Sciences de l'ingénieur (Spé) — Informatique embarquée
Microcontrôleurs et systèmes embarqués
Architecture Arduino, programmation embarquée, capteurs et actionneurs interfacés
Résumé synthétiqueFiche en 4 sectionsQuiz de 10 questionsGratuit, sans pub
Résumé
L'informatique embarquée désigne les systèmes informatiques intégrés dans des objets techniques pour les piloter. Le microcontrôleur est un petit ordinateur sur une puce contenant un processeur, de la mémoire (Flash pour le programme, RAM pour les données) et des périphériques d'entrée/sortie. La carte Arduino Uno, très utilisée en SI, embarque un microcontrôleur ATmega328P avec 14 broches numériques (dont 6 PWM) et 6 entrées analogiques (CAN 10 bits, résolution de 0 à 1023). Pour interfacer un capteur analogique comme un potentiomètre, on utilise analogRead() qui retourne une valeur entre 0 et 1023. Pour commander un moteur, on utilise une sortie PWM (analogWrite, 0-255) associée à un transistor ou un pont en H. Le programme suit la structure setup() pour l'initialisation et loop() pour la boucle principale. Le système embarqué doit fonctionner en temps réel, avec des contraintes de fiabilité et de consommation énergétique.
Un microcontrôleur est un ordinateur complet sur une seule puce : processeur, mémoires et entrées/sorties réunis. L'Arduino Uno est la carte de référence en SI pour piloter capteurs et actionneurs.
- Intègre sur une puce : CPU, Flash (programme), RAM (données), EEPROM, périphériques E/S.
- Arduino Uno : ATmega328P, $16\ \mathrm{MHz}$, $32\ \mathrm{Ko}$ Flash, $2\ \mathrm{Ko}$ RAM, $1\ \mathrm{Ko}$ EEPROM.
- 14 broches numériques (D0–D13) : entrée ou sortie (HIGH $= 5\ \mathrm{V}$, LOW $= 0\ \mathrm{V}$).
- 6 broches PWM : signal carré à rapport cyclique variable ($0$–$255$).
- 6 entrées analogiques (A0–A5) : CAN 10 bits $\rightarrow$ valeur de $0$ à $1023$ (résolution $\approx 4{,}9\ \mathrm{mV}$).
- Alimentation : $5\ \mathrm{V}$ via USB ou $7$–$12\ \mathrm{V}$ via la prise jack (régulateur intégré).
Exemple
La résolution du CAN sous $5\ \mathrm{V}$ sur $10$ bits vaut $\dfrac{5}{1023} \approx 4{,}9\ \mathrm{mV}$ par pas : une lecture analogRead de $512$ correspond donc à $\approx 512 \times 4{,}9\ \mathrm{mV} \approx 2{,}5\ \mathrm{V}$.
Piège à éviter
La Flash est non volatile (garde le programme hors tension) ; la RAM est volatile (perd les variables à l'extinction). Ne pas confondre leurs rôles.
Tout programme Arduino repose sur deux fonctions :
setup() (une fois, pour l'initialisation) et loop() (en boucle, pour le travail répété). Les fonctions d'E/S relient le code au monde physique.setup(): exécuté une seule fois au démarrage (configuration des broches, init série).loop(): boucle infinie aprèssetup()(lecture capteurs, traitement, commande actionneurs).pinMode(broche, mode): configure en INPUT, OUTPUT ou INPUT_PULLUP.digitalRead/digitalWrite: lecture/écriture numérique ($0$ ou $1$).analogRead: lecture analogique ($0$–$1023$) ;analogWrite: sortie PWM ($0$–$255$).Serial.begin(9600)etSerial.println(): communication série pour le débogage.
Exemple
Faire clignoter une LED : dans
setup(), pinMode(13, OUTPUT) ; dans loop(), digitalWrite(13, HIGH), attendre, digitalWrite(13, LOW), attendre. setup() ne s'exécute qu'une fois, loop() répète à l'infini.Piège à éviter
Configurer une broche en sortie dans
loop() au lieu de setup() la réinitialise à chaque tour : la configuration des broches va dans setup(), pas dans loop().Le microcontrôleur dialogue avec le réel via ses broches. Chaque type de composant (bouton, LED, servomoteur, moteur DC) a son schéma de câblage et sa méthode de commande.
- Capteur numérique (bouton) :
digitalRead$\rightarrow$ $0$ ou $1$ (prévoir une résistance de tirage pull-up/pull-down). - Capteur analogique (LM35, potentiomètre) :
analogReadpuis conversion par formule. - LED : sortie numérique avec résistance série $R = \dfrac{5 - V_{\mathrm{LED}}}{I_{\mathrm{LED}}}$.
- Servomoteur : bibliothèque
Servo, commande par angle ($0$ à $180$°) via PWM. - Moteur DC : transistor (sens unique) ou pont en H L293D/L298N (deux sens + vitesse PWM).
- Écran LCD I2C : bibliothèque
LiquidCrystal_I2C, adresse $\mathtt{0x27}$,lcd.print().
Exemple
Résistance série d'une LED rouge ($V_{\mathrm{LED}} = 2\ \mathrm{V}$, $I = 20\ \mathrm{mA}$) sous $5\ \mathrm{V}$ : $R = \dfrac{5 - 2}{0{,}020} = 150\ \Omega$. On choisit la valeur normalisée $\geq$, souvent $150$ ou $220\ \Omega$.
Piège à éviter
Sans résistance de tirage, l'entrée d'un bouton est « flottante » et lit des valeurs aléatoires. Utilise
INPUT_PULLUP (résistance interne) ou une résistance externe pull-down.Un système embarqué n'est pas un PC : il doit réagir en temps réel, fonctionner sans plantage, et souvent économiser sa batterie, avec une mémoire très limitée.
- Temps réel : réagir dans un délai garanti (ex. freinage ABS en quelques $\mathrm{ms}$).
- Fiabilité : fonctionner sans interruption (pas de redémarrage possible en vol pour un drone).
- Consommation : sur batterie, optimiser (mode veille, sleep mode).
- Mémoire limitée : $2\ \mathrm{Ko}$ de RAM sur l'Uno $\rightarrow$ éviter les
String, préférer les tableaux dechar. - Éviter
delay()en multitâche : utilisermillis()pour des temporisations non bloquantes.
Exemple
Pour faire clignoter une LED tout en lisant un bouton,
delay(1000) bloquerait la lecture pendant $1\ \mathrm{s}$. Avec millis(), on teste si $1000\ \mathrm{ms}$ se sont écoulées sans bloquer : le bouton reste réactif.Piège à éviter
delay() gèle tout le programme : aucun capteur n'est lu pendant la pause. Pour tout système devant réagir vite ou faire plusieurs choses, on lui préfère millis().Quiz - Microcontrôleurs et systèmes embarqués
10 questions
S'entraîner
Articles utiles
Questions fréquentes
Les points clés à retenir sur Microcontrôleurs et systèmes embarqués, extraits du quiz de révision.
Combien de broches numériques possède l'Arduino Uno ?
Réponse :
14
L'Arduino Uno dispose de 14 broches numériques (D0 à D13), dont 6 capables de générer un signal PWM.
Quelle fonction est exécutée une seule fois au démarrage d'un programme Arduino ?
Réponse :
setup()
La fonction setup() s'exécute une seule fois au démarrage pour initialiser les broches et les communications. Ensuite loop() tourne en boucle.
Quelle est la résolution du CAN de l'Arduino Uno ?
Réponse :
$10$ bits ($0$–$1023$)
Le CAN de l'Uno est sur $10$ bits :
analogRead() retourne une valeur entre $0$ et $1023$ ($2^{10} = 1024$ niveaux).Quelle est la plage de valeurs pour analogWrite() (PWM) ?
Réponse :
$0$ à $255$
analogWrite() accepte une valeur de $0$ (rapport cyclique $0\ \%$) à $255$ (rapport cyclique $100\ \%$), codée sur $8$ bits.