Arduino CAN Bus Board
XXX
But
Connecter deux atmels entre eux via un bus CAN, ce tuto prends 2 arduinos, les relis via du CAN et permet des deux cotés d'appuyer sur un boutton qui allume une diode à l'autre bout.Nous ne reviendrons pas sur la partie serie via arduino ui est detaillé dans le tuto "Arduino Bit Bang"
Prerequis
Partie Materielle
Tout ceci pour UN terminal!
Arduino
MCP2515 La puce qui gère le protocole CAN
MCP2551 La puce qui s'occupe de la couche physique CAN (gestion des perturbations, envoi electrique,etc.) drivée par le 2515
Quartz 16MHz
Condensateurs 22pico X2
Resistances 120Ko + 1Ko
Les condensateurs servent au fonctionnement du quartz, les resistances à la terminaison de ligne comme un bouchon de réseau BNCRéalisation
Cablage du terminal
On a maintenant une prise icsp qui peut programmer n'importe quel atmel!
Du côté de l'atmel, justement nous avons deux choix qui s'offre a nous:
- Raccorder chacun des pins de programmation avec des fils
- Créer une plaquette de programmation d'atmel réutilisable
Pour la méthode qui consiste a uniquement raccorder les fils sur une plaque d'essai, il faut se référer à la doc de votre atmel pour le branchement
Exemple de documentation atmega16
Pour créer une plaque réutilisable, il suffit de faire la partie alimentation (+5V DCC), d'y mettre le support de l'atmel, le quartz et les condensateurs précisés dans le schéma correspondant à votre modèle d'atmel et enfin une prise icsp pour pouvoir y brancher facilement l'arduino que l'on a crée ci-dessus.
Cette prise est soit une prise IDP 2x3 pins, soit une IDP 2X5 (à vérifier).
Voici le schema de la connectique en 2x3 et 2x5 pins:
Le montage terminé ressemble a ceci:
Enfin, il faut avoir installé le driver FTDI pour la connexion avec la puce usb (ft232) de l'arduino, si vous pouvez déjà uploader du code dans votre arduino vous l'avez sinon, il est livré avec le logiciel arduino.
Partie logicielle
Pour programmer votre atmel, il faut compiler votre code avec avr-gcc, si vous avez windows, avr studio s'occupe de tout, il suffit de bien préciser le modele d'atmega que vous utilisez.Sous linux, cela dépend de votre distribution, sous debian, un simple apt-get install avr-gcc avrdude devrait suffire ;)
La programmation d'un atmel fera l'objet d'un tuto séparé.
Envoi du programme dans l'atmel
C'est la que cela diffère de l'utilisation d'un programmateur traditionnel.Nous allons utiliser une version modifiée d'avrdude, avrdude-serjtag et on va rajouter l'arduino comme programmateur.
Téléchargement d'avrdude-serjtag:
- Pour Windows: avrdude-serjtag
- Pour Linux: Avrdude suffit, pour son installation, procédez comme vous le faites d'habitude sur votre distrib
- Pour Mac Os: Je n'ai pas trouvé de version pour mac, si vous en avez une, envoyez moi un mail ;)
Il faut ensuite éditer le fichier avrdude.conf et y rajouter:
#arduino diecimila programmer id="diecimila"; desc = "FT232R Synchronous BitBang"; type = ft245r; miso = 3; # CTS X3(1) sck = 5; # DSR X3(2) mosi = 6; # DCD X3(3) reset = 7; # RI X3(4) ;
Que reste t'il a faire ?
Il faut modifier les fuses de l'atmel, les fuses correspondent à la configuration de l'atmel, c'est dans ceux ci que l'ont va par exemple indiquer a l'atmel s'il doit utiliser l'oscillateur interne ou un quartz externe, s'il est en mode de programmation ou pas.
Pour savoir quelle valeur de fuse utiliser, tout dépend de ce que vous voulez faire, le plus simple est d'utiliser un calculateur de fuse: calculateur de fuse fusecalc. Par contre pas d'aide sur le coup la, google est votre seul ami ;)
Selon si l'on est sous linux ou sous windows, les ports series changent, sous linux c'est un port /dev/ttyS0, sous windows c'est ft0, bien entendu le 0 depend d'ou vous avez branché le programmateur sur votre machine.
Les exemples suivant sont pour un atmega32 (m32) sous windows (ft0).
Lecture des fuses:
avrdude -c diecimila -P ft0 -B 4800 -p m32 -v
Ecriture des fuses (ici sur oscillateur externe):
avrdude -c diecimila -P ft0 -B 4800 -p m32 -U lfuse:w:0xef:m -U hfuse:w:0x89:m
Envoi du programme main.hex:
avrdude -c diecimila -P ft0 -B 4800 -p m32 -v -U flash:w:main.hex:i
Vous venez d'envoyer du code dans votre atmel!
Il ne reste plus qu'a débrancher la prise icsp, en effet le port reset empeche la puce d'executer son code...
Si votre code s'execute, vous avez gagné!
Un peu truc utile a connaitre est l'option -V qui permet de passer la verification lors de l'envoi du binaire.
Conclusion
Grace a l'utilisation de la puce ft232 de l'arduino, on est capable de programmer des atmel sans cout supplementaire, il ne reste plus qu'a faire des circuits qui utilisent ces atmels ;)Au boulot! :D