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.

Zone de Texte: servos

 


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 !

Datasheet MIC5205

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.

Datasheet IDT74ALVC164245

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.

Datasheet LT1300