Le but est de faire clignoter une LED avec un nombre réduit de composants, un environnement réduit et un programme simple... Dans ce cas-ci, le développement a lieu sur Ubuntu 14.04 mais cela devrait pouvoir se faire sur n'importe quel Linux, Windows,...
Arduino, c'est magique. Un peu trop magique... C'est quand même mieux de savoir ce que l'on fait et de s'approcher de la réalité des choses. Et donc, par exemple, d'utiliser un programmeur
ISP (qui utilise un bus
SPI...) pour programmer l'
AVR directement plutôt que de passer par le
bootloader installé dans l'
Arduino. Au niveau du prix, quand on veut le faire soi-même, cela revient à peu près au même. Un clone de
USBasp revient au même prix qu'une interface USB-série, quelque chose comme 2 euros. En plus, on n'est plus limité à l'ATMega368 (ou 168), on peut utiliser toute la gamme AVR, comme ici avec l'
ATTiny13. On peut aussi se servir d'un Arduino comme programmateur avec
ArduinoISP.
Il y a donc quelques fils à connecter : le 5 (ou 3?) volts (VCC), la terre (GND), les trois fils du SPI (MOSI, MISO, CLK) et le 'chip select' (c.-à-d. /RESET).
Le programme pour faire clignoter une LED, sans utiliser l'API Arduino (mais avr-libc), se réduit à
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
DDRB |= _BV(PB3);
for (;;)
{
_delay_ms(200);
PORTB ^= _BV(PB3);
}
}
On programme le port3 en sortie et on joue sur le bit data correspondant pour faire clignoter la LED. (Notons que le compilateur va se plaindre que F_CPU n'est pas défini dans delay.h (il prend alors la valeur par défaut, 1 MHz); on pourrait ajouter un #define F_CPU 1000000UL avant l'
include ou passer F_CPU au compilateur dans le Makefile)
Le Makefile, sans
bell ni
whistle, comprend 3 étapes : compiler avec avr-gcc, transformer le binaire obtenu en fichier texte (
iHEX) et le téléverser avec
avrdude. (On utilise les paquets gcc-avr, binutils-avr, avr-libc, avrdude; la plupart sont déjà requis par le paquet arduino)
blink.elf: blink.c
avr-gcc -std=c99 -Wall -Os -mmcu=attiny13 -o blink.elf blink.c
blink.hex: blink.elf
avr-objcopy -j .text -j .data -O ihex blink.elf blink.hex
flash: blink.hex
avrdude -c usbasp-clone -p t13 -U flash:w:blink.hex
Pour peu que l'ont ait créé un /etc/udev/rules.d/
99-USBasp.rules avec
SUBSYSTEM=="usb", ATTR{product}=="USBasp", ATTR{idProduct}=="05dc", ATTRS{idVendor}=="16c0", MODE="0666"
dedans, on peut simplement faire
$ make flash
et obtenir une LED qui clignote sur PB3.
Une fois enlevé le cordon ombilical de programmation, il ne reste que l'alimentation, le microcontrôleur, une résistance de 10K entre /RESET et VCC, un condensateur de 100nF entre VCC et GND et une 'blinkenlight' entre PB3 et GND (dans ce cas-ci une LED et une résistance de 1K (c'est beaucoup mais selon
AVR Programming, comme ça cela fonctionne aussi avec 12 volts).