Nous avons construit un robot de compagnie, autonome, à peu près de la taille d'un chat (il miaule), et pour le prix d'un plein de carburant. Le robot marche avec 4 pattes. Pour chaque patte, il faut 2 moteurs : un moteur de cuisse et un moteur de mollet : 8 moteurs.
Pour limiter le coût du robot, il faut des moteurs pas chers. Pour ce genre d'usage, nous connaissons 2 types de moteur avec réducteur relativement économiques :
Les petits moteurs pas à pas avec réducteurs comme celui ci-dessous (environ 3€ avec la carte de commande)
Les servomoteurs RC (radiocommande), autour de 4€ pour un modèle avec pignons métal et suffisamment puissant.
Les petits moteurs pas à pas sont très économiques (environ 3 € avec la carte de commande). Mais ils posent plusieurs problèmes :
Même avec des jambes courtes et en les suralimentant en 12 V, leur couple est vraiment juste : environ 200 g sur les cuisses pour soulever (avec 4 moteurs) un robot dont la masse est proche du kg.
Le rendement n'est pas terrible et la consommation est élevée (même en désactivant les moteurs à l'arrêt) et donc l'autonomie est faible.
Il faut trouver une solution pour compenser la perte des pas : butées mécaniques, capteurs...
Pour ne pas trop perdre de pas, il ne faut pas tourner trop vite: le robot sera donc lent (environ 1 cm/s)
il faut les commander avec chacun une carte ULN2003 et 1 PCF8574 pour 2 moteurs : ça fait pas mal de ficelles (même avec le bus I2C) :
Il reste donc les servos RC : si on veut des modèles suffisamment puissants et avec des pignons métal, on peut trouver les 8 servos (MGC995 ou MG996R) autour de 32 €. (Les tout petits servos à engrenages plastiques, moins chers, ont une durée de vie très limitée). Courant annoncé en marche : 10 mA, à vide : 100 mA, à pleine charge : 350 mA.
Rappelons que ces servos RC s'alimentent en ~5 V via un connecteur 3 broches : masse (marron), +5 V (rouge), PPM (orange) : on envoie une impulsion carré à 50 Hz et la longueur de l'impulsion détermine la position du servo. Nous avons choisi un modèle 180° (le plus petit angle disponible), le couple est de l'ordre de 10 kgcm ce qui est largement suffisant : la force développée par la cuisse sera de l'ordre de 5 kg. Le temps de déplacement de l'ordre de 0.2 s. Selon la longueur des pattes, on devrait atteindre une vitesse d'au moins 10 cm/s.
Les avantages d'un servo par rapport à un moteur pas à pas :
Capteur de position (potentiomètre) : pas besoin de remise à zéro et pas de perte de pas
Couple important
Très bon rendement
Rapide (nous estimons la vitesse maxi du robot entre 10 et 20 cm/s selon la longueur des pattes). On trouve, à un prix un peu plus élevé le même type de servo ultrarapide : environ 0.07 s au lieu de 0.2 s qui devraient permettre de frôler 1m/s... (36 km/h)
Relativement léger
Fonctionne en 5 V comme l'Arduino Nano
Code beaucoup plus simple (bibliothèque servo.h pour Arduino)
Facile à se procurer et à changer en cas de panne (pignon usé...)
Dans ce genre de projet, il faut, à notre avis, concevoir les choses dans l'ordre suivant :
La mécanique : construire une mécanique robuste, simple et saine et durable
L'électronique : un câblage simple et accessible
Le code : nous allons faire tourner le robot sur un Arduino Nano avec un code maison.
La mécanique :
La nomenclature : total : environ 60 € :
8 servos RC MG995 ou MG996R : environ 32 €
1 morceau de profilé aluminium de fenêtre (récupération) (sinon, une tôle aluminium de 240x75x2)
1 Arduino Nano : environ 2 €
Capteur à ultrason Arduino : environ 2 €
2 batteries Lithium type 18650 environ 10 €
Un convertisseur 6V 4A (pour les servos) environ 5€
Un petit convertisseur 5V pour l'Arduino Nano et le capteur à ultrason : environ1 €
4 embouts caoutchouc collés à la colle à chaud : 2 €
De la quincaillerie : du tube aluminium Ø8d6, des vis...
Une ampoule au mercure ou un interrupteur pour la mise en route (l'ampoule au mercure est moins chère, plus fiable, plus pratique, plus facile à câbler et à utiliser et c'est plus rigolo qu'un interrupteur) (le robot ne fonctionnera qu'en position à peu près horizontale, ventre vers le sol) : environ 1 €
Nota : pour charger les 2 batteries Lithium type 18650, on trouve des petits chargeurs USB qui sont très pratiques mais mal conçus : en fait de gestion de charge il y a une simple résistance (3.9 ohms) (et un transistor pour allumer la Led)
Il vaut beaucoup mieux utiliser ce genre de carte qui enclenche la charge en dessous de 4.1V, la déclenche au-dessus de 4.3V (+-1.2%), la limite à 0.6A, allume une Led rouge pendant la charge, une Led bleue quand la batterie est chargée. Elle limite le courant d'utilisation à 3A, coupe la batterie en dessous de 2.4V et fait clignoter la Led rouge en cas d'anomalie.
En option, tissu en fausse fourrure, MOSFET P 20mOhms IRF4905, module microphone pour que le robot se réveille quand il entend du bruit.
Nota : ce type de module microphone a un gain insuffisant et ne convient pas :
Nous partons donc d'un profilé de fenêtre en aluminium découpé à 240 mm (celui de la photo n'est pas encore coupé)
Une partie du matériel :
Le profilé aluminium de fenêtre
L'Arduino Nano collé au silicone sur une plaque PCB (orange) qui rentre juste dans la rainure du profilé
Des plaques en aluminium qui maintiendrons les servos
Les tubes et tôles aluminium e2 pour réaliser les jambes
La plaque à trous avec les 8 connecteurs servo, le câble USB, la Led et un MOSFET canal P IRF4905 (20 mΩ) : Drain sur le ~5V des servos, Source sur le ~5V USB , Grille au ~+5V via une résistance d'environ 33 kΩ et reliée au drain d'un petit mosfet N ex : BST76A. Sa source à la masse et sa Grille reliée à l'Arduino Nano pour mettre les servos en marche ou en veille.
Un buzzer, des vis , 4 embouts caoutchouc
Nota : le choix de la matière pour les pattes (comme pour les vrais animaux) est important : une matière suffisamment molle, qui accroche au sol, il faut tester CouicCouic sur différents types de sol...
Le profilé est muni des 8 servos. Chaque servo est muni d'un levier (livré avec le servo). Un servo règle la hauteur de la cuisse, le 2e avance ou recule le mollet : pour avancer on soulève la cuisse, on avance le mollet, on redescend la cuisse, on recule le mollet. La jambe opposée en diagonale effectue le même mouvement. Les 2 autres jambes effectuent le même mouvement mais décalé (quand le mollet avant droit avance, le mollet avant gauche recule...
Les axes sont réalisés avec un petit morceau de tige laiton Ø2 L10 avec une soudure à chaque extrémité. (C'est rapide et pratique)
Nota : Avec cette mécanique, on pourrait même concevoir un robot "étanche" à la pluie. (IP63)
Nota : on peut augmenter la vitesse du robot en rallongeant les jambes... ou rajouter des ressorts aux mollets pour gagner en souplesse... (Si on augmente trop la hauteur des jambes, le robot devient instable et se casse facilement la figure).
Nota : le robot est habillé avec un tissu en fausse fourrure :
De gauche à droite : capteur à ultrason, Arduino Nano, les 8 servos à plat. Le servo extérieur règle la hauteur de cuisse (environ +-15°) le servo central fait avancer ou reculer le mollet (environ +-40°). Les leviers des servos sont fournis avec. Il faut fabriquer les cuisses et les leviers de mollet avec du tube aluminium D8d6 et de la tôle aluminium e2 collée Araldite. Les 2 batteries Lithium type 18650 et le convertisseur. La queue du robot est une prise USB qui permet la recharge des batteries (avec une gaine pour que la queue soit plus rigide).
Vue du robot en cours de construction :
Il manque les servos et les batteries. Sont visibles : le profilé alu, le capot avant vissé (abandonné dans la version définitive), le capteur à ultrason, la prise USB C de programmation de l'Arduino Nano, les pattes posées sans les chaussures.
Electronique :
L'Arduino Nano (muni d'une embase USB C pour la programmation) est installé à l'avant (collé au silicone sur une plaque PCB 1mm) glissée dans la rainure du profilé de fenêtre
Le capteur à ultrason est installé à l'avant relié au 5V Arduino (Le capteur renvoie la distance au cm près jusqu'à 4 m environ). Le capteur et l'Arduino sont reliés au petit convertisseur 5V
Les 8 servos sont câblés en // pour la masse et le 6V relié au convertisseur 6V 4A. L'entrée PPM de chaque servo est reliée à une sortie digitales de l'Arduino Nano (qui peut piloter directement les servos RC avec une bibliothèque adéquate)
Les batteries et les convertisseurs sont fixés sur le robot
En fait d'interrupteur de marche, on installe, sur le dessus du robot, une petite ampoule au mercure reliée à la sortie des batteries : pour arrêter le robot, il suffit de le retourner sur le dos (s'il se retourne en marchant : il s'arrête).
Au centre, entre les servos , un petit PCB qui contient les 8 connecteurs de servos, une Led, le câble USB et les 10 fils reliés à l'Arduino Nano et un MOSFET canal P pour désactiver (via l'Arduino et un BST76) les 8 servos quand le robot fait une pause (Le constructeur des servos annonce un courant de repos par servo de l'ordre de 10 mA par moteur ce qui fait 80 mA pour les 8)
Nous estimons que les servos vont consommer, en marche avant à vitesse rapide environ 150 mA par servo soit 150*4+10*6=660 mA en marche (Les servos cuisses et mollet ne fonctionnent pas en même temps) et 80 mA à l'arrêt.
Avec 2 batteries 18650 de 1200mAh, ça nous fait 2 h d'autonomie (ça dépend de la vitesse maxi de la marche avant)
Le robot est muni "d'yeux" : un capteur à ultrason Arduino qui indique la distance (jusqu'à environ 4 m) à l'avant.
Le robot est équipé d'un piezo pour que le robot puisse émettre du son. Il couine : c'est pour cela qu'il s'appelle CouicCouic.
Bilan des entrée sorties Arduino Nano :
8 Sorties digitales pour les 8 servos (D2, D3, D4, D5, D6, D7, D8, D9)
2 E/S pour les ultrasons (D12, D13)
2 E/S reliées directement au piezo (2 pour faire plus de bruit) (D10, D11)
En option : 1 sortie pour mettre les servos en marche (D17/A3)
En option : 1 entrée pour un capteur de son microphone, 1 entrée pour mesurer la tension batterie
En principe, l'Arduino Nano suffit très largement en puissance de calcul et en nombre d'E/S. (utilisation d'environ 40% de code et 30% mémoire)
Code Arduino :
Il faut développer un code Arduino
A la mise en route, petit couinement piezo pour prévenir (fréquence et durée légèrement aléatoire).
Activer les servos si besoin
Il faut commencer la mise au point du code par faire marcher le robot le plus vite possible en marche avant : déterminer les tempos pour que les servos suivent (~10 ms). Régler les angles (l'avantage, par rapport aux moteurs pas à pas, c'est que si on va trop vite, on ne perd pas de pas, simplement les enjambées sont plus petites). (~+-15°/cuisses, ~+-40°/mollets).
On pourra toujours ralentir, démarrer lentement puis accélérer, vitesse aléatoire...
Ensuite initialiser puis lire le capteur à ultrason : si moins de 200mm (par exemple) le robot tourne aléatoirement à droite ou à gauche et repart. Si moins de 100mm, il recule puis tourne.
On pourra optimiser le mouvement des cuisses pour les soulever puis les redescendre légèrement quand le mollet recule pour que le robot ait une démarche plus souple. (se dandine moins).
Ensuite on peut rajouter des fonctions aléatoires :
Debout, couché, assis, renifler, immobile, sautiller, gratter avec la patte, dandiner, reculer... couinement aléatoire.
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 à ultrason.
Nous avons installé un microphone avec un capteur de son Arduino, au bout d'un temps assez long (20 mn par exemple, il peut se mettre en veille en déconnectant les servos : seul l'Arduino tourne. S'il entend un bruit, il redémarre pour, par exemple, accueillir son maître :-). Nota : la carte microphone nécessite une alimentation propre (pas de parasite) : sur notre robot, nous avons dû ajouter un découplage avec une résistance de 470 ohms et une capacité de 220 uF pour découpler l'alimentation de la carte microphone.
L'Arduino Nano seul (servos déconnectés) consomme environ 10 mA.
Le code Arduino :
Il y a donc 8 servos :
Initialisation
Couinement pour prévenir
Mesure de distance : si D>200 mm
Marche avant :
Soulève la cuisse AVG et ARD de 15°, on descend la cuisse ARG et AVD de 15°
Avance le mollet AVG et ARD de 40°, on recule le mollet ARG et AVD de 40°
Descend la cuisse AVG et ARD de 15°, on soulève la cuisse ARG et AVD de 15°
Recule le mollet AVG et ARD de 40°, on avance le mollet ARG et AVD de 40°
Si obstacle <200 mm, on tourne (aléatoirement) par la droite ou par la gauche de la même manière que pour avancer mais en croisant les mouvements : avance à droite et on recule à gauche pendant, mettons, 10 cycles et on repart
Si avance pendant une durée aléatoire entre 30 s et 2 mn, changement de direction
Aléatoirement : arrêt pendant une durée aléatoire, couché, assis, renifler, debout, gratter, dandiner, tourner, repartir, couiner..
L'aléatoire apporte beaucoup de vie au robot en le rendant imprévisible.
Exemple de code Arduino pour gérer un servo :
Fourrure :
A partir de notre "fourrure" synthétique à poils longs (70 mm), nous souhaitons habiller le robot.
Selon les fourrures, attention au sens du poil.
Nous souhaitons pouvoir ôter, pour la maintenance, la fourrure du robot en l’équipant de Velcro sous le ventre.
Notre fourrure, à la base, fait 500x400 :
Nous allons la redécouper à 500x300.
Il reste de la matière pour faire une queue ou des oreilles :-)
Puis nous allons la découper selon le patron ci-dessous. Il est fortement conseillé de faire un essai, par exemple, à partir du plastique d'un sac poubelle. Les rectangles bleus représentent les Velcro (Mâles ou Femelles, cousus)
Bon, le poil, sous le robot, sera à l'envers (sinon, il faut faire un peu plus de couture).
On coud un carré de 100x100 à l'avant du patron (à côté des yeux), avec le poil dans l'autre sens et on le muni d'un Velcro mâle de 80x15 côté opposé aux poils
On coud un Velcro femelle de 80x15 à l'arrière du robot côté poils
On coud un Velcro mâle de 80x15 sur le bord du côté droit côté opposé aux poils
On coud un Velcro femelle de 80x15 sur le bord de l'autre côté, côté poils
On pose le dos du robot sur la fourrure (côté intérieur sans poils).
On passe la queue par le trou correspondant (un câble court USB pour la recharge).
Puis les "yeux" et la "bouche" par les trous correspondants.
On replie le carré de 100x100 et on l'attache au Velcro arrière
On replie les 2 côtés et on attache les Velcro ensemble
On fabrique 4 rondelles en plastiques Ø4 avec 4 ou 6 trous périphériques Ø2 ou on récupère les rondelles à trous livrées avec les servos
On insert en force 4 entretoises M4 à l'extrémité de chaque patte (tube aluminium)
On colle à chaud dans chaque embout caoutchouc une vis M4x20
Pour chaque patte, on visse un pied caoutchouc avec la rondelle plastique
On perce à chaud (fer à souder) 4 ou 6 trous dans la fourrure autour de l'extrémité de chaque patte
Pour chaque patte, on passe un fil (de pêche ou de couture) alternativement dans les trous de la rondelle et dans les trous de la fourrure et on noue
Pour ôter la fourrure : (c'est assez facile)
Libérer les 3 Velcro
Dévisser les 4 pieds
Retire la fourrure de la queue et des pattes arrière
Retirer des pattes avant et de la tête
Encore une fois, il faut affiner le patron ci-dessous avec une feuille de plastique ou un morceau de tissu...
Un premier jet :
Un premier essai qui ressemble plus à de l'emmaillotage ... (Il manque les Velcro)
Il faudra peut-être fendre et ôter des triangles de plastique autour des pattes avant de faire de la couture...
Il faut aussi faire des essais avec les servos pour déterminer la longueur des pattes.
Les premiers essais sont relativement concluants.
Avec sa fourrure et ses "yeux" le robot est "kawai" (mignon) comme disent les japonais.
Plusieurs problèmes et leurs solutions :
Pour améliorer la marche, nous avons décomposé le mouvement : le robot abaisse sa cuisse, avance le mollet à mi-course (c'est à ce moment-là que le robot est le plus haut), on recule les autres mollets puis on finit d'avancer totalement le mollet avant de relever la cuisse : la marche avant se fait ainsi en 20 temps.
Ce n'est pas en faisant tourner les servos le plus vite possible que le robot est le plus rapide : il faut trouver le rythme pour qu'il se dandine efficacement. Évidemment, plus les servos tournent vite, plus la consommation augmente et plus l'autonomie diminue
Finalement, nous avons supprimé les capots avant et arrière (la fourrure protège)
Pour coudre la fourrure aux pattes du robot, nous avons utilisé des roues de servos par les trous desquels nous avons passé les fils de couture
Le système de fourrure + Velcro + roues de servos et les pieds vissés est pratique : on peut facilement déshabiller et rhabiller le robot
Sur le dos du robot : Les 2 batteries Lithium type 18650 en //, et un petit convertisseur 5 V USB qui alimente en 5V uniquement l'Arduino Nano et capteur à ultrasons(~ 10 mA). Ainsi, plus de reset intempestif et le robot peut marcher beaucoup plus vite. Et le "gros" convertisseur 6V 4A (celui avec un radiateur) pour alimenter les servos via le connecteur jaune (invisible sur les photos). (Nous allons rajouter une photo de l'arrière...)
Il y a aussi un interrupteur à levier 3 positions : Arrêt, Marche, Arrêt sur le ventre (le mode normal commandé par l'ampoule au mercure (difficile à voir).
Une photo du robot complet avec les pattes et la fourrure : il suffit de le mettre sur le dos pour l'arrêter et de le remettre sur ses pattes pour redémarrer...
Voilà : le robot avance, recule, évite les obstacles, couine, tourne à droite ou à gauche, penche à droite ou à gauche, se dandine, bouge, s’assoit, se penche en avant, se couche et attend. S'il entend un bruit, il repart...
Le programme fait un peu plus de 1100 lignes...
L'autonomie est d'un peu plus d'une heure (elle dépend beaucoup de la vitesse de marche du robot)
That's all folks !
Créé le 18/04/2024
A jour le 23/01/2025