Voiture à capteurs de distance : Différence entre versions
(Ajout de la rubrique "Problèmes rencontrés") |
|||
(3 révisions intermédiaires par le même utilisateur non affichées) | |||
Ligne 1 : | Ligne 1 : | ||
[[Catégorie:Enib2019]] | [[Catégorie:Enib2019]] | ||
+ | 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. | ||
− | <font color="# | + | [[Image:Voiture_capteurs_de_distance.jpg|450px|right|thumb|<center>Voiture à capteurs de distance</center>]] |
+ | ==Matériel== | ||
+ | |||
+ | * un [http://wiki.lesfabriquesduponant.net/index.php?title=Arduino Arduino] | ||
+ | * un [https://fr.wikipedia.org/wiki/Servomoteur servo moteur](non continu) | ||
+ | * un [https://les-electroniciens.com/sites/default/files/cours/moteur_a_cc.pdf moteur DC] | ||
+ | * un [https://fr.wikipedia.org/wiki/Pont_en_H pont H] | ||
+ | * des fils/moyens de créer des connections | ||
+ | * deux capteurs de distance (ici des [https://www.gotronic.fr/pj2-hc-sr04-utilisation-avec-picaxe-1343.pdf 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. | ||
+ | <font color="#f28518"> 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. </font> | ||
+ | |||
+ | * 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== | ||
+ | |||
+ | <pre> | ||
+ | #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); | ||
+ | } | ||
− | + | } | |
+ | </pre> |
Version actuelle datée du 22 janvier 2019 à 22:15
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.
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); } }