[Projet] Réalisation d'un robot de A à Z

Bonjour à tous,

Cela fait maintenant quelque temps que j'ai découvert ces formidables choses que sont les cartes Arduino !

Comme tout bon débutant je suis passé par les cases "Eskimon",OpenClassRoom,...

J'ai ensuite réalisé quelques petits projets simples : un automate qui allumait ma Senseo à l'heure souhaitée (je parle au passé car la carte est désormais sur mon robot) et un frein à main pour mon volant T300RS qui fonctionne avec un arduino nano, un bouton poussoir , un servo moteur et une led et est fonctionnel à 100% :slight_smile: .

Je me lance aujourd'hui dans un projet plus conséquent, la réalisation d'un robot.

Quelques liens valent mieux qu'une longue description voici donc le matériel de base que j'utilise :

Chassis

Carte de contrôle moteurs

Ainsi qu'un arduino UNO R3.

Les objectifs que je me suis fixés à plus ou moins long terme sont :

  • Une première phase d'initiation, avec utilisation de différents capteurs et moyens de contrôles
  • Créer une interface PC (via bluetooth) pour contrôler et recevoir des infos du robot
  • Faire en sorte que mon robot se repaire dans un plan 2D (une pièce)
  • Intégrer des applications de domotiques (gestion des éclairages, volets électriques, ...

Evidemment cette liste n'est pas fixe et évoluera certainement avec le temps.

Le but de se Topic est donc dans un premier temps de partager mon projet (OpenSource <3) mais aussi de demander des conseils lors de la réalisation.

Je posterais très prochainement le code ainsi que le schéma de câblage du montage que j'ai fait pour contrôler les moteurs avec un Joystick.

Pour le fun je met une petite photo du châssis assemblé.

Chose promise chose due, voici le code qui me permet de contrôler mon robot avec un seul Joystick :

#define VITESSED 5                    //Pin 5 = Vitesse du moteur droit (pwm)
#define DIRECTIOND 4                  //Pin 4 = Direction du moteur droit 
#define VITESSEG 9                    //Pin 9 = Vitesse du moteur gauche (pwm)
#define DIRECTIONG 8                  //Pin 8 = Direction du moteur gauche 
#define JOYSTICK1 0                   //Pin A0 = Axe x joystick 
#define JOYSTICK2 1                   //Pin A1 = Axe y joystick 

long temps = 0;


void setup() {
  pinMode(VITESSED,OUTPUT);
  pinMode(DIRECTIOND,OUTPUT);  
  pinMode(VITESSEG,OUTPUT);
  pinMode(DIRECTIONG,OUTPUT);  
  digitalWrite(VITESSED,LOW);
  digitalWrite(VITESSEG,LOW);
  Serial.begin(9600);
}

void loop() {
  
ControleJoystick();

}


void ControleJoystick(){                                                                                  //Fonction de lecture du joystick

  int valJoystickVitesse,valJoystickDirection;
  unsigned char vitesse;
  
  valJoystickVitesse = analogRead(JOYSTICK1); 
  valJoystickDirection = analogRead(JOYSTICK2);  
    
  if((valJoystickVitesse < 495) && (503 < valJoystickDirection < 507)) {                                  //RECUL
      vitesse = map(valJoystickVitesse,501,0,0,255);
      Bouge (vitesse,1,1);  
      }
      else {
          if ((valJoystickVitesse > 505) && (503 < valJoystickDirection < 507)){                          //AVANCE
              vitesse = map(valJoystickVitesse,501,1024,0,255);     
              Bouge(vitesse,0,0);
              }
              else {
                  if(( valJoystickDirection < 500 ) && (498 < valJoystickVitesse < 502)) {                //TOURNE A GAUCHE
                      vitesse = map(valJoystickDirection,501,0,0,255);     
                      Bouge(vitesse,0,1);
                      }
                      else {
                          if(( valJoystickDirection > 510 ) && (498 < valJoystickVitesse < 502)) {        //TOURNE A GAUCHE
                              vitesse = map(valJoystickDirection,501,0,0,255);     
                              Bouge(vitesse,1,0);
                              }
                              else {
                                  Stop();
                                  }                               
                      }
               } 
        }
            
  if(millis()-temps>2000){                                                                                //AFFICHAGE DES VARIABLES
      Serial.print ("Val joystick vitesse : ");
      Serial.println (valJoystickVitesse);
      Serial.print ("Val joystick direction : ");
      Serial.println (valJoystickDirection);
      Serial.print ("Vitesse : ");
      Serial.println (vitesse);
      temps = millis();
      }
}

void Bouge (unsigned char vitesse, bool DirMoteurG, bool DirMotorD){                                    //FONCTION QUI ACTIVE LES MOTEURS
   analogWrite(VITESSED,vitesse);
   analogWrite(VITESSEG,vitesse);
   digitalWrite(DIRECTIOND,DirMoteurG);
   digitalWrite(DIRECTIONG,DirMotorD);
  
}

void Stop (){                                                                                           //FONCTION QUI ARRETE LES MOTEURS
    analogWrite(VITESSED,LOW);              
    analogWrite(VITESSEG,LOW); 
}

Je suis ouvert à toutes propositions pour l'optimisation de celui-ci (temps d’exécution, mémoire,...) même si il s'agit d'un code simple autant corriger mes erreurs dés le début !

De plus je rajoute le schéma d'alimentation de l'arduino et du shield (ATTENTION le shield représenté n'est pas celui que j'ai réellement et les infos sur la batterie ne correspondent pas à mes besoins) le but est juste de montrer l'idée.

L'idée du montage est d'alimenter le robot via une batterie en position 1 et de l'éteindre en position 2, position qui permet aussi de brancher le robot via usb (pour les essais). Je suis, là aussi, ouvert à toutes propositions !

Alimentation_avec_batterie.pdf (309 KB)

Le but de se Topic est donc dans un premier temps de partager mon projet

Bonjour,
bonne initiative, bienvenue !

concernant l'alim, y a-t-il assez de puissance au niveau de l'USB pour faire fonctionner le robot ?
si la batterie est une lipo, quelles précautions sont prévues ?

concernant l'alim, y a-t-il assez de puissance au niveau de l'USB pour faire fonctionner le robot ?
si la batterie est une lipo, quelles précautions sont prévues ?

Bonjour,

Le montage avec la batterie n'est pas encore réalisé.
Actuellement j’alimente le shield et l'arduino par usb mais sur deux ports différents, cela fonctionne bien.

Par contre dans cette configuration le robot est surélevé donc le courant tiré par les moteurs doit être proche du courant de fonctionnement à vide (300mA) je n'ai pas mesuré cette valeur.

A noté aussi que la position 2 permet d'avoir soit un mode OFF soit un mode "test" (avec robot surélevé) si on branche les câbles USB.

Par contre pour la lipo je me pose encore des questions, le nimh me parait envisageable aussi. Ce qui est sur c'est que le compartiment qui me servira pour la batterie est situé dans le châssis, à coté du shield, je dispose d'un volume d'environ 120 x 40 x 50 (mm).
Donc si je met une lipo celle-ci sera protégée des chocs, par contre je me demande si tout ça ne risque pas de chauffer...

Jaymalodoi:
Par contre pour la lipo je me pose encore des questions, le nimh me parait envisageable aussi. Ce qui est sur c'est que le compartiment qui me servira pour la batterie est situé dans le châssis, à coté du shield, je dispose d'un volume d'environ 120 x 40 x 50 (mm).
Donc si je met une lipo celle-ci sera protégée des chocs, par contre je me demande si tout ça ne risque pas de chauffer...

si la batterie est une lipo, quelles précautions sont prévues ?

Bonjour,

A propos des précautions, pour une lipo la question se pose.

  • Le risque principal est électrique, batterie surchargée ou trop déchargée.
    Concernant la décharge, il faut que la tension de la batterie soit contrôlée de façons à couper l'alimentation par batterie en cas de tension trop basse. C'est l'arduino qui doit se charger de cela.
    Concernant le risque de surcharge, c'est le chargeur qui doit gérer cela.
    Concernant l'échauffement, normalement une batterie lipo correctement dimensionnée ne doit pas tant chauffer que cela. Il sera utile de connaître la conso de l'ensemble pour faire ce choix; d'autant que l'autonomie doit elle aussi être prévue. Mais une bonne batterie lipo possède de très bonnes capacités a la décharge rapide. (par ex pour une petite batterie de 1000 mAh, une décharge à 10A est facilement envisageable)
  • Maintenant la protection contre les chocs n'est pas si critique que cela si on prend un minimum de précautions. (je pratique l'aéromodélisme électrique, nous utilisons des batteries lipos et les chocs existent ..... on appelle cela des crashs :slight_smile: )

Serge .D

Concernant la décharge, il faut que la tension de la batterie soit contrôlée de façons à couper l'alimentation par batterie en cas de tension trop basse. C'est l'arduino qui doit se charger de cela.

Bonjour,

Merci pour ces informations ! J'avais effectivement lu qu'il fallait faire attention à la charge et à la décharge mais je n'avais pas pensé à contrôler le niveau de décharge avec l'arduino. Je n'ai encore jamais essayé de lire une tension avec la carte je vais me renseigner sur le sujet.

Il sera utile de connaître la conso de l'ensemble pour faire ce choix; d'autant que l'autonomie doit elle aussi être prévue. Mais une bonne batterie lipo possède de très bonnes capacités a la décharge rapide. (par ex pour une petite batterie de 1000 mAh, une décharge à 10A est facilement envisageable)

Je pensais partir sur une batterie de 7,2v, ce modèle me semble intéressant mais il n'y a pas d'indication sur les dimensions...

Pour la consommation de l'ensemble mon raisonnement est le suivant (dites moi si je me trompe) : les deux moteurs ont un courant de décrochage de 4A si ils sont alimentés en 6V, donc environ 5A avec une batterie de 7.2V pour l'arduino je ne pense pas qu'il tire beaucoup plus que 500mA.

La consommation maximum du circuit est donc de 10.5A environ.

Pour connaître la capacité de décharge rapide il faut bien regarder le coefficient "C" de la batterie et le multiplié par la capacité ?

exemple : batterie 40C, 1000mAh, la capacité de décharge rapide est de 40x1000=40000mA donc 40A ?

Bonjour,
il faudrait avoir la fiche technique de la batterie, la moindre des choses à ce prix ...

il faudrait avoir la fiche technique de la batterie, la moindre des choses à ce prix ...

Je viens de demander la fiche technique sur le site. L'une de mes contraintes est que je ne compte pas sortir la batterie du robot pour chaque charge, je préfère donc choisir une batterie qui à une bonne capacité (donc plus chère) pour ne pas être trop limité par l'autonomie du robot.

Si on regarde sur internet les prix peuvent aller du simple au double pour des batteries qui semblent avoir les mêmes caractéristiques, je suis un peu perdu.
A noter que d'avoir une "jolie batterie imitation carbone" n'est pas ma priorité :wink: j'imagine que certaines marques n'hésitent pas à faire payer le prix fort pour une batterie un peu plus design.

J'ai commencé aujourd'hui à essayer de faire fonctionner un module bluetooth HM-10.

J'ai commencé par réaliser le montage présenté ICI en alimentant le module en 5V.

Hors je viens de voir sur cette datasheet que le module devait être alimenté en 3.3V ...

Après avoir corrigé le montage j'ai essayé le code suivant :

#include <SoftwareSerial.h>

SoftwareSerial maConnection(0, 1); //RX|TX


void setup(){
  Serial.begin(9600);
  maConnection.begin(9600); // default baud rate
  Serial.println("AT commands: ");
}

void loop(){
  maConnection.println("Hello World !");
  delay(1000);
}

Pas de soucis je reçois bien un "Hello World !" dans le moniteur.

Le problème se pose quand je test ce programme :

#include <SoftwareSerial.h>

SoftwareSerial maConnection(0, 1); //RX|TX


void setup(){
  Serial.begin(9600);
  maConnection.begin(9600); // default baud rate
  Serial.println("AT commands: ");
}

void loop(){
  //read from the HM-10 and print in the Serial
  if(maConnection.available())
    Serial.write(maConnection.read());
    
  //read from the Serial and print to the HM-10
  if(Serial.available())
    maConnection.write(Serial.read());
}

Quand je saisie la commande AT le moniteur me renvoie "Aÿ" si je test avec la commande AT+ADDR? il me retourne "AVúþ"... Bref il est perdu et moi aussi :stuck_out_tongue:

Pour information : je peux voir le module et l'associé sur mon téléphone Android mais il n'est pas reconnu sur les applications comme "Arduino Bluetooth" ou "BlueSerial Beta" le message d’erreur sur cette dernière est "Could not connect to device. Is it a Serial device? Also check if the UUID is correct in the settings".

J'ai pas mal fouillé sur internet et sur le forum mais pour l'instant je n'ai trouvé aucune solution ...

Jaymalodoi:
Je viens de demander la fiche technique sur le site. L'une de mes contraintes est que je ne compte pas sortir la batterie du robot pour chaque charge, je préfère donc choisir une batterie qui à une bonne capacité (donc plus chère) pour ne pas être trop limité par l'autonomie du robot.

Si on regarde sur internet les prix peuvent aller du simple au double pour des batteries qui semblent avoir les mêmes caractéristiques, je suis un peu perdu.
A noter que d'avoir une "jolie batterie imitation carbone" n'est pas ma priorité :wink: j'imagine que certaines marques n'hésitent pas à faire payer le prix fort pour une batterie un peu plus design.

Bon, j'ai du mal à suivre ...
j'étais parti sur du lipo, sur le lien je vois du NimH ???

Pour définir une batterie il y a plusieurs choses à connaître :

  • la capacité en Ah
  • La tension nominale en volts
  • Le taux de décharge (nombre de "C") Généralement peu communiqué pour du NimH. Pour une conso importante (moteur) ce paramètre est nécessaire.
    La masse est directement liée à la capacité et la tension.

Quand aux prix, les batteries lipos sont quasi toutes fabriquées en asie et les prix (à performances égales) varient beaucoup avec les fournisseurs.

Une caractéristique intéressante pour le lipo est que la tension est en relation directe avec la capacité restante pour une précision très correcte, ce qui n'est pas le cas pour le Nimh.

Serge .D

Bon, j'ai du mal à suivre ...
j'étais parti sur du lipo, sur le lien je vois du NimH ???

Oups... c'est une erreur de ma part, j'ai consulté le site dans la catégorie LIPO et j'ai dérivé sur un lien "Batterie + chargeur" j'avoue que j'ai lu la fiche technique en diagonal...

Donc pas de malentendu, je part bien sur une LIPO.

J'ai consulté votre lien, le prix est bien plus attractif ! je vais regarder si je trouve un chargeur qui correspond.

Bon... J'ai enfin réussi à me dépatouiller avec le module Bluetooth HM-10, qui est en fait un BLE (Bluetooth Low Energy) une technologie intéressante mais encore peu utilisée.

J'ai réussi à le paramétrer via l'arduino avec les commandes AT et à communiquer avec lui grâce à une appli android que j'ai créée avec MIT app inventor 2.

Etant donné le peu d'informations que j'ai trouvé je me demande si il ne serait pas utile de faire un sujet dans la partie tutoriels et cours (Titre du sujet : Communication Android (App Inventor) / Bluetooth Low Energy / Arduino).
Dois-je demander l'autorisation avant d'écrire dans cette partie du forum ?

Bonjour,
ce sera toujours mieux que rien !
tu peux faire ton tuto en précisant ses limitations, s'il y en a