Voiture à capteurs de distance

De Les Fabriques du Ponant
Révision datée du 22 janvier 2019 à 23:05 par Hedge (discussion | contributions) (Complétion de la partie "Réalisation")
Aller à : navigation, rechercher
La voiture à capteur de distance est une voiture contrôlée par des capteurs de distance. 
Deux capteurs sont utilisés, l'un contrôle l'avancement tandit que l'autre contrôle la direction.
Voiture à capteurs de distance

Matériel

  • un Arduino
  • un servo moteur(non continu)
  • un moteur DC
  • un pont H
  • des fils/moyens de créer des connections
  • deux capteurs de distance (ici des HC-sr04)
  • des couvercles de pots
  • un matériau suffisement résistant pour faire un chassis

Réalisation

  • Nous avons réalisé un chassis en bois de 3mm découpé au laser. Les roues arrières ont aussi été découpées au laser.

La découpe au laser n'est pas une obligation, elle permet juste de gagner du temps.

  • La direction est gérée par le servo moteur, relié par un trombone au systeme de direction. L'idée étant que selon

la position du moteur, la pivot central tire/pousse sur les barres de direction, tournant ainsi les roues. Attention à bien prévoir des pièces assez grandes au niveau des axes des roues ainsi que du pivot afin de faciliter le travail sur moteur.

  • Le pont H doit être alimenté par l'Arduino (pin +5v et GND), le moteur peut ensuite être branché sur la sortie. Il faut

ensuite brancher les deux pin EN{x} correspondant au moteur, si le pont H,comme dans notre cas, gère plusieurs sorties à la fois, bien veiller à relier les deux pin EN{x} conntrollant la bonne sortie (en général ceux du même coté que la sortie).

  • Les capteurs HC-sr04 sont reliés par 4 fils, l'alimentation est à relier au pin +5v de l'Arduino et la masse au pin GND.
  • Les pins sur lequels brancher tous les fils de commande (hors 5v et masse) sont spécifiés dans le code (partie "pinout")

Notre code :

#include "Arduino.h"
#include "Servo.h"

//pinout
#define TRIGGER_1 2
#define ECHO_1 3
#define TRIGGER_2 6
#define ECHO_2 7
#define SERVO 8
#define IN1 A2
#define IN2 A1

//creation du controle du servo moteur
Servo* dir;

void setup() {

	Serial.begin(9600);

	//reglage des pins capteur
	pinMode(TRIGGER_1,OUTPUT);
	digitalWrite(TRIGGER_1,LOW);
	pinMode(TRIGGER_2,OUTPUT);
	digitalWrite(TRIGGER_2,LOW);
	pinMode(ECHO_1,INPUT);
	pinMode(ECHO_2,INPUT);

	//setup du servo moteur
	dir = new Servo();
	dir->attach(SERVO);

	//reglage des pins pont H
	pinMode(IN1,OUTPUT);
	digitalWrite(IN1,LOW);
	pinMode(IN2,OUTPUT);
	digitalWrite(IN2,LOW);
}


void loop() {

	unsigned long tmpOut[2][10];
	unsigned long out[2] = {0,0};

	//boucle de mesure, avec moyenne sur 10 mesures
	for(int i=0; i<10; i++) {

		//envois d'un impulsion au capteur pour initialise la mesure
		digitalWrite(TRIGGER_1,HIGH);
		digitalWrite(TRIGGER_1,LOW);
		//recuperation de la valeur
		tmpOut[0][i] = pulseIn(ECHO_1,HIGH,4000);

		digitalWrite(TRIGGER_2,HIGH);
		digitalWrite(TRIGGER_2,LOW);
		tmpOut[1][i] = pulseIn(ECHO_2,HIGH,4000);

		delay(1);
	}

	out[0] = 0;
	out[1] = 0;
	for(int j=0; j<2; j++) {
		for(int i=0; i<10; i++) { out[j] += tmpOut[j][i]; }
		//calcul de la moyenne
		out[j] = out[j]/10;
		//ecretage
		if( out[j] > 1500) { out[j] = 1500; }
		Serial.println(out[j]);
	}

	//commande du servo moteur
	dir->write(out[0]/10);

	//commande du pont H
	if(out[1] > 400) {
		if(out[1] < 600) {
			digitalWrite(IN1,LOW);
			digitalWrite(IN2,LOW);
		} else {
			digitalWrite(IN1,HIGH);
			digitalWrite(IN2,LOW);
		}
	} else {
		digitalWrite(IN1,LOW);
		digitalWrite(IN2,HIGH);
	}

}