L'ingénierie embarquée est l'art de donner une intelligence à la matière.
C'est le point de fusion entre la rigidité du Hardware et la flexibilité du
Software.
Le Cœur du Système : CPU, Périphériques, et le Monde Extérieur.
Contrairement à un PC qui attend passivement une entrée clavier, un système embarqué est vivant. Il scrute le monde physique en permanence via une variété infinie de Capteurs (LiDAR, Accéléromètre, Pression, Bio-signaux, Caméras thermiques...) et réagit immédiatemment via des Actionneurs (Moteurs Brushless, Relais de puissance, Écrans OLED, Retour Haptique, Vannes hydrauliques).
C'est ici que se joue la différence entre un développeur logiciel et un ingénieur embarqué. Nous devons faire tenir une intelligence complexe dans des contraintes drastiques :
Fonctionner 5 ans sur une pile bouton (Coin Cell). Chaque micro-ampère (µA) compte.
Remplacer un chip à 1$ par un chip à 0.80$ économise 200k$ sur une production de 1M d'unités.
Temps Réel Dur (Hard Real-Time). L'airbag DOIT se déclencher en 20ms, pas 21ms.
Pour atteindre ce niveau de performance, on oublie souvent Python ou Java. On parle le langage de la machine : C, C++ et Assembleur (ASM). On manipule directement les registres du processeur, on gère les interruptions à la nanoseconde, et l'optimisation n'est pas une option, c'est une nécessité.
"Faire plus avec moins."
Concevoir des systèmes autonomes, optimisés en taille, coût et énergie. C'est le domaine du FPGA, du Microcontrôleur (STM32, ESP32) et du code C/C++ proche du métal.
"La fiabilité avant tout."
Automatiser des usines et des processus critiques. On utilise des Automates (PLC), des bus de terrain robustes (Modbus, Profinet) et des interfaces hommes-machines (SCADA).
"Tout est donnée."
Connecter le monde physique au Cloud. C'est la couche qui récupère la data (Capteurs), la transmet (LoRa, 5G, Wi-Fi) et l'analyse (Big Data, AI).
Tensions, Courants, Bruit, Chaleur. Ici, une erreur de code peut faire fondre le processeur.
Temps Réel, Optimisation binaire, Robustesse. C'est l'intelligence qui dompte la puissance brute.
Les lois fondamentales de l'univers
Avant de coder, il faut comprendre le terrain. L'électronique, c'est comme de la plomberie : on déplace des électrons (eau) dans des tuyaux (fils) à travers des composants (valves, réservoirs). Si vous ne respectez pas la pression (tension), les tuyaux explosent.
Bougez les curseurs pour voir l'impact sur le Courant (I).
La "Pression" (Hauteur du château d'eau).
Le "Frein" (Diamètre du tuyau).
Le composant le plus courant. Il résiste au passage du courant.
Il stocke des charges électriques (V). Il s'oppose aux variations de tension.
Il stocke de l'énergie magnétique (I). Il s'oppose aux variations de courant.
Une valve anti-retour. Ne laisse passer que dans un sens.
Un interrupteur électronique commandé.
Le métronome du système.
Convertit une tension sale en tension propre.
"La somme des courants qui entrent est égale à la somme des courants qui sortent."
"Dans une boucle fermée, la somme des tensions est nulle."
Comment lire un capteur 5V sur un ESP32 (3.3V) sans le griller ?
Ex: Vin=5V. R1=2k, R2=3k.
Vout = 5 * (3 / 5) = 3V (Safe !)
Rien n'est instantané. Un condensateur met du temps à se charger à travers une résistance.
Après 1τ, on est à 63%. Après 5τ, on est à 99%.
C'est ce qui crée les temps de montée/descente des signaux.
La Puissance (Travail réel). P = U × I. Si P est trop grand pour le composant, il chauffe et brûle.
Alternating Current (Prise murale 220V) vs Direct Current (Pile 5V). Nos MCUs vivent en DC. Attention à ne pas mélanger !
Le sol commun. La référence 0V. Tous les composants d'un système doivent avoir leurs masses reliées pour communiquer.
Chemin sans résistance entre le + et le -. Le courant devient infini. C'est la mort instantanée de l'alimentation.
Le manuel technique du composant. La Bible. Tout y est (Pinout, Voltage Max, Exemples).
Comme la Résistance, mais pour les signaux qui bougent (AC). Indispensable pour les antennes et l'audio.
Une résistance qui force un état (High ou Low) quand rien n'est connecté. Évite les états "flottants".
Une broche non connectée. Elle capte le bruit ambiant et change d'état aléatoirement. Danger !
Le bruit résiduel sur une alimentation. Une alim instable fait planter le MCU.
Architecture et Coeur du Système
Avant de coder, il faut que le système vive. Tout système embarqué repose sur une "Sainte Trinité" matérielle. Si l'un de ces éléments manque, le MCU est une brique inerte.
Le MCU a besoin d'une tension STABLE (ex: 3.3V). Une baisse (Brown-out) provoque un Reset aléatoire. On utilise des condensateurs de découplage partout (100nF).
Le cœur bat à une fréquence précise. L'oscillateur interne (RC) est imprécis. Pour l'USB ou le RF, on utilise un Quartz Externe.
Pour démarrer proprement, le MCU doit être maintenu en "Reset" tant que la tension n'est pas stable. C'est le rôle du circuit RC ou du Brown-Out Detector.
Von Neumann utilise un bus unique (Goulot). Harvard (Cortex-M) sépare Code et Données pour lire les deux en même temps.
Tout est une adresse. La Flash, la RAM et même les Périphériques (GPIO) ont une case mémoire dédiée.
Le CPU parle vite via le AHB (High-speed) et commande les périphériques lents via le APB (Peripheral).
Parallélisation : Préparer l'instruction N+1 pendant qu'on exécute l'instruction N.
Les Mains du système
Le GPIO est l'interface la plus basique mais la plus polyvalente. C'est ici que le code devient une tension électrique réelle.
• Schmitt Trigger : Un circuit qui nettoie le signal d'entrée. Il évite que le MCU ne lise "0-1-0-1" très vite si le signal est bruité.
• Push-Pull : Mode standard. La pin "pousse" vers 3.3V ou "tire" vers le GND. Idéal pour piloter une LED.
• Open-Drain : La pin peut seulement "tirer" vers le GND. Pour le 3.3V, il faut une résistance externe. Utilisé pour l'I2C.
// Drive the MOSFETs
PORTB |= (1 << 5);
Une entrée connectée à RIEN est "flottante" (bruit électrique). Elle change de valeur aléatoirement.
Le numérique n'est pas "parfait". Pour un MCU 3.3V :
Une pin est fragile. Courant max : souvent 20mA.
Le Langage des machines
Dans un système embarqué, le MCU ne travaille jamais seul. Il doit commander des capteurs, parler à des mémoires ou envoyer des logs à un PC. Pour cela, on utilise des **protocoles de communication série**, chacun ayant ses forces, ses faiblesses et ses contraintes électriques.
L'UART est le "vieux sage". Sans horloge commune, il repose sur un timing strict (Baudrate) convenu à l'avance.
ST=Start, SP=Stop. Pas de parité.
L'I2C est le "réseau local" de la carte. Il permet de connecter des dizaines de composants sur seulement 2 fils grâce à l'adressage.
Sans résistance, le bus reste à 0V !
Le SPI est un "télégramme ultra-rapide". Synchronisé par une horloge, il est idéal pour les écrans et les cartes SD.
Il existe 4 modes SPI. S'ils ne correspondent pas, les données seront corrompues.
Vitesse de transmission en symboles/seconde (ex: 9600 bauds). Emetteur et Récepteur doivent avoir le même !
Architecture où un chef (MCU) orchestre les communications et donne la parole aux périphériques (Capteurs).
Parler et écouter en même temps (Téléphone). Contraire de Half-Duplex (Talkie-Walkie).
Le monde réel n'est pas binaire
La température, le son ou la lumière sont des valeurs analogiques (infinies). Le processeur, lui, ne comprend que des 0 et des 1. Il faut donc un traducteur : l'**ADC** (Analog to Digital Converter) pour écouter, et le **PWM** (ou DAC) pour parler.
Combien de marches a votre escalier ? Pour un ADC 12-bit (ESP32) sur 3.3V :
Le moindre bruit > 0.8mV faussera la mesure !
Pour numériser un son à 40kHz, il faut échantillonner à au moins **80kHz** (2x). Sinon, gare à l'**Aliasing** (les roues de voiture qui tournent à l'envers à la télé).
Le MCU ne sait pas sortir 1.5V. Il sort 3.3V, puis 0V, très vite. La moyenne donne l'illusion de 1.5V.
Pour de l'audio haute fidélité, le PWM est trop "sale". On utilise un **DAC (Digital to Analog Converter)** (souvent un réseau de résistances R-2R) pour créer une courbe de tension lisse et parfaite.
Précision de la mesure. 8-bit = 256 niveaux. 12-bit = 4096 niveaux (plus précis).
Fréquence d'échantillonnage. Combien de fois par seconde on mesure la tension.
Rapport cyclique (PWM). % du temps où le signal est à l'état HAUT sur une période.
L'Intelligence Connectée (ESP32 & MQTT)
Ce n'est pas juste un Arduino avec du WiFi. C'est un **SoC Dual Core** 240MHz.
C'est pourquoi votre `loop()` n'est jamais bloquée par le réseau !
HTTP est lourd ("Allô ? Tu m'entends ? Tiens la page"). MQTT est ultra-léger, pensé pour des réseaux instables.
À quel point le message est-il important ?
Organisez vos données comme des dossiers.
MQTT clair (Port 1883) = Tout le monde voit vos mots de passe. Utilisez toujours **MQTTS** (Port 8883) avec certificats, même si c'est dur pour un petit CPU !
FreeRTOS & L'Art du Multitâche
Dans une **Super Loop** (`while(1)`), si une action bloque, tout le système fige. Le RTOS (Real-Time Operating System) découpe le code en **Tâches** indépendantes. Le **Scheduler** (ordonnanceur) décide qui a le droit de "parler" au CPU à chaque milliseconde.
xTaskCreate(TaskBlink, "Blink", 1024, NULL, 1, NULL); // Nom, Nom debug, Stack, Params, PRIORITE, Handle
Exemple de 2 tâches alternant (preemption).
"La clé des toilettes". Une seule tâche peut la prendre à la fois. Protège une ressource partagée.
"Le compteur de places de parking". Peut autoriser N accès simultanés (ex: 3 connexions max).
"Une file d'attente". Passer des données d'une tâche à l'autre de manière sûre (FIFO).
Si une tâche basse prio bloque un Mutex dont une tâche haute prio a besoin, le système peut se retrouver bloqué. FreeRTOS offre des Mutex avec "Priority Inheritance" pour éviter cela.
Commander le Monde Réel
Une broche GPIO sort au maximum 20mA à 3.3V. C'est suffisant pour allumer une LED, mais pas pour faire tourner un moteur. Pour commander de la puissance, il faut un **étage de puissance** (MOSFET, Relay, Driver).
C'est un interrupteur commandé par une tension minuscule.
Une bobine (moteur, relais) stocke de l'énergie. Quand on la coupe, elle génère une surtension destructrice (**Inductive Kickback**).
Solution : Placer une diode en "roue libre" pour court-circuiter la surtension.
Simple : 2 fils. Tension = Vitesse. PWM pour varier. **H-Bridge** pour le sens.
Contrôle d'**angle**. Signal PWM (1-2ms). Utilisé pour les bras robotiques, directions.
Contrôle de **position précise** (200 pas/tour). Imprimantes 3D, CNC. Driver dédié (DRV8825, A4988).
4 interrupteurs (MOSFETs) pour inverser le sens du courant. Activer Q1+Q4 = Sens Horaire. Activer Q2+Q3 = Sens Anti. Ne jamais activer Q1+Q2 en même temps (court-circuit !).
L'Art de Dormir Intelligemment
En IoT sur batterie, le MCU ne doit travailler que 0.1% du temps. Le reste, il doit dormir profondément. Un code mal optimisé vide une pile en 24h au lieu de 5 ans.
Consommation Max (80-200mA avec WiFi). Faire le calcul au plus vite et s'éteindre !
CPU en pause, RAM active (~1mA). Réveil rapide via GPIO ou Timer.
Tout éteint sauf RTC (~10µA). La seule façon de durer des années. Au réveil, le MCU reboot.
Formule : Autonomie (heures) = Capacité (mAh) / Consommation moyenne (mA)
Le C Embarqué en Profondeur
Sur un PC, vous avez 16Go de RAM. Sur un Arduino Uno, vous avez **2Ko**. Comprendre la mémoire évite les plantages mystérieux après 72h de fonctionnement (fragmentation, stack overflow).
Le "Sous-fifre" du CPU. Un circuit dédié qui copie des données (ADC → RAM, RAM → SPI) **tout seul**, pendant que le CPU dort ou calcule.
Indispensable pour : Audio temps réel, SPI rapide (écrans), UART haute vitesse.
Du Prototype au Produit Fini
La Breadboard n'est que le début. Le but final est un **circuit imprimé (PCB)** fiable, fabricable et prêt à l'assemblage en usine.
Interface physique pour flasher et déboguer pas-à-pas. Voir la RAM en temps réel.
"Voir" les 0 et les 1 sur I2C/SPI/UART. Le Saleae est la référence.
Voir la forme du signal (tensions, glitchs, bruit). Indispensable pour l'analogique.
L'ami fidèle : Tension (V), Continuité (Bip), Courant (A).
Extraire l'Info du Chaos
Le monde réel est bruité. Un capteur ne donne jamais une ligne parfaite. Le **DSP** (Digital Signal Processing) permet de filtrer ces parasites pour extraire l'information utile (rythme cardiaque, voix, vibrations).
Algorithme "magique" qui transforme un **signal temporel** (amplitude vs temps) en un **spectre fréquentiel** (amplitude vs fréquence).
Applications : Égaliseur audio, Reconnaissance vocale, Détection de vibrations.
// Filtre Passe-Bas Simple (Exponential Moving Average) float filtered = 0; void loop() { float raw = readSensor(); filtered = (0.1 * raw) + (0.9 * filtered); // Alpha = 0.1 }
L'Attaquant a Accès au Hardware
Si un attaquant a un accès **physique** à votre carte, il peut souvent tout lire (JTAG, dump Flash). La sécurité embarquée vise à protéger votre **Propriété Intellectuelle** (Firmware) et les **données utilisateur** (Clés WiFi), même contre un vol physique.
Un **fusible matériel** qui empêche le débugger (JTAG/SWD) de relire la mémoire Flash. Si verrouillé, le seul moyen de débloquer est d'**effacer toute la puce**.
Le MCU ne démarre QUE si le Firmware est **signé cryptographiquement** par votre clé privée. Empêche l'installation de malwares ou de firmwares pirates.
Accélérateurs matériels (AES-256, SHA, RNG) pour chiffrer les données **sans ralentir le CPU** et sans exposer les clés en RAM.
Perturber l'alimentation ou l'horloge pour faire "sauter" une instruction de sécurité. Le CPU exécute `if(password_ok)` mais le glitch fait qu'il saute le `if`.
Analyser la **consommation de courant** (Power Analysis) pendant que le CPU chiffre. La différence de conso révèle les bits de la clé secrète.
Construire un Produit qui Dure
Un produit IoT doit se mettre à jour à distance (**OTA**). Cela demande une architecture avec un **Bootloader** immuable et une Application mise à jour. Le tout doit être **incassable** (anti-brick, rollback).
Un compteur **matériel indépendant** qui décrémente. Votre code doit le "nourrir" régulièrement.
Vérifier les préconditions de chaque fonction. Si ça échoue = Bug détecté tôt.
Toujours gérer le `default:` dans un `switch`. Un état inconnu est un bug.
Vérifier l'intégrité des données critiques (Config en Flash, Trames reçues).
Quand Chaque Millimètre Compte
À basse vitesse (I2C), un fil est un fil. À haute vitesse (USB 3.0, DDR4, PCIe), un fil est une **ligne de transmission**. Si mal conçue → réflexions, données corrompues.
Si Source = 50Ω, Câble = 50Ω, Charge = 50Ω → **OK**.
Sinon → **Réflexion** (le signal rebondit comme un écho et corrompt les données).
On n'utilise plus 1 fil + GND, mais **2 fils (D+ et D-)** avec des signaux opposés. Le bruit externe s'annule (Mode Commun), seule la différence compte.
Superposition de milliers de bits sur l'oscillo. "L'œil" doit être ouvert = signal propre.
Tremblement de l'horloge. Une PLL instable provoque des erreurs de synchronisation.
Décalage entre Clock et Data. Les pistes doivent avoir la même longueur ("length matching").
La Magie Noire du Sans-Fil
Envoyer des données dans l'air demande de **moduler** une onde porteuse. C'est le domaine de la "magie noire" où la géométrie du cuivre définit la performance. 1mm de piste = dB perdus = portée réduite.
Le "calcul comptable" pour savoir si la liaison passera :
Marge : PRX - Sensibilité = Marge de sécurité (15dB recommandé).
| Proto | Fréquence | Portée | Débit | Conso |
|---|---|---|---|---|
| WiFi | 2.4/5GHz | ~50m | Mbit/s | Haute |
| BLE | 2.4GHz | ~30m | 1Mbit/s | Basse |
| LoRa | 868/915MHz | ~15km | 0.3-50kbit/s | Très Basse |
| Zigbee | 2.4GHz | ~100m | 250kbit/s | Basse |
| NFC | 13.56MHz | ~4cm | 424kbit/s | Très Basse |
| LTE-M | Cellulaire | ~10km | 1Mbit/s | Moyenne |
Télécommandes, capteurs simples. Bonne pénétration murs. Puissance limitée (10mW).
LoRaWAN, Sigfox. Excellente portée. Duty Cycle réglementé (1%).
WiFi, BLE, Zigbee. Encombré ! Atténuation par l'eau (corps humain).
Quand la Lumière Devient Signal
La lumière est **immunisée** aux parasites électromagnétiques. On l'utilise pour transporter de l'info (Fibre Optique) ou pour **isoler galvaniquement** deux circuits dangereux. Un photon ne conduit pas l'électricité → isolation parfaite jusqu'à plusieurs kV !
Une **LED** en face d'un **phototransistor** dans un boîtier opaque. La lumière traverse, pas l'électricité.
On envoie une impulsion **laser IR** et on mesure le temps qu'elle met à revenir.
| λ (nm) | Couleur | Usage |
|---|---|---|
| 630-660 | Rouge | LED indicatrices, laser pointeur |
| 520-530 | Vert | Rétroéclairage, laser visible puissant |
| 450-470 | Bleu | LED blanches (avec phosphore), gravure laser |
| 850 | IR proche | Télécommandes TV, barrières IR |
| 940 | IR invisible | Détection présence (capteurs PIR améliorés) |
| 1550 | IR télécom | Fibre optique longue distance, sécurité oculaire |
Cœur large (50-62.5µm). LED comme source. Courtes distances (<2km). Data centers.
Cœur ultra-fin (9µm). Laser comme source. Longues distances (100+ km). Télécom.
Lumière → courant. Ultra rapide (ns). Fibre optique, récepteurs IR. Linéaire.
Photodiode + Gain intégré. Plus sensible mais plus lent (µs). Optocoupleurs.
Gain interne ×100. Détection faible lumière. LiDAR longue portée. Coûteux.
L'Art du Mouvement Précis
...le faire tourner à **exactement 300.5 RPM** malgré une charge variable demande des maths : l'**asservissement** (PID). C'est le cœur de la robotique, des drones aux bras industriels.
| Type | Contrôle | Précision | Vitesse | Usage |
|---|---|---|---|---|
| DC Brushed | PWM simple | Faible | Haute | Jouets, ventilateurs |
| Brushless (BLDC) | ESC/FOC | Moyenne | Très haute | Drones, véhicules |
| Stepper | Séquence pas | Très haute | Faible | CNC, imprimantes 3D |
| Servo RC | PWM 1-2ms | Haute (angle) | Moyenne | Bras robot, direction |
| Servo Industriel | Boucle fermée | Extrême | Variable | Robots industriels |
Ordre : Toujours régler Kp → Ki → Kd.
Sacrifier de la vitesse pour gagner du **couple** (et inversement).
Impulsions relatives. Besoin de Homing au démarrage. Économique. 100-10000 PPR.
Position exacte à chaque instant. Pas de Homing. Plus cher. Robots industriels.
Accéléromètre + Gyroscope. Fusion Kalman/Madgwick. Drones, stabilisation.
Micro-switch NC. Homing + Sécurité. Debounce obligatoire.
Jauge de contrainte + HX711 (24-bit ADC). Balances, pinces force.
La Guerre Invisible du Bruit
Votre circuit fonctionne sur table. Il plante dès qu'on allume le néon ou le moteur à côté. Bienvenue en **CEM** ! Un produit doit **ne pas polluer** (Émission) et **résister à la pollution** (Immunité). Sans cela = pas de certification CE = pas de vente.
Le **bruit** que votre circuit génère ou subit.
La capacité d'un système à fonctionner sans perturber ni être perturbé.
Normes : EN 55032 (Émission), EN 55035 (Immunité).
Cage de Faraday : Boîtier métallique relié à la masse. Bloque les ondes rayonnées.
Ferrites sur les câbles, filtres LC sur l'alimentation. Bloque le bruit conduit.
Condensateurs 100nF + 10µF au plus près de chaque puce. Absorbe les spikes localement.
Plusieurs chemins de masse = antenne captant le bruit magnétique. Solution : topologie en étoile unique.
Couche entière de cuivre GND. Chemin de retour à très basse impédance. Ne jamais découper !
L'étincelle quand on touche une poignée de porte = **2000-15000V** en quelques nanosecondes. Un MCU meurt à 100V.
Obligatoire pour vendre en Europe. Tests en chambre anéchoïque (≈2000-5000€).