Logiciel : le RaspberryPi

Avec l'utilisation de BleuettePi, la programmation de Bleuette se fait directement en Python, quel bonheur de développer en haut niveau sans les innombrables contraintes que j'avais sur Arduino, plus de limitation en taille, en vitesse, en programme qu'il faut compiler à chaque itération puis envoyer à la carte Arduino...

J'ai repris la même logique que sur l'Arduino pour l'enregistrement des séquences, un tableau est utilisé pour stocker les positions des pattes à chaque étapes (une structure en C sur la version Arduino) qui est contenu dans une classe Python (une autre structure pour la version en C), toutes les positions sont envoyées par la liaison série.

Bleuette est maintenant pilotable via une interface web tournant grâce à Tornado (un framework web en Python), toute la communication se fait via un websocket, et Bleuette pousse régulièrement toutes les informations issues de ses capteurs (tension, courant consommé, valeur du magnétomètre, de l'accéléromètre, etc...).

Sur l'interface, il est possible de régler finement la position des servos (trims), de régler les valeurs limites à ne pas dépasser, et même de voir une vue 3D de Bleuette et des mouvements de ses pattes (grâce à l'utilisation de Three.js) etc...

Voici les captures d'écran des différentes pages :

Page d'accueil Vue des mouvements de pattes Réglage des positions limites des pattes Mouvement des pattes Vue des capteurs Vue 3D de Bleuette et des mouvements

Un mode de test permet de tester le logiciel sans avoir de Bleuette sous la main, il vous suffit de suivre les instructions de cette page : Tester le serveur.

Problèmes rencontrés

Chevauchement des ordres

Les ordres reçus depuis l'interface utilisateur sur l'ordinateur distant arrivent dans Bleuette au travers d'un websocket, ces informations sont asynchrones, on ne peut pas savoir quand elles vont arriver et des fois, elles pouvaient se chevaucher, ainsi, si j'envoie un ordre pour modifier la position des servos (16 octets : 1 commande, 14 positions, 1 contrôle) et que pendant l'envoi d'un octet de la trame, une autre commande est exécutée, l'ordre de position va échouer (somme de contrôle erronée), des octets vont rester en attente, la communication série va expirée, remonter une exception, etc...

Exemple concret: Le programme du Pic fait des lectures régulières du courant consommé par les servos, si la valeur dépasse un seuil, le Pic déclenche une interruption à destination du Raspberry (INTD), ce dernier va alors faire une demande de lecture de Status (voir au dessus) au Pic lui permettant de savoir quel type d'interruption à été levé mais cette demande passe bien entendu par la ligne série et comme elle peut survenir n'importe quand, elle peut aussi survenir lors de l'envoi du longue trame de positionnement de patte.

Pour palier à cela, j'ai créé un thread portant le doux nom de Servo_Sequencer qui se charge de l'envoi des positions, seul lui est capable de le faire, chaque position envoyée est mise en cache et dès que la communication est possible, elle est envoyée, il est également possible de faire des sortes de transaction à l'aide du concept de context manager de Python.

Exemple :

with ServoSeq:
    ServoSeq.setPosition(0, 120)
    ServoSeq.setPosition(2, 120)

Une fois sortie du contexte introduit par with, les positions sont ajoutées dans le buffer et seront transmises par ordre d'arrivée au contrôleur de servos.

Ligne série saturée

La liaison série est pas mal occupée lorsque Bleuette marche car toutes les communications du Raspberry au Pic inclu dans BleuettePi se font par celle-ci, or, pour lire les tensions analogiques, il faut passer par cette liaison, il est difficile de faire une demande de lecture analogique au moment ou Bleuette doit déplacer une patte sans que cela n'induise des latences.

Pour ces 2 problèmes, chevauchement des ordres et saturation de la ligne série, la prochaine évolution sera l'ajout du Pic sur le bus I2C permettant ainsi de garder la ligne série uniquement pour le pilotage de Bleuette.
J'envisage aussi d'ajouter un convertisseur analogique numérique I2C évitant ainsi au Pic d'avoir à faire les conversions...

Amplificateur audio

La carte BleuettePi inclu un amplificateur audio (LM386) permettant ainsi de donner la voix à Bleuette, le problème est l'utilisation d'une clef Usb Wifi qui rayonne assez fort et qui vient gentiment ronronner dans la partie audio, lorsque du son est émis, pas de souci, le ronronnement est noyé mais dans le cas contraire, c'est plutôt gênant.

Je pense donc déplacer la partie amplification sur une carte fille, j'utiliserai certainement un amplificateur un peu plus puissant.

Carte fille accéléromètre / magnétomètre

La carte fille (GY-27) comprenant un accéléromètre et un magnétomètre est fixée sur BleuettePi via un simple connecteur (type barette sécable), il sera certainement déporté afin d'être fixé au corps de Bleuette pour éviter qu'elle ne vibre et renvoie des informations non fiables.

Grâce à la récente acquisition d'un four à refusion, il est également possible que la future carte BleuettePi intégre directement les capteurs.

La liste des évolutions de Bleuette sera maintenue sur cette page : BleuettePi : Future version