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 BNC

Réalisation

Cablage du terminal

Branchement Branchement fini
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:
Prises ICSP

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