TD1: Prise en main

Ressources

Nous allons travailler sur une carte Arduino Uno Rev3. Les documentations techniques sont téléchargeables ci-dessous:

Datasheet de l'ATmega328P

Il s'agit de la documentation technique du microcontrôleur que nous allons utiliser ici.


Pin mapping UNO/ATmega328P

Permet de consulter la correspondance entre les broches du microcontrôleur et celles indiquées sur la carte


Schéma de l'Arduino Uno R3

Surtout à titre indicatif, un schéma des branchements internes de l'Arduino

Chaîne de compilation

Un premier programme

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:

  • Compilation du programme:
    • avr-gcc -mmcu=atmega328p -Os -o led.elf led.c
  • Génération du fichier binaire:
    • avr-objcopy -O binary led.elf led.bin
  • Transfert du fichier binaire sur la carte:
    • 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.

Automatisation (Makefile)

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: compiler
  • make install: transférer le programme sur la carte

Clignotement de la LED

Ajoutez 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 ?

Clignotement progressif

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.

Correction