Sujet d'actualité, je pense également à la réalisation d'un petit robot.
Son électronique devra être modulaire afin d'évoluer en fonction de mes disponibilités (faibles !), c'est naturellement que j'ai choisi d'utiliser le bus I2C. Le mode de propulsion dudit robot n'est pas encore choisi, je commence donc par l'essentiel : le pilotage de servo et un afficheur pour déboguer l'ensemble. Le module servo peut également servir à piloter des contrôleurs de moteur de modélisme (brushed ou brushless), me dispensant du traitement de la partie puissance.
Tous ces modules feront bien sur usage de microcontroleur, là j'ai retenu la série Atmel AVR (atmega8 principalement).
Mes modules terminés sont à ce jour :
Pilote de 8 servos par bus I2C
Pilote d'écran LCD texte par bus I2C
Pilote de 8 sorties en PWM
Test I2C pour AVR
Pilote 8 servos
Ce module permet donc de piloter 8 servo de modélisme via un bus I2C. Ses fonctions sont :
-contrôle indépendant ou groupé de chaque servo
-contrôle individuel de vitesse pour rejoindre la position de consigne
-mémorisation de position avec débrayage
Le schéma et la platine ont été réalisés avec Eagle, les sources sont disponibles ici.
Le code source est en C. La partie pilotage des servo a été largement inspirée par la page « Bouge ton servo ». J'y ai ajouté le support de l'I2C et la gestion des fonctions supplémentaires. Le module peut occuper 4 adresses différentes sur le bus, ce qui permet de piloter jusqu'à 32 servo avec un seul bus.
Le code source de l'ensemble est disponible ici.
Les trames I2C
Le module connait 2 modes de fonctionnement, pilotage individuel ou groupé; les 2 modes utilisent des trames différentes et donc sont supportés simultanément. Cela permet de limiter la taille des trames I2C lorsqu'il n'y a qu'un seul servo à commander.
Mode 1 : gestion individuelle
Dans ce mode la trame doit faire exactement 3 octets.
Octet 1 : numéro de servo à commander (0 à 7)
Octet 2 et 3 : position. Cette valeur est décomposée en 2.
Bit 15-12 : vitesse de mouvement (0= immédiat, 1 à 15 =de plus en plus rapide)
Bit 11-0 : position. Elle doit être comprise entre 1000 et 2000 pour ne pas sortir des spécifications des servo. La valeur spéciale 000 débraye le servo mais conserve en mémoire la valeur (plus de commande), la valeur spéciale FFF embraye le servo avec la valeur mémorisée.
Mode 2 : gestion groupée
Dans ce mode la trame doit comporter un nombre pair d'octets, et au maximum 16 octets.
Chaque groupe de 2 octets code la position de chaque servo (de 0 à 7) comme dans le mode 1.
Carte LCD I2C
Ce module gère un afficheur à base de HD44780, et permet donc d'afficher des textes via le bus I2C. Tous les caractères ASCII sont gérés.
J'ai inclus quelques code ASCII particuliers afin de contrôler l'afficheur :
01 : Positionne le curseur au début de l'écran
02,xx : Positionne le curseur au caractère xx
04 : Cache le curseur
05 : Montre le curseur
12 (0x0C) : Efface l'écran
Le code n'est pas encore stabilisé (de temps en temps cela plante l'écran, problème de timming je pense), mais il est disponible sur demande (ainsi qu'une version de la CAO)
Pilote 8 sorties PWM
Ce module permet de piloter 8 sorties en PWM (port D du micro), pour par exemple y connecter des moteurs, ou éclairages. 8 sorties binaires (port B) sont également utilisées dans le but de fournir un signal type « Enable », 4 autres sorties (PC0-3) fournissent un signal de type « sens/direction » pour les voies 0 à 3..
Les sorties PWM sont pilotées à une fréquence proche de 100Hz, ce qui ne semble pas générer de bruit particulier sur les moteurs (pas de « musique » !). Chaque sortie a un réglage sur 4 bits, soit 16 états (de STOP à FULL). Les fronts montants des sorties sont décalés de quelques µs afin d'éviter un appel de courant trop fort sur l'alimentation.
Format de trame :
2 octets NN,PP :
NN = numéro de sortie (de 0 à 7)
PP = bit 7 : Enable (sortie sur port Bnn), Bit 6 : Dir (sortie sur port PC0-3), bit 3-0 : puissance
Quelque soit l'état du bit Enable, toutes les sorties PWM sont toujours actives, pour les stopper il faut y mettre la valeur 0 (état bas) ou 15 (0xF, état haut).
Le code source est disponible ici.
Test I2C pour ATMega
Reprise de mon petit utilitaire favoris, j'ai porté mon logiciel Test I2C sur ATMega. Il permet, via un terminal série, de piloter le bus I2C (pour tests). Forcément très pratique pour développer tous mes modules.
La partie soft est presque terminée, reste à modifier la lib I2C afin d'intégrer des codes retours plus explicites. La carte en CAO est presque terminée, une fois le proto monté je publierais les fichiers. Si vous souhaitez avoir le soft en avance, demandez le moi par mail.
(C) Marc BOUGET - 2008