Retour au blog

Électronique Numérique et Arduino pour Bac Pro SN

LOW et HIGH, les 0 à 1023 d'analogRead() et les 0 à 255 d'analogWrite() : ce qu'ils valent en volts sur une carte Arduino Uno, avec quatre exercices corrigés.

Cet article a été rédigé à des fins pédagogiques. Les informations présentées peuvent évoluer. Nous t’invitons à vérifier auprès de sources officielles.

Sur une carte Arduino Uno R3 alimentée en 5 V, ton programme manipule trois sortes de nombres : LOW ou HIGH sur une broche numérique, un entier de 0 à 1023 renvoyé par analogRead(), un entier de 0 à 255 donné à analogWrite(). Chacun représente une tension, et on passe de l'un à l'autre par une proportion. Une lecture de 512 correspond à $512 \times \dfrac{5}{1024} = 2{,}5$ V, et analogWrite(9, 51) donne une tension moyenne de $\dfrac{51}{255} \times 5 = 1$ V.

Une broche numérique : LOW, HIGH et la zone grise

Une broche numérique porte un bit, c'est-à-dire un chiffre binaire : 0 ou 1. En sortie, digitalWrite(13, HIGH) met la broche à 5 V et digitalWrite(13, LOW) la met à 0 V.

En entrée, la frontière est moins nette. D'après la référence Arduino, sur une carte 5 V, digitalRead() renvoie HIGH au-dessus de 3,0 V et LOW au-dessous de 1,5 V. Entre les deux, rien n'est garanti.

Une entrée reliée à rien est dite « flottante » : sa lecture devient imprévisible. C'est ce qui arrive avec un bouton branché seul, une fois relâché. Le remède est une résistance de tirage (pull-up) entre la broche et le 5 V : bouton relâché, elle tire la broche vers HIGH ; bouton appuyé, il relie la broche à la masse (GND) et la lecture passe à LOW. Avec pinMode(2, INPUT_PULLUP), tu actives une résistance de ce type intégrée au microcontrôleur : il suffit alors de câbler le bouton entre la broche 2 et GND.

Piège classique : avec INPUT_PULLUP, la logique est inversée. Bouton appuyé, digitalRead(2) renvoie LOW. Si tu testes if (digitalRead(2) == HIGH) pour détecter l'appui, ton action se déclenche quand personne ne touche le bouton.

Pour combiner deux entrées, ton programme joue le rôle d'une porte logique. La porte ET, dont la sortie vaut 1 seulement si les deux entrées valent 1, s'écrit && ; la porte OU s'écrit ||, la porte NON !. Pour allumer une lampe quand il fait sombre et que quelqu'un passe, le test devient if (sombre && presence).

D'où sortent 1023 et 255

Le microcontrôleur range chaque valeur sur un nombre fixe de bits. Chaque bit ajouté double le nombre de combinaisons : 2 avec un bit, 4 avec deux, 8 avec trois. Avec $n$ bits, on écrit donc $2^n$ nombres, de $0$ à $2^n - 1$.

BitsNombre de valeursPlus grande valeurFonction concernée
1$2^1 = 2$$1$digitalRead(), digitalWrite()
8$2^8 = 256$$255$analogWrite()
10$2^{10} = 1024$$1023$analogRead() sur la Uno

Le compte commence à zéro : 1024 valeurs, mais la plus grande vaut 1023. En binaire, 1023 s'écrit avec dix chiffres 1 : $1111111111$.

Lire une tension avec analogRead()

Les entrées analogiques de la Uno, de A0 à A5, passent par un convertisseur analogique-numérique, le CAN. Il transforme une tension, qui peut prendre n'importe quelle valeur, en un nombre entier. Celui de la Uno travaille sur 10 bits : il découpe la plage de 0 à 5 V en 1024 marches égales.

Définition : le quantum $q$ est la hauteur d'une marche, c'est-à-dire la plus petite variation de tension que le CAN distingue. Sur la Uno, $q = \dfrac{5}{1024} \approx 0{,}0049$ V, soit environ 4,9 mV.

Formule : si analogRead() renvoie $N$, la tension sur la broche, en volts, vaut

$$U \approx N \times q = N \times \frac{5}{1024}$$

et dans l'autre sens, $N \approx \dfrac{U}{q}$.

Le jour où tu as oublié la formule, refais le raisonnement : 1024 marches pour 5 V, donc une marche vaut $\dfrac{5}{1024}$ V, et $N$ marches valent $N$ fois plus. Puis contrôle l'ordre de grandeur : une lecture proche de 1023 signifie presque 5 V, une lecture proche de 512 environ la moitié.

Commander une puissance avec analogWrite()

La fonction analogWrite() ne sort pas une tension continue réglable. D'après sa documentation, la broche produit un signal rectangulaire : elle bascule entre 0 et 5 V. C'est la modulation de largeur d'impulsion, ou MLI (PWM en anglais). Sur la Uno R3, seules les broches 3, 5, 6, 9, 10 et 11 la proposent, à 490 Hz (980 Hz sur les broches 5 et 6).

Le rapport cyclique $\alpha$ est la part de chaque période $T$ pendant laquelle la broche est à 5 V : $\alpha = \dfrac{t_{\text{haut}}}{T}$. La valeur donnée à analogWrite() le fixe : 0 laisse la broche toujours à 0 V, 255 la laisse toujours à 5 V, donc $\alpha = \dfrac{\text{valeur}}{255}$.

Formule : la tension moyenne sur la broche, en volts, vaut

$$U_{\text{moy}} = \alpha \times 5 = \frac{\text{valeur}}{255} \times 5$$

Ton œil ne suit pas une LED qui s'allume et s'éteint 490 fois par seconde, et un moteur lancé ne s'arrête pas entre deux impulsions : l'un comme l'autre ne réagit qu'à la moyenne. Avec $\alpha = 0{,}5$, la LED paraît moins lumineuse et le moteur tourne moins vite, alors que la broche ne délivre jamais 2,5 V.

Piège classique : malgré son nom, analogWrite() n'a rien à voir avec les entrées A0 à A5 ni avec analogRead(), comme le précise la documentation Arduino. Elle attend une valeur de 0 à 255, jamais la lecture brute de 0 à 1023 : l'exercice 4 tombe là-dessus.

Exercices corrigés

Exercice 1 : Sur une carte Uno alimentée en 5 V, analogRead() renvoie 205 pour la tension prise sur un potentiomètre (une résistance réglable). Quelle est cette tension, au centième de volt près ?

Correction :

Le CAN de la Uno a 1024 marches pour 5 V, donc $U \approx 205 \times \dfrac{5}{1024} = \dfrac{1025}{1024} \approx 1{,}00$ V.

Contrôle : 205 est à peu près le cinquième de 1024, et le cinquième de 5 V vaut 1 V.

Exercice 2 : Dans une serre, un capteur de température délivre 10 mV par degré Celsius, et 0 V à 0 °C. Il est relié à l'entrée A0 d'une carte Uno alimentée en 5 V, et analogRead(A0) renvoie 62. Quelle température règne dans la serre ? À combien de degrés près ce montage peut-il mesurer ?

Correction :

Tension lue : $U \approx 62 \times \dfrac{5}{1024} \approx 0{,}3027$ V, soit environ 302,7 mV.

À 10 mV par degré, la température vaut $\dfrac{302{,}7}{10} \approx 30{,}3$ °C.

Une marche du CAN vaut $\dfrac{5}{1024} \approx 0{,}0049$ V, soit environ 4,9 mV, ce qui représente $\dfrac{4{,}9}{10} = 0{,}49$ °C. Ce montage mesure donc à un demi-degré près environ.

Exercice 3 : Un ventilateur est commandé, à travers un transistor, par la broche 9 d'une carte Uno alimentée en 5 V. La MLI de cette broche fonctionne à 490 Hz. On veut une tension moyenne de 3 V sur la broche. Quelle valeur faut-il donner à analogWrite() ? Pendant combien de temps la broche reste-t-elle à 5 V dans chaque période ?

Correction :

Le rapport cyclique vaut $\alpha = \dfrac{3}{5} = 0{,}6$, donc la valeur est $0{,}6 \times 255 = 153$ : on écrit analogWrite(9, 153).

La période vaut $T = \dfrac{1}{490} \approx 0{,}00204$ s, soit environ 2,04 ms. La broche reste à 5 V pendant $t_{\text{haut}} = \alpha \times T \approx 0{,}6 \times 2{,}04 \approx 1{,}22$ ms.

Exercice 4 : Pour régler la luminosité d'une LED branchée sur la broche 9 d'une carte Uno, avec un potentiomètre relié à l'entrée A0, un élève écrit analogWrite(9, analogRead(A0));. Pourquoi est-ce faux ? Quand analogRead(A0) renvoie 800, quelle valeur faut-il donner à analogWrite() pour garder la même proportion ?

Correction :

La fonction analogRead() renvoie de 0 à 1023, tandis que analogWrite() attend de 0 à 255. Dès que la lecture dépasse 255, la valeur sort de la plage prévue par la documentation.

Il faut garder la proportion : $\dfrac{800}{1023} \times 255 \approx 199{,}4$. La fonction map(800, 0, 1023, 0, 255) fait ce calcul en nombres entiers et supprime la partie décimale : elle renvoie 199.

La ligne corrigée : analogWrite(9, map(analogRead(A0), 0, 1023, 0, 255));

À retenir

À retenir :

  • Carte 5 V : digitalRead() renvoie HIGH au-dessus de 3,0 V, LOW au-dessous de 1,5 V, rien de garanti entre les deux.
  • Avec INPUT_PULLUP, un bouton appuyé se lit LOW.
  • $n$ bits donnent $2^n$ valeurs, de $0$ à $2^n - 1$.
  • Lecture : $U \approx N \times \dfrac{5}{1024}$ en volts, avec un quantum d'environ 4,9 mV.
  • Commande : $U_{\text{moy}} = \dfrac{\text{valeur}}{255} \times 5$ en volts, une moyenne obtenue par MLI.
  • D'une lecture à une commande : map(valeur, 0, 1023, 0, 255).

Sources

  • Arrêté du 13 février 2023 portant création de la spécialité « cybersécurité, informatique et réseaux, électronique » de baccalauréat professionnel, Journal officiel du 12 mars 2023 : la dernière session du bac pro SN a eu lieu en 2025 ; le bac pro CIEL qui le remplace, avec une première session en 2026, range les « structures électroniques matérielles (analogiques et numériques) » et les « structures programmables » parmi ses connaissances (texte sur eduscol).
  • Référence du langage Arduino : analogRead, analogWrite, HIGH et LOW, INPUT_PULLUP et map.

Tu peux partager cette page librement, en citant ORBITECH AI Academy avec son lien.