Tout ou rien, et le PWM
En une phrase : une broche de l'ESP32 ne sait faire que allumé ou éteint ; pour faire « à moitié », elle alterne les deux très vite, c'est le PWM.
Le tout-ou-rien¶
Avec digitalWrite, une broche n'a que deux états : HIGH (3,3 V, allumé) ou LOW (0 V, éteint). C'est du numérique : pas de demi-mesure. Parfait pour faire clignoter, mais comment faire une LED qui s'allume doucement, ou un moteur qui tourne lentement ?
L'astuce : allumer-éteindre très vite¶
Le PWM (Pulse Width Modulation, « modulation de largeur d'impulsion ») allume et éteint la broche mille fois par seconde. Beaucoup trop vite pour l'œil, qui ne voit que la moyenne : allumé 10 % du temps, la LED paraît faible ; 90 % du temps, presque à fond.
Comme au cinéma
Un film, ce sont 24 images fixes par seconde : ton cerveau les fusionne en mouvement fluide. Le PWM joue le même tour : 1 000 flashs par seconde, ton œil n'en voit qu'une lumière continue, plus ou moins forte.
Plus en profondeur¶
Deux réglages : la fréquence et le rapport cyclique¶
| Réglage | Ce que c'est | Sur l'ESP32 avec analogWrite |
|---|---|---|
| Fréquence | combien de cycles allumé-éteint par seconde, en hertz (Hz) | 1 000 Hz : un cycle dure 1 ms |
| Rapport cyclique | la part du cycle passée « allumé », en % | réglé par la valeur de 0 à 255 |
La période, c'est la durée d'un cycle : période = 1 ÷ fréquence. À 1 000 Hz : 1 ÷ 1 000 = 0,001 s = 1 ms.
Pourquoi de 0 à 255 ?¶
Le PWM de l'ESP32 est réglé par défaut sur 8 bits : 8 chiffres binaires (des 0 et des 1) donnent 2 × 2 × 2 × 2 × 2 × 2 × 2 × 2 = 256 valeurs, de 0 à 255. On retrouve ce même 255 dans les couleurs du ruban et de la barre lumineuse : c'est le nombre préféré des électroniciens !
La tension « moyenne »¶
Le multimètre et les moteurs, comme l'œil, ne suivent pas 1 000 changements par seconde : ils voient la moyenne.
tension moyenne = (valeur ÷ 255) × 3,3 V
analogWrite(2, 64) : allumé un quart du temps. Le multimètre, l'œil ou le moteur ne « voient » que la moyenne, la ligne pointillée bleue.L'œil n'est pas une règle¶
Curiosité : notre œil est bien plus sensible aux faibles lumières qu'aux fortes. Passer de 0 à 25 se voit énormément, passer de 230 à 255 presque pas. C'est pour ça qu'une « respiration » faite en ligne droite paraît rester longtemps allumée à fond. Les bibliothèques comme FastLED corrigent cet effet avec une courbe appelée correction gamma.
Les moteurs et les servos¶
- Moteur : il a de l'inertie (il ne s'arrête pas en 1 ms), donc il lisse lui-même les impulsions et tourne à une vitesse moyenne. Mais une broche ne fournit pas assez de courant : le PWM commande un driver, qui commute la grosse alimentation au même rythme.
- Servo : il attend un signal différent, une impulsion répétée 50 fois par seconde (toutes les 20 ms). C'est la durée de l'impulsion qui donne l'angle : environ 1 ms pour une extrémité, 1,5 ms pour le milieu, 2 ms pour l'autre extrémité (la plage exacte varie selon les servos). La bibliothèque ESP32Servo calcule tout ça avec
write().
Dans le code : analogWrite¶
analogWrite(2, 0); // éteint (0 %)
analogWrite(2, 128); // à moitié (50 %)
analogWrite(2, 255); // à fond (100 %)
La valeur va de 0 à 255. Sur l'ESP32, n'importe quelle broche de sortie sait faire du PWM.
Exemples de calculs¶
Calcul 1 · Combien de temps allumé ?
analogWrite(2, 64) : 64 ÷ 255 ≈ 25 %.
- Dans chaque cycle de 1 ms, la LED est allumée 0,25 ms et éteinte 0,75 ms.
- Tension moyenne : 0,25 × 3,3 ≈ 0,83 V.
Calcul 2 · La vitesse du moteur de la mission 5
Le driver est alimenté en 5 V, et la puissance maximale de départ du programme est puissanceMax = 200.
- 200 ÷ 255 ≈ 78 %.
- Tension moyenne vue par le moteur : 0,78 × 5 ≈ 3,9 V : il tourne à environ trois quarts de sa vitesse maximale.
Calcul 3 · Quelle valeur pour 2 V de moyenne ?
2 ÷ 3,3 ≈ 0,61, et 0,61 × 255 ≈ 155. Donc analogWrite(broche, 155).
Calcul 4 · Le servo au milieu
50 impulsions par seconde → une toutes les 1 000 ÷ 50 = 20 ms. Une impulsion de 1,5 ms dans une période de 20 ms, c'est un rapport cyclique de 1,5 ÷ 20 = 7,5 % seulement : le servo ne lit pas la moyenne, il chronomètre l'impulsion.
Mise en pratique¶
La LED qui respire, version simple : sur la LED bleue intégrée, deux boucles for font monter puis descendre la luminosité.
#define LED 2
void setup() {
pinMode(LED, OUTPUT);
}
void loop() {
for (int v = 0; v <= 255; v++) { // la lumière monte…
analogWrite(LED, v);
delay(4);
}
for (int v = 255; v >= 0; v--) { // … puis redescend
analogWrite(LED, v);
delay(4);
}
}
Une montée dure 256 × 4 ms ≈ 1 seconde. Change le delay(4) pour respirer plus vite ou plus lentement. (La boucle for est expliquée dans tableaux, boucles et fonctions.)
Mesurer la moyenne : avec la LED de test sur D2 et analogWrite(2, 128) dans setup(), mets le multimètre en V⎓ entre D2 et GND. Il affiche environ 1,65 V : la moitié de 3,3 V. Essaie 64 (≈ 0,8 V) et 192 (≈ 2,5 V).
Les pièges¶
| Le piège | Ce qui arrive | La bonne habitude |
|---|---|---|
| Une valeur au-delà de 255 | elle est ramenée à 255 au mieux, ou donne un résultat inattendu | rester entre 0 et 255 (constrain aide) |
| Un moteur directement sur une broche en PWM | pas assez de courant | passer par un driver |
Croire qu'un servo se commande avec analogWrite |
il tremble ou ne bouge pas | utiliser la bibliothèque ESP32Servo |
Exercices¶
1. Quel rapport cyclique donne analogWrite(2, 191) ?
191 ÷ 255 ≈ 75 %.
2. Quelle tension moyenne donne une broche avec un rapport cyclique de 50 % ?
0,5 × 3,3 = 1,65 V.
3. À 1 000 Hz, combien de temps dure un cycle ? Et à 500 Hz ?
1 ÷ 1 000 = 1 ms. À 500 Hz : 1 ÷ 500 = 2 ms.
4. Le moteur de la mission 5 tournerait-il plus vite avec puissanceMax = 255 ? Est-ce risqué ?
Oui, il recevrait 5 V en moyenne et tournerait plus vite. Nos deux moteurs acceptent 5 V (l'EF09087 jusqu'à 6 V, l'EF10154 jusqu'à 5 V) : pas de danger pour eux. Mais ils demandent plus de courant, surtout au démarrage : sur l'USB, l'ESP32 risque de redémarrer.
À retenir
- Une broche est tout ou rien : 3,3 V ou 0 V.
- Le PWM alterne très vite : l'œil (ou le moteur) ne voit que la moyenne.
analogWrite(broche, 0 à 255): 0 = éteint, 255 = à fond ; moyenne = valeur ÷ 255 × 3,3 V.- Les servos lisent la durée d'une impulsion (1 à 2 ms), 50 fois par seconde.
Où ça sert dans l'atelier¶
- Mission 1 · Qui fait quoi : la respiration (□) et le mode pilote (L1) de la LED bleue.
- Mission 3 · Dagoservo : le signal du servo.
- Mission 4 · Naboucle : un radar à balayage, piloté en microsecondes.
- Mission 5 · Le driver DRV8833 : la vitesse du moteur aux gâchettes.
Pour aller plus loin¶
- 🇫🇷 Et les sorties « analogiques », enfin… presque !, cours Arduino d'Eskimon : le PWM avec
analogWrite. - 🇫🇷 Modulation de largeur d'impulsion, sur Wikipédia.
- 🇬🇧 ESP32 PWM with Arduino IDE, Random Nerd Tutorials : le PWM spécialement sur l'ESP32.
- 🇬🇧 Pulse Width Modulation, SparkFun.
- 🇬🇧 analogWrite(), la référence officielle Arduino.