Robot
Conception :
Nous souhaitons réaliser un robot de compagnie muni de 4 pattes (cuisse + mollet), chacune des pattes est équipée de 2 moteurs (bassin et genou).
Le robot devrait coûter moins de 50€ et être relativement solide (il faut quand même éviter de marcher dessus :-)
Le robot est réalisé à partir d'un profilé aluminium (de fenêtre) de 78x38 coupé à une longueur de 210mm.
(Sur la photo, le profilé n'est pas encore découpé)
Ce profilé est muni de 4 moteurs (hauts) pas à pas avec réducteur fixé chacun par 2 vis M4 et écrou. Ce sont des petits moteurs pas à pas économiques (on peut en trouver 10 pour une vingtaine d'euros avec leurs cartes de commande ULN2003)
Ces moteurs sont très économiques et munis d'un réducteur mais le couple fourni en 5V est vraiment faible, insuffisant pour faire marcher le robot, même avec des cuisses et des mollets courts.
Heureusement, les cartes ULN2003 (livrées avec) sont munis d'un switch qui réunit le commun du moteur au +5V. Il faut ôter le switch et réunir tous les communs des moteurs à la sortie d'un convertisseur +5V->8V ou 9V réglable. Le convertisseur fourni 5A. A noter que l'informatique est conçu pour ne jamais alimenter plus de 2 moteurs en même temps. (Avec les réducteurs, ces moteurs pas à pas sont "irréversibles" et le robot ne va pas s'affaisser sur ses pattes si on coupe un moteur. cette "irréversibilité a de nombreux avantages :
On diminue énormément la consommation (d'un facteur 5 environ)
On limite la température des moteurs, ce qui permet d'augmenter la tension du convertisseur pour atteindre un couple et une vitesse suffisants
On augment énormément l'autonomie
On diminue la taille et donc le poids du Powerbank que le robot doit porter sur son dos
En théorie, les moteurs fonctionnent en 12V mais les moteurs pas à pas, c'est à peu près increvable (ce n'est pas le cas du réducteur avec ses pignons en plastique). En théorie, si on alimente les moteurs en 12V, les bobines vont surchauffer. Mais nous avons vu que seuls 0, 1 ou 2 moteurs sont alimentés en même temps. Ce qui fait que la puissance moyenne d'un moteur (autour de 0.5W) et donc son échauffement est très peu élevé.
Chaque moteur est donc piloté par un ULN2003 (livré avec) et un PCF8574 (non livré avec) en I2C.
ATTENTION : à la mise sous tension, par défaut les PCF8574 sont en entrée à l'état haut avec un pull-up. Ils actionnent donc toutes les entrées de l'ULN2003 : tous les transistors sont saturés et toutes les bobines des 8 moteurs sont activées. Ce qui fait beaucoup de courant : environ 8A ! Conclusion : à la mise sous tension, pendant , mettons une seconde environ : le temps d'initialiser l'I2C et mettre les 4 PCF à 0, le courant est très important. Le convertisseur (qui alimente les ULN2003 mais pas l'Arduino, va probablement s'écrouler. Il faut s'assurer qu'une fois le courant revenu à la normale, il reparte seul. Sinon il faut ajouter une électronique de temporisation
Chaque moteur est muni d'une tôle aluminium 10x2 découpée et percée,(la cuisse) fixée sur un embout vissé sur l'axe du moteur. Avec un entraxe de 25. Au bout de la cuisse est fixé le même type de moteur (bas) tourné vers l'extérieur (le genou) sur l'axe duquel est fixé un embout avec une vis M4 pour bloquer l'axe, une tige filetée M4X20 muni de deux écrous.
Les cuisses et les mollets ne doivent pas être trop longs pour ne pas exiger un couple trop important aux moteurs (petits mais démultipliés 64 fois).
Les fils du moteur du genou sont fixés à la cuisse et commandés de la même manière avec un ULN2003 et le même PCF8574 en I2C. Tous les PCF8574 sont reliés en bus I2C à un Arduino Nano 33BLE (un Arduino Nano muni d'un Bluetooth et d'accéléromètres 3 axes et d'un magnétomètre). Il est monté à l'avant du robot, prise USB à l'avant pour la programmation : le cerveau.
Tout ça est relié à un bloc batterie muni d'une entrée USBC pour la charge et d'un convertisseur 5V qui alimente l'électronique et les moteurs via embase USB standard.
Le robot est muni "d'yeux" : un capteur à Ultrason Arduino qui indique la distance (jusqu'à environ 4m) à l'avant.
Un bouton poussoir, à l'arrière, sur le dos du robot permet de l'activer ou de l'arrêter. Un interrupteur classique permet d'éteindre complètement le robot.
Le robot est équipé d'un piezo pour que le robot puisse émettre du son et un microphone.
On pourra plus tard munir le robot d'une tête orientable avec le capteur ultrason, 1 ou 2 axes avec le même type de moteur. Voire une caméra ?
Comme d'habitude, dans ce genre de projet, il faut commencer par construire une mécanique fiable, simple, saine et facile à entretenir. Ensuite on peut attaquer l'électronique, les commandes de moteur, l'I2C, l'Arduino Nano et le bloc batterie. Enfin il faut s'attaquer au code Arduino.
Mécanique :
Découper le profilé aluminium à 210, Percer les 12 trous des fixations et des axes des quatre moteurs du haut, les trous du bouton poussoir et de l'interrupteur, la fixation de l'Arduino, le capteur à ultrason et le bloc batterie
Fabriquer 4 cuisses : Chaque cuisse est constituée d'une tôle aluminium 10x2x56 découpée et et percé et sur laquelle est collé époxy l'embout du moteur : un ancien domino électricien en laiton d=5 coupé en 2. Attention : les cuisses droites et gauches ne sont pas identiques mais symétriques (le domino est collé de l'autre côté)
Fixer 4 fois les 4 moteurs de genoux sur chaque cuisse
Fabriquer 4 mollets : Chaque mollet est constitué de la 2e partie du domio électricien en laiton soudé sur une entretoise laiton M4 dans laquelle est vissée une vis M4x20 : la longueur de la vis détermine la longueur du mollet
Ce système de pattes permet de construire assez facilement un robot relativement agile. Inconvénient : les moteurs de genoux sont exposés à l’extérieur. Les protéger à l’intérieur du robot complique beaucoup la mécanique…
Fixer le capteur à Ultra-son, l'Arduino, le bloc batterie et la queue : cordon USB de charge
Fixer les 4 cartes moteurs
Sur cette vue, l’avant du robot est évidemment à gauche. le capteur à ultra-son, L'Arduino 33BLE et sa prise USB de programmation, le bouton poussoir de veille, l'interrupteur de marche sont visibles, les vis et les écrous. La queue est un cordon USB pour la recharge de la batterie. Les cuisses en tôle aluminium et les mollets des vis M4x30.
Electronique :
4 cartes. Pour chacune : 2 connecteurs moteurs, 1 ULN2003, 1 PCF8574 (I2C), 1 connecteur Alim, 1 connecteur I2C (ou 2 pour un câblage en guirlande)
Fixer la carte Arduino 33BLE, à l'avant, prise USB vers l'avant pour la reprogrammer facilement
Fixer le capteur à ultrason à l'avant
Fixer le bloc batterie (la prise USB de charge du bloc côté arrière est reliée à la queue (un cordon USB semi rigide) pour être accessible)
Percer deux trous sur le dessus du profilé et monter l’interrupteur poussoir de veille et l’interrupteur à levier Arrêt/Marche
Monter le HP piezo dessous
Connecter le bloc batterie aux cartes des moteurs et à l'Arduino via l'interrupteur à levier
Connecter le capteur à ultra-son, le bouton poussoir et le HP Piezo à l'Arduino
Connecter le microphone et son préampli à l'Arduino (entrée ADC)
Tester que les 8 moteurs bougent (Attention à ne pas aller en butée pour ne pas abimer les pignons de sortie des réducteurs de moteur).
Informatique :
Il faut développer un code Arduino, en mesurant l’horizontalité gauche/droite (accéléromètres)
A la mise en route, petit couinement pour prévenir (fréquence et durée légèrement aléatoire)
Pour fiare fonctionner le robot même en perdant des pas, les cuisses sont conçues pour appuyer sur une des vis de fixations des moteurs à chauqe pas (une méthode un peu brute pour réinitialiser les pas)
idem pour les mollets
Robot debout, couché, assis pour tester, prévenir et pour le fun
Petit couinement pour prévenir (fréquence et durée légèrement aléatoire)
Démarrer la séquence aléatoire d’exploration :
Marche avant, si obstacle (distance capteur ultrason trop faible < 0.2m) : changement de direction
Prévoir un changement aléatoire au bout d’un certain temps (entre 20s et 40s aléatoire) par exemple pour le fun et en cas d’obstacle non détecté par le capteur.
Si microphone : de temps en temps, le robot s’assoit pendant 5s, pousse un petit couinement (fréquence et durée légèrement aléatoire) et attend, si pas de réponse, aléatoirement : veille ou reprise, si réponse microphone, on reprend l’exploration. (Le bruit de la marche et des moteurs risque d'empêcher d'écouter tout en marchant)
En veille de temps en temps (aléatoirement entre 2 mn et 5mn) on reprend l’exploration
Si angle accéléromètres variable et aléatoire : cela veut dire que le robot est attrapé par quelqu'un : petit couinement aléatoire et arrêt des moteurs jusqu'à un angle à peu près horizontal (ça permet aussi d'arrêter le robot en cas de chute ou si on le pose sur le côté pour l'arrêter)
Si arrêt par poussoir : mise en veille jusqu’au prochain appui poussoir
Le code Arduino :
Il y a donc 8 moteurs : AVGH (Avant gauche haut), AVGB, ARGH, ARGB, ARVDH, AVDB, ARDH, ARDB. Chaque moteur est piloté par son angle en pas par exemple; AVGH=-160.
Il faut définir des routines qui consisterons à envoyer des angles au moteur, une seule fois ou périodiquement :
Debout
Assis
Couché
Penché (vers l'avant pour "renifler")
Avant
Avant rapide
Arrière
Avant droite
Avant gauche
Arrière droite
Arrière gauche
Patte droite (donne la patte du côté droit) (si possible sans se casser la figure)
Patte gauche
Balancer (osciller gauche droite)
Saut périlleux avant (je plaisante... )
Ces routines déclencheront l'envoi des angles à chaque moteur en I2C, une fois ou de manière répétitive.
Sur l'Arduino, il nous faut donc des entrées sortie :
Bus I2C : 2 broches
Veille poussoir : 1 broche
Voyant marche : 1 broche
HP (piézo) : 1 broche
Microphone (préampli) : 1 broche (entrée ADC)
Capteur ultra-son : 1 broche
Dynamique et programmation :
Lors de la marche, les mouvements des membres sont identiques entre l'avant droit et l'arrière gauche et inversement. Les mouvements entre, par exemple, l'avant droit et l'arrière droit sont identiques mais déphasés. En principe, les cuisses et les mollets ne tournent pas en même temps.
Marche avant :
Soulève la cuisse 30°
Avance le mollet 30°
Redescend la cuisse 30°
Recule le mollet 30°
Et ainsi de suite
La séquence complète pour marcher :
Soulever la cuisse avant droite et arrière gauche de 30° + abaisser la cuisse avant gauche et arrière droite de 30°-
Avancer le mollet avant droit et arrière gauche de 30°-, reculer le mollet avant gauche et arrière droit de 30°+
Abaisser la cuisse avant droite et arrière gauche de 30°-, Soulever la cuisse avant gauche et arrière droite de 30°+
Reculer le mollet avant droit et arrière gauche de 30°+, avancer le mollet avant gauche et arrière droit de 30°-
Et ainsi de suite...
Autrement dit (vu du point de vue des moteurs, en pas, + = CW, - = CCW=trigo), sur ces moteurs, : 10°=14 pas, 20°=28 pas
Soulève la cuisse :
Avance le mollet :
Abaisse la cuisse :
Recule le mollet :
Il convient de tester jusqu'où on peut aller en vitesse maxi (environ 2000us/pas), accélération, décélération
L'Arduino calcule les pas et envoie la séquence de pas avec une tempo qui déterminera la vitesse de marche. la séquence de pas se traduit par des suites de 0 et de 1 dans les bobines des moteurs concernés qui tournent en boucle jusqu'à atteindre l'angle requis.
Ex du code très simplifié en I2C : A la mise sous tension on envoie le code 0000 (hors tension) aux 8 moteurs.
Pour la marche : soulève la cuisse : AVGH=0001, ARGD=0001, AVGH=0010, ARGD=0010, AVGH=0100, ARGD=0100, AVGH=1000, ARGD=1000, pause : par exemple 2 ms, et on recommence : AVGH=0001... La pause détermine la vitesse de rotation des moteurs et finalement la vitesse de marche du robot. (en augmentant ou diminuant la durée (entre, par exemple 2 ms et 20ms) pendant les décélérations et accélérations). Idem en décalé pour les moteurs AVGD et ARGH. Quand la séquence est finie : les 30° sont atteints, après la décélération, on fait une "grosse" pause : ex : 100ms, (on en profite pour vérifier tous les capteurs), puis on attaque les mouvements du mollet de la même manière. On peut provisoirement multiplier toutes les tempo par 10 ou par 100 pour les premiers tests et le debug (Marche avant au ralenti).
Pour limiter le code et éviter de saturer l'Arduino, on ne fait pas bouger les cuisses et les mollets et même temps, ça a un autre avantage : celui de moins solliciter les moteurs en étant sûr que la marche avant soit bien arrêtée avant de démarrer la marche arrière. En fait, les moteurs pas à pas, c'est increvable ! Par contre les pignons du réducteur ont une durée de vie finie...
Nous avons besoin des PCF8574 (8 Entrées/sorties I2C), en effet : les ULN2003 sont des darlingtons de puissance qui n'ont aucune mémoire. les PCF8574, outre le fait de beaucoup simplifier le câblage en I2C, mémorisent la sortie jusqu'à la prochaine. sinon, il faudrait 8x4 = 32 sorties sur l'Arduino + les capteurs (sans parler du câblage)
A noter que nous commandons les moteurs en 5 fils ce qui est moins efficaces qu'en 4 fils mais plus simple.
Lors de la pause entre les mouvements de cuisse et de mollet, on peut en profiter pour vérifier le capteur à ultrason, les accéléromètres, le magnétomètre et les autres consignes. En espérant que l'Arduino soit suffisamment rapide. A noter que l'Arduino 33BLE est nettement plus puissant que l'Arduino Nano standard.
En fait de puissance de calcul, si l'Arduino est trop lent, ça limitera simplement la vitesse maxi du robot :-) (Si la vitesse est limitée par l'informatique, c'est un peu dommage...)
Ce système à 8 moteurs et quatre pattes est très efficace : certains robots industriels quadrupèdes dépassent les 45 km/h) et parviennent à sauter et à même à faire des saltos. Bon évidemment, ici, nous n'en demandons pas tant :-)
Nous pensons que le point faible de ce robot devrait être le dernier pignon de sortie des moteurs et son axe (usure, passage trop rapide avant/arrière, casse si bug et que les jambes se rentrent dedans....).
Ceci dit, changer un moteur est économique et pas très compliqué...
Si tout marche bien, on pourra protéger l'avant (avec 2 trous pour le capteur et un trou pour la micro USB de programmation), le dessous, l'arrière avec un trou pour la queue USB pour recharger la batterie. 2 trous à l'avant et 2 trous à l'arrière pour les câbles moteurs bas. Avec 1 plaque légère en aluminium cintrée au niveau des coins (arrondis) et fixée à l'avant et à l'arrière ?
Le robot complet devrait peser moins de 1 kg.
Masse estimée du robot (sans dessous) :
profilé alu : 120g
4 cuisses à 10g : 40g
4 mollets à 22g : 88g
8 moteur à 33g : 264g
visserie : 50g
circuit imprimé et câbles : 50g
interrupteur et cordon USB : 20g
Powerbank 5V : 150g
TOTAL : 782 g
Réalisation :
Nous avons réunit une partie des composants du robot : Le profilé est coupé à la bonne longueur mais pas encore percé. L'Arduino et les vis M4, la queue du robot...
Le profilé de 210 a été découpé pour le passage des moteurs.
Nous avons fabriqué un dessous en tôle d'aluminium collé époxy à 3 tubes aluminium et peint en blanc.
Le coffret assemblé, avec son dessous, vu de dessous assemblé par 10 vis :
Nous avons :
Percé le dessous pour laisser passer la prise USB de l'Arduino et laisser passer la queue USB de charge
Percé le dessus et monté le bouton poussoir de veille et l'interrupteur de marche
Monté l'Arduino
Monté le connecteur Micro USB relié à la queue (le circuit imprimé époxy qui la bloque sert aussi de bornier électrique pour distribuer la masse et le +5V
Connecté électriquement tout ça : L'Arduino s'allume (La Led verte de l'Arduino est visible près de son connecteur USB
Vue de dessus, on distingue la découpe pour la prise Micro USB de l'Arduino sur le côté du dessous.
Essai des PCF8574 en I2C :
Nous avons installé 2 cartes ULN2003 (livrées avec les moteurs) sur une plaquette à trous munie d'un PCF8574. L'ensemble devra être reproduit 4 fois. Il est relié à la masse (fil noir), au +5V (fil jaune), à l'I2C SDA (fil vert) relié à l'Arduino et l'I2C SCL (fil bleu) relié à l'I2C Arduino. Les cartes ULN2003 ont été légèrement recoupées pour que les 8 rentrent, à plat, dans le coffret.
Si le bloc batterie ne rentre pas dans le profilé, on pourra le fixer sur le dos...
Le code a bien avancé, il y a un peu plus de 700 lignes :
Setup avec les variables globales, l'initialisation du port série, de l'IMU (accéléromètres et magnétomètres), I2C , son et test des moteurs
Les routines I2C, son, Ultrason, Lecture IMU, rotation moteurs
La routine principale loop :
Fait avancer le robot de quelques mètre sauf si obstacle ultrason
Puis aléatoirement : (et avec des durées aléatoires)
Marche avant rapide
Pause
Couché
Assis
Arrière
Gauche
Droite
Renifler (penché vers l'avant)
Gratter
Patte
Osciller
Sautiller
On pourra en rajouter...
L'Arduino élabore le code pour faire tourner les moteurs dans un sens ou dans l'autre avec accélération, vitesse max et décélération. Le PCF modifie ses 8 sorties et les transmet à l'ULN2003 qui allume les diodes Leds rouges et actionne les 2 moteurs en 5 fils.
Sur la photo :
A gauche, un petit Buzzer actionné par l'Arduino
L'ensemble des 2 cartes ULN2003, la plaquette à trous avec lePCF8574 est dessous, invisible, des Leds rouges sont allumées...
On distingue les 2 résistances de pull-up (10k) soudées sur l'Arduino, nécessaires à l'I2C
Sur l'écran de l'oscilloscope, en bleu : SCL, en jaune : SDA
L'Arduino avec sa Led RVB, ici allumé en vert : selon l'état de l'Arduino nous allumons la Led en rouge, vert, bleu, jaune, cyan, magenta ou blanc (c'est pratique pour débugger) en plus du moniteur série de l'IDE Arduino. Nota : avec du PWM, on pourrait générer toutes les couleurs avec la Led RVB : orange, rose...
Nous avons reçu les moteurs et le capteur à ultrason. Nous avons installé le capteur qui fonctionne très bien. Jusqu'à plus de 4m ce qui amplement suffisant. Epatants ces petits capteurs : ça ne coûte presque rien ça fonctionne bien et c'est assez précis...
Nous avons installé un moteur et câblé un autre. Les moteurs fonctionnent bien, pour que le couple soit suffisant, il faut régler la tension de sortie du convertisseur des moteurs autour de 8V. A affiner lorsque les 8 moteurs avec leurs cuisses et mollets et cartes seront installés. Le convertisseur permet de régler facilement la puissance du bidule
Sur la photo, de gauche à droite :
Le capteur à ultrason
Le moteur pas à pas monté (avec une pince crocodile pour voir la rotation et mesurer les angles)
L'Arduino Nano 33 BLE
Un buzzer
Les 2 ULN2003 et le PCF8574
Le 2e moteur de mollet pas encore monté
La platine alimentation qui maintient aussi la prise USB de charge (la queue)
La queue , l'interrupteur de marche et le poussoir
On relie le Vcc des moteurs (accessibles sur les ULN2033) à petit convertisseur élévateur 5V->7.5V ou 8V réglable. (environ 2€).
Etant donné que les moteurs sont "irréversibles" : ils sont "bloqués" même déconnectés. Par logiciel, dès qu'un moteur a fini de tourner, il est déconnecté. A part pour la marche où 2 moteurs sont activés en même temps, le reste du temps un seul ou aucun moteur n'est activé. Ce qui fait une consommation de 4.5W en moyenne, mettons 5W avec l'Arduino. soit 1A sous 5V. Avec une powerbank de 5Ah, ça fait 5h d'autonomie.
On économise aussi la température des moteurs. (La puissance moyenne dans chaque moteur est d'environ 0.5W ce qui est très faible.
Un autre avantage de moins consommer, c'est de pouvoir prendre une powerbank de plus faible capacité, moins chère, et surtout, plus légère puisqu'elle est portée par le robot..
Les 4 moteurs de cuisse ont été montés. Les 4 cuisses avec les moteurs de mollets et les jambes : des vis M4x20 et les embouts caoutchouc noirs.
Il manque encore 3 ensembles de 2 ULN2003+ 1 PCF8574...
Le robot est, pour la première fois sur ses pattes. Les moteurs déconnectés tiennent largement le poids du robot. Il a ses chaussures (les embouts caoutchouc) au bout des mollets.
That's all folks !
Créé le 18/04/2024
A jour le 29/04/2024