Robot autonome de type Roomba

De Wikidebrouillard.

Article incomplet en cours de rédaction
La vidéo "Robot autonome de type Roomba"

Sommaire

Présentation du projet Arduino

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.

Liste du matériel

réalisation du projet

Explication

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.

Schéma Fritzing

Code

// 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
}

Liens avec d'autres projets arduino

chercher ici : http://wikidebrouillard.org/index.php/Catégorie:Arduino

Pour aller plus loin

Liens avec le quotidien

Robot ménager Roomba

Portail des ExplorateursWikidébrouillardLéon DitFLOGPhoto mystèreJ'ai FaitPortraitsAnnuaire
AR
CO

Robot autonome de type Roomba

Rechercher

Page Discussion Historique
Powered by MediaWiki
Creative Commons - Paternite Partage a l

© Graphisme : Les Petits Débrouillards Grand Ouest (Patrice Guinche - Jessica Romero) | Développement web : Libre Informatique