R.cerda est un robot à conduite différentielle basé sur un Raspberry Pi, pensé pour être à la fois simple et économique. Il est propulsé par deux moteurs à courant continu, commandés par des puces L293D et interfacées aux GPIO du Raspberry Pi par un MCP23017. Une puce MCP3008 permet de lire d'ajouter des entrées analogiques au Raspberry Pi.
Ce robot possède deux roues parallèles, entraînées chacune par un moteur électrique à courant continu. On utilise deux puces L293D en parallèle pour commander individuellement les deux moteurs. Le MCP3008 ajoute un convertisseur analogique au Raspberry pi, et grâce à cela, nous pouvons détecter la distance aux obstacles frontaux en utilisant un capteur ultrasonique ou infrarouge. Une roue omnidirectionnelle (ball caster) sert de troisième point de contact, et le robot peut ainsi se déplacer, tout en étant stable, avec un minimum de friction.
Il y a 5 batteries dans un compartiment pouvant en accepter 6. Cela sert à avoir une tension de 5 à 6V, qui alimente directement les moteurs. Dans le même temps, le courant qui sort des batteries est régulé par un petit composant qui s'assure ainsi de fournir du 5V en sorte, de façon stable. Cette tension est alors fournie au Raspberry Pi, qui peut alors commander les puces et les moteurs. On pourrait envisager deux sources d'alimentation, une pour le pi, et l'autre pour les moteurs, mais c'est plus simple avec une seule. Le régulateur de tension que j'ai utilisé est très efficace, et ne gaspille donc que très peu d’énergie.
Le capteur ultrasonique est placé sur la face avant du robot, et indique la distance aux obstacles se situant dans l'arc frontal. Ainsi, le robot peut tourner pour les éviter.
Voyons maintenant le matériel nécessaire pour la réalisation de ce robot.
En pratique, on s'en sort pour 80 à 120€, selon les options choisies, que l'on possède déjà des batteries, etc.
Les moteurs sont contrôlés par deux puces L293D. Les deux sont en parallèle, car elles peuvent fournir 600mA au maximum par canal, alors que les moteurs en demandent 800. J'ai donc connecté les deux puces en parallèle, elles peuvent ainsi fournir jusqu'à 1200mA par canal, ce qui est largement suffisant. Le Raspberry pi est connecté à un MCP23017, qui ajoute 16GPIO, et le MCP23017 est connecté aux L293D. Dans l'absolu, on peut se passer du MCP23017, et connecter directement les L293D aux GPIO du Raspberry, mais j'ai choisi d'utiliser cette puce, car j'en ai au moins une pour chacun de mes Pi, et que cela permet d'envisager des extensions ultérieures, en ajoutant par exemples des boutons sur les coins pour détecter d'éventuels contacts.
Le principe du fonctionnement est donc d'éviter les obstacles détectés. Pour cela, j'utilise un Maxbotix LV-EZ4, qui détecte les objets grâce à un faisceau à ultrasons entre 6 pouces (environ 15cm) et 6 mètres. Le Pi est connecté à un convertisseur analogique vers numérique (un MCP3008), qui permettra de récupérer les données analogiques du capteur de distance. Le capteur ayant une sortie linéaire, la mesure est directement proportionnelle à la distance. La puce de gauche sur la photo du dessus est le MCP3008, et on peut voir le capteur de distance à ultrasons sur la photo ci-contre, à l'avant du robot. A noter que le gros œil rouge ne fait pas partie du robot, c'est simplement un autre Raspberry pi.
J'ai testé l'autonomie d'un Raspberry Pi modèle alimenté par 5 batteries AA et un convertisseur de tension efficate, et streamant un flux webcam en wifi. Vous trouverez plus de détails sur ce post sur un autre forum (lien externe). On obtenait 3-4 heures d'autonomie. Ici, si on garde la clé Wifi, la consommation devrait être approximativement la même, environ 800mA. La consommation maximale de chaque moteur est de 800mA, ce qui fait qu'en théorie, si les moteurs forcent au maximum en permanence, nous diviserons l'autonomie par 3, soit environ 1h à 1h20.
En pratique, on peut s'attendre à ce que les moteurs ne forcent pas à fond en permanence, donc en étant conservateurs, disons qu'ils seront à 50%. Cela signifie que nous aurons donc 800mA de consommation pour les deux moteurs, donc un total de 1600mA. Les batteries étant données pour 2700mAh, on obtient donc théoriquement 2700/1600=1h36minutes. En pratique, si on divise par 2 l'autonomie du pi tout seul, on obtient 1h30 à 2h d'autonomie théorique, donc ça colle assez bien.
Ici, je parle d'un scénario ou le robot roulerait en permanence… En pratique, on peut également s'attendre à ce qu'il ne se déplace pas tout le temps, s'il fait des tâches diverses. Dans ce cas, on gagnerait encore en autonomie. Mais on a une estimation de l'autonomie minimale Vous pouvez voir sur les images ci dessous (cliquables pour une version HD) les batteries et le convertisseur.
Le programme du robot est alors assez simple, puisqu'il s'agit de l'algo suivant :
boucle infinie : distanceObstacle=lireDistanceCapteurUltrasons(); Si (distanceObstacle<8 pouces) reculer; Sinon Si (distanceObstacle<12 pouces) tourner à gauche; Sinon avancer; Attendre(5ms);
Le code est fait en python, et le robot évalue les données toutes les 5ms. L’étroitesse du faisceau cause quelques problèmes, il faudra sans doute adapter les distances, ou monter le détecteur sur un servomoteur pour l'orienter.
Ce robot étant à but pédagogique, l'intégralité de la fabrication sera décrite. Il suffira de disposer d'outils simples (perceuse basique, une scie à main ou une scie sauteuse, un fer à souder de base -30W environ- pour quelques soudures simples, et des tournevis), d'une ou deux après midi, et des composants proposés dans le guide pour pouvoir construire le robot. Nous partirons de zéro, et il n'y a pas de prérequis particuliers. Ce guide se compose de plusieurs parties, dans cet ordre :