Accueil > Arduino, Matériel > Robot 2WD autonome

Robot 2WD autonome

Pour aujourd’hui j’ai décidé d’équiper mon robot 2WD, d’un capteur ultrason HC-SR04 monté sur un servomoteur Tower Pro SG90. Cela va permettre à mon robot d’être autonome.

Voici une photo du montage de l’ensemble sur mon robot :

robot ultrason

 

Le programme va consister à faire avancer le robot; s’il rencontre un obstacle à environ 40 cm, il s’arrête puis le servomoteur va tourner à gauche puis à droite afin d’effectuer une mesure de distance; le robot tournera vers la distance détectée la plus grande.

Pour comprendre l’utilisation du robot 2WD, du capteur ultrason HC-SR04 et du servomoteur SG90, je vous invite à regarder mes articles sur le blog.

Voici le contenu du programme :

/*
   Robot 2WD autonome capteur ultrason HC-SR04
*/

#include <Servo.h>

// définition des broches utilisées par le capteur HC-SR04
int trig = 12;
int echo = 11;

// définition des broches utilisées sur le shield contrôle moteur DRI0001
int direction_moteur_droite = 7;
int controle_moteur_droite = 6;
int direction_moteur_gauche = 4;
int controle_moteur_gauche = 5;

long lecture_echo;
long cm, cm_gauche, cm_droite;
Servo monservo;  // crée l’objet pour contrôler le servomoteur

void moteur (int moteur_gauche, boolean sens_moteur_gauche, int moteur_droite, boolean sens_moteur_droite)
{
  // définition sens moteur LOW avance, HIGH recule
  digitalWrite(direction_moteur_gauche, sens_moteur_gauche);
  analogWrite(controle_moteur_gauche, moteur_gauche);
  digitalWrite(direction_moteur_droite, sens_moteur_droite);
  analogWrite(controle_moteur_droite, moteur_droite);
}

void virage_90 (boolean sens)
{
  // on va toujours garder une valeur PWM à 200
  // et on va jouer sur la durée en ms pour effectuer le virage souhaité
  // sens à HIGH pour gauche, LOW pour droite
  digitalWrite(direction_moteur_gauche, sens);
  digitalWrite(direction_moteur_droite, !sens);
  analogWrite(controle_moteur_gauche, 200);
  analogWrite(controle_moteur_droite, 200);
  delay(480);
  analogWrite(controle_moteur_gauche, 0);
  analogWrite(controle_moteur_droite, 0);       
}

void calcul_distance()
{
  digitalWrite(trig, HIGH);
  delayMicroseconds(10);
  digitalWrite(trig, LOW);
  lecture_echo = pulseIn(echo, HIGH);
  cm = lecture_echo / 58;
}

void setup()
{
  int i;
  for (i=4;i<=7;i++)
    pinMode(i, OUTPUT); //définit les port 4 à 7 en sortie
  analogWrite(controle_moteur_gauche, 0); // arrêt moteur gauche
  analogWrite(controle_moteur_droite, 0); // arrêt moteur droite
  pinMode(trig, OUTPUT);
  digitalWrite(trig, LOW);
  pinMode(echo, INPUT);
  monservo.attach(9);  // utilise la broche 9 pour le contrôle du servomoteur
  monservo.write(70); // positionne le servomoteur en fait à 90°
}

void loop()
{
  monservo.write(70);
  delay(1000);
  calcul_distance();
  if (cm >= 40)
  {
    // Robot avance tout droit
    moteur(200, LOW, 200, LOW);
  }
  else
  {
    // Robot stop
    moteur(0, LOW, 0, LOW);
    monservo.write(30);
    delay(1000);
    calcul_distance();
    cm_droite = cm;
    monservo.write(120);
    delay(1000);
    calcul_distance();
    cm_gauche = cm;
    if (cm_droite < cm_gauche)
    {
      // Robot tourne 90° à gauche
      virage_90(HIGH);
    }
    if (cm_droite > cm_gauche)
    {
      // Robot tourne 90° à droite
      virage_90(LOW);
    }
    if (cm_droite == cm_gauche)
    {
      // Robot demi-tour
      virage_90(HIGH);
      virage_90(HIGH);
    }
  }
}

Et une petite vidéo pour visualiser le résultat :

Robot 2WD autonome
Catégories :Arduino, Matériel Étiquettes : , , , , ,
  1. 06/06/2013 à 13:48

    C’est la classe ce petit robot. Il doit être bourré d’électronique pour effectuer les calcul de distance. Par contre, il dévie légèrement sur la droite sur la vidéo.

    • 09/06/2013 à 18:46

      Merci,
      Effectivement sur le coup j’ai été fainéant mais il suffit juste d’adapter le programme pour compenser les 2 moteurs lors de l’avance en ligne droite…

  2. Mohamed Tarik
    30/06/2013 à 04:16

    Svp le shéma du montage!!et merci

  3. deharbe
    04/11/2013 à 19:28

    bravo . epoustouflant … du moins pour mon peu de connaissance. Je suis un Grd’Père curieux tentant de répondre aux questions de mon petit fils (11 ans). Je pense que bientot c’est lui qui me guider dans cette recherche. Bravo et merci de vos articles qui m’éclaire et m’aide énormement pour tenter de comprendre comment tout celà fonctionne. Est-il possible de se servir de votre programme (Robot 2WD autonome) avec Arduino Uno et Rotoshield de chez Snootlab …. http://snootlab.com/shields-snootlab/87-rotoshield-fr.html

    • 04/11/2013 à 19:41

      Merci beaucoup,
      Il faudra modifier le programme. Récupérer la librairie qui permet de gérer la carte rotoshield en la téléchargeant sur le site github. Il y a des exemples fournies avec la librairie, donc cela ne doit pas être insurmontable.

      • deharbe
        04/11/2013 à 21:37

        Merci . je vais tenter celà, vous faire part de mes essais et demanderde l’aide éventuellement
        merci

      • 05/11/2013 à 21:05

        Pas de problèmes

      • deharbe
        07/11/2013 à 11:40

        bonjour …… j’ai modifié votre code pour la carte Rotoshield, mais je bloque dans la partie « avec le code erreur redefinition ofVoid setup()  » svp pouvez vous m’aider . ? merci d’avance …
        /*void setup()
        {
        int i;
        for (i=4;i<=7;i++)
        pinMode(i, OUTPUT); //définit les port 4 à 7 en sortie
        analogWrite(controle_Motor_1, 0); // arrêt moteur gauche
        analogWrite(controle_Motor_2, 0); // arrêt moteur droite
        pinMode(trig, OUTPUT);
        digitalWrite(trig, LOW);
        pinMode(echo, INPUT);
        monservo.attach(9); // utilise la broche 9 pour le contrôle du servomoteur
        monservo.write(70); // positionne le servomoteur en fait à 90°
        }
        */

        /*
        Robot 2WD autonome capteur ultrason HC-SR04
        de . https://itechnofrance.wordpress.com/2013/05/08/robot-2wd-autonome/
        merci au concepteur de ce code …
        essais pour faire fonctionner avec carte Rotoshield
        */
        #include

        #include

        // this is the snootor library
        #include

        // définition des broches utilisées par le capteur HC-SR04
        int trig = 12;
        int echo = 11;

        // Declaration of 2 motor objects

        SnootorDC Motor_1;
        SnootorDC Motor_2;
        int i;
        void setup()
        {
        // Initialization according to pins
        Serial.begin(115200);
        Wire.begin();
        Motor_1.init(1);
        Motor_2.init(2);
        Serial.println(« init ok »);
        }

        // définition des broches utilisées sur le shield contrôle moteur DRI0001

        int direction_Motor_2; //3; // était à 7 mis 3 pour moteur 1
        int controle_Motor_2; //6; // était à 6
        int direction_Motor_1; //4; // était à 4
        int controle_Motor_1; //5; // était à 5

        long lecture_echo;
        long cm, cm_gauche, cm_droite;
        Servo monservo; // crée l’objet pour contrôler le servomoteur

        void moteur (int Motor_1, boolean sens_Motor_1, int Motor_2, boolean sens_Motor_2)

        // définition sens moteur LOW avance, HIGH recule
        {
        digitalWrite(direction_Motor_1, sens_Motor_1);
        analogWrite(controle_Motor_1, Motor_1);
        digitalWrite(direction_Motor_2, sens_Motor_2);
        analogWrite(controle_Motor_2, Motor_2);
        }

        void virage_90 (boolean sens)
        {
        // on va toujours garder une valeur PWM à 200
        // et on va jouer sur la durée en ms pour effectuer le virage souhaité
        // sens à HIGH pour gauche, LOW pour droite
        digitalWrite(direction_Motor_1, sens);
        digitalWrite(direction_Motor_2, !sens);
        analogWrite(controle_Motor_1, 200);
        analogWrite(controle_Motor_2, 200);
        delay(480);
        analogWrite(controle_Motor_1, 0);
        analogWrite(controle_Motor_2, 0);
        }

        void calcul_distance()
        {
        digitalWrite(trig, HIGH);
        delayMicroseconds(10);
        digitalWrite(trig, LOW);
        lecture_echo = pulseIn(echo, HIGH);
        cm = lecture_echo / 58;
        }

        void setup()
        {
        int i;
        for (i=4;i= 40)
        {
        // Robot avance tout droit
        moteur(200, LOW, 200, LOW);
        }
        else
        {
        // Robot stop
        moteur(0, LOW, 0, LOW);
        monservo.write(30);
        delay(1000);
        calcul_distance();
        cm_droite = cm;
        monservo.write(120);
        delay(1000);
        calcul_distance();
        cm_gauche = cm;
        if (cm_droite cm_gauche)
        {
        // Robot tourne 90° à droite
        virage_90(LOW);
        }
        if (cm_droite == cm_gauche)
        {
        // Robot demi-tour
        virage_90(HIGH);
        virage_90(HIGH);
        }
        }
        }

      • 07/11/2013 à 12:18

        Il ne peut avoir qu’une seule fonction void_setup() dans un sketch arduino

  4. deharbe
    07/11/2013 à 12:46

    itechnofrance :Il ne peut avoir qu’une seule fonction void_setup() dans un sketch arduino

    ok merci de votre reponse rapide ….. je creuse le problème

  5. Pascal
    18/12/2013 à 19:45

    bonjour a tous j’ai un problème avec le servo qui ne fonctionne pas ,j’ai une carte funduino 2560 , j’ai essayer un programme exemple d’essai de servo et la aussi sa ne marche pas .
    quelqu’un pourrait m’aider

  6. Michael
    29/12/2013 à 14:49

    Si on utilise l’arduino motor shield rev3 au lieu de shield contrôle moteur DRI0001,est ce que ca va fonctionner?

  7. sarah
    28/03/2014 à 15:38

    je veux utiliser deux moteurs dC au lieu des servomoteurs et je veux savoir comment faire tourner le capteur ultrason SVP quoi faire?

    • 28/03/2014 à 19:20

      Pour le capteur ultrason il est impératif d’utiliser un moteur pas à pas afin de pouvoir gérer la position. Avec un moteur DC c’est impossible à cause de l’inertie de celui-ci

  8. Sergio
    15/04/2014 à 11:53

    Bonjour , les pin 4-5-6 et 7 côté shield se raccordent à quoi de l’autre côté des connecteurs et quelle est la ref du composant qui se trouve à droite sur le shield ( et qui ressemble à un détecteur infra rouge). J’aurai besoin du schéma de câblage

    • 15/04/2014 à 17:29

      Bonjour, regardez les différents article parus auparavant. Tout y est expliqué. Effectivement c’est bien un détecteur infrarouge référence Sparkun modèle SEN08554. Pour l’utilisation de celui -ci voir l’article ‘piloter le robot 2wd par infrarouge’

  9. 11/04/2015 à 15:48

    est il possible de faire le montage sur l’arduino uno utilisant un L293d pour les deux moteur?

  10. flash901@live.fr
    25/05/2015 à 14:02

    Je pense que oui à la place du shield bein c le L293D

  11. Mat
    26/05/2015 à 20:34

    Bonjour bonjour
    J’ai eu une petite idée pour améliorer votre programme car le robot tourne trop a mon goût pour emprunter un passage étroit
    On pourrait peut être utiliser une boucle for afin de faire tourner le robot jusqu’à ce qu’il trouve une distance de 40cm par exemple
    Merci beaucoup pour tous vos tutos !!!

  12. chrisrob
    23/09/2015 à 13:19

    bonjour, j’ai fait le même montage,mais avec un schield motor adafruit v1,utilisé votre code et mon robot tourne en rond puis s’arrête avec le servomoteur qui tourne de de droite a gauche en boucle et le capteur a ultrason qui ne capte rien du tout, par contre quand je de branche le servo et le capteur,le moteur semble suivre le programme,et quand je débranche les moteurs, le servo et le capteur fonctionne bien, quand je débranche le capteur les moteurs et le servo fonctionne,est ce que le problème vient du shield moteur?

  13. chris
    24/09/2015 à 11:34

    bonjour, est ce que le programme fonctionne avec un shield motor adafruit v1.1

  14. Gilles
    20/01/2016 à 21:35

    Bonjour, bonjour !

    Super tuto ! Je suis débutant, mais je suis sur un projet un peu semblable. Je bloque actuellement sur l’utilisation du capteur ultrason avec le servomoteur. En effet, le servo tourne bien, il calcule bien la distance, je lui demande de l’afficher à chaque fois qu’il la mesure. Et c’est là qu’intervient le problème, parfois il mesure des choses assez aberrantes du type 3-4cm alors que l’obstacle est à plus d’1m. Auriez-vous une idée du soucis ?

    #include
    #include

    Adafruit_MCP23017 mcp;

    // Définit les broches du capteur Ultrason
    int trig = 12;
    int echo = 13;
    long lecture_echo;
    long cm;
    long echo_left;
    long echo_right;

    Servo Servo1; // Définit un objet servo

    void distance() { // Définit fonction « Mesure de la Distance »
    digitalWrite(trig, HIGH);
    delayMicroseconds(10);
    digitalWrite(trig, LOW);
    lecture_echo = pulseIn(echo, HIGH);
    cm = lecture_echo / 58;
    }

    void setup() {
    pinMode(trig, OUTPUT); // Définit Trigger comme sortie
    digitalWrite(trig, LOW);
    pinMode(echo, INPUT); // Définit Echo comme entrée
    Serial.begin(9600);

    Servo1.attach(2); // Définit la broche du servomoteur
    Servo1.write(90); // Positionne Servo à 90°
    }

    void loop() {
    Servo1.write(90);
    delay(5000);
    distance();
    Serial.print(« Distance : « );
    Serial.println(cm);

    if (cm > 50) {

    //Il tourne la tête à gauche puis à droite prend une mesure
    Servo1.write (70); //20° sur la gauche
    delay(5000);
    distance();
    echo_left = cm;
    Serial.print(« Distance gauche : « );
    Serial.println(echo_left);
    Servo1.write (120); //20° sur la droite
    delay(5000);
    distance();
    echo_right = cm;
    Serial.print(« Distance droite : « );
    Serial.println(echo_right);
    }

    if (echo_right > echo_left) {
    Servo1.write(90);
    delay(1000);
    Servo1.write(100);
    delay(1000);
    Servo1.write(110);
    delay(1000);
    }

    }

  15. durupt
    04/10/2016 à 06:26

    hello,
    super , je voulais savoir le matériel utilisé pour ce robot.

  16. Andre
    10/08/2017 à 16:47

    Bonjour je suis grand-pere avec son petit fils de 10 qui bricole le même robot 2 wheels j’ai fait le programme a l’aide ardublock les roues fonctionne ,le servo fonctionne ,mais quand je met les 2 ensembles le servo bloque le system PWM (vu sur internet)
    c’est une carte arduino uno moteur shield L298 et un Hc-SR04 +servo tower pro 9g.
    je utilise donc avec le servo fixe et ça fonctionne.

    Probléme pour adapter votre code ,apres analyse j’ai un probléme je ne vois pas ou cablè les borne ENA et ENB venant du circuit motor shield L298N.

    Merci d’avance pour votre aide .
    Andre

  17. Andre
    13/08/2017 à 22:02

    Tout fonctionne correctement après avoir compris le motor shield L298 et L293 ,apres avoir adapter les connections .
    Merci pour bel exemple.
    ps:pour ceux que ça interesse les pin 9 et 10 en mode PWM ne sont pas compatible avec un servo.

  18. Bernard
    16/03/2019 à 05:22

    Très bel exemple de programmation, bien expliqué (pour un débutant comme moi !).
    Cependant, lorsque je compile le code sur l’IDE j’ai cette erreur :
    error: expected primary-expression before ‘if’

    if (*centi > 35) return true; // Si plus de 35 cm pas d’obstacle
    D’où cela provient-il ? Et pourquoi suis- je apparemment le seul à avoir cette erreur ?

    • 16/03/2019 à 13:08

      bonjour et merci
      pour la correction la ligne doit être : if (centi > 35) return true;
      mais pouvez-vous me dire sur quel article rencontrez-vous le problème ?

  1. No trackbacks yet.

Laisser un commentaire