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
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.
| Broches | Nombre | Rôle |
|---|---|---|
Numériques 0 à 13 | 14 | lire ou écrire un état, haut ou bas |
Dont PWM, marquées ~ | 6 | 3, 5, 6, 9, 10, 11 : simuler une tension intermédiaire |
Analogiques A0 à A5 | 6 | mesurer une tension entre 0 et 5 V |
| Alimentation | 5V, 3.3V, GND (la masse, le 0 V de référence) |
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.
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.
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.
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.
Avec 220 Ω : mA. Avec 330 Ω : 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.
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.
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.
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.
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.
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 ms, soit une seconde. En soixante secondes : 60 éclairs.
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 V sous 10 mA : Ω.
Les résistances ne se vendent qu'en valeurs normalisées. On prend la valeur immédiatement supérieure, 330 Ω, qui donne 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
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
- Poser le montage sur le papier avant de câbler : quelle broche, quel composant, quel sens.
- 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.
- Séparer ce qui se fait une fois, dans
setup(), de ce qui se répète, dansloop(). - Dessiner le signal attendu sur chaque sortie, avec ses durées, avant d'écrire les
delay. - 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.
pinModeconfigure une broche,digitalWritey imposeHIGHouLOW,delaysuspend 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.