Mot-clé - BleuettePi

Fil des billets - Fil des commentaires

Lundi, septembre 30 2013

Dernières avancées de Bleuette

Un petit billet pour vous donner des nouvelles de Bleuette...

Alimentation

Pour fonctionner correctement, Bleuette à besoin d'une tension de 5V@1A pour alimenter son cerveau (un RaspberryPi) et d'une autre tension de 6V@3A pour alimenter les servos et la guirlande de led.

Le développement d'une seconde carte fille permettant de générer les alimentations est prévue mais pour le moment, j'ai fait au plus simple, ainsi, pour le 6V, j'ai branché en parallèle 2 modules régulateurs de tension à découpage facilement trouvable sur le net, notamment, sur DealExtreme, ce sont des modules très pratiques que j'utilise assez souvent, ils sont capables de débiter 3A en pointe, mis en parallèle, nous avons donc théoriquement 6A, c'est amplement suffisant pour Bleuette qui comme dit plus haut doit avoir besoin de 3A maximum.

Note: Concernant la mise en parallèle des régulateurs à découpage, prenez garde à parfaitement bien régler la même tension sur les 2 modules à l'aide d'un multimètre fiable.

Pour le 5V du Raspberry, j'ai fait très simple en récupérant le régulateur inclu dans une prise allume cigare, voir Régulateur à découpage à très faible coût.

La source de tension est un accu LiPo de 11.1V @ 1.3A, c'est plutôt faible mais je n'ai que ça sous la main pour le moment...

Logiciel embarqué : le Pic

Sur la carte BleuettePi se trouve un Pic 18F452 qui est là afin d'assurer les mêmes tâches que sur la version Arduino (Bleuette Shield) mais avec quelques différences :

  • Les ports utilisés pour piloter les servos ne sont pas les mêmes
  • Le RaspberryPi n'ayant pas de convertisseur Analogique / Numérique, c'est le Pic qui s'en charge et met à disposition 8 entrées analogiques
  • Il surveille la tension de la batterie et prévient le RaspberryPi (via INTD) en cas de passage sous un seuil
  • Il surveille le courant consommé par les servos et prévient le RaspberryPi (via INTD) en cas de dépassement d'un seuil

La communication avec le Pic se fait via une liaison série à l'aide de commande :

Divers :

  • Version Retourne la version du micrologiciel
  • Status Retourne des informations courantes sur le système

Spécifique au pilotage des servos :

  • Init Initilisation
  • Pause Met en pause les servos
  • Resume Sort d'une pause
  • Clear Passe à 0 toutes les consignes
  • Set Spécifie les positions des servos

Spécifique au convertisseur analogique :

  • Current Retourne la dernière valeur du courant consommé par les servos
  • Set Max Spécifie la valeur max du courant à ne pas dépasser
  • Read x Lit la valeur de l'entrée analogique (x vaut de 0 à 7)

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

Mercredi, mai 22 2013

BleuettePi : Une carte fille pour RaspberryPi

Introduction

Comme je l'annonçais dans un précédent article, Bleuette va pouvoir être piloté par un Raspberry Pi grâce à une carte fille dédiée dont je vais décrire les caractéristiques ici même.

Le choix du Raspberry Pi s'est porté grâce à 2 de ses atouts : le coût et la puissance, en effet, pour moins de 40€, on dispose d'un système embarqué sous Gnu/Linux avec 512Mio de RAM, un processeur pouvant monter à 1Ghz, à côté des 2.5Kio de RAM et des 16Mhz de l'Arduino Leonardo, ça fait une sacré différence et ça laisse entrevoir plein de nouvelles possibilités...

Notez que ça ne signifie pas l'abandon du développement de Bleuette sur Arduino, il s'agit juste de donner le choix du système.

Caractéristiques

Les avantages d'utiliser un tel ordinateur embarqué sont nombreux, comme par exemple, la facilité pour embarquer / supporter des périphériques comme une clef WiFi pour programmer Bleuette à distance ou encore brancher une webcam (notamment le module caméra officiel), etc... Mais il n'y a pas que des avantages, on se retrouve aussi avec quelques soucis comme par exemple l'alimentation, le Raspberry Pi consomme plus qu'une petite carte Arduino et ses entrées / sorties ne sont absolument pas compatible avec le 5V utilisé sur la précédente carte fille, il faudra donc faire avec...

BleuettePi est conçue à la base pour faire fonctionner Bleuette mais j'ai fait en sorte que cette carte soit suffisamment généraliste pour être utilisée dans d'autre application.

Voici les caractérisitiques de cette carte :

  • Gestion de 14 servos (toujours de manière synchrone)
  • Mesure du courant consommé par les servos
  • Mesure de la tension de la batterie
  • Connexion pour une carte GY-27 contenant un accéléromètre et un compas (via I2C)
  • 16 entrées / sorties compatible 5V avec 2 lignes d'interruption, le tout commandé en I2C
  • 6 entrées analogiques
  • Amplificateur audio pour ajouter le son à votre Raspberry Pi (à base de LM386)
  • 5 entrées / sorties généralistes compatible 5V direct Raspberry + 5 autres entrées / sorties disponible si le bus SPI n'est pas utilisé
  • Toutes les broches du SPI (MOSI, MISO, SCLK, CE0, CE1) sont disponibles sur un connecteur et compatible 5V
  • Un module horloge temps réel (RTC) pour garder votre Raspberry Pi à l'heure !
  • 4 lignes d'interruptions physiques (INTA et INTB pour les IO, INTC en provenance de l'horloge temps réel, INTD)

Schéma de principe

Voici le schéma de principe complet :
Schéma de principe de la carte d'extension de Bleuette

Détails

Les détails bloc par bloc du schéma de principe :

Liaison au RaspberryPi

La liaison au RaspberryPi se fait via P1 :

BleuettePi : Liaison RaspberryPi

L'alimentation

Pour fonctionner, le RaspberryPi a besoin d'une tension d'alimentation de 5V avec une intensité d'environ 1A.

La carte fille reçoit 2 tensions en entrée :

  • Le 5V pour le Raspberry et pour la carte fille
  • Une tension pour alimenter les servos (de 5V à 6V selon les servos).

Une autre entrée (BATT et BATT1) optionnelle permet de recevoir la tension brute de la batterie à des fins de mesure via le pont diviseur R1 / R2.

Note: Si la tension d'alimentation des servos est directement celle de la batterie, le jumper (J_BATT0 ou J_BATT1) permette d'injecter la tension directement sur R1 / R2.

BleuettePi : Alimentation

Gestion des servos

BleuettePi : Pilotage des servos

Pour le pilotage des servos, un PIC18F4520 programmé avec une version dérivée du projet Pic24Servos est utilisé de la même façon qu'avec la Bleuette Shield Arduino.

Mais comme mentionné plus haut, les entrées / sorties du Raspberry Pi fonctionnent uniquement avec une tension de 3.3V, le PIC18F4520 aussi mais rien ne permet d'affirmer que les servos vont « voir » les impulsions de 3.3V comme des niveaux hauts, donc, j'ai choisi d'alimenter le PIC en 5V et d'adapter la liaison série avec le Raspberry Pi.

Pour la transmission de donnée du RaspberryPi vers le Pic, le signal passe par l'adaptateur de niveau 3V / 5V, pour la communication inverse, du Pic vers le RaspberryPi, un simple diviseur de tension (R9 / R10) ramène la tension à 3.3V max.

Le découplage de la ligne d'alimentation des servos est effectué par plusieurs condensateurs de bonne capacité (C1 et C9).

Les entrées / sorties

L'adaptateur de niveau 3V / 5V bidirectionnel pour les entrées sorties généralistes est un TXB0108PWR :

BleuettePi : Adaptateur de niveau

Une partie des entrées / sorties sont disponibles via les connecteurs OPTION0 et OPTION1 :

BleuettePi : Input / Output

Horloge temps réel (RTC)

Une horloge temps réel est disponible via le bus I2C afin de garder le RaspberryPi à l'heure, même sans alimentation grâce à la pile bouton de sauvegarde (CR1220).

BleuettePi : RTC, Horloge Temps Réel

C'est le DS1339 qui joue le rôle d'horloge, ce dernier est équipé d'une sortie (SQW/OUT) cablée sur INTC (INTterruption Clock) permettant au choix d'obtenir un signal carré à une fréquence précise ou d'utiliser cette broche comme réveil, cette dernière est disponible sur le connecteur OPTION0, ainsi, on peut imaginer un dispositif qui sortirait le RaspberryPi d'un sommeil très profond puisque dans cet état, il ne consommerait absolument rien...

Le son

Le Raspberry Pi disposant d'une sortie son, il est intéressant d'en profiter via l'utilisation d'un amplificateur et d'un haut parleur externe.

BleuettePi : Son

Rien de particulier à dire, à part un potentiomètre permettant d'atténuer le niveau d'entrée.

Mesure du courant et tension LiPo

Un pont diviseur de tension pour la mesure de la tension de la batterie et l'utilisation d'un MAX4173 pour la mesure du courant.

BleuettePi : Mesure du courant

Sur la version à base d'Arduino, c'est ce dernier qui s'occupait de la conversion analogique, or, le Raspberry Pi ne contient pas de convertisseur analogique / numérique (CAN), du coup, il aurait fallu embarquer un circuit intégré spécialisé pour cette fonction mais il n'y a plus de place sur la carte et il y a une meilleure solution, en effet, le PIC18F452 utilisé pour la gestion des servos possède un CAN et justement, ces broches sont libres...

La mesure du courant (SERVO_CURRENT) se fait via l'entrée AN5 et la tension (LIPO_VOLTAGE) via l'entrée AN4.

Carte accéléromètre et magnétomètre

Vu le format de ce type de composant (très difficile à souder avec du matériel amateur), j'ai opté pour un module GY-27 intégrant les 2 composants, le magnétomètre (HMC5883L) et l'accéléromètre (ADXL345) dialoguant tous les 2 en I2C, ils sont donc branchés sur la liaison I2C hardware du Raspberry Pi.

La carte sera donc directement branchée sur la carte fille BleuettePi permettant en plus un gain de place non négligeable.

BleuettePi : Capteur GY-27

Pour ceux ne voulant pas utiliser cette carte, il est tout à fait possible de l'utiliser pour autre chose, ça reste de l'I2C...

Liaison SPI

Un autre convertisseur de niveau 3V / 5V (TXB0108PWR) est présent pour assurer la conversion de niveau de tension du bus SPI :

BleuettePi : Liaison SPI

Guirlande de led RGB

Pour le pilotage de la guirlande de led RGB à base de LPD8806 depuis le Raspberry Pi, la librairie Boblight sera utilisée.

Au niveau électronique, rien de particulier, le pilotage se fait via le bus SPI hardware du Raspberry (ligne MOSI et SCLK).

Informations supplémentaires

Un premier batch de 5 PCB est en cours de fabrication chez Seeedstudio à l'heure où j'écris ces lignes.

Les fichiers sources sont disponibles au format Eagle sur GitHub :

La pages dédiées sur le wiki : BleuettePi sur GitHub.