Sommaire |
Utilisation de la carte arduino uno et du shield motor afin de réaliser un robot autonome capable de se déplacer librement et d'eviter des obstacles.
Attention : Ce tutoriel nécessite de posséder un shield Motor de la marque Arduino!
L'utilisation de la carte arduino Uno combinée au shield Motor Arduino permet facilement de contrôler les deux moteurs à courant continus. On utilise un capteur à ultrasons HC-SR04 qui permet de détecter les murs. En fonction de retour de ce capteur, on contrôle les moteurs de différente facon(avancer, reculer, pivoter). Si un mur est détecté, le robot recule et pivote tant qu'il n'y a plus de mur dans le champs de vision du robot. On mesure également l'intensité de chaque moteur. Si le robot est bloqué, les moteurs sont alors en surintensité. Dans ce cas, le robot recule et pivote.
// variable hc sr04 const int trigPin = 6; const int echoPin =7; // variable moteur droit const int vitesseMotD=3; const int sensMotD=12; const int freinMotD=9; const int intensiteMotD = A0; // variable moteur gauche const int vitesseMotG=11; const int sensMotG=13; const int freinMotG=8; const int intensiteMotG = A1; // variable pour rotation int a=0; int sens = random(0,2); // variable temps pour analyse blocage int time2 =0; void setup() { Serial.begin (115200); // initialisation HC SR04 pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); // intialisation moteur droit pinMode (vitesseMotD,OUTPUT); pinMode (freinMotD,OUTPUT); pinMode (sensMotD,OUTPUT); // initialisation moteur gauche pinMode (vitesseMotG,OUTPUT); pinMode (freinMotG,OUTPUT); pinMode (sensMotG,OUTPUT); // conditions initiales : moteurs a l arret stopMot(); } void loop() { long time = millis(); Serial.print("temps ecoule :"); Serial.println(time); long duration, distance; digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); distance = (duration/2) / 29.1; if (distance < 20) { //Serial.println("Mur detecte"); stopMot(); delay(100); // 5 secondes temps arbitraire rotation(); delay(300); } else { //Serial.println("aucun mur detecte"); if (analogRead(intensiteMotD)>155 || analogRead(intensiteMotG)>155){ Serial.println("Moteur bloque!"); reculer(); delay(500); rotation(); delay(500); } else if (time2>2000 && (analogRead(intensiteMotD)>130 || analogRead(intensiteMotG)>130)){ reculer(); delay(500); rotation(); delay(500); time2 = 0; } else if (analogRead(intensiteMotD)>130 || analogRead(intensiteMotG)>130){ time2= millis();// temps pour analyse blocage } else { avancer(); } } if (distance >= 30000 || distance <= 0){ //Serial.println("Out of range"); stopMot(); } else { // Serial.print("Distance: ["); //Serial.print(distance); //Serial.println(" cm"); } delay(200); } void stopMot() { //moteur Droit digitalWrite(vitesseMotD,LOW); digitalWrite(sensMotD,LOW); digitalWrite(freinMotD,LOW); //moteur Gauche digitalWrite(vitesseMotG,LOW); digitalWrite(sensMotG,LOW); digitalWrite(freinMotG,LOW); } void avancer(){ digitalWrite(sensMotD,LOW); // sens 1 digitalWrite(sensMotG,HIGH); // sens 1 analogWrite(vitesseMotG,255); // vitesse max analogWrite(vitesseMotD,253); // vitesse modere // afficher l'intensite Serial.print("intensite moteur gauche : "); Serial.println(analogRead(intensiteMotG)); Serial.print("intensite moteur droit : "); Serial.println(analogRead(intensiteMotD)); Serial.println(" "); } void rotation(){ if (a%=5){ sens = random(0,2); // 2 exclus } //Serial.print("sens est :"); //Serial.println(sens); a=a+1; digitalWrite(sensMotD,sens); // sens est high(1) ou low(0) digitalWrite(sensMotG,sens); analogWrite(vitesseMotG,255); // vitesse max analogWrite(vitesseMotD,255); // vitesse modere } void reculer(){ digitalWrite(sensMotD,HIGH); // sens 1 digitalWrite(sensMotG,LOW); // sens 1 analogWrite(vitesseMotG,255); // vitesse max analogWrite(vitesseMotD,253); // vitesse modere }
chercher ici : http://wikidebrouillard.org/index.php/Catégorie:Arduino
Robot ménager Roomba
© Graphisme : Les Petits Débrouillards Grand Ouest (Patrice Guinche - Jessica Romero) | Développement web : Libre Informatique