Robot sur deux roues / Self-balancing robot
Channel: birdyberth
Date: 2013-01-18

Voici mon prototype de robot sur deux roues. Il n'est pas achevé, mais je vous le présente tout de même, parce que premièrement, j'ai mis beaucoup de temps dessus, et deuxièmement, je commence à être écœuré de mettre du temps dessus. Pourquoi ne pas prendre une petite pause, relaxer, publier cette vidéo, passer à d'autres expériences divertissantes et revenir finaliser éventuellement cette merveille technologique qu'est ce robot lorsque j'aurai trouvé des solutions aux derniers problèmes qu'il lui reste?
Parce que donner l'équilibre à un robot, il faut le faire! Et j'y suis presque parvenu... À vous de juger du résultat.
On ne s'en rend pas trop compte, nous qui l'avons de façon innée, mais l'équilibre est un constant réajustement. Il aime la douceur, il ne faut surtout pas le forcer. Bon, assez philosophé!
Pour construire ce robot, j'ai utilisé un Memsic 2125, qui est un accéléromètre à 2 axes. Mon robot n'utilise qu'un seul axe, ce qui simplifie le programme. Cet accéléromètre a la particularité de coder l'accélération sous la forme d'un rapport cyclique (duty cycle) d'un signal carré de 100 Hz. Une accélération nulle sur l'axe donne un rapport cyclique de 50%. 
Mon robot se sert de la valeur de l'accélération pour déterminer sa position dans l'espace. Ainsi, lorsqu'il lit une accélération de 0 G, il sait qu'il est droit; avec une accélération proche de +/- 1G, il sait qu'il est complètement couché. La valeur est en fait la projection de l'accélération gravitationnelle sur un axe qui est en tout temps horizontal au robot.
C'est bien beau connaître cette accélération, mais encore faut-il savoir quoi en faire! Pour cela, il y a mon microcontrôleur (un Basic Stamp 2) qui exécute un petit programme que j'ai concocté. Tout d'abord, rien ne se passe tant que je n'appuie pas sur le bouton de calibrage. Une fois ceci effectué, le programme fait une première lecture de l'accélération et la stocke dans une variable. Comme je l'explique dans la vidéo, cette commande mesure le temps passé à l'état haut; puisque la fréquence est constante, on peut en déduire facilement le rapport cyclique (mais on n'a pas besoin de le faire). Il en résulte un nombre (l'exemple de 2682 est réaliste, d'habitude mes valeurs de calibrage tournent autour de ça). Pour retrouver le temps, il faut multiplier ce nombre par 2us; dans notre cas, cela donnerait 5364 us, donc un rapport cyclique de 53,64% (encore une fois, ces calculs sont superflus et ne sont pas dans le code, c'est juste pour donner une idée). L'accéléromètre n'est donc pas parfaitement horizontal.
Par la suite, le microcontrôleur va comparer sans cesse les valeurs subséquentes d'accélération avec la valeur de référence. Si c'est plus grand, il va envoyer un état haut dans un fil, si c'est plus petit, il enverra un état haut dans un second fil. Ces deux fils contrôlent un H-Bridge (pont H?), qui permet d'inverser le sens de rotation du moteur. Donc, en résumant, lorsque le robot est penché, l'accéléromètre va le détecter, puis le programme va réagir en faisant tourner les roues, ce qui va produire un moment de force de sens inverse à celui de la gravité et permet (plus en théorie qu'en pratique) de rétablir l'équilibre du robot. 
En réalité, quand j'ai construit mon robot, je me suis rendu compte que ça ne marchait vraiment pas bien, puisqu'au moindre déséquilibre, le moteur envoyait valser le robot dans l'autre direction; il avait plus tendance à fuir l'équilibre qu'autre chose. J'ai donc rajouté un PWM (Pulse Width Modulation) (Modulation de largeur d'impulsion?), qui contrôle la puissance fournie au moteur en fonction de l'inclinaison. Ainsi, une faible variation entraîne une faible réponse; le robot est moins agressif et un peu plus enclin à retrouver l'équilibre (mais ça ne s'approche vraiment pas de la perfection).
Parmi les améliorations à apporter, il y aurait un meilleur bloc moteur, avec moins de jeu dans les engrenages, ensuite l'utilisation d'un gyroscope au lieu d'un accéléromètre (ou encore mieux, d'un gyroscope ET d'un accéléromètre). Bref, il me reste encore bien du plaisir en perspective! ;-)