Un système embarqué, c'est une électronique cachée dans l'objet qu'elle pilote, et elle tient en trois maillons : un capteur qui mesure, une carte programmée qui décide, un actionneur qui agit. Prends un arrosage automatique : une sonde mesure l'humidité de la terre, la carte Arduino compare cette mesure à un seuil et, si la terre est trop sèche, fait démarrer la pompe à travers un transistor. Tout le travail tient alors en deux règles : ne jamais demander à une broche plus de courant qu'elle ne peut en fournir, et écrire un programme qui relit ses capteurs sans s'arrêter.
Capteur, programme, actionneur
Un capteur transforme une grandeur physique (température, distance, lumière) en signal électrique. Un actionneur agit sur le monde : une pompe pousse l'eau, un moteur tourne. Entre les deux, le microcontrôleur, un petit ordinateur complet sur une seule puce, exécute ton programme.
Avant de câbler un capteur, regarde la forme du signal qu'il rend : elle décide de la broche à utiliser et de la fonction qui le lira.
| Le capteur rend | Exemple | Lecture dans le programme |
|---|---|---|
| deux états seulement (tout ou rien) | bouton, détecteur de présence | digitalRead() |
| une tension qui varie | sonde d'humidité, photorésistance (sa résistance varie avec la lumière) | analogRead() |
| une impulsion dont la durée compte | capteur à ultrasons | pulseIn() |
Côté sortie, une broche délivre un signal de commande, pas de la puissance. Elle suffit pour une LED ; pour une pompe ou un moteur, il faut un intermédiaire.
Définition : le préactionneur laisse passer l'énergie vers l'actionneur quand la carte le lui demande. En courant continu, c'est souvent un transistor utilisé en interrupteur ; pour un appareil branché sur le secteur, c'est un relais, un interrupteur actionné par un électroaimant.
Brancher sans abîmer la carte
La fiche technique de l'Arduino Uno Rev3 annonce 20 mA par broche d'entrée-sortie (caractéristiques du fabricant). C'est assez pour une LED, pas pour un moteur.
Une LED reliée sans protection entre une broche à 5 V et la masse (GND, le 0 V de référence) laisse passer un courant que rien ne limite. On ajoute une résistance en série, et la loi d'Ohm, $U = R \times I$, donne sa valeur : la LED garde à ses bornes une tension à peu près fixe, la résistance reçoit le reste, et le même courant traverse les deux.
Formule : pour une LED de tension $U_{\text{LED}}$, alimentée sous $U_{\text{alim}}$ et parcourue par le courant $I$ voulu,
$$R = \frac{U_{\text{alim}} - U_{\text{LED}}}{I}$$
avec $R$ en ohms, les tensions en volts et $I$ en ampères.
Pour une LED rouge prévue pour 2 V et 15 mA, sur une broche à 5 V : $R = \dfrac{5 - 2}{0{,}015} = 200\ \Omega$. Une valeur courante juste au-dessus, 220 Ω, convient : le courant baisse un peu et la LED reste protégée.
Pour une charge plus gourmande, la broche commande le préactionneur et une alimentation séparée fournit la puissance. Relie alors la masse de la carte à celle de cette alimentation : sans ce fil commun, la commande du transistor n'a pas de référence. Et place une diode de roue libre, en inverse, aux bornes d'un moteur ou d'une bobine de relais : à la coupure, une bobine crée une pointe de tension qui peut détruire le transistor, et la diode écoule ce courant.
Piège classique : brancher la pompe directement sur une broche, « juste pour tester ». Elle réclame bien plus que 20 mA : elle démarre mal ou pas du tout, et la sortie du microcontrôleur risque d'être détruite. La broche commande, l'alimentation de puissance fournit.
La boucle qui décide
Le bac pro CIEL, qui a remplacé le bac pro SN (dernière session en 2025, première session CIEL en 2026), attend que tu maîtrises « variables, alternatives, boucles et fonctions » (arrêté du 13 février 2023). Un programme Arduino les met toutes en jeu.
Il contient toujours deux fonctions. setup() s'exécute une seule fois, après chaque mise sous tension ou réinitialisation de la carte : on y règle le rôle des broches. loop() s'exécute ensuite en boucle, sans fin : c'est là que le système lit, décide et agit.
Pour l'arrosage, le réflexe est un seul seuil : pompe en marche sous 30 % d'humidité, arrêtée sinon. Mais une mesure n'est jamais parfaitement stable. Autour de 30 %, la lecture passe de 29 à 31 puis revient, et la pompe démarre et s'arrête sans cesse, ce qui l'use vite.
Définition : l'hystérésis sépare le seuil de mise en marche du seuil d'arrêt. Entre les deux, le système garde l'état qu'il avait. Un thermostat de chauffage fonctionne ainsi.
Voici le programme complet. lireHumidite() est une fonction que tu as écrite à part : elle renvoie l'humidité de la terre en pourcentage.
const int POMPE = 7; // broche reliée au transistor
void setup() {
pinMode(POMPE, OUTPUT);
}
void loop() {
int h = lireHumidite();
if (h < 30) {
digitalWrite(POMPE, HIGH); // trop sec : marche
} else if (h > 45) {
digitalWrite(POMPE, LOW); // assez humide : arrêt
}
// entre 30 et 45 : rien, la pompe garde son état
}
Une sortie garde le niveau que tu lui as donné : ne rien écrire, c'est laisser la pompe comme elle était.
Piège classique : pour limiter l'arrosage à 10 secondes, delay(10000) semble tout trouvé. Mais pendant un delay(), aucune lecture de capteur ni commande de broche n'a lieu, précise la référence Arduino : ton système reste aveugle dix secondes. Pour mesurer une durée sans bloquer, note l'instant du départ avec millis(), qui compte les millisecondes depuis le lancement du programme, et compare à chaque tour de loop().
Exercices corrigés
Exercice 1 : Une LED verte de tension 2,2 V doit être parcourue par 10 mA, sur une broche à 5 V (données fictives). Calcule la résistance à mettre en série. Avec la résistance de 330 Ω que tu as sous la main, quel courant obtiens-tu ?
Correction :
La résistance reçoit $5 - 2{,}2 = 2{,}8$ V pour un courant de 10 mA, soit 0,010 A, donc $R = \dfrac{2{,}8}{0{,}010} = 280\ \Omega$.
Avec 330 Ω : $I = \dfrac{2{,}8}{330} \approx 0{,}0085$ A, soit environ 8,5 mA. La LED éclaire un peu moins, et la broche reste loin de ses 20 mA.
Exercice 2 : Un robot doit s'arrêter à moins de 30 cm d'un obstacle. Son capteur à ultrasons émet une salve sonore, et pulseIn() renvoie 2900 : c'est la durée, en microsecondes, entre l'émission et le retour de l'écho. Le son se déplace à 340 m/s dans l'air. À quelle distance est l'obstacle ? Le robot doit-il s'arrêter ?
Correction :
La durée vaut $2\,900\ \mu\text{s} = 0{,}0029$ s, et le son parcourt pendant ce temps $340 \times 0{,}0029 = 0{,}986$ m.
Ce trajet est un aller-retour, l'obstacle est donc à la moitié : $d = \dfrac{0{,}986}{2} = 0{,}493$ m, environ 49 cm. C'est plus que 30 cm, le robot continue. Sans la division par deux, tu aurais trouvé 99 cm, le double.
Exercice 3 : Une pompe fonctionne sous 12 V et consomme 0,25 A (données fictives). Elle doit être pilotée par une carte Uno, qui fournit 20 mA par broche. Peut-on la brancher sur une broche ? Sinon, décris le montage et ses deux précautions.
Correction :
La pompe demande 250 mA, soit $\dfrac{250}{20} = 12{,}5$ fois ce que la broche fournit, et sous 12 V au lieu de 5 V : le branchement direct est exclu.
La broche commande un transistor, qui ferme le circuit de la pompe alimenté en 12 V. Les deux masses sont reliées, et une diode de roue libre est placée en inverse aux bornes de la pompe, dont le moteur contient des bobines.
Exercice 4 : La pompe est arrêtée au départ, et le programme lit successivement 31, 29, 30, 28, 31, 29, 40 puis 46 % d'humidité. Donne l'état de la pompe après chaque lecture, d'abord avec un seul seuil (marche si $h < 30$, arrêt sinon), puis avec l'hystérésis du programme ci-dessus. Combien de démarrages dans chaque cas ?
Correction :
Un seul seuil : arrêt, marche, arrêt, marche, arrêt, marche, arrêt, arrêt. À 30, la condition $h < 30$ est fausse, donc la pompe s'arrête. Bilan : 3 démarrages pour une terre qui n'a presque pas changé.
Avec l'hystérésis : arrêt, marche, marche, marche, marche, marche, marche, arrêt, soit un seul démarrage. À 31, entre les seuils, rien ne change ; ensuite, la pompe ne s'arrête qu'au-dessus de 45 %.
Le piège : couper la pompe dès que l'humidité repasse au-dessus de 30 %. Entre les deux seuils, on ne touche à rien.
À retenir
À retenir :
- La forme du signal rendu par le capteur choisit la fonction de lecture.
- Une broche commande, elle n'alimente pas : 20 mA par broche sur une Uno Rev3.
- Résistance d'une LED : $R = \dfrac{U_{\text{alim}} - U_{\text{LED}}}{I}$.
- Charge gourmande : transistor ou relais, masses reliées, diode de roue libre sur toute bobine.
setup()une fois,loop()sans fin, et deux seuils plutôt qu'un.- Pour attendre,
millis()plutôt quedelay(), qui rend le système aveugle.
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 (articles 10 et 11, compétence « Coder ») : texte sur eduscol.
- Arduino Uno Rev3, caractéristiques techniques : fiche du fabricant.
- Référence du langage Arduino : setup, loop, delay, millis, pulseIn, et l'exemple Ping (capteur à ultrasons).