Robot autonome intelligent contrôlable par Bluetooth

Robot autonome intelligent contrôlable par Bluetooth

Salut à tous c’est Vince574,

Ce projet concerne la fabrication d’un robot à 4 roues motrices équipé d’un capteur ultrason.
Le robot peut évoluer dans 2 modes qui sont choisis par l’application Bluetooth :

– autonome et intelligent (à l’aide du servomoteur il va s’arrêter lorsqu’il détecte un obstacle et choisir son chemin en regardant les objets à sa droite et sa gauche),

– entièrement contrôlable par Bluetooth tel un véhicule radio commandé.

Ce projet explique la conception et la fabrication de A à Z et sera une base pour un projet suivant qui pourra être la localisation précise et l’asservissement du robot dans une pièce. L’idée m’est venu en regardant de nombreuses compétitions de robotique où le robot ne démarrait même pas et lorsqu’il démarrait il ne se repérait pas dans son espace.
Ce tutoriel est donc destiné à des personnes voulant construire leur premier robot autonome, intelligent et commandé par Bluetooth. Il permet d’obtenir les premières bases solides de la robotique pour pouvoir ajouter par la suite différentes fonctionnalités de plus haut niveau.

  1. Voici une démonstration du robot :
  2. 1) Montez la partie inférieure de la base du robot avec les moteurs. Pour cela il est nécessaire de suivre le mode d'emploi de la base roulante.
  3. 2) Fixer l'Arduino Uno sur la base roulante à l'aide de deux vis et écrous (possibilité de prendre les vis et écrous du kit robotique)

    Il faut faire attention au sens de l'Arduino pour que le port USB reste accessible pour la programmation du robot.

    Il faut aussi faire attention à ne pas réaliser de court circuit avec les vis mais les endroits sont normalement judicieusement choisis.
  4. 3) Fixer la Breadboard soudable au centre du robot à l'aide de ruban double face ou de colle.

    J'ai utilisé 3 lignes d'alimentation sur la breadboard :

    - le +5 V de l'arduino sur la première ligne

    - la masse commune sur la seconde

    - la batterie sur la troisième

    Je montre les soudures à l'étape 5
  5. 4) Installer et souder les contrôleurs moteur L293D de chaque côté du robot comme sur la photo
  6. Voici le schéma et les explications de câblage du contrôleur moteur

    1) La pin 1 permet de réguler la vitesse du moteur 1, il faut donc la brancher sur un PWM de l'arduino (sur la 6 par exemple, je vous conseille de suivre les mêmes branchements que moi pour que le code s'adapte automatiquement)

    2) Permet de contrôler le sens du moteur 1, câblé à la sortie numérique de l'arduino (5), je l'ai aussi relié à la pin 10 du contrôleur car le signal envoyé sera le même, cela permet d'économiser une pin de l'arduino

    3) + du moteur 1

    4) 5) 13) 12) sont déjà reliées ensemble, il faut juste en relier une sur la masse de la breadboard

    6) - du moteur 1

    7) Broche qui permet de contrôler le sens du moteur avec la 2, reliée à la 15 du contrôleur car même signal (les roues d'un côté du robot tourneront toujours dans le même sens)

    Si les deux broches ont le même état le moteur ne tournera pas. Si une broche est à HIGH et l'autre à LOW le moteur tournera dans un sens et si on inverse les deux états, le moteur tournera dans l'autre sens.

    8) Alimentation du circuit de commande (5V de l'arduino), il faut donc le relier à la première ligne de la Breadboard

    9) Contrôle vitesse du moteur 2 (PWM de l'arduino , broche 3)

    10) déjà reliée à la 2

    11) - du moteur 2

    14) + du moteur 2

    15) déjà reliée à la 7 du contrôleur

    16) Alimentation de la puissance des moteurs (+ de la batterie qui vient de la breadboard)

    Je vous recommande de vérifier si les connexions sont bien réalisées à l'aide d'un multimètre.


  7. 5) Amener les bons signaux sur les différentes lignes de la Breadboard et alimenter l'arduino

    1ère ligne : souder un câble du +5V de l'Arduino

    2ème ligne : souder un câble de la masse de l'Arduino et de la batterie

    3ème ligne : souder un câble du + de la batterie

    Il faut souder un câble entre le Vin de l'Arduino et la 3ème ligne, cela permet d'alimenter l'Arduino

    Il est nécessaire de mettre un interrupteur entre la batterie et la Breadboard.

    Il est possible de rajouter un condensateur entre les lignes d'alimentations et la masse pour absorber les pics de tensions.

    Les couleurs des câbles ont une signification :

    Rouge : tension batterie

    Noir: masse

    Orange : 5v

    Attention la batterie LiPo que j'utilise peut s'avérer dangereuse. Lors de la non utilisation ou de la charge de cette batterie il est fortement conseillé de la mettre dans un sac ignifuge pour empêcher tout incendie.

    Il faut mesurer de temps en temps la tension de la batterie et lorsqu'elle est inférieure à 6.6 V pour une batterie 2 modules il est nécessaire de la recharger. Sa tension maximale étant de 8.4 V (4.2 V par cellule).
  8. 6) Arrivé à cette étape, je vous conseille d'effectuer des tests sur les moteurs pour voir si tout est fonctionnel

    En effet, je vous transmets un code commenté qui vous permet de vérifier si tout est fonctionnel.



    const int rd = 7; // définitions des pins pour chaque côté des roues, je me suis trompé de côté mais ça reste un détail
    const int rde = 5;
    const int rg = 12;
    const int rge = 13;
    const int vrd = 3;
    const int vrde = 6;
    const int vrg = 10;
    const int vrge = 11;


    void setup() { // définitions des broches en mode sortie
    pinMode(rd, OUTPUT);
    pinMode(rde, OUTPUT);
    pinMode(rg, OUTPUT);
    pinMode(rge, OUTPUT);
    pinMode(vrde, OUTPUT);
    pinMode(vrd, OUTPUT);
    pinMode(vrg, OUTPUT);
    pinMode(vrge, OUTPUT);
    }

    void loop() {
    digitalWrite(vrde, LOW); // les moteurs sont à l'arrêt car la vitesse est à LOW
    digitalWrite(vrd, LOW); // la direction des roues est vers l'avant car une broche est à HIGH et l'autre à LOW, elles ne sont donc pas bloquées
    digitalWrite(vrge, LOW);
    digitalWrite(vrg, LOW);
    digitalWrite(rd, HIGH);
    digitalWrite(rde, LOW);
    digitalWrite(rg, HIGH);
    digitalWrite(rge, LOW);
    delay(2000);
    analogWrite(vrde, 250); // les roues sont en action, vous pouvez remarquer que la PWM n'est pas utilisé pour un côté mais pour l'autre côté oui
    analogWrite(vrd, 250); // en effet j'ai effectué plusieurs tests pour que le robot avance droit
    digitalWrite(vrge, HIGH);
    digitalWrite(vrg, HIGH);
    delay(4000);
    digitalWrite(vrde, LOW); // arrêt des moteurs et direction inverse
    digitalWrite(vrd, LOW);
    digitalWrite(vrge, LOW);
    digitalWrite(vrg, LOW);
    digitalWrite(rd, LOW);
    digitalWrite(rde, HIGH);
    digitalWrite(rg, LOW);
    digitalWrite(rge, HIGH);
    delay(2000);
    digitalWrite(vrde, HIGH);
    analogWrite(vrd, 250);
    digitalWrite(vrge, HIGH);
    digitalWrite(vrg, HIGH);
    delay(4000);
    digitalWrite(vrde, LOW); // arrêt des moteurs et changement de direction (rotation du robot)
    digitalWrite(vrd, LOW);
    digitalWrite(vrge, LOW);
    digitalWrite(vrg, LOW);
    digitalWrite(rd, HIGH);
    digitalWrite(rde, LOW);
    digitalWrite(rg, LOW);
    digitalWrite(rge, HIGH);
    delay(4000);
    digitalWrite(vrde, HIGH);
    digitalWrite(vrd, HIGH);
    digitalWrite(vrge, HIGH);
    digitalWrite(vrg, HIGH);
    delay(600);
    }






  9. 7) Une fois que la partie moteur fonctionne, nous pouvons rajouter le capteur à ultrasons monté sur le servomoteur. Il faut donc rajouter la partie haute de la base roulante.

    Il est nécessaire de vérifier que lorsque le capteur à ultrason sera monté sur le servomoteur, il pourra tourner de +-90° par rapport à la face avant. Il vaut mieux pencher le capteur ultrason un peu vers l'arrière que vers l'avant sinon il détectera le sol. Prévoyez de longs câbles pour pouvoir retirer la partie haute de la base roulante sans dessouder les câbles.

    Pour monter le servomoteur, il est possible de le fixer à l'aide d'une vis et d'un écrou comme sur la photo de l'étape suivante.

  10. 8) Câblez le servomoteur et le capteur ultrason de la manière suivante :

    - Capteur US :

    Vcc : 5V
    Echo : Sortie numérique (8)
    Trig : Sortie numérique (4)
    OUT : pas de branchement
    Gnd: Masse

    Les soudures doivent s'avérer résistantes car lorsque le servo va tourner, les câbles vont bouger avec.

    - le servomoteur :

    Marron : masse
    Rouge : 5V
    orange : Sortie numérique (9)
  11. 9) Il est nécessaire de vérifier le fonctionnement du capteur à ultrasons et du servomoteur.

    Pour cela, utilisez le code commenté suivant :



    #include

    Servo myservo; // créer l'objet servo


    int pos = 0; // définition des pins, position du servo et variables de lecture distance
    int trig = 4;
    int echo = 8;
    long lecture_echo;
    long cm;

    void setup() {
    myservo.attach(9); // définition des broches
    pinMode(trig, OUTPUT);
    digitalWrite(trig, LOW);
    pinMode(echo, INPUT);
    Serial.begin(9600);
    }

    void loop() {



    for (pos = 102; pos = 102; pos -= 1) { // retourne à la position de 102 ° par balayage
    // in steps of 1 degree
    myservo.write(pos);
    delay(10);
    }
    delay(1000);
    digitalWrite(trig, HIGH);
    delayMicroseconds(10);
    digitalWrite(trig, LOW);
    lecture_echo = pulseIn(echo, HIGH);
    cm = lecture_echo / 58;
    Serial.print("Distance en cm : "); // nouvelle prise de mesure et affichage dans le moniteur série
    Serial.println(cm);
    delay(1000);

    for (pos = 102; pos >= 45; pos -= 1) { // va à la pos 45 en balayant
    myservo.write(pos);
    delay(10);
    }
    delay(1000);
    digitalWrite(trig, HIGH);
    delayMicroseconds(10);
    digitalWrite(trig, LOW);
    lecture_echo = pulseIn(echo, HIGH);
    cm = lecture_echo / 58;
    Serial.print("Distance en cm : "); // nouvelle prise de mesure
    Serial.println(cm);
    delay(1000);

    for (pos = 45; pos <= 102; pos += 1) { // retour à la position de départ
    // in steps of 1 degree
    myservo.write(pos);
    delay(10);
    }
    }








  12. 10) Si tout est fonctionnel, nous pouvons ajouter le module Bluetooth et le câbler de la manière suivante :

    State : non câblé
    Rxd : Entrée digitale arduino (1)
    Txd : Entrée digitale arduino (0)
    Gnd : à la masse
    Vcc : +5V
    Key : non câblé



  13. 11) Paramétrisation de l'application Bluetooth

    J'ai choisi comme application BlueTooth Serial Controller sur Android.

    Il est nécessaire de modifier les paramètres et d'obtenir le même résultat que la photo.

    Dans les paramètres de l'application il faut donc changer le nom, la commande et la visibilité pour chaque bouton.

    Voici les commandes à mettre pour chaque bouton :

    - Avancer : 1
    - Reculer : 2
    - Pause : 0
    - Gauche : 4
    - Droite : 3
    - Auto : 5
  14. 12) Code de test du module Bluetooth




    #include

    SoftwareSerial Genotronex(0,1);

    int ledpin = 13;

    int BluetoothData;

    void setup() {
    Genotronex.begin(9600);
    Genotronex.println("Bluetooth On please press 1 or 0 blink LED ..");
    pinMode(ledpin,OUTPUT);
    }

    void loop() {
    if(Genotronex.available()){
    BluetoothData= Genotronex.read();
    if(BluetoothData=='1'){
    digitalWrite(ledpin,1);
    Genotronex.println("LED On D13 ON ! ");
    }
    if(BluetoothData=='0'){
    digitalWrite(ledpin,0);
    Genotronex.println("LED On D13 OFF ! ");
    }
    }
    delay(100);
    }



    Il faut donc appuyer sur le bouton pause et avancer pour éteindre et allumer la LED de l'Arduino !
  15. 13) Il est possible d'ajouter 2 LEDS à l'arrière du robot qui permet d'indiquer le moment où le robot réfléchit. Cela tombe bien car il reste une broche libre sur l'Arduino (2).

    Les LEDS de 5 ou 3mm se fixent parfaitement sur la base roulante. Il faudra rajouter une résistance en série des 2 LEDS en fonction des tensions des LEDS.

    Exemple : 2 leds de 2.2V et 20mA

    R=(U/I)= (Tension_alimentation - Chute_tension)/I = (5-4.4)/20mA = 30 Ohms

  16. 14) Software final permettant de contrôler le robot ou de le laisser en mode autonome (les commentaires se trouvent dans le code)



    #include
    #include


    Servo myservo;


    int pos = 0; // déclaration des pins, variables
    int trig = 4;
    int echo = 8;
    long lecture_echo;
    long cm;
    long cm1;
    long cm2;
    const int rd = 7;
    const int rde = 5;
    const int rg = 12;
    const int rge = 13;
    const int vrd = 3;
    const int vrde = 6;
    const int vrg = 10;
    const int vrge = 11;
    const int led = 2;
    int choix = 0;

    SoftwareSerial Genotronex(0,1);
    int BluetoothData;

    void setup() {
    myservo.attach(9); // définition du mode des broches
    pinMode(trig, OUTPUT);
    digitalWrite(trig, LOW);
    pinMode(echo, INPUT);
    pinMode(rd, OUTPUT);
    pinMode(rde, OUTPUT);
    pinMode(rg, OUTPUT);
    pinMode(rge, OUTPUT);
    pinMode(vrde, OUTPUT);
    pinMode(vrd, OUTPUT);
    pinMode(vrg, OUTPUT);
    pinMode(vrge, OUTPUT);
    pinMode(led, OUTPUT);
    Serial.begin(9600);
    digitalWrite(vrde, LOW);
    digitalWrite(vrd, LOW);
    digitalWrite(vrge, LOW);
    digitalWrite(vrg, LOW);
    Genotronex.begin(9600);
    }

    void loop() {

    myservo.write(102);
    digitalWrite(led, LOW);
    if(Genotronex.available() || choix ==2){ // si une donnée provient de l'USB ou le mode auto est activé on lit la donnée
    BluetoothData= Genotronex.read();

    if(BluetoothData=='0' && choix == 0){ // le robot se stoppe

    digitalWrite(vrde, LOW);
    digitalWrite(vrd, LOW);
    digitalWrite(vrge, LOW);
    digitalWrite(vrg, LOW);

    }

    if(BluetoothData=='2' && choix == 0){ //reculer

    digitalWrite(rd, LOW);
    digitalWrite(rde, HIGH);
    digitalWrite(rg, LOW);
    digitalWrite(rge, HIGH);
    digitalWrite(vrde, HIGH);
    analogWrite(vrd, 250);
    digitalWrite(vrge, HIGH);
    digitalWrite(vrg, HIGH);

    }

    if(BluetoothData=='1' && choix == 0){ // avancer

    digitalWrite(rd, HIGH);
    digitalWrite(rde, LOW);
    digitalWrite(rg, HIGH);
    digitalWrite(rge, LOW);
    analogWrite(vrde, 250);
    analogWrite(vrd, 250);
    digitalWrite(vrge, HIGH);
    digitalWrite(vrg, HIGH);

    }


    if(BluetoothData=='3' && choix ==0){ // tourner droite

    digitalWrite(rd, HIGH);
    digitalWrite(rde, LOW);
    digitalWrite(rg, LOW);
    digitalWrite(rge, HIGH);
    digitalWrite(vrde, HIGH);
    digitalWrite(vrd, HIGH);
    digitalWrite(vrge, HIGH);
    digitalWrite(vrg, HIGH);

    }


    if(BluetoothData=='4' && choix ==0){ // tourner gauche

    digitalWrite(rd, LOW);
    digitalWrite(rde, HIGH);
    digitalWrite(rg, HIGH);
    digitalWrite(rge, LOW);
    digitalWrite(vrde, HIGH);
    digitalWrite(vrd, HIGH);
    digitalWrite(vrge, HIGH);
    digitalWrite(vrg, HIGH);
    }


    }

    if(BluetoothData=='5' || choix ==2){ // mode auto, le fait de changer la valeur d'une variable permet de reboucler la fonction
    choix == 2;

    digitalWrite(rd, HIGH); // avance linéaire du robot
    digitalWrite(rde, LOW);
    digitalWrite(rg, HIGH);
    digitalWrite(rge, LOW);
    myservo.write(102);
    analogWrite(vrde, 250);
    analogWrite(vrd, 250);
    digitalWrite(vrge, HIGH);
    digitalWrite(vrg, HIGH);
    digitalWrite(trig, HIGH);
    delayMicroseconds(10);
    digitalWrite(trig, LOW);
    lecture_echo = pulseIn(echo, HIGH);
    cm = lecture_echo / 58;
    Serial.print("Distance en cm : ");
    Serial.println(cm);
    delay(1);

    if(cm <= 50){ // si robot détecte un obstacle il fait sa routine (recule, regarde droite puis gauche et choisit son chemin)
    digitalWrite(vrde, LOW);
    digitalWrite(vrd, LOW);
    digitalWrite(vrge, LOW);
    digitalWrite(vrg, LOW);
    digitalWrite(rd, LOW);
    digitalWrite(rde, HIGH);
    digitalWrite(rg, LOW);
    digitalWrite(rge, HIGH);
    delay(2000);
    digitalWrite(led, HIGH);
    digitalWrite(vrde, HIGH);
    analogWrite(vrd, 250);
    digitalWrite(vrge, HIGH);
    digitalWrite(vrg, HIGH);
    delay(400);
    digitalWrite(vrde, LOW);
    digitalWrite(vrd, LOW);
    digitalWrite(vrge, LOW);
    digitalWrite(vrg, LOW);
    delay(1000);


    myservo.write(160); // regarde à droite


    delay(1000);
    digitalWrite(trig, HIGH);
    delayMicroseconds(10);
    digitalWrite(trig, LOW);
    lecture_echo = pulseIn(echo, HIGH);
    cm1 = lecture_echo / 58;
    Serial.print("Distance en cm : ");
    Serial.println(cm1);
    delay(200);


    myservo.write(40); // regarde à gauche


    delay(1000);
    digitalWrite(trig, HIGH);
    delayMicroseconds(10);
    digitalWrite(trig, LOW);
    lecture_echo = pulseIn(echo, HIGH);
    cm2 = lecture_echo / 58;
    Serial.print("Distance en cm : ");
    Serial.println(cm2);
    delay(300);


    myservo.write(102); // revient au centre
    delay(100);


    if (cm1 < cm2){ // comparaison des valeurs à droite et gauche puis tourne en fonction des obstacles
    digitalWrite(vrde, LOW);
    digitalWrite(vrd, LOW);
    digitalWrite(vrge, LOW);
    digitalWrite(vrg, LOW);
    digitalWrite(rd, LOW);
    digitalWrite(rde, HIGH);
    digitalWrite(rg, HIGH);
    digitalWrite(rge, LOW);
    delay(2000);
    digitalWrite(vrde, HIGH);
    digitalWrite(vrd, HIGH);
    digitalWrite(vrge, HIGH);
    digitalWrite(vrg, HIGH);
    delay(300);
    }
    else {
    digitalWrite(vrde, LOW);
    digitalWrite(vrd, LOW);
    digitalWrite(vrge, LOW);
    digitalWrite(vrg, LOW);
    digitalWrite(rd, HIGH);
    digitalWrite(rde, LOW);
    digitalWrite(rg, LOW);
    digitalWrite(rge, HIGH);
    delay(2000);
    digitalWrite(vrde, HIGH);
    digitalWrite(vrd, HIGH);
    digitalWrite(vrge, HIGH);
    digitalWrite(vrg, HIGH);
    delay(300);
    }
    digitalWrite(vrde, LOW);
    digitalWrite(vrd, LOW);
    digitalWrite(vrge, LOW);
    digitalWrite(vrg, LOW);
    delay(2000);
    digitalWrite(led, LOW);
    }
    }
    }



    Merci à vous de m'avoir suivi et si vous avez des questions, n'hésitez pas !

    A+ les amis makers !

    Vince574,
Réalisé par
Posté le
Univers
Robotique & RC
Temps de fabrication
1/2 journée
Niveau de difficulté
Débutant
Matériel(s)
1
Châssis roulant pour robot Joy-it Arduino-Robot Car Kit
1
Arduino UNO
2
Circuit intégré L293D (ou compatible)
1
Une platine d'expérimentation
Outils
1
Fer à souder
1
Multimètre
1
Tournevis

3 commentaires

  1. zouck57 said on mai 23, 2018

    Super Vince574 un très beau projet ! Avec des explications claires et structurées =)

  2. Salut @Vince574 !
    Merci pour ton tuto, il est complet!

  3. Super Vince. Claire et bien expliqué.

    Bonne chance pour la suite.

Vous devez être connecté pour laisser un commentaire.