Voiture à capteurs de distance

De Les Fabriques du Ponant
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")

Problèmes rencontrés

  • Nous avons rencontré un problème majeur lors de la réalisation de ce projet: notre servo moteur était trop peu puissant pour

actionner le système de direction. Une solution à ce problème serai d'utiliser un moteur plus puissant, cependant, modifier le système de direction afin de faciliter le travail du moteur serai une solution plus durable.

  • Un autre problème rencontré se situe au niveau du pont H : nous n'avons pas été en mesure de le commander analogiquement:

la voiture ne comporte que 3 vitesses (marche avant, marche arrière, point mort) alors que le pont H permet un contrôle fin de la vitesse du moteur. En effet nous ne somme pas parrvenu à contrôler le pont H via des signaux PWM, ce qui est normalement possible. Malheureusement, par manque de temps, note seule solution sera de conserver le fonctionnement actuel.

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);
	}

}