Cet article est le troisième de la série « Un robot arduino« . Je relate ici comment j’ai fait pour transformer la plateforme du NoRobo en un « robot » comparable à une voiture télécommandée, dirigé par l’action d’un joystick d’une application Android sur un téléphone.
Prototypage avec des leds
J’ai d’abord essayé de faire un programme utilisant l’application android Joystick Bluetooth commander directement pour le NoRobo. Mais je me suis heurtée à des dysfonctionnements majeurs. J’ai donc fait un prototype plus simple, avec des led.
Sur un breadbord, montage de 4 leds de couleurs différentes, chacune avec 330 ohms sur son côté positif et d’un module bluetooth HC-05. RX et TX du HC-05 sont respectivement connectés à TX et RX de l’arduino. Les 4 leds sont connectées aux broches 8, 9,10 et 11 de l’arduino.
Le programme est disponible ici (Joystick-BT-LED-2016-04-04 (ino)) ou sur GitHub.
J’ai eu beaucoup de difficultés :
- à comprendre qu’il faut que des variables changent lors de l’action des boutons car sinon on peut se trouver avec plusieurs leds allumées simultanément (ce qui pour mon NoRobo signifie qu’il reçoit simultanément l’ordre d’avancer et de reculer…).
- à comprendre que je devais faire fonctionner des interrupts pour qu’il soit possible de réagir à chaque action d’un bouton, même si j’évitais soigneusement les delay() dans la boucle et les différentes fonctions.
Avec les leds ça fonctionne depuis que les interrupts sont dans le programme. Je vais donc mettre en oeuvre ce que j’ai appris sur le NoRobo !
Le NoRobo avance et recule au joystick !
Partant de ce que j’ai appris avec les leds, j’ai entrepris d’adapter le programme de test des leds (ci-dessus) pour qu’il commande des moteurs DC. Mon objectif était seulement (!) de faire en sorte qu’il avance et recule sur commande du joystick. Et l’objectif est atteint !
Le programme complet est téléchargeable ici (NoRobo-Joystick-BT-commander-2016-04-05.ino) ou sur GitHub ici.
Un extrait intéressant :
void PID_and_motor_comd() { //adjust motors to turn robot MotorPower = map(abs(joyY), 0, 100, 0, 255); if (MotorPower > 255) MotorPower = 255; R_Speed = MotorPower; L_Speed = MotorPower; if(joyY>0) { Robot_Direction = true ; }else { Robot_Direction = false ; } //run motors MoveMotors(R_Motor, Robot_Direction, R_Speed); // always forward (true) MoveMotors(L_Motor, Robot_Direction, L_Speed); // always forward (true) }
Pour transformer le degré d’avance (ou recul) du joystick en une vitesse, j’ai utilisé la fonction map() d’arduino : MotorPower = map(abs(joyY), 0, 100, 0, 255); dit que MotorPower est égal à la valeur de la valeur absolue – sans signe – de joyY (la position en Y du joystick) mais que sa valeur doit être modifiée pour aller de 0 à 255 plutôt que 0 à 100.
Et la direction du mouvement est indiquée par le signe de joyY : si négatif, le NoRobo doit reculer et Robot_Direction = false.
Faire tourner le NoRobo…
Il faut maintenant que les ordres donnés aux moteurs permettent de faire tourner le robot lorsque le joystick est déplacé en x.
Comme depuis le début, je suis partie du programme du robot à balancier de ce tutoriel du Gimbal Balancing Robot.
Comme mon NoRobo n’a pas de gyroscope, utilise des moteurs « brush » et non « brushless » et n’a pas la capacité à tenir « debout sur deux roues », les commandes des moteurs sont sensiblement différentes.
Dans le programme du Gimbal balancing robot, on trouve les trois lignes suivantes :
//adjust motors to turn robot rot_Speed = - 0.3 * joyX; R_Speed += rot_Speed; L_Speed -= rot_Speed;
On notera que c’est l’équivalent de
L’idée générale est d’accélérer un moteur et d’en décélérer un autre en fonction de la position du joystick en x pour que le NoRobo tourne à gauche lorsque joyX < 0 et à droite dans l’autre cas.
R_speed | L_speed | Tourne à | |
joyX > 0 donc rot_Speed < 0 | Diminue | Augmente | Droite |
joYX < 0 et donc rot_Speed > 0 | Augmente | Diminue | Gauche |
J’ai tout simplement recopié ce code dans le mien pour voir ce qui se passait. Et mon robot tourne maintenant à droite et à gauche !
J’en ai également profité pour introduire une variable MAX_POWER qui définit la vitesse maximale du robot. Pour l’instant elle est fixée à 150 (pour un maximum de 255).
Et voilà à ce stade le programme arduino est celui-ci : NoRobo-Joystick-BT-commander-2016-04-07.ino, (disponible également sur GitHub ici).
Et maintenant ?
Pour une raison que je ne comprends pas, le robot tourne sur lui-même en sens inverse des aiguilles d’une montre à l’initialisation.
Il faut donc déboguer ça puis poursuivre les améliorations. Ce sera l’objet du prochain article de cette série Un robot arduino.