Aller au contenu principal

Avant de commencer

Ce que ce chapitre apporte

  • Dire ce qui distingue un microcontrôleur d'un ordinateur, et ce que cela change pour le programme.
  • Expliquer le rôle de setup() et de loop(), et pourquoi loop() ne se termine jamais.
  • Brancher une LED avec sa résistance, et justifier la valeur de cette résistance.
  • Faire clignoter une LED et lire le chronogramme du signal produit.
  • Afficher un message dans le moniteur série.

Jusqu'ici, un programme lisait des données et affichait des résultats : tout se passait à l'écran. Une carte Arduino change la nature de l'exercice. Le programme allume une LED, lit un bouton, mesure une tension : il agit sur le monde physique, et le monde physique lui répond. Ce chapitre pose le décor, explique ce que fait un programme qui ne s'arrête jamais, et fait clignoter une première LED, en simulation, sans aucun matériel.

Un ordinateur réduit à l'essentiel

Définition

Un microcontrôleur réunit sur une seule puce un processeur, de la mémoire et des broches d'entrée et de sortie. Il n'a ni écran, ni clavier, ni système d'exploitation : il exécute un seul programme, qui démarre à la mise sous tension.

La carte Arduino Uno est construite autour du microcontrôleur ATmega328P. Ses chiffres sont modestes, et il faut les avoir en tête dès maintenant : 32 Ko de mémoire pour le programme, 2 Ko de mémoire vive pour les variables, un processeur cadencé à 16 MHz. Un tableau de mille entiers ne tient pas dans cette mémoire vive.

BrochesNombreRôle
Numériques 0 à 1314lire ou écrire un état, haut ou bas
Dont PWM, marquées ~63, 5, 6, 9, 10, 11 : simuler une tension intermédiaire
Analogiques A0 à A56mesurer une tension entre 0 et 5 V
Alimentation5V, 3.3V, GND (la masse, le 0 V de référence)
Les broches 0 et 1 sont déjà prises
Elles portent la liaison série avec l'ordinateur, celle qui sert à téléverser le programme et à afficher des messages. Y brancher un composant perturbe l'une et l'autre. Les montages de ce parcours commencent donc à la broche 2.

setup() et loop()

Un programme Arduino ne contient pas de point de départ unique qui s'exécuterait puis rendrait la main. Il contient obligatoirement deux fonctions.

Définition

setup() s'exécute une seule fois, au démarrage : c'est là qu'on configure les broches et qu'on ouvre la liaison série.

loop() s'exécute ensuite indéfiniment : dès qu'elle se termine, la carte la relance depuis sa première ligne.

Organigramme
VraiFauxDébutsetup()indéfinimentloop()

Le cycle de vie d'un programme Arduino. Il n'y a pas de sortie : un microcontrôleur n'a personne à qui rendre la main. Couper l'alimentation est la seule façon d'arrêter le programme.

Cette boucle perpétuelle n'est pas une curiosité. Un thermostat, une alarme, un feu de circulation ne s'arrêtent jamais : ils observent, décident, agissent, et recommencent. loop() est la forme exacte de ce travail.

Le clignotement placé dans setup()
Un programme qui allume puis éteint la LED dans setup(), en laissant loop() vide, ne produit qu'un seul éclair au démarrage. Le code n'est pas faux, il est au mauvais endroit : ce qui doit se répéter va dans loop().

Premier montage : une LED

Une LED ne se branche pas n'importe comment. Elle a un sens : le courant entre par l'anode, la patte la plus longue, et ressort par la cathode, la plus courte. Branchée à l'envers, elle reste éteinte.

Elle a surtout besoin d'une résistance en série. Une LED rouge fait chuter la tension d'environ 2 V ; sur une broche à 5 V, les 3 V restants tombent dans la résistance, et c'est elle qui fixe le courant par la loi d'Ohm.

Le calcul de la résistance

Avec 220 Ω : I=(52)/22013,6I = (5 - 2) / 220 \approx 13{,}6 mA. Avec 330 Ω : I9,1I \approx 9{,}1 mA.

Une broche de l'Uno supporte 20 mA en fonctionnement normal. Sans résistance, rien ne limite le courant sauf la broche elle-même, qui finit détruite avec la LED.

Le montage : anode vers la broche 3, cathode vers une résistance de 220 Ω, résistance vers GND. Puis le programme.

Arduino
void setup() {
pinMode(3, OUTPUT); // la broche 3 pilote la LED
}
void loop() {
digitalWrite(3, HIGH); // 5 V sur la broche : la LED s'allume
delay(1000); // attendre une seconde
digitalWrite(3, LOW); // 0 V : elle s'éteint
delay(1000);
}

pinMode déclare la broche en sortie. digitalWrite y impose 5 V (HIGH) ou 0 V (LOW). delay suspend le programme pendant le nombre de millisecondes indiqué. Ce que produit ce programme n'est pas une suite d'instructions, c'est un signal sur un fil.

1 s par bit1 bauds8 bits, 8 s en tout
broche 31010101008 s
Le signal produit par le programme, sur huit secondes. Chaque palier dure une seconde : c'est la valeur passée à delay. Une période complète, allumée puis éteinte, dure donc deux secondes.

Simuler avant de câbler

Tinkercad est un simulateur en ligne, gratuit, qui propose une carte Uno virtuelle, une plaque d'essai et des composants. On y câble le montage à la souris, on écrit le programme en mode texte, et l'on démarre la simulation.

Ce que la simulation ne remplace pas
Elle valide la logique du programme et la cohérence du câblage. Elle ne reproduit pas tout ce qui existe sur une vraie carte : contacts qui rebondissent, tolérances des composants, parasites. Un montage qui fonctionne en simulation reste à essayer sur le matériel.

Le moniteur série

La carte n'a pas d'écran, mais elle peut envoyer du texte à l'ordinateur par la liaison série. Le moniteur série de l'environnement de développement, ou celui de Tinkercad, l'affiche.

Arduino
int compteur = 0;
void setup() {
Serial.begin(9600); // ouvrir la liaison à 9600 bauds
}
void loop() {
Serial.print("Secondes : "); // sans retour à la ligne
Serial.println(compteur); // avec retour à la ligne
compteur++;
delay(1000);
}

Le moniteur affiche Secondes : 0, puis Secondes : 1, une ligne par seconde. Le nombre passé à Serial.begin est le débit : 9600 bauds, soit environ 960 caractères par seconde, un caractère occupant dix bits sur la ligne. Le moniteur doit être réglé sur le même débit, sans quoi il affiche des caractères incohérents.

Le moniteur série, premier outil de mise au point
Afficher la valeur d'une variable à un moment choisi est la façon la plus directe de savoir ce que fait réellement le programme. Le chapitre 8 en fait une méthode.

Exercices type

Une LED reste allumée 200 ms puis éteinte 800 ms, en boucle. Combien d'éclairs produit-elle en une minute ?

Une période dure 200+800=1000200 + 800 = 1000 ms, soit une seconde. En soixante secondes : 60 éclairs.

Arduino
void setup() {
pinMode(13, OUTPUT);
}
void loop() {
digitalWrite(13, HIGH);
delay(200);
digitalWrite(13, LOW);
delay(800);
}

Le rapport entre durée allumée et durée totale vaut ici 20 %. C'est une notion qui reviendra au chapitre 6, sous le nom de rapport cyclique.

Le programme de clignotement a été écrit entièrement dans setup(), et loop() est vide. Qu'observe-t-on ?

Un seul éclair, au démarrage, puis plus rien. setup() ne s'exécute qu'une fois ; loop() tourne bien indéfiniment, mais ne contient rien.

Pour que le clignotement se répète, les instructions d'allumage, d'extinction et d'attente doivent être déplacées dans loop(). Seul pinMode, qui n'a besoin d'être fait qu'une fois, reste dans setup().

Une LED rouge, qui fait chuter 2 V, doit être parcourue par environ 10 mA sur une broche à 5 V. Quelle résistance choisir ?

La résistance doit absorber 52=35 - 2 = 3 V sous 10 mA : R=3/0,010=300R = 3 / 0{,}010 = 300 Ω.

Les résistances ne se vendent qu'en valeurs normalisées. On prend la valeur immédiatement supérieure, 330 Ω, qui donne 3/3309,13 / 330 \approx 9{,}1 mA : un peu moins de courant, et donc un peu moins de lumière, mais jamais trop. Prendre la valeur inférieure ferait dépasser le courant visé.

Vérification

Vérification rapideon peut se reprendre

1.Que fait la carte quand la fonction loop() se termine ?

2.Pourquoi une LED se branche-t-elle toujours avec une résistance ?

3.Une LED est branchée à l'envers, cathode vers la broche. Que se passe-t-il ?

4.Le moniteur série affiche des caractères incohérents. Quelle est la cause la plus probable ?

5.Sur l'Uno, pourquoi éviter de brancher un composant sur les broches 0 et 1 ?

La méthode

  1. Poser le montage sur le papier avant de câbler : quelle broche, quel composant, quel sens.
  2. Calculer la résistance de chaque LED à partir de la tension et du courant visés, puis prendre la valeur normalisée immédiatement supérieure.
  3. Séparer ce qui se fait une fois, dans setup(), de ce qui se répète, dans loop().
  4. Dessiner le signal attendu sur chaque sortie, avec ses durées, avant d'écrire les delay.
  5. Simuler, puis vérifier dans le moniteur série ce que le programme fait réellement.

Synthèse

  • Un microcontrôleur exécute un seul programme, sans système d'exploitation, avec très peu de mémoire vive : 2 Ko sur l'Uno.
  • setup() s'exécute une fois, loop() indéfiniment.
  • Une LED a un sens, de l'anode vers la cathode, et exige une résistance qui limite le courant.
  • pinMode configure une broche, digitalWrite y impose HIGH ou LOW, delay suspend le programme.
  • Un programme de clignotement produit un signal : ses paliers ont la durée des delay.
  • Serial.begin(9600) ouvre la liaison série ; le moniteur doit utiliser le même débit.