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
Publicités
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.

  1. No trackbacks yet.

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

%d blogueurs aiment cette page :