Nous allons travailler sur une carte Arduino Uno Rev3. Les documentations techniques sont téléchargeables ci-dessous:
Il s'agit de la documentation technique du microcontrôleur que nous allons utiliser ici.
Permet de consulter la correspondance entre les broches du microcontrôleur et celles indiquées sur la carte
Surtout à titre indicatif, un schéma des branchements internes de l'Arduino
Voici un programme très simple qui allume la LED de la carte:
// led.c
#include <avr/io.h>
int main(void)
{
DDRB |= (1 << PB5); // PB5 en sortie
PORTB |= (1 << PB5); // PB5 à 1
while (1);
}
Afin d'exécuter ce programme sur la carte, nous allons procéder en plusieurs étapes:
avr-gcc -mmcu=atmega328p -Os -o led.elf led.c
avr-objcopy -O binary led.elf led.bin
avrdude -p atmega328p -c arduino -P /dev/ttyACM0 -U flash:w:led.bin
Exécutez les commandes afin de tester le processus de compilation et de transfert.
Placez maintenant la source dans le dossier demo_led/main.c
, et écrivez un fichier
Makefile
permettant d'automatiser la compilation et le chargement, à l'aide de:
make
: compilermake install
: transférer le programme sur la carteAjoutez un fichier blink/main.c
, et faites en sorte que votre Makefile
permette
de changer le programme à compiler et à transférer, vous pourrez par exemple utiliser
une variable:
# Makefile
FIRMWARE := blink
L'architecture de votre dossier pourrait ressembler à cela:
firmwares/
├── Makefile # Permet de compiler et de transférer le programme
├── demo_led/
│ └── main.c
├── blink/
│ └── main.c
└── build/ # Fichiers générés par la compilation
├── firmware.bin
├── firmware.elf
└── main.o
Ainsi, vous pourrez conserver les firmwares intermédiaires que vous écrirez au cours des séances.
Afin de faire clignoter la LED, nous aurons besoin de délais, nous utiliserons pour cela:
#include <util/delay.h>
// Pour attendre
_delay_ms(1000); // Délai (temps en millisecondes)
Modifiez le code pour faire clignoter la LED.
Vous pourriez observer le message d'erreur F_CPU not defined
. Pourquoi d'après vous
ce message apparaît-il ? Comment y remédier ?
Nous allons maintenant faire clignoter la LED de manière progressive (elle s'allumera puis
s'etteindra progressivement).
La broche PB5
ne peut être qu'allumée ou éteinte. Il est cependant possible de jouer sur
la durée pendant laquelle elle est allumée, afin de donner l'impression qu'elle est plus ou
moins lumineuse.
En jouant sur les délais vus précédemment , essayez de régler la luminosité en faisant "clignoter" la LED à une fréquence importante, en faisant en sorte qu'elle soit plus ou moins souvent allumée.
Note: Nous avons l'impression que la lumière ne clignote pas grâce à la persistance rétinienne. Le ratio de temps allumé/éteint s'appelle le rapport cyclique.
Ajoutez maintenant un nouveau programme glow/main.c
qui fait varier la luminosité de la
LED de manière progressive.
Note: La fonction _delay_ms
prend en paramètre une valeur qui doit être connue à la
compilation. Mais vous pouvez écrire votre propre fonction qui fera par exemple appel à
_delay_ms(1)
le nombre de fois nécessaire.