L’électronique
Architecture
du système :
Le
fonctionnement de la carte électronique est basé sur un bus de données. Quatre
éléments sont connectés à ce bus : le microcontrôleur, le FPGA, la carte
mémoire, le port parallèle du PC.
Cette architecture a l’avantage
d’être très souple. Pour que la robot se déplace, le FPGA doit recevoir 800
octets par seconde, ces octets peuvent venir de n’importe où. Dans la première
version du robot, le déplacement été stocké directement dans la mémoire du µC.
Dans un deuxième temps, j’ai ajouté la carte mémoire qui a permis d’exécuter
des programmes beaucoup plus complexes. On pourrait aussi imaginer que les
octets arrivent directement du PC dans un mode « filoguidé » ou que
le µC applique un traitement aux données lue dans la mémoire avant de les
envoyer au FPGA. Bref il y a plein de combinaisons possibles…
Je ne détaille pas les protocoles de
communications entre les différents éléments, on trouve tous dans les
datasheet…
Principe
général de commande des servos :
On a vu dans la partie mécanique
qu’il y a deux servos par pattes, plus celui pour la translation. Soit 13
servos au total. La carte est capable d’en contrôler 16 (pour des évolutions
futures…).
Comme chacun sait, un servo se
commande pour une impulsion de largeur 1 à 2 ms (grosso modo) à raison de 50
impulsions par seconde.
C’est le FPGA qui ce charge de
fabriquer ces créneaux à partir des octets que le µC lui envoi (détails plus
bas). L'octet représente la largeur de l'impulsion : 100 = 1ms ; 200 = 2ms.
C'est bête comme choux et ça permet une excellente résolution dans le
positionnement de chaque servo. De plus, 50 fois par seconde le µC donne 16
nouveaux octets au FPGA, la position est donc vraiment actualisée 50 fois par
seconde. Cela permet de contrôler la vitesse de rotation du servo.
Pour la sûreté de fonctionnement,
j’ai voulu que le µC précise l’adresse du servo pour chaque octet envoyé.
Sinon, un parasite aurait pu décaler d’un rang toute la séquence suivante (un
beau bordel dans les servo quoi !)
Programmation
du micro-contrôleur :
Le micro-contrôleur est un 68HC811
de Motorola (256o de ram ; 2ko d’EEPROM). Ok, ce n’est pas un foudre-de-guerre,
mais je savais déjà m’en servir et vu son architecture, le robot n’a vraiment
pas besoin de puissance de calcul !
Le programme embarqué est
extrêmement simple, il n'a que deux modes :
1) téléchargement = le robot attend
que le PC lui envoi un programme de déplacement et il le stocke dans la mémoire
Flash à l'adresse spécifiée par le PC.
2) Il exécute un programme de
déplacement. Comme expliqué plus haut, ce programme une simple suite d’octet a
envoyer au FPGA. Le boulo du microcontroleur se résume donc à : demande un
octet à la mémoire flash -> donne le FPGA en précisant l’adresse du servo
-> recommence pour le suivant...
La mémoire Flash étant ENORME, je
l’ai découpé en 16 segments qui contienne chacun un programme de déplacement.
On sélectionne le programme avant le démarrage avec une roue codeuse 4bits.
Lorsqu’on tire la goupille, le µC saute automatiquement au segment mémoire
demandé.
La programmation est faite en
assembleur avec le compilateur gratuit de Motorola et un petit shareware pour
télécharger le programme dans l’EEPROM du µC.
Description
de la carte mémoire :
J’ai décidé de faire une carte
mémoire séparée de la carte principale pour pouvoir en avoir plusieurs.
Ensuite, la prise mémoire c’est révélée très pratique pour débugger la
communication sur le bus car pratiquement tous les signaux y sont connectés
(même s’il ne servent pas à la mémoire => évolutivité !!)
Le composant mémoire Flash-Nand de
Samsung référence KM29U128IT, le même qu’on trouve dans tous les périphériques
de stockage « silicium » (compact flash, smart média, disk-on-key…).
Il est un peu chiant à écrire, mais très adapté à mon besoin pour la
lecture : il suffit d’envoyer une adresse de départ puis une horloge pour
qu’il sorte séquentiellement tous les octets. De plus, je les ai récupéré à mon
boulo (quand c’est gratuit, on pose pas de question, on prend…)
A ce propos, ne cherchez pas à
acheter une KM29U128IT, cette référence est obsolète. Mais n’importe quelle
mémoire Flash-Nand de Samsung est compatible broche-à-broche.
Autre petit souci : c’est
alimenté en 3,3V alors que le reste est en 5V !
Pour les alims c’est pas difficile,
j’ai mis un micro régulateur 5V->3,3V Micrel MIC5205 en boîtier SOT23-5 !
Par contre, pour interfacer les
signaux c’est un peu plus chiant. Après une recherche approfondie, le bon
composant c’est un « translateur de niveau 3.3/5, 16 buffers
bidirectionnels à sorties trois états » (ouf !) La référence c’est
IDT74ALVC164245 fabriqué par IDT, dispo chez Radiospares.
Dernier détail, c’est du CMS au pas
de 0,5mm. C’est une merde indescriptible si on a pas le bon matériel et le tour
de main. Ma technique : je charge tous les pads en étain, je pose le
composant dessus, je fait refondre l’étain avec un fer à air chaud. Ensuite il
faut tester toutes les connexions une par une et corriger les circuits ouvert
avec un fer à panne ultra fine.
Programme
du FPGA :
Pour les néofites, un FPGA n’est
rien d’autre qu’un gros paquet de portes logiques et de bascules flip-flop dans
un seul composant. On configure ces éléments comme on veut par programmation.
Mon FPGA est un XC3090 de Xilinx en PLCC84. C’est également obsolète mais
n’importe quelle autre référence peut remplir la même fonction.
Comme expliqué plus haut, le
rôle du FPGA est de traduire un octet en une impulsion de largeur
proportionnelle et ceci à 50Hz. Cette fonction est réalisé par des décompteurs
8bits préchargeable. La fréquence de décomptage est de 100kHz, la fréquence de
préchargement est de 50Hz. Donc, quand je charge l’octet 153 par exemple, la
retenue (Carry) reste à 0 pendant 1,53ms puis passe a 1. Ce 1 provoque l’arrêt
du décomptage. J’inverse ce bit et j’ai mon signal de commande de servo !
Le FPGA contient donc 16 décompteurs
pour générer les signaux de commandes, un démultiplexeur 4 vers 16 pour
l’adressage et la circuiterie de division d’horloge pour avoir du 50Hz et du
100kHz à partir d’un quartz 4MHz.
Schéma légèrement simplifié :
Une
solution sympa pour l’alimentation :
Le LT1300 monté en Up/Down
converter !
Ce montage accepte n’importe quelle
tension entre 2,5 et 8V en entré et sort du 5V (ou du 3,3V) parfaitement
régulé. L’avantage c’est que je peux mettre un accu 4,8V ou du 6V (pour
survolter les servos) je n’ai pas de problème pour l’alim de l’électronique. De
plus, ce montage est capable de « pomper » l’énergie dans l’accu
alors qu’il est quasiment vide. Cela permet de détecter cette chute de tension
et d’arrêté les moteurs ou toute autre action.