Logo Blog perso d'Ozwald

L'arduino c'est contagieux

Par Oz le - Électronique
Hack arduino atmega robot électronique

Le 9 mars 2011 dernier (merci Twitter pour la date exacte) j'ai acheté un arduino. Depuis j'ai pas mal joué avec et j'en arrive aujourd'hui à vouloir utiliser au jour le jour certains de mes bricolages. Le problème c'est que si je dois acheter un arduino pour chaque bricolage que je veux garder et utiliser quotidiennement ça risque de taper sérieusement dans mon budget. Heureusement il y a pleins de solutions à ce problème.

Arduino UNO - Creative Common by "Beraldo Leal" on Flickr

La première solution c'est de ne tout simplement jamais utiliser d'arduino et d'oublier carrément les micro-controlleurs Atmega. L'un de mes amis, qui fait de l'électronique depuis des années, a ainsi toujours utilisé des PIC. L'avantage des PIC, par rapport aux Arduino, c'est leur prix ridicule (comptez quelques dizaines de centimes d'euros pour les plus petits alors qu'un arduino coutera minimum une quinzaine d'euros). Mais l'inconvénient majeur des PIC c'est qu'il vous faudra un programmeur matériel dédié pour uploader vos programmes dessus, et que ce programmeur dédié coute cher (comptez une trentaine ou une cinquantaine d'euros).

La seconde solution c'est d'utiliser des Atmega nu. Les Atmega c'est la famille des micro-controlleurs qui sont au coeur des Arduino. En fait un Arduino c'est un atmega avec un peu d'électronique autour pour uploader les instructions sans programmeur externe, et pas mal de logiciel pour rendre ultra simple le codage, la compilation, et l'upload sur l'Atmega. Donc quand on utilise un Arduino en fait on utilise un Atmega :) L'avantage des Atmega (et leur petits frêres les Attiny) c'est le prix du programmeur externe, en effet vous pouvez utiliser votre Arduino comme programmeur pour Atmega (via le sketch ArduinoISP, donc aucun investissement supplémentaire si vous arrivez à le faire marcher) ou bien en acheter un tout fait et dédié à cet usage (ce qui est beaucoup plus simple à mon gout) pour la modique somme de 3€ sur eBay. L'inconvénient c'est que les Atmega (et les Attiny) sont plus chers que les PIC (et qu'il existe également moins de modèles différents); mais ne vous affolez pas ça reste quand même largement moins cher qu'un arduino complet et vous n'aurez donc aucun scrupule à "investir" 1 ou 2 euros dans un Atmega destiné à rester à perpétuité dans votre bricolage numéro 3454464béta :D

Dans l'idée de fabriquer des bricolages "définitifs" je me suis donc orienté vers la seconde option : programmeur matériel dédié à acheter une fois et atmega (ou attiny) indépendant à acheter pour chaque montage "définitif". Le prix de cette migration a donc été pour mon cas de :

  • 3€ pour un programmeur dédié USBASP (acheté sur eBay)
  • 1,30€ pièce pour des Atmega8 (également achetés sur eBay)
  • ou 3,5€ pièce pour des ATtiny85 (encore et toujours achetés sur eBay) à la place des Atmega8 si je veux un tout petit montage.

Par contre en basculant sur du micro-controlleur indépendant on perd un avantage énorme de l'arduino : l'IDE et ses bibliothèques simplifiant monstrueusement la tache du codeur. A titre d'exemple voilà le code Arduino qui fait clignoter une LED (l'équivaleur électronique de "Hello World") :

void setup() {                
  // initialize the digital pin 13 as an output.
  pinMode(13, OUTPUT);     
}

void loop() {
  digitalWrite(13, HIGH);   // set the LED on
  delay(1000);              // wait for a second
  digitalWrite(13, LOW);    // set the LED off
  delay(1000);              // wait for a second
}

Et, pour comparer, le même code pour ATtiny85 sans utiliser les librairies Arduino :

#include<avr/io.h>
#include<util/delay.h>

void sleep(int millisec) {
    while(millisec)
    {
        _delay_ms(1);/* 1 ms delay */
        millisec--;
    }
}

main() {
    DDRB |= 1<<PB3; /*PB3 is now an output*/
    while(1) {
        PORTB &= ~(1<<PB3); /* PB3 low */
        sleep(1500); /* 1.5s delay */

        PORTB |= (1<<PB3); /* PB3 high */
        sleep(3000); /* 3s delay */
    }
}

Tout de suite c'est quand même moins user-friendly. Et encore, là on fait juste clignoter une LED. Soyez assurés que quand on joue avec les interruptions c'est encore plus moche. M'enfin bon, ça reste quand même compréhensible, donc poursuivons. Quand on utilise l'IDE Arduino on branche son arduino en USB, on écrit son code, puis on clique sur le bouton "compile and upload" et c'est fini, l'Arduino se comporte comme on l'a programmé. Quand on utilise un micro-controlleur indépendant c'est "un poil" plus compliqué.

D'abord il faut brancher l'USBASP (notre programmeur matériel dédié) : Coté USB c'est trivial, coté Micro-controlleur il faut ressortir la doc des branchements. Une fois la doc sous les yeux le branchement est simple puisqu'il suffit de se débrouiller pour que les fils MOSI/MISO/SCK/RST du programmeur correspondent aux pates MOSI/MISO/SCK/RST du micro-controlleur. Ca n'a rien de sorcier mais on est obligé de ressortir le schéma à chaque fois (parce que, franchement, l'apprendre par coeur...). Branchement coté programmeur :

USBASP programmer

Et branchement coté micro-controlleur (ci-dessous pour les attiny) :

pinout attiny 25/45/85

Une fois correctement branché il faut coder (pour ça on peut être certain que vim ne nous laissera pas tomber :)). Ensuite on compile avec avr-gcc en faisant attention de bien choisir la plateforme cible :

avr-gcc -mmcu=attiny85 ledblink.c -Os -o ledblink_tiny85.o

Une fois compilé on extrait le code intéressant au format ihex :

avr-objcopy -j .text -j .data -O ihex ledblink_tiny85.o ledblink_tiny85.hex

Il ne reste plus qu'à uploader le code sur notre micro-controlleur à 3€ :

avrdude -p /dev/ttyS3 -c usbasp -p t85 -v -U flash:w:ledblink_tiny85.hex

Et "voilà" la LED qu'on a branché sur la pate PB3 de l'attiny (via une résistance de plus de 300 ohms pour ne pas la cramer) clignote gentiment. Maintenant plus rien ne s'oppose à la réalisation de montages permanents coutant moins de 10€ :) !

EDIT 14/04/2012 : chez moi par défaut avr-gcc ne trouve par le fichier "crtm8.o" et du coup il ne parvient pas à linker correctement quand je lui spécifie une cible "atmega8" à la place de "attiny85". Pour régler le problème il suffit de lui rappeler où trouver "crtm8.o" avec son option -B:

avr-gcc -mmcu=atmega8 ledblink.c -Os -o ledblink_atmega8.o -B /usr/avr/lib/avr4/

La suite reste similaire à l'exemple donné pour l'attiny85:

avr-objcopy -j .text -j .data  -O ihex ledblink_atmega8.o ledblink_atmega8.hex

Et pour l'upload on change juste l'option "-p" en mettant "m8" (= atmega8) à la place de "t85" (=attiny85) :

avrdude -p /dev/ttyS1 -c usbasp -p m8 -v -U flash:w:ledblink_atmega8.hex

EDIT2 14/04/2012 : Rajout en fichier joint d'un exemple de code réalisant deux Fast PWM sur atmega8 (typiquement pour diriger un robot)


Gorgonite le 2012/04/13 22:03

Salut Ozwald,

Clairement le "prix sur la durée" est la raison pour laquelle j'ai refusé de passer sur Arduino (joueur, mais juste pas envie de cramer trop dedans si je peux faire sans ;) )
Concernant les PIC, il est possible de ne pas acheter mais de construire quels petits trucs sympas, style http://www.tavernier-c.com/programm...
Par ailleurs une version de OCaml pour PIC existe (souviens-toi de la prépa ^^)

Gorgonite le 2012/04/13 22:34

Au passage, il est aussi possible d'investir dans un FPGA et de simuler un petit paquet de circuits sympas (dont certains dispos via opencores par exemple), et ensuite de flasher la puce en fonction du TP que l'on souhaite faire... réutilisable à l'infini tant qu'on peut synthétiser gratuitement :)

Ozwald le 2012/04/13 23:53

Hello Gorgonite !

Le programmateur PIC que tu proposes se branche sur un port parallèle quand même...en 2012 ça commence à se faire rare ;-)

S'il y a un compilateur OCaml pour PIC c'est une raison supplémentaire pour ne surtout pas aller dans cette direction lol :-p M'enfin si un masochiste traine sur ce blog il sera heureux de l'apprendre donc en son nom : merci pour l'info.

Les FPGA c'est clairement la classe au dessus niveau puissance et versatilité, mais c'est malheureusement nettement plus cher (sinon ça fait un moment que je casserai du mdp sur FPGA@home ;-)). Tu as craqué et tu t'en es acheté un toi :) ? En tout cas pour mes besoins actuels des petits atmega reprogrammables "à l'infini" avec un programmeur à 3€ ça me suffira bien (après tout y'a carrément un malade qui a réussi à faire tourner linux sur un atmega : http://dmitry.co/index.php?p=./04.T... )

Gorgonite le 2012/04/14 18:19

Tout geek digne de ce nom a encore une machine avec un port parallèle...
Disons que ce genre de plan traine sur le net, suffit de se baisser pour en avoir à disposition.
http://www.geii.iut-nimes.fr/fg/wp-...
http://www.technologuepro.com/monta...

Par ailleurs, même en achetant une carte tout prête, est-ce vraiment moins cher que ta solution ? (si l'on ne tient pas compte du fait que tu partais déjà avec des finances amputées par Arduino ^^)
Au passage, tu as sûrement déjà vu ceci :
http://www.robot2009e2i.toile-libre...

Concernant le FPGA, non je n'en ai pas (encore) acheté... C'est prévu (ticket d'entrée estimé à 200€ si je fais mon fainéant), j'attends juste d'avoir un projet sympa en tête et surtout beaucoup de calme durant mes WE. Mais clairement, c'est plus prévu pour tester, mais pas pour "garder en marche" (on peut tout simuler, puis synthétiser et tester sur FPGA... avant de rebasculer sur une plate-forme plus conventionnelle si vraiment ça doit être utilisé sur la durée -- et donc à moindre coût énergie/matériel)
Pour le moment, je me contente de jouer sur simulateur.

Sachant que mon but est aussi de m'amuser à faire des back-ends de proto déjà développés, vers des solutions peu onéreuses... afin de faire du systèmes complexes à prix raisonnable (en vue de domotique hacké maison par exemple :) )

miaousami le 2012/04/16 10:54

Alors mister Oz, ça programme dur ?

trackinnewtech le 2013/09/10 07:39

Pourquoi en basculant sur du micro-controlleur indépendant on perd : l'IDE et ses bibliothèques simplifian la tache du codeur ? Ne faut il pas juste acheter une puce atm avec boatloader et ainsi vous garder tous ces avantages ? Cet exemple montre ce type d'approche et le code s'appuie sur les lib arduino http://blog.idleman.fr/raspberry-pi...

kit le 2014/11/09 14:39

N’importe quel programmeur universel (minipro, etc.) avec AVR studio qui permet de compiler et de récupérer un fichier HEX a reprogrammé...

C’est encore moins cher, simple et rapide

« Page 2 / 2