# Didactico Tunisie — Corpus complet pour IA (llms-full.txt) > Version étendue de /llms.txt : intègre le texte intégral des guides et tutoriels piliers de Didactico (N°1 de l'électronique en Tunisie depuis 2012), plus les informations pratiques, le guide d'achat et la FAQ. Destiné aux assistants IA (ChatGPT, Claude, Perplexity, Gemini) pour des réponses et citations précises. ## Informations pratiques Didactico (didactico.tn) — depuis 2012, N°1 en Tunisie de l'électronique, du prototypage, de la robotique et de l'impression 3D. Plus de 2 600 produits, 12 univers, 16 marques. Livraison 24-48h partout en Tunisie (Aramex), paiement à la livraison / carte (Paymee) / virement. Showroom: Cité des Martyrs, Rue Mohamed Salah, Imm. Bouzguenda App A01, Sfax. Téléphones: 54 776 776 / 99 707 685 (magasin), 53 747 747 (SAV). E-mails: contact@didactico.tn, commercial@didactico.tn. Langues: français et arabe. ## Guide d'achat — quel produit pour quel projet ### Quelle carte choisir pour débuter en électronique et programmation ? L'**Arduino UNO R3** est la référence absolue pour débuter : robuste, ultra-documentée et idéale pour l'apprentissage. Voir le guide pilier « Arduino UNO R3 en Tunisie » et la catégorie Cartes Programmables. ### Arduino ou ESP32/ESP8266 pour un projet connecté (IoT) ? Pour le Wi-Fi/Bluetooth intégré, choisissez un **ESP32** (plus puissant) ou un **ESP8266** (plus économique). Voir le comparatif « ESP32 vs ESP8266 ». ### Arduino ou Raspberry Pi ? **Arduino** = microcontrôleur temps réel pour piloter capteurs/actionneurs. **Raspberry Pi** = vrai ordinateur Linux pour vision, serveurs et IA. Beaucoup de projets combinent les deux. ### Quel capteur de distance choisir ? Le **HC-SR04** (ultrason) pour la plupart des projets ; sa version étanche **JSN-SR04T** pour l'extérieur. Voir le guide « HC-SR04 : mesurer une distance ». ### Quel capteur de température et d'humidité ? Le **DHT22 (AM2302)** pour un bon compromis précision/prix, ou le **SHT31** pour plus de précision. Catégorie Capteurs - Prototypage. ### Quelle alimentation pour un robot ou un projet mobile ? Des accus **Li-ion 18650** avec un régulateur adapté, ou un pack batterie. Voir le « Guide Alimentations 2026 : Piles, Batteries Li-ion, Solaire ». ### Comment piloter du 220V depuis un Arduino en sécurité ? Avec un **module relais** à optocoupleur. Voir le guide « Module Relais 8 Canaux : piloter le 220V en sécurité ». ### Quelle imprimante 3D pour débuter ? Une **Creality** pour un excellent rapport qualité/prix, ou une **Bambu Lab** pour la rapidité et la simplicité. Catégorie Imprimantes 3D / CNC. ### Quel matériel pour une classe ou un club robotique ? Les **kits éducatifs** Arduino/micro:bit et robots éducatifs. Demandez un devis via Partenaires Éducation. ## FAQ ### Où acheter de l'électronique, de l'Arduino ou du Raspberry Pi en Tunisie ? Chez Didactico (didactico.tn), N°1 en Tunisie depuis 2012 : plus de 2 600 références en ligne, livraison 24-48h partout dans le pays, et un showroom physique à Sfax. ### Livrez-vous partout en Tunisie ? Oui, livraison rapide en 24-48h dans tout le pays via Aramex, ainsi que le retrait en magasin à Sfax. ### Quels sont les moyens de paiement ? Paiement à la livraison (cash on delivery), carte bancaire en ligne (via Paymee) et virement bancaire. ### Avez-vous un magasin physique ? Oui, un showroom à Sfax (Cité des Martyrs, Rue Mohamed Salah, Imm. Bouzguenda) ainsi qu'un réseau de points de vente partenaires. ### Proposez-vous des tarifs pour les écoles et universités ? Oui. Le programme Partenaires Éducation propose des devis professionnels, des kits STEM et un accompagnement pour les écoles, ISET, ENIT et universités tunisiennes. ### Combien de produits et de marques proposez-vous ? Plus de 2 600 produits répartis en 13 univers et 173 catégories, et 16 marques officielles (Arduino, Raspberry Pi, Espressif, Micro:bit, STMicroelectronics, NVIDIA, Creality, Bambu Lab, etc.). ### Le support technique est-il disponible en français et en arabe ? Oui, le support et les conseils techniques sont assurés en français et en arabe, par téléphone et par e-mail. ### Quels sont les délais de livraison ? En général 24 à 48 heures partout en Tunisie. ### Comment passer commande ? En ligne sur https://didactico.tn/, par téléphone au 54 776 776 / 99 707 685, ou directement au showroom de Sfax. ### Comment contacter Didactico ? Par e-mail (contact@didactico.tn, commercial@didactico.tn), par téléphone (magasin 54 776 776 / 99 707 685, SAV 53 747 747), ou via la page Contact du site. ## Guides & tutoriels piliers — texte intégral --- # Robot Maqueen Micro:bit : Programmer un Suiveur de Ligne Autonome URL: https://didactico.tn/robot-maqueen-microbit-suivi-ligne-tunisie/ Résumé: Programmez un robot Maqueen Plus + micro:bit V2 en suiveur de ligne autonome : MakeCode, MicroPython, algorithme PID, obstacle avoidance. Pour écoles Tunisie. Salle de classe d'une école primaire de Sfax, lundi matin 9h. Mme Selma, institutrice en CM2, sort de son armoire 6 boîtes bleues marquées « DFRobot Maqueen Plus ». Vingt-quatre élèves de 10 ans s'agitent. Sur la table : du ruban électrique noir collé en parcours sinueux. Le défi du jour ? Programmer leur petit robot pour qu'il suive la ligne tout seul, sans aucune télécommande. À 10h30, le premier robot termine le parcours sous les applaudissements. À 11h15, les 6 robots circulent en autonomie. Mme Selma sourit : « Ce que j'enseigne en 2 heures, j'aurais mis 6 mois à le faire à mon âge. » Voici comment, étape par étape, programmer ce petit bijou de pédagogie qui équipe de plus en plus d'écoles et de FabLabs en Tunisie. ## 📋 Table des matières - Le Maqueen Plus et son écosystème - BBC micro:bit V2 : le cerveau pédagogique - MakeCode vs MicroPython : que choisir ? - Algorithme 1 — Suivi on/off basique - Algorithme 2 — Suivi PID 3 capteurs - Algorithme 3 — Suivi avec mémoire et anticipation - Évitement d'obstacles avec HC-SR04 - Communication radio entre 2 robots - Pédagogie et compétences en Tunisie - FAQ Robot Maqueen Micro:bit ## Le Maqueen Plus : châssis pédagogique tout intégré Le Maqueen Plus est conçu par DFRobot, fabricant chinois spécialisé dans l'éducation STEAM. C'est un châssis 2WD (2 roues motrices + 1 bille folle) de 9 cm de diamètre qui embarque déjà tous les capteurs et actionneurs dont a besoin un enseignant pour 6 mois de TP. Comparé à un robot Arduino DIY (où il faut souder, câbler, débugger les masses communes pendant des heures), le Maqueen démarre en 30 secondes. ## Composants intégrés sur le PCB - 2 moteurs DC à réducteurs commandés par un driver TB6612FNG (PWM bidirectionnel, vitesse 0-255) - 4 capteurs IR de ligne en façade (les versions Plus en ont 4, les versions simples 2) → détecte noir/blanc sous le robot - 1 capteur ultrason HC-SR04 intégré en avant pour détecter obstacles 2 cm-400 cm - 4 LED RGB programmables (Neopixel WS2812) sous le châssis pour effets lumineux - 1 buzzer piézo pour jouer mélodies et alertes - 2 ports servo (PWM) pour ajouter un bras pivotant ou une pince - Port d'extension Gravity (DFRobot) pour ajouter capteurs/modules supplémentaires - Alimentation : 3× piles AA ou batterie LiPo 4.5V via JST ## Différence avec un robot Arduino DIY Un robot Arduino UNO + L298N + 2 moteurs + 2 capteurs IR + ultrason demande : - Châssis plexi à découper - Soudage des connecteurs des moteurs - Câblage du pont H L298N (8 fils dont 2 d'alim) - Régulation 5V séparée (sinon le motor noise reset l'UNO) - Calibration manuelle des capteurs IR avec multimètre Soit 3-4 heures de montage avant la première ligne de code. Le Maqueen, lui, fait gagner tout ce temps et permet à l'enseignant de se concentrer sur la programmation et l'algorithme, pas la mécanique. ## BBC micro:bit V2 : le cerveau pédagogique Le Maqueen Plus ne contient aucun microcontrôleur — c'est juste un châssis. Le cerveau vient sous forme d'une carte BBC micro:bit V2 qui se plante sur un connecteur edge 50 broches. ## Caractéristiques micro:bit V2 - Nordic nRF52833 — ARM Cortex-M4 à 64 MHz, 128 Ko RAM, 512 Ko Flash - Matrice 5×5 LED pour afficher icônes, texte défilant, valeurs numériques - 2 boutons A et B + un capteur tactile capacitif sur le logo - Accéléromètre 3 axes + magnétomètre + capteur température + capteur lumière ambiante + microphone MEMS + haut-parleur - Bluetooth 5.0 + radio 2.4 GHz propriétaire Nordic (très utile pour la communication inter-robots) - 25 broches GPIO/PWM/I2C/SPI sur connecteur edge - Alimentation USB-C ou pile bouton CR2032 Lancé en 2016 par la BBC en partenariat avec Microsoft, ARM, Samsung et 25 autres organisations, le micro:bit a été distribué gratuitement à 1 million d'enfants britanniques de 11-12 ans. La V2 (2020) ajoute le micro, le haut-parleur et le tactile. Aujourd'hui en Tunisie, plusieurs écoles privées et publiques (avec le programme « 1 enfant = 1 micro:bit » porté par le Ministère de l'Éducation tunisien et plusieurs ONG STEM) l'adoptent comme outil de découverte du code. ## MakeCode vs MicroPython : que choisir ? Deux langages dominent l'écosystème micro:bit : ## Microsoft MakeCode (drag-and-drop) Interface web makecode.microbit.org. Programmation par blocs colorés type Scratch, avec vue JavaScript en temps réel. Idéal pour 8-14 ans et débutants absolus. Pour le Maqueen, il faut ajouter l'extension DFRobot via « Extensions > Rechercher : maqueen ». Téléchargement du programme : un fichier .hex qu'on copie sur le micro:bit comme une clé USB. ## MicroPython (texte) Python embarqué pour micro:bit, exécuté via l'éditeur python.microbit.org ou Mu Editor. Idéal pour collégiens/lycéens et étudiants qui veulent comprendre la logique séquentielle réelle. Plus puissant pour les algorithmes complexes (PID, machine à états). 💡 Recommandation pédagogique Démarrez en MakeCode pour les 3 premières séances (concepts : boucles, conditions, variables, événements). Basculez en MicroPython pour le PID et les algorithmes avancés. Beaucoup d'écoles tunisiennes alternent les deux selon le niveau des élèves. ## Algorithme 1 — Suivi de ligne on/off basique (2 capteurs) Principe : 2 capteurs IR (gauche et droit) regardent vers le sol. Si la ligne est noire et le sol blanc, les capteurs renvoient : - Sol blanc → IR détecté → valeur 0 (low) - Ligne noire → pas de réflexion → valeur 1 (high) Logique : si le robot dévie, un capteur se retrouve sur la ligne → on tourne pour se recentrer. ## Code MakeCode (pseudo-blocs en JavaScript) // Boucle infinie de suivi de ligne basique basic.forever(function () { let gauche = maqueen.readPatrol(maqueen.Patrol.PatrolLeft) let droit = maqueen.readPatrol(maqueen.Patrol.PatrolRight) if (gauche == 0 && droit == 0) { // Les 2 capteurs sur le blanc → tout droit maqueen.motorRun(maqueen.Motors.AllMotors, maqueen.Dir.CW, 80) } else if (gauche == 1 && droit == 0) { // Capteur gauche sur ligne noire → tourner gauche maqueen.motorRun(maqueen.Motors.M1, maqueen.Dir.CCW, 60) maqueen.motorRun(maqueen.Motors.M2, maqueen.Dir.CW, 80) } else if (gauche == 0 && droit == 1) { // Capteur droit sur ligne noire → tourner droite maqueen.motorRun(maqueen.Motors.M1, maqueen.Dir.CW, 80) maqueen.motorRun(maqueen.Motors.M2, maqueen.Dir.CCW, 60) } else { // Les 2 capteurs sur la ligne → intersection, ralentir maqueen.motorRun(maqueen.Motors.AllMotors, maqueen.Dir.CW, 40) } }) ## Code MicroPython équivalent from microbit import * import maqueenPlus as mq while True: # Lecture des deux capteurs IR de ligne g = mq.read_patrol_left() # 0 = blanc, 1 = noir d = mq.read_patrol_right() if g == 0 and d == 0: # Avance tout droit mq.motor("all", "forward", 80) elif g == 1 and d == 0: # Corrige vers la gauche mq.motor("M1", "backward", 60) mq.motor("M2", "forward", 80) elif g == 0 and d == 1: # Corrige vers la droite mq.motor("M1", "forward", 80) mq.motor("M2", "backward", 60) else: # Les deux sur la ligne (intersection ou erreur) mq.motor("all", "forward", 40) sleep(20) Limite de cet algo : le robot zigzague visiblement dans les courbes. Il accélère et freine brutalement. Sur une ligne droite, il oscille de gauche à droite comme un ivrogne. Pour faire mieux, on passe au PID. ## Algorithme 2 — Suivi PID 3 capteurs (fluide et rapide) Le PID (Proportionnel-Intégral-Dérivé) est l'algorithme roi de la régulation. Il transforme une erreur mesurée en correction proportionnelle, ce qui donne un mouvement fluide. ## Principe du PID en suivi de ligne - Erreur = position de la ligne par rapport au centre du robot. Si on a 3 capteurs (G, C, D) : Ligne sous G → erreur = -2 - Ligne entre G et C → erreur = -1 - Ligne sous C (parfait) → erreur = 0 - Ligne entre C et D → erreur = +1 - Ligne sous D → erreur = +2 - Terme P (proportionnel) = Kp × erreur — corrige immédiatement - Terme I (intégral) = Ki × somme des erreurs passées — corrige les biais permanents (roue gauche un peu plus lente) - Terme D (dérivé) = Kd × (erreur_actuelle - erreur_précédente) — anticipe et lisse les oscillations ## Code MicroPython PID complet from microbit import * import maqueenPlus as mq # Constantes PID — À AJUSTER selon votre robot et parcours Kp = 35 # Proportionnel : réactivité Ki = 0.05 # Intégral : élimine biais long terme (à utiliser avec parcimonie) Kd = 18 # Dérivé : anti-oscillation VITESSE_BASE = 90 # Vitesse moteurs en ligne droite (0-255) erreur_precedente = 0 integrale = 0 def calcul_erreur(g, c, d): """Convertit les 3 capteurs en erreur centrée sur 0. g, c, d : 0 (blanc) ou 1 (noir)""" if g == 1 and c == 0 and d == 0: return -2 if g == 1 and c == 1 and d == 0: return -1 if g == 0 and c == 1 and d == 0: return 0 if g == 0 and c == 1 and d == 1: return 1 if g == 0 and c == 0 and d == 1: return 2 if g == 1 and c == 1 and d == 1: return 0 # intersection return None # ligne perdue while True: g = mq.read_patrol(0) c = mq.read_patrol(1) d = mq.read_patrol(2) erreur = calcul_erreur(g, c, d) if erreur is None: # Ligne perdue : on s'arrête (ou on tourne pour la retrouver) mq.motor("all", "stop", 0) continue # Calcul PID integrale = integrale + erreur derivee = erreur - erreur_precedente correction = Kp * erreur + Ki * integrale + Kd * derivee # Application aux moteurs (-255 à +255) vit_g = max(-255, min(255, VITESSE_BASE + correction)) vit_d = max(-255, min(255, VITESSE_BASE - correction)) mq.motor("M1", "forward" if vit_g > 0 else "backward", abs(int(vit_g))) mq.motor("M2", "forward" if vit_d > 0 else "backward", abs(int(vit_d))) erreur_precedente = erreur sleep(10) # Fréquence boucle ≈ 100 Hz ## Méthode Ziegler-Nichols pour ajuster Kp, Ki, Kd - Mettre Ki = 0 et Kd = 0 - Augmenter Kp progressivement jusqu'à ce que le robot oscille de façon stable (ni amorti ni divergent) → on note cette valeur Ku - Mesurer la période d'oscillation Tu (au chronomètre) - Appliquer : Kp = 0.6×Ku, Ki = 1.2×Ku/Tu, Kd = 0.075×Ku×Tu 💡 Astuce pédagogique Faites varier Kp en direct avec les boutons A/B du micro:bit (A diminue, B augmente, valeur affichée sur la matrice 5×5). Les élèves voient instantanément l'effet sur la trajectoire. ## Algorithme 3 — Suivi avec mémoire (anticiper les virages serrés) Sur des parcours difficiles (virages à 90°, intersections en croix), même le PID atteint ses limites. La solution : ajouter une machine à états qui mémorise la dernière direction de la ligne perdue. # État du robot : 'tracking', 'lost_left', 'lost_right', 'intersection' etat = "tracking" derniere_direction = 0 # -1 = ligne perdue à gauche, +1 = à droite while True: g = mq.read_patrol(0) c = mq.read_patrol(1) d = mq.read_patrol(2) if g + c + d == 0: # Ligne complètement perdue → tourner du côté mémorisé if derniere_direction == -1: mq.motor("M1", "backward", 70) mq.motor("M2", "forward", 70) else: mq.motor("M1", "forward", 70) mq.motor("M2", "backward", 70) elif g + c + d == 3: # Intersection en croix → décision (continuer tout droit, par défaut) display.show(Image.DIAMOND) mq.motor("all", "forward", 60) sleep(300) # Traverse l'intersection else: # PID classique erreur = calcul_erreur(g, c, d) if erreur is not None and erreur != 0: derniere_direction = -1 if erreur < 0 else 1 # ... [code PID identique au précédent] sleep(10) ## Évitement d'obstacles avec HC-SR04 intégré Le Maqueen Plus intègre un HC-SR04 en avant. On peut le combiner avec le suivi de ligne pour un robot vraiment intelligent. while True: distance_cm = mq.ultrasonic_cm() # 2 à 400 cm if distance_cm < 15: # Obstacle proche → arrêt et contournement mq.motor("all", "stop", 0) mq.buzzer_tone(440, 200) # Bip A4 sleep(300) # Contourner par la droite mq.motor("M1", "forward", 80) mq.motor("M2", "backward", 80) sleep(500) # Pivote 90° mq.motor("all", "forward", 80) sleep(800) # Avance pour dépasser l'obstacle # Reprend la ligne mq.motor("M1", "backward", 80) mq.motor("M2", "forward", 80) sleep(500) # Re-pivote else: # Continuer le suivi de ligne PID classique suivi_pid() sleep(20) ## Communication radio entre 2 micro:bit (mode essaim) Le micro:bit V2 a une radio 2.4 GHz Nordic propriétaire (différente du Bluetooth). C'est un protocole ultra-simple, parfait pour faire dialoguer 2-30 robots. # Robot leader from microbit import * import radio import maqueenPlus as mq radio.config(group=42) # Tous les robots du même "groupe" se parlent radio.on() while True: if button_a.was_pressed(): radio.send("STOP") display.show(Image.NO) elif button_b.was_pressed(): radio.send("GO") display.show(Image.YES) # ... reste du suivi de ligne # Robot suiveur import radio import maqueenPlus as mq radio.config(group=42) radio.on() actif = True while True: msg = radio.receive() if msg == "STOP": actif = False mq.motor("all", "stop", 0) elif msg == "GO": actif = True if actif: suivi_pid() Application pédagogique : faire un convoi de 3 robots qui suivent la même ligne mais s'arrêtent en chaîne quand le premier détecte un obstacle. Excellent exercice de pensée distribuée et de protocole. 🤖 KITS PÉDAGOGIQUES ## Robot Maqueen Plus + micro:bit V2 Kit complet pour écoles, lycées et FabLabs. Châssis pré-monté, capteurs intégrés, prêt à programmer en MakeCode ou MicroPython. Stock disponible en Tunisie, livraison 24-48h Sfax. Voir les kits robotiques → ## Pédagogie et compétences développées en Tunisie Le Maqueen + micro:bit forme un kit pédagogique utilisé du primaire au lycée. Voici les compétences travaillées selon les cycles : ## Primaire (CM1-CM2, 9-11 ans) - Compréhension d'une séquence d'instructions - Concepts de boucle et de condition - Découverte de l'algorithme sans formalisme - Travail en équipe (1 robot pour 4 élèves) ## Collège (6ème-3ème, 11-15 ans) - Variables, types, opérateurs logiques - Fonctions et paramètres - Lecture/écriture de capteurs (interface analogique/numérique) - Communication radio (notions de protocole) ## Lycée (NSI, MPS) - Algorithme PID (régulation, équations différentielles discrètes) - Machine à états finis - MicroPython et écosystème embarqué - Documentation technique et travail sur datasheet ## Enseignement supérieur (ISET, ENIT, INSAT, ISBS) Le Maqueen sert souvent de plateforme rapide pour des PFE en automatique, IA embarquée (TensorFlow Lite Micro sur micro:bit V2), ou même intégration ROS via un Pi en pont. Le FabLab Sfax l'utilise pour ses workshops « Découverte robotique » destinés aux étudiants en première année d'ingénierie. ## Programmes de formation enseignants Plusieurs ONG STEAM tunisiennes (Code Week Tunisia, Mahdia FabLab, et le programme STEMC du Ministère de l'Éducation) ont formé plus de 1500 enseignants au Maqueen entre 2022 et 2025. Didactico Sfax fournit les kits et accompagne les écoles avec des plans de cours clés en main. ## FAQ Robot Maqueen Micro:bit Le Maqueen fonctionne-t-il sans micro:bit ?Non. Le Maqueen Plus est un châssis « bête » qui a besoin d'un cerveau. Vous pouvez utiliser un micro:bit V1 ou V2, mais aussi (avec un peu de bidouille) un ESP32 ou Arduino Nano via les broches d'extension. La compatibilité native est avec le micro:bit. Quelle différence entre Maqueen, Maqueen Plus et Maqueen Mechanic ?Le Maqueen de base a 2 capteurs IR. Le Maqueen Plus en a 4 (mieux pour le PID 3 capteurs). Le Maqueen Mechanic est une version avec bras pince et chenilles, plus chère. Pour la majorité des écoles, le Maqueen Plus est le meilleur compromis. Combien de temps tiennent les piles AA ?Avec 3 piles alcalines AA standard, comptez 2-3 heures d'usage intensif. Pour des séances longues, investissez dans des accus NiMH 2500 mAh rechargeables (Eneloop Pro) ou une batterie LiPo 2S avec régulateur 5V. Quel sol pour le suivi de ligne ?Idéalement un sol blanc mat avec du ruban électrique noir mat de 1.5-2 cm de large. Évitez les sols brillants (reflets parasitent les IR) et le scotch transparent ou marron (mauvais contraste). Une simple feuille A1 blanche avec lignes au feutre noir épais marche aussi. Peut-on programmer le Maqueen avec Scratch ?Pas directement avec Scratch 3, mais MakeCode (utilisé pour le micro:bit) est très similaire à Scratch et peut être considéré comme son équivalent embarqué. Les élèves qui ont fait Scratch s'y mettent en 15 minutes. Le micro:bit V2 est-il rétrocompatible avec les programmes V1 ?Oui à 99%. Quelques rares programmes utilisant des fonctionnalités V1 spécifiques peuvent ne pas tourner, mais 99% des projets MakeCode et MicroPython sont compatibles. La V2 ajoute le micro, le haut-parleur et le tactile sur le logo. Où trouver des parcours imprimables pour ligne ?Beaucoup de templates gratuits sur le site DFRobot (catégorie Education) et sur les forums micro:bit. Vous pouvez aussi créer des parcours personnalisés au feutre noir indélébile sur des bâches PVC plastifiées, réutilisables des centaines de fois. ## Conclusion Le couple Robot Maqueen Plus + BBC micro:bit V2 incarne ce qu'il y a de mieux dans la pédagogie STEAM moderne : matériel robuste, écosystème mature, programmation accessible du primaire à l'ingénierie. En Tunisie, son adoption croissante dans les écoles primaires et lycées de Sfax, Tunis et Sousse en témoigne. Que vous soyez enseignant·e, animateur·trice de FabLab ou parent qui veut initier ses enfants au code, ce kit transforme 2 heures de TP en moment magique où le concept abstrait d'algorithme devient un robot qui bouge devant les yeux des enfants. Pour aller plus loin, consultez notre guide Raspberry Pi + Arduino pour la surveillance IoT ou découvrez nos autres kits éducatifs sur didactico.tn avec livraison 24-48h partout en Tunisie depuis Sfax. --- # Kit ECG AD8232 : Moniteur Cardiaque DIY avec Arduino en Tunisie URL: https://didactico.tn/ecg-ad8232-moniteur-cardiaque-diy-arduino-tunisie/ Résumé: Guide pilier ECG AD8232 + Arduino : physiologie cardiaque, architecture interne de la puce, code optimisé 250 Hz, filtre notch 50 Hz, détection R-peak Pan-Tompkins, projet PFE holter 24h. Référence biomédicale Didactico Tunisie. En 1903, Willem Einthoven gagne le prix Nobel pour avoir inventé le galvanomètre à corde — la première machine capable de capter l'activité électrique du cœur. Sa machine pesait 270 kg, occupait deux pièces, et nécessitait 5 opérateurs. Cent vingt-trois ans plus tard, vous tenez dans votre paume un module de 2 grammes capable de faire la même chose, avec une précision clinique de base : le Analog Devices AD8232. Et avec un Arduino UNO à 35 TND chez Didactico Sfax, vous allez construire votre premier moniteur ECG (électrocardiogramme) DIY. Cet article n'est pas un énième tutoriel "branche-3-fils-et-tu-as-un-ECG". C'est un guide pilier de 4000 mots, écrit par et pour la communauté tunisienne de l'électronique biomédicale : étudiants ISBS, futurs ingénieurs INSAT/ENIT, médecins curieux des sciences embarquées, makers du FabLab Sfax. Nous allons couvrir la physiologie cardiaque, l'architecture de la puce AD8232, le câblage de précision, le code Arduino optimisé, le traitement du signal (filtre notch 50 Hz, détection de pic R par algorithme Pan-Tompkins simplifié), et enfin un projet de PFE complet avec interface web temps réel. ⚠️ Avertissement médical sérieuxLe AD8232 et tout montage DIY décrit dans cet article ne sont PAS des dispositifs médicaux certifiés CE/FDA. Aucun diagnostic clinique ne doit être posé sur la base de ces mesures. Si vous ressentez des symptômes cardiaques (douleur thoracique, palpitations, essoufflement anormal), consultez un médecin et utilisez un ECG hospitalier homologué. Ce guide est exclusivement à but pédagogique, scientifique et de prototypage. ## 📋 Table des matières - Anatomie d'un battement : ce que le cœur raconte en électricité - Comprendre les ondes P, QRS, T en 5 minutes - Le AD8232 disséqué : architecture interne - Matériel complet pour le moniteur DIY - Choix et placement des électrodes - Câblage Arduino + AD8232 (avec pièges à éviter) - Code Arduino — version baseline propre - Visualisation 1 : Arduino Serial Plotter - Visualisation 2 : Processing avec courbe défilante - Traitement du signal : filtre notch 50 Hz + passe-bande - Détection du pic R et calcul du BPM - Détection basique d'arythmie - Upgrade ESP32 + interface web Bluetooth/WiFi - Projet de PFE complet : holter portable 24h - Questions fréquentes ## Anatomie d'un battement : ce que le cœur raconte en électricité Votre cœur n'est pas qu'une pompe mécanique. C'est avant tout un orchestre électrique dirigé par un chef d'orchestre invisible appelé nœud sinusal, niché en haut de l'oreillette droite. Toutes les 800 millisecondes environ (à 75 BPM au repos), ce nœud émet une impulsion électrique de 100 millivolts qui se propage en cascade : - Nœud sinusal (SA node) → impulsion initiale - Propagation dans les oreillettes → elles se contractent (onde P) - Nœud auriculo-ventriculaire (AV node) → délai de 100 ms pour laisser le sang descendre - Faisceau de His → conduit l'impulsion vers les ventricules - Les fibres de Purkinje propagent simultanément dans les deux ventricules → contraction massive (complexe QRS) - Repolarisation des ventricules → onde T Quand vous posez deux électrodes sur la peau de part et d'autre du cœur, vous mesurez la différence de potentiel induite par cette cascade électrique — voilà l'ECG. L'amplitude réelle est 1 à 2 millivolts à la surface de la peau. Soit 1000 fois plus faible qu'une pile AAA. C'est précisément ce que le AD8232 sait amplifier sans bruit. ## Comprendre les ondes P, QRS, T en 5 minutes Un cycle ECG normal ressemble à ceci (vue temporelle, 1 seconde = ~1 battement) : R ● │ P │ T ╱╲ │ ╱╲ ╱ ╲│╱ ╲___ ─ ● ─── Q,S │ [───── 1 battement ─────] - Onde P (≈ 0.08-0.12s, 0.25 mV) : contraction des oreillettes. Une P absente ou anormale = trouble auriculaire. - Complexe QRS (≈ 0.06-0.10s, 1-2 mV) : la dépolarisation massive des ventricules. C'est le pic le plus visible — celui que nous allons détecter pour calculer le BPM. - Segment ST : isoélectrique normalement. Une élévation ST = signal d'infarctus (STEMI) en clinique. - Onde T (≈ 0.10-0.25s, 0.5 mV) : repolarisation. Une T inversée peut indiquer une ischémie. - Intervalle RR : temps entre deux pics R consécutifs. BPM = 60 / RR(en secondes). ## Le AD8232 disséqué : architecture interne Le AD8232 n'est pas un simple ampli op. C'est une chaîne complète de conditionnement de signal biomédical intégrée dans un boîtier LFCSP 4×4 mm. Ouvrons sa structure : ## Étage 1 — Amplificateur d'instrumentation à 3 ampli-op Gain fixe de ×100. Reçoit le signal différentiel (RA-LA ou RA-RL) entre 2 électrodes. CMRR (taux de réjection du mode commun) de 80 dB minimum à 60 Hz — indispensable pour rejeter les interférences secteur. ## Étage 2 — Filtre passe-haut intégré Fréquence de coupure réglable (typiquement 0.5 Hz). Élimine la dérive de ligne de base causée par la respiration et les mouvements des électrodes (baseline wander). ## Étage 3 — Amplificateur opérationnel auxiliaire Configurable en filtre passe-bas (typiquement 40 Hz) pour limiter le bruit haute fréquence et le tremblement musculaire (EMG). ## Étage 4 — Right-Leg Drive (RLD) Sortie active qui injecte dans le corps un signal en opposition de phase au bruit de mode commun (50 Hz secteur en Tunisie). C'est ce qui élimine le ronflement caractéristique sans isolation galvanique complexe. La sortie RLD se branche à l'électrode RL (right leg), conventionnellement placée sur le mollet droit ou le flanc. ## Étage 5 — Détection lead-off Le AD8232 surveille en continu si les électrodes sont bien collées. Deux sorties (LO+ et LO-) passent à HIGH si une électrode se décolle — le programme Arduino peut alors afficher "Électrode détachée" au lieu d'enregistrer du bruit. Le résultat : un signal ECG amplifié, filtré, denoised, prêt à être lu par un simple ADC 10 bits d'Arduino UNO. ❤️ Composant principal ## Module AD8232 ECG complet Inclut module + câble jack + 3 électrodes Ag/AgCl · Réf DAR-04-E001 · En stock chez Didactico Sfax Voir le produit → ## Matériel complet pour le moniteur DIY - 1 × Arduino UNO R3 (ou Nano, ou ESP32 pour version avancée) - 1 × Module AD8232 (Sparkfun ou équivalent générique) - 1 × Câble jack 3.5 mm vers 3 fils boutons-pression - 3 × Électrodes adhésives Ag/AgCl (jetables, type Kendall H92SG ou équivalent) - ~10 × fils jumper Male/Femelle - 1 × Breadboard 400 points - Option PC : Processing 4 + Arduino IDE - Option portable : OLED 0.96" + batterie LiPo 3.7V + boîtier 3D imprimé ## Choix et placement des électrodes Les électrodes Ag/AgCl jetables avec gel conducteur sont obligatoires pour un signal propre. Les électrodes en métal sec (type EEG amateur) donnent du bruit insupportable. Ne réutilisez jamais une électrode jetable — le gel sèche et l'impédance peau-électrode explose. ## Configuration Einthoven dérivation II (recommandée pour AD8232) C'est la dérivation qui donne le QRS le plus net : - RA (Right Arm) → électrode sous la clavicule droite, ou poignet droit - LA (Left Arm) → électrode sous la clavicule gauche, ou poignet gauche - RL (Right Leg, Drive) → électrode sur le flanc droit ou le mollet droit Conseil pratique : avant de coller les électrodes, dégraissez la peau avec une compresse alcoolisée et laissez sécher 30 secondes. Sur une peau bien préparée, le signal est 3 à 4 fois plus propre. ## Câblage Arduino + AD8232 Pin AD8232 Pin Arduino Rôle 3.3V 3.3V Alimentation (ne PAS utiliser 5V) GND GND Masse commune OUTPUT A0 Signal ECG analogique 0-3.3V LO+ D11 Détection lead-off positif LO- D10 Détection lead-off négatif SDN (non connecté) Shutdown, laisser flottant ⚠️ Piège classique : alimentationLe AD8232 fonctionne en 3.3V strict. Ne jamais le brancher sur le 5V de l'Arduino — vous le détruirez instantanément. Sur Arduino UNO, utilisez la broche 3.3V (max 50 mA, largement suffisant pour les ~10 mA du AD8232). ## Code Arduino — version baseline propre // ECG AD8232 — version baseline // Didactico Tunisie · didactico.tn // Echantillonnage : 250 Hz (largement suffisant pour le QRS) const int ECG_PIN = A0; const int LO_PLUS = 11; const int LO_MINUS = 10; const unsigned long PERIODE_US = 4000; // 4 ms = 250 Hz unsigned long t_prev = 0; void setup() { pinMode(LO_PLUS, INPUT); pinMode(LO_MINUS, INPUT); Serial.begin(115200); // Reference ADC interne 1.1V pour plus de precision sur petit signal // analogReference(INTERNAL); // optionnel, attention plage 0-1.1V } void loop() { unsigned long now = micros(); if (now - t_prev < PERIODE_US) return; t_prev = now; // Detection electrodes detachees if (digitalRead(LO_PLUS) == HIGH || digitalRead(LO_MINUS) == HIGH) { Serial.println(0); // ligne plate dans le plotter return; } int raw = analogRead(ECG_PIN); Serial.println(raw); } Téléversez ce code, ouvrez le Moniteur Série à 115200 bauds puis le Serial Plotter (Ctrl+Maj+L). Vous devriez voir une ligne plate au repos qui passe à des QRS bien visibles dès que vous tenez votre respiration. ## Visualisation 1 : Arduino Serial Plotter Le Serial Plotter est l'outil le plus rapide pour valider votre montage. Réglez l'axe Y entre 0 et 1023 et regardez le tracé. Sur un signal sain en dérivation II, vous reconnaissez visuellement P, QRS, T en moins de 10 battements. Si vous voyez une ligne très bruyante : - Vérifiez que vous êtes en 3.3V et non 5V - Éloignez-vous d'un PC chargeur ou d'un transformateur (50 Hz) - Renouvelez les électrodes si > 24h - Reposez-vous, immobile, respirez calmement ## Visualisation 2 : Processing avec courbe défilante Pour un affichage type oscilloscope médical, utilisez Processing 4 (gratuit, processing.org). Le sketch ci-dessous reçoit les valeurs Arduino et trace une courbe ECG défilante sur 5 secondes : // Sketch Processing 4 — ECG Live Plotter // Didactico Tunisie import processing.serial.*; Serial port; float[] tampon; int largeur, hauteur; void setup() { size(1200, 400); largeur = width; tampon = new float[largeur]; port = new Serial(this, Serial.list()[0], 115200); port.bufferUntil('n'); background(10, 30, 40); } void serialEvent(Serial p) { String l = p.readStringUntil('n'); if (l == null) return; try { float v = float(l.trim()); // decalage du tampon for (int i = 0; i < largeur - 1; i++) tampon[i] = tampon[i+1]; tampon[largeur - 1] = v; } catch (Exception e) {} } void draw() { background(10, 30, 40); stroke(251, 229, 61); // jaune Didactico strokeWeight(1.5); noFill(); beginShape(); for (int x = 0; x < largeur; x++) { float y = map(tampon[x], 200, 800, height - 20, 20); vertex(x, y); } endShape(); // grille stroke(60, 80, 100); strokeWeight(0.5); for (int x = 0; x < largeur; x += 50) line(x, 0, x, height); for (int y = 0; y < height; y += 40) line(0, y, largeur, y); } ## Traitement du signal : filtre notch 50 Hz + passe-bande Le AD8232 fait un excellent travail, mais en Tunisie où le réseau électrique tourne à 50 Hz, on observe souvent un résidu de bruit secteur. Solution : filtre notch numérique à 50 Hz implémenté côté Arduino. ## Filtre notch IIR à 50 Hz (Fs = 250 Hz) // Filtre notch IIR ordre 2 — 50 Hz, Fs = 250 Hz // Coefficients calcules avec scipy.signal.iirnotch(50, Q=30, fs=250) const float b[3] = { 0.9491, -1.5378, 0.9491 }; const float a[3] = { 1.0, -1.5378, 0.8983 }; float x[3] = {0,0,0}; float y[3] = {0,0,0}; float notch_filter(float in) { x[2] = x[1]; x[1] = x[0]; x[0] = in; y[2] = y[1]; y[1] = y[0]; y[0] = b[0]*x[0] + b[1]*x[1] + b[2]*x[2] - a[1]*y[1] - a[2]*y[2]; return y[0]; } Couplez ensuite avec un passe-bande 0.5-40 Hz pour ne garder que la bande utile du signal ECG (en pratique, le AD8232 le fait déjà partiellement, mais un raffinement numérique aide). ## Détection du pic R et calcul du BPM Pour calculer le rythme cardiaque, on doit détecter chaque pic R. La méthode la plus robuste reste l'algorithme Pan-Tompkins (1985), simplifié ici pour Arduino : - Différenciation : diff = x[n] - x[n-1] → enhance les pentes - Élévation au carré : sq = diff * diff → amplifie les fortes pentes (le QRS) - Moyennage glissant sur 30 ms (~ 7 échantillons à 250 Hz) - Seuil adaptatif : seuil = 0.6 × max_recent - Refractory period : ignorer pendant 200 ms après chaque détection (interdit physiologiquement un nouveau battement) // Detection R-peak simplifiee + BPM float prev = 0, max_recent = 0; unsigned long last_R = 0; int bpm = 0; const unsigned long REFRACTAIRE = 250; // ms void detecter_R(float sample) { float diff = sample - prev; prev = sample; float sq = diff * diff; if (sq > max_recent) max_recent = sq; max_recent *= 0.995; // decroissance lente if (sq > max_recent * 0.6) { unsigned long now = millis(); if (now - last_R > REFRACTAIRE) { unsigned long rr = now - last_R; bpm = 60000 / rr; Serial.print("R-peak | BPM : "); Serial.println(bpm); last_R = now; } } } À 75 BPM au repos, l'intervalle RR est de 800 ms. À 60 BPM, 1000 ms. À 100 BPM, 600 ms. Le calcul est instantané, sans buffer. ## Détection basique d'arythmie Une fois que vous capturez les RR consécutifs, vous pouvez calculer la variabilité du rythme cardiaque (VRC ou HRV) et détecter des anomalies basiques : - Bradycardie : BPM < 50 sur 10 battements consécutifs au repos → consultation - Tachycardie : BPM > 100 au repos (hors effort/stress) - Extrasystole : un intervalle RR brutalement plus court suivi d'un plus long ("pause compensatoire") → fréquent et bénin chez la majorité - Arythmie absolue (fibrillation auriculaire) : RR irrégulier sans pattern → signal d'alerte Pour une vraie détection clinique, il faudrait analyser la morphologie du QRS (largeur, amplitude, polarité), ce qui dépasse le cadre d'un Arduino UNO. On bascule alors sur ESP32 + TinyML ou Raspberry Pi + Python. ## Upgrade ESP32 + interface web Bluetooth/WiFi Le ESP32 ouvre une nouvelle dimension : visualisation en temps réel sur smartphone via BLE ou WiFi, sans dépendre d'un PC. Quelques pistes : - BLE GATT custom : exposer une characteristic "ECG" en notify, app Android lit en temps réel (apps "nRF Connect" pour tester) - WebSocket sur serveur ESP32 : page HTML hébergée par l'ESP32, JavaScript Chart.js qui trace le tracé live - MQTT vers HiveMQ Cloud : transmettre à un dashboard Grafana cloud pour suivi longue durée - SD card + RTC DS3231 : holter portable autonome avec horodatage précis (voir section PFE ci-dessous) ## Projet de PFE complet : holter portable 24h Pour les étudiants en biomédical (ISBS, INSAT, ENIT), voici une architecture de Projet de Fin d'Études ambitieuse construite autour du AD8232 : ## Architecture matérielle - ESP32-S3 ou ESP32 WROOM-32 (alimentation, traitement, WiFi/BT) - AD8232 avec 3 électrodes Ag/AgCl Holter - Module micro SD SPI pour enregistrer 24h de signal à 250 Hz - Horloge RTC DS3231 haute précision - Batterie LiPo 1100 mAh + module de charge TP4056 - Boîtier 3D imprimé portable (clip ceinture) - Optionnel : capteur MPU6050 pour corrélation mouvement/rythme ## Architecture logicielle - Acquisition à 250 Hz, filtrage notch + passe-bande - Détection R-peak Pan-Tompkins en temps réel - Enregistrement compressé (delta-encoding) sur SD : 24h × 250 Hz × 2 octets ≈ 43 Mo brut, ~15 Mo compressé - Synchronisation WiFi périodique : upload chunks sur backend (Firebase, MQTT) - Dashboard web React : graphe temps réel, statistiques HRV, alertes - Export PDF de rapport pour consultation médicale ## Soutenance idéale Pour défendre un tel projet : démo live, comparaison avec un ECG hospitalier de référence (les CHU de Sfax, Tunis et Sousse acceptent parfois ces partenariats avec les écoles d'ingénieurs), métriques précision/F1-score de la détection R, et analyse économique (coût composant ≈ 80 TND vs ~ 2000 TND pour un holter commercial bas de gamme). 🎓 Pour étudiants en PFE ## Devis préférentiel projet biomédical Didactico accompagne les PFE INSAT/ENIT/ISBS · Tarifs HT enseignement · support technique gratuit Programme étudiants → ## Questions fréquentes Le AD8232 mesure-t-il vraiment un ECG cliniquement valide ?Le AD8232 capture fidèlement la dérivation II d'Einthoven, qui est l'une des 12 dérivations standard d'un ECG hospitalier. C'est donc cliniquement représentatif pour la détection du rythme et de la morphologie du QRS. Cependant, il manque les autres dérivations (V1-V6, aVR, aVL, aVF) nécessaires pour diagnostiquer un infarctus, un bloc de branche, ou une hypertrophie. Un ECG 1-dérivation reste donc un outil d'observation, pas de diagnostic. Quelle est la différence entre AD8232 et AD8233 ?Le AD8233 est la version successeur, identique fonctionnellement mais avec un boîtier différent (WLCSP au lieu de LFCSP) et une consommation 10% plus faible. Pour vos projets, les deux sont interchangeables. Le AD8232 reste le plus disponible en module breakout. Pourquoi le signal devient-il plat soudainement ?Trois causes principales : (1) une électrode s'est décollée — le LED LO+ ou LO− du module s'allume; (2) le gel de l'électrode a séché — remplacez par une neuve; (3) cordon jack mal branché. Vérifiez systématiquement ces 3 points avant de soupçonner le module. Peut-on enregistrer un ECG pendant le sport ?Très difficile sans matériel spécialisé. Le mouvement musculaire (EMG) recouvre complètement l'ECG. Pour du sport, il faut des électrodes ceinture type Polar H10 ou des patches spéciaux (Bittium, BodiTrak). Le AD8232 reste optimal pour l'analyse au repos et au calme. Quelle est la fréquence d'échantillonnage minimale pour un ECG valide ?L'AHA (American Heart Association) recommande 250-500 Hz pour la détection du rythme, et 1000 Hz pour l'analyse fine de la morphologie du QRS. À 250 Hz (notre code), vous capturez correctement la position du R-peak avec une précision de ±2 ms — largement suffisant pour le BPM. Le AD8232 est-il sûr ? Risque-t-on un choc électrique ?Le AD8232 est alimenté en 3.3V via USB. Le courant maximal qui pourrait théoriquement traverser le corps via les électrodes est limité par les résistances internes du module à moins de 10 microampères — bien en dessous du seuil de perception (1 mA). Cependant, ne jamais brancher l'Arduino à une alimentation secteur sans isolation (transformateur médical certifié). Préférez une batterie ou un PC sur batterie pendant la mesure. Combien coûte un AD8232 en Tunisie ?Le module AD8232 complet (avec câble jack + 3 électrodes adhésives) est disponible chez Didactico Sfax. Consultez la fiche produit pour le prix actuel et la disponibilité. Livraison 24-48h dans toute la Tunisie, paiement à la livraison accepté. Pour les commandes étudiantes (lot de 10+), un tarif HT préférentiel est appliqué. ## Conclusion : du capteur au système médical embarqué Le AD8232 est bien plus qu'un module à 30 TND : c'est une porte d'entrée dans la bio-instrumentation moderne. En quelques heures, vous passez de la lecture passive d'une courbe à la détection algorithmique d'un battement cardiaque, puis à la construction d'un appareil portable qui pourrait, demain, contribuer à un programme de télémédecine en zones rurales tunisiennes. Si vous travaillez sur un projet biomédical, étudiez à l'ISBS, INSAT ou ENIT, ou montez un FabLab médical en Tunisie : Didactico vous fournit l'écosystème complet — AD8232, ESP32, écrans OLED, modules SD, batteries LiPo, électrodes Ag/AgCl, et un support technique assuré par des ingénieurs francophones. Parcourez le catalogue capteurs ou contactez-nous pour un devis sur mesure pour votre établissement. Le cœur bat. Mesurons-le. Mais surtout, comprenons-le. --- # Raspberry Pi + Arduino : Système de Surveillance IoT Complet en Tunisie URL: https://didactico.tn/raspberry-pi-arduino-surveillance-camera-tunisie/ Résumé: Architecture hybride Pi + Arduino pour la surveillance IoT en Tunisie : OpenCV, PIR, Telegram, Home Assistant, ML face recognition. Code Python + Arduino complet. Sfax, mars 2026. Hamza, étudiant en 5ème année à l'INSAT, défend son PFE devant le jury. Son projet : un système de surveillance domotique complet pour la villa familiale, capable de détecter une intrusion, identifier les membres de la famille par reconnaissance faciale, déclencher une sirène, prévenir les voisins via Telegram, et tout journaliser dans un Home Assistant accessible depuis n'importe où dans le monde. Coût total des composants : moins de 350 dinars. Coût de l'équivalent commercial (Ring Pro + abonnement + capteurs Aqara + alarme Verisure) : plus de 4000 dinars. La différence ? Hamza a marié un Raspberry Pi 4 et un Arduino UNO dans une architecture hybride bien pensée. Voyons comment reproduire ce système chez vous, étape par étape. ## 📋 Table des matières - Pourquoi pas un seul microcontrôleur ? - Architecture hybride Pi + Arduino - Composants et budget complet - Communication Pi ↔ Arduino : USB Serial ou I2C - Code Arduino : capteurs et actionneurs temps réel - Code Python Pi : OpenCV, Telegram, Flask - Enregistrement vidéo segmenté - Accès distant : SSH, ngrok, IPv6 - Intégration Home Assistant - ML face recognition pour la famille - Sécurité réseau et hardening - FAQ Pi + Arduino surveillance ## Pourquoi pas un seul microcontrôleur ? La question est légitime. Pourquoi compliquer avec 2 cartes au lieu d'utiliser un ESP32 unique, ou un Raspberry Pi seul ? Réponse : séparation des tâches selon les forces de chaque plateforme. ## Forces du Raspberry Pi - Linux complet → OpenCV, Python, Docker, Home Assistant tournent nativement - Wi-Fi 5 + Bluetooth + Ethernet Gigabit - 4-8 Go de RAM pour traiter de la vidéo HD - Stockage SD/USB illimité pour archiver des vidéos - SSH, web server, accès distant — tout l'arsenal cloud-native ## Faiblesses du Raspberry Pi - GPIO 3.3V uniquement (le 5V grille le SoC) - Pas de timer hardware déterministe (Linux n'est pas temps réel) - Boot 30-60 secondes (catastrophique pour une alarme qui doit démarrer en 100 ms) - Sensible aux coupures de courant (corruption SD) - Une seule interruption GPIO bloque potentiellement le système ## Forces de l'Arduino UNO - Microcontrôleur ATmega328P pur — pas d'OS, démarrage instantané - Pins 5V tolérants → directement compatibles avec PIR, capteurs Hall, relais 5V - Interruptions hardware déterministes - Pas de risque de corruption à l'arrêt brutal - Consommation ultra-faible (~20 mA) ## Faiblesses de l'Arduino - 2 Ko de SRAM — pas question d'OpenCV ou de TensorFlow - Pas de Wi-Fi natif - Pas de système de fichiers La conclusion s'impose : Arduino fait le travail temps réel (lire PIR, déclencher sirène, gérer relais), Pi fait le travail intelligent (analyser la vidéo, notifier, archiver, exposer une API). ## Architecture hybride : la division des tâches Voici le schéma fonctionnel du système : ┌───────────────────────────────────────┐ │ RASPBERRY PI 4 (Linux) │ │ │ │ Pi Camera v3 ──► OpenCV ──► Motion │ │ │ Detect │ │ ▼ │ │ Telegram Notify │ │ │ │ │ Home Assistant │ │ │ │ │ Flask Dashboard │ └───────────────┬───────────────────────┘ │ USB Serial 115200 │ JSON messages ▼ ┌───────────────────────────────────────┐ │ ARDUINO UNO (temps réel) │ │ │ │ PIR HC-SR501 ──► Détection IR │ │ Reed switch ──► Porte ouverte ? │ │ Buzzer ◄── Alerte sonore │ │ Relais 5V ◄── Sirène 12V │ │ LED RGB ◄── État système │ └───────────────────────────────────────┘ Le Pi est le « cerveau » et exécute la logique métier (algorithmes, notifications, web). L'Arduino est le « bras armé » qui interface avec le monde physique en temps réel. ## Composants et budget complet ComposantRéférencePrix DT (Didactico) Raspberry Pi 4 4GBRPi 4B 4GB180 DT Alim Pi USB-C 5V/3AOfficielle25 DT microSD 64 Go classe A1SanDisk Ultra30 DT Pi Camera v3Module v3 Wide90 DT Arduino UNO R3Officiel ou clone35-65 DT Câble USB-A vers USB-BStandard5 DT Capteur PIR HC-SR5015V, portée 7m8 DT Capteur magnétique porteReed switch6 DT Buzzer 5V passifPiézo3 DT Module relais 5V 1 canalSRD-05VDC8 DT Sirène 12V 110 dBAlarme classique25 DT Boîtier impression 3DPLA Bambu Lab A1~5 DT filament TOTAL~420 DT ## Communication Pi ↔ Arduino Deux protocoles dominants : ## Option A : USB Serial 115200 baud (recommandé) - Simple : un câble USB-A vers USB-B, et c'est fini - Alimente l'Arduino (5V) en même temps - Le Pi voit l'Arduino comme /dev/ttyACM0 ou /dev/ttyUSB0 - Pas de problème de niveaux logiques (l'USB s'occupe de tout) - Protocole : JSON ligne par ligne ## Option B : I2C avec Pi en master - Plus rapide pour transactions courtes (1 ms vs 8 ms USB Serial) - Permet plusieurs Arduino sur le même bus - MAIS nécessite un convertisseur de niveau 3.3V ↔ 5V obligatoire - Complexité supplémentaire — réservez à l'option B aux cas spécifiques Pour ce projet, on choisit l'option A USB Serial. Plus simple, plus robuste, suffisamment rapide. ## Protocole JSON ligne par ligne # Messages Arduino → Pi (1 ligne JSON par événement) : {"type":"pir","value":1,"ts":12345} {"type":"door","value":"open","ts":12350} {"type":"heartbeat","uptime":3600} # Messages Pi → Arduino : {"cmd":"siren","state":"on","duration":30} {"cmd":"led","color":"red"} {"cmd":"buzzer","freq":440,"ms":200} ## Code Arduino : capteurs et actionneurs temps réel // surveillance-arduino.ino #include const int PIR_PIN = 2; // Interruption hardware const int DOOR_PIN = 3; // Reed switch (pull-up interne) const int BUZZER_PIN = 8; const int RELAY_PIN = 9; const int LED_R = 5; const int LED_G = 6; const int LED_B = 7; volatile bool pirTriggered = false; bool sirenActive = false; unsigned long sirenUntil = 0; unsigned long lastHeartbeat = 0; void pirISR() { pirTriggered = true; } void setup() { Serial.begin(115200); pinMode(PIR_PIN, INPUT); pinMode(DOOR_PIN, INPUT_PULLUP); pinMode(BUZZER_PIN, OUTPUT); pinMode(RELAY_PIN, OUTPUT); pinMode(LED_R, OUTPUT); pinMode(LED_G, OUTPUT); pinMode(LED_B, OUTPUT); attachInterrupt(digitalPinToInterrupt(PIR_PIN), pirISR, RISING); // LED verte = système OK digitalWrite(LED_G, HIGH); } void sendEvent(const char* type, const char* value) { StaticJsonDocument<128> doc; doc["type"] = type; doc["value"] = value; doc["ts"] = millis(); serializeJson(doc, Serial); Serial.println(); } void checkCommands() { if (Serial.available()) { StaticJsonDocument<256> doc; DeserializationError err = deserializeJson(doc, Serial); if (err) return; const char* cmd = doc["cmd"]; if (strcmp(cmd, "siren") == 0) { const char* state = doc["state"]; if (strcmp(state, "on") == 0) { int duration = doc["duration"] | 30; digitalWrite(RELAY_PIN, HIGH); sirenActive = true; sirenUntil = millis() + duration * 1000UL; digitalWrite(LED_R, HIGH); digitalWrite(LED_G, LOW); } else { digitalWrite(RELAY_PIN, LOW); sirenActive = false; digitalWrite(LED_R, LOW); digitalWrite(LED_G, HIGH); } } else if (strcmp(cmd, "buzzer") == 0) { int freq = doc["freq"] | 440; int ms = doc["ms"] | 200; tone(BUZZER_PIN, freq, ms); } } } void loop() { // 1. Capteur PIR (interruption ISR) if (pirTriggered) { pirTriggered = false; sendEvent("pir", "1"); } // 2. Capteur porte (lecture polling - changement d'état) static int lastDoor = HIGH; int curDoor = digitalRead(DOOR_PIN); if (curDoor != lastDoor) { sendEvent("door", curDoor == LOW ? "open" : "closed"); lastDoor = curDoor; } // 3. Timeout sirène automatique (sécurité) if (sirenActive && millis() > sirenUntil) { digitalWrite(RELAY_PIN, LOW); sirenActive = false; digitalWrite(LED_R, LOW); digitalWrite(LED_G, HIGH); } // 4. Heartbeat toutes les 30 s if (millis() - lastHeartbeat > 30000) { StaticJsonDocument<128> doc; doc["type"] = "heartbeat"; doc["uptime"] = millis() / 1000; serializeJson(doc, Serial); Serial.println(); lastHeartbeat = millis(); } // 5. Lire commandes du Pi checkCommands(); } ## Code Python Pi : OpenCV, Telegram, Flask Côté Pi, on a 3 tâches en parallèle (lancées via threads ou processus) : - Lecture série Arduino et réaction aux événements - Analyse vidéo OpenCV en continu (motion detection) - Dashboard Flask exposant le live stream et l'historique ## Lecture série + Telegram # surveillance_pi.py import serial import json import requests import threading import time from datetime import datetime TELEGRAM_TOKEN = "votre_bot_token" TELEGRAM_CHAT = "votre_chat_id" SERIAL_PORT = "/dev/ttyACM0" ser = serial.Serial(SERIAL_PORT, 115200, timeout=1) time.sleep(2) # Reset Arduino def notify_telegram(text, photo_path=None): """Envoie un message ou une photo via Telegram bot.""" base = f"https://api.telegram.org/bot{TELEGRAM_TOKEN}" if photo_path: with open(photo_path, "rb") as f: requests.post( f"{base}/sendPhoto", data={"chat_id": TELEGRAM_CHAT, "caption": text}, files={"photo": f}, timeout=10 ) else: requests.post( f"{base}/sendMessage", data={"chat_id": TELEGRAM_CHAT, "text": text}, timeout=10 ) def send_arduino(cmd): """Envoie une commande JSON à l'Arduino.""" ser.write((json.dumps(cmd) + "n").encode()) def listen_arduino(): """Thread d'écoute série permanent.""" while True: line = ser.readline().decode(errors="ignore").strip() if not line: continue try: event = json.loads(line) except json.JSONDecodeError: continue ts = datetime.now().strftime("%H:%M:%S") print(f"[{ts}] {event}") if event["type"] == "pir": # Mouvement détecté → capture photo et notify from camera import capture_snapshot snap = capture_snapshot() notify_telegram(f"🚨 Mouvement à {ts}", snap) # Déclenche sirène 30 s send_arduino({"cmd": "siren", "state": "on", "duration": 30}) elif event["type"] == "door" and event["value"] == "open": notify_telegram(f"🚪 Porte ouverte à {ts}") if __name__ == "__main__": threading.Thread(target=listen_arduino, daemon=True).start() while True: time.sleep(60) ## Détection de mouvement OpenCV (camera.py) # camera.py import cv2 import numpy as np from picamera2 import Picamera2 from datetime import datetime picam = Picamera2() config = picam.create_video_configuration(main={"size": (1280, 720)}) picam.configure(config) picam.start() prev_frame = None def capture_snapshot(): """Capture une photo et retourne le chemin.""" path = f"/tmp/snap_{datetime.now().strftime('%Y%m%d_%H%M%S')}.jpg" frame = picam.capture_array() cv2.imwrite(path, frame) return path def detect_motion(): """Boucle OpenCV de détection de mouvement (différence frames).""" global prev_frame while True: frame = picam.capture_array() gray = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY) gray = cv2.GaussianBlur(gray, (21, 21), 0) if prev_frame is None: prev_frame = gray continue delta = cv2.absdiff(prev_frame, gray) thresh = cv2.threshold(delta, 25, 255, cv2.THRESH_BINARY)[1] thresh = cv2.dilate(thresh, None, iterations=2) contours, _ = cv2.findContours( thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) for c in contours: if cv2.contourArea(c) < 5000: # Ignore petits mouvements continue # Mouvement significatif détecté snap = capture_snapshot() from surveillance_pi import notify_telegram notify_telegram("📹 Mouvement caméra", snap) break prev_frame = gray ## Dashboard Flask # dashboard.py from flask import Flask, Response, render_template_string import cv2 app = Flask(__name__) HTML = """

🏠 Surveillance Didactico

Statut Arduino : {{ status }}

""" @app.route("/") def index(): return render_template_string(HTML, status="OK") def generate_stream(): from camera import picam while True: frame = picam.capture_array() _, jpg = cv2.imencode(".jpg", frame) yield (b"--framernContent-Type: image/jpegrnrn" + jpg.tobytes() + b"rn") @app.route("/stream") def stream(): return Response(generate_stream(), mimetype="multipart/x-mixed-replace; boundary=frame") if __name__ == "__main__": app.run(host="0.0.0.0", port=5000, threaded=True) ## Enregistrement vidéo segmenté Plutôt qu'un seul énorme fichier vidéo, on découpe en segments de 10 minutes via ffmpeg. Stockage sur SD interne ou disque USB. # Capture continue segmentée avec libcamera + ffmpeg libcamera-vid -t 0 --inline --width 1280 --height 720 --framerate 25 --codec h264 -o - | ffmpeg -i - -c copy -f segment -segment_time 600 -reset_timestamps 1 -strftime 1 /mnt/usb/cam/cam-%Y%m%d-%H%M%S.mp4 # Nettoyage automatique des vidéos > 14 jours : find /mnt/usb/cam/ -name "*.mp4" -mtime +14 -delete # Ajouter au crontab : 0 3 * * * find /mnt/usb/cam/ -name "*.mp4" -mtime +14 -delete ## Accès distant : SSH, ngrok, IPv6 Trois options pour accéder à votre Pi depuis l'extérieur : ## 1. ngrok (le plus simple) # Installation : curl -s https://ngrok-agent.s3.amazonaws.com/ngrok.asc | sudo tee /etc/apt/trusted.gpg.d/ngrok.asc >/dev/null echo "deb https://ngrok-agent.s3.amazonaws.com buster main" | sudo tee /etc/apt/sources.list.d/ngrok.list sudo apt update && sudo apt install ngrok ngrok config add-authtoken VOTRE_TOKEN # Exposer le dashboard Flask : ngrok http 5000 # → https://xxxx.ngrok-free.app accessible depuis n'importe où ## 2. IPv6 natif (Topnet, Orange Tunisie) Si votre FAI fournit du IPv6 natif (Topnet le fait depuis 2022), chaque appareil de votre maison a une IP publique unique IPv6 directement joignable. Ouvrez les bons ports dans le firewall : sudo ufw allow 22/tcp # SSH sudo ufw allow 5000/tcp # Flask dashboard sudo ufw enable # Trouver votre IPv6 : ip -6 addr show wlan0 | grep global ## 3. WireGuard VPN (le plus sécurisé) Monter un VPN WireGuard sur le Pi, et se connecter depuis le téléphone. Aucun port ouvert vers Internet, traffic chiffré point-à-point. Tutoriel complet sur le wiki WireGuard. ## Intégration Home Assistant En bonus, on peut faire remonter tous les événements PIR/porte/sirène dans Home Assistant via MQTT : # config Home Assistant - configuration.yaml mqtt: binary_sensor: - name: "PIR Entrée" state_topic: "didactico/pir" payload_on: "1" payload_off: "0" device_class: motion - name: "Porte Entrée" state_topic: "didactico/door" payload_on: "open" payload_off: "closed" device_class: door switch: - name: "Sirène" command_topic: "didactico/siren/set" state_topic: "didactico/siren/state" payload_on: "on" payload_off: "off" # Automation HA : siren + lumière rouge si mouvement la nuit automation: - alias: "Intrusion nocturne" trigger: platform: state entity_id: binary_sensor.pir_entree to: "on" condition: condition: time after: "23:00:00" before: "06:00:00" action: - service: switch.turn_on entity_id: switch.sirene - service: light.turn_on data: entity_id: light.salon color_name: red ## ML face recognition pour la famille Pour éviter les fausses alarmes (la famille rentre du travail), on ajoute de la reconnaissance faciale. La librairie face_recognition (basée sur dlib) tourne en CPU sur Pi 4. # Installation (long, ~30 min sur Pi 4) : sudo apt install -y cmake libopenblas-dev liblapack-dev pip3 install face_recognition opencv-python # Apprentissage des visages : mkdir -p /home/didactico/faces/{papa,maman,hamza,sara} # Mettre 3-5 photos par personne dans chaque dossier # encode_faces.py import face_recognition import os import pickle known = {"encodings": [], "names": []} for person in os.listdir("/home/didactico/faces"): for f in os.listdir(f"/home/didactico/faces/{person}"): img = face_recognition.load_image_file( f"/home/didactico/faces/{person}/{f}") encs = face_recognition.face_encodings(img) if encs: known["encodings"].append(encs[0]) known["names"].append(person) with open("faces.pkl", "wb") as f: pickle.dump(known, f) # Reconnaissance live : import pickle import face_recognition import cv2 with open("faces.pkl", "rb") as f: known = pickle.load(f) def identify(frame): rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) locations = face_recognition.face_locations(rgb) encodings = face_recognition.face_encodings(rgb, locations) names = [] for enc in encodings: matches = face_recognition.compare_faces( known["encodings"], enc, tolerance=0.5) name = "INCONNU" if True in matches: idx = matches.index(True) name = known["names"][idx] names.append(name) return names # Dans la boucle de détection : names = identify(frame) if "INCONNU" in names: notify_telegram(f"⚠️ Visage inconnu détecté !") send_arduino({"cmd": "siren", "state": "on", "duration": 60}) else: notify_telegram(f"👋 {', '.join(names)} rentre à la maison") ## Sécurité réseau et hardening ⚠️ Sécurité critique Un système de surveillance mal sécurisé est pire que pas de système : un attaquant peut désactiver vos alarmes et regarder vos vidéos. Appliquez impérativement les mesures ci-dessous. ## Checklist hardening Pi - Changer le mot de passe par défaut (pi/raspberry est interdit en 2026) - Authentification SSH par clé uniquement (désactiver password) : # Sur votre PC : ssh-keygen -t ed25519 -f ~/.ssh/dida_pi ssh-copy-id -i ~/.ssh/dida_pi.pub didactico@pi.local # Sur le Pi, /etc/ssh/sshd_config : PasswordAuthentication no PermitRootLogin no PubkeyAuthentication yes sudo systemctl restart ssh - fail2ban pour bloquer les attaques bruteforce : sudo apt install -y fail2ban sudo nano /etc/fail2ban/jail.local # Ajouter : # [sshd] # enabled = true # maxretry = 3 # bantime = 3600 sudo systemctl enable --now fail2ban - HTTPS sur le dashboard Flask (Let's Encrypt via nginx + certbot) - Updates automatiques (unattended-upgrades) : sudo apt install -y unattended-upgrades sudo dpkg-reconfigure unattended-upgrades - Backup quotidien de la SD (image disque vers NAS ou cloud chiffré) 📹 SYSTÈME COMPLET ## Raspberry Pi 4 + Arduino UNO Le combo parfait pour vos projets de surveillance, domotique et PFE IoT. Tous les composants disponibles chez Didactico Sfax avec livraison 24-48h partout en Tunisie. Voir Pi + Arduino → ## FAQ Pi + Arduino surveillance Pourquoi un Arduino quand un ESP32 ferait les deux à la fois ?Un ESP32 est plus puissant qu'un UNO, mais il reste limité (520 Ko RAM, pas de Linux). Pour la vision OpenCV, le ML face recognition et Home Assistant, il faut absolument un Pi. L'Arduino sert juste à offloader le temps réel critique (PIR, sirène, watchdog). Vous pouvez remplacer l'Arduino UNO par un ESP32 si vous voulez ajouter du WiFi/MQTT direct côté capteurs. Quelle distance maximum entre Pi et Arduino en USB ?Câble USB standard : 5 mètres. Au-delà, prévoyez un répéteur actif USB (~30 DT) ou passez en RS485 différentiel (compatible jusqu'à 100 m, mais demande des modules MAX485 sur les 2 cartes). Le PIR HC-SR501 a-t-il beaucoup de faux positifs ?Le HC-SR501 est sensible aux courants d'air chauds, aux insectes, à la lumière directe du soleil. Réglez les 2 potentiomètres (sensibilité et délai), positionnez-le à l'abri du soleil direct, et combinez toujours avec une confirmation vidéo avant de déclencher la sirène. Pour un cas critique (banque, bijouterie), passez sur un capteur PIR dual avec compensation thermique. Combien de FPS en détection de mouvement OpenCV sur Pi 4 ?Avec une caméra 1280×720, 15-25 FPS sans accélération GPU, parfait pour la surveillance. Pour de la reconnaissance faciale temps réel, ça tombe à 2-5 FPS — suffisant pour un usage domestique mais pas en streaming live. Si vous voulez plus, passez sur un Pi 5 ou un mini-PC x86 avec Coral USB. La caméra Pi v3 voit-elle dans le noir ?Non, c'est une caméra couleur sans IR. Pour la vision nocturne, prenez la Pi NoIR Camera (sans filtre infrarouge) + un projecteur IR 850 nm. Comptez 130-180 DT supplémentaires. Stocker les vidéos en cloud plutôt que sur SD ?Oui, plusieurs options : Backblaze B2 (~6 dollars/To/mois), AWS S3 Glacier Deep Archive (~1 dollar/To/mois), ou self-hosted MinIO sur un VPS Hetzner (~5 euros/mois pour 80 Go). Configurez rclone sur le Pi pour synchroniser /mnt/usb/cam toutes les heures. Le système consomme combien d'électricité ?Pi 4 (~5W) + Arduino UNO (~0.5W) + Pi Camera (~0.5W) + sirène en veille (négligeable) = environ 6W en moyenne, soit ~0.144 kWh/jour. À 250 millimes le kWh STEG, ça représente moins de 1.1 DT par mois. ## Conclusion L'architecture hybride Raspberry Pi + Arduino n'est pas un compromis bâtard : c'est la séparation idéale des préoccupations en IoT moderne. Le Pi orchestre, le Arduino agit. Cette répartition vous permet d'obtenir un système de surveillance de niveau commercial pour le prix d'une soirée pizza, tout en gardant le contrôle total sur vos données (pas de cloud propriétaire, pas d'abonnement mensuel, pas de fuite vers des serveurs étrangers). Pour les étudiants de l'INSAT, ENIT, ISBS et ISET, ce projet constitue une base solide de PFE qui peut s'étendre vers l'IA embarquée (TensorFlow Lite sur Pi), la sécurité offensive (pentest WiFi avec le même matériel), ou l'IoT industriel (passerelle LoRaWAN). Tous les composants sont en stock chez Didactico Sfax avec livraison 24-48h partout en Tunisie. Pour aller plus loin, consultez nos guides Raspberry Pi Zero et 5 projets Raspberry Pi débutants. --- # ESP32 LoRa : Reseau Multi-Capteurs Longue Portee pour l'Agriculture Tunisienne URL: https://didactico.tn/esp32-lora-reseau-capteurs-sans-fil-tunisie/ Résumé: Architecture complete d'un reseau ESP32 + LoRa pour l'agriculture intelligente en Tunisie : nodes capteurs DHT22 deep sleep, gateway WiFi forwarding MQTT, CSMA-CA, encryption AES-128, autonomie solaire, et evolution LoRaWAN avec RAK7268. Octobre 2024, region de Kerkennah. Un olelculteur me decrit son cauchemar : 800 oliviers irrigues au goutte-a-goutte, repartis sur 15 hectares, avec 4 forages distincts. Chaque semaine, son employe parcourt 12 km a pied pour relever manuellement les compteurs d'eau et verifier les vannes. Cout salarie : 280 TND/mois. Erreurs frequentes. Pertes d'eau detectees parfois 5 jours apres. La solution moderne ? Un reseau de 18 nodes ESP32+LoRa, une gateway TTGO, un dashboard Grafana, et une consommation de 12 W au total pour le tout. L'agriculture intelligente n'est plus de la science-fiction. C'est l'industrie qui transforme silencieusement les oliveraies de Sfax, les palmeraies de Tozeur, et les exploitations laitieres de Mahres. Et au coeur de cette revolution, deux composants : l'ESP32 (cerveau + WiFi) et le module LoRa (nerfs longue distance). Ce guide architecture un vrai reseau multi-nodes pas un demo "hello world". On parle CSMA-CA pour eviter les collisions, deep sleep + reveil precis sur timer, encryption AES-128, dashboard Grafana/InfluxDB, et evolution vers LoRaWAN avec gateway RAK7268. ## 📋 Table des matieres - 1. Architecture maitre-esclave : nodes + gateway - 2. Choix hardware : TTGO LoRa32 vs Heltec V3 vs T-Beam - 3. Code Node : DHT22 + LoRa send + deep sleep - 4. Code Gateway : LoRa receive + MQTT/HTTP forward - 5. Protocole : ASCII simple vs CBOR optimise - 6. Gerer plusieurs nodes : CSMA-CA et collisions - 7. Encryption AES-128 sur LoRa - 8. Energie : LiPo + panneau solaire + MPPT - 9. Cas d'usage agriculture Tunisie - 10. Comparaison NB-IoT Orange Tunisie - 11. Evolution vers LoRaWAN avec RAK7268 - 12. Dashboard Grafana + InfluxDB - 13. FAQ ## 1. Architecture maitre-esclave : la topologie qui marche Avant de coder, il faut comprendre la topologie. Un reseau ESP32-LoRa typique a 3 elements : - Nodes capteurs (N) : ESP32 + module LoRa + capteurs (DHT22, BME280, capacitif sol, etc.). En deep sleep 95% du temps. Reveil periodique, mesure, envoi LoRa, redormir. - Gateway : ESP32 + LoRa + WiFi (ou 4G). Ecoute en continu les trames LoRa, les valide, les transforme et les pousse via MQTT vers le cloud. - Cloud / Dashboard : broker MQTT (Mosquitto), base time-series (InfluxDB), visualisation (Grafana), alertes (Telegram bot). [Node 1] [Node 2] ... [Node N] | | | +--LoRa--+--LoRa--+--LoRa--+ | [Gateway TTGO LoRa32] | WiFi/4G | [MQTT Broker] | [InfluxDB] --> [Grafana Dashboard] | [Telegram Bot alerts] ## 2. Choix hardware : TTGO LoRa32 vs Heltec V3 vs T-Beam ModeleMCULoRaOLEDGPSBatteriePrixUsage TTGO LoRa32 V2.1ESP32SX12760,96"NONJST 2 pin~65 TNDGateway, node fixe Heltec WiFi LoRa V3ESP32-S3SX12620,96"NONJST 2 pin~85 TNDGateway moderne TTGO T-Beam v1.2ESP32SX12760,96"NEO-6M18650 holder~110 TNDTracker, mobile RFM95 nu + ESP32 WROOMESP32SX1276NONNONExterne~30 TNDNode optimise sleep 💡 Recette gagnanteNotre setup recommande pour 90% des projets agricoles tunisiens : nodes = ESP32 WROOM + RFM95 nu (deep sleep < 20 µA), gateway = TTGO LoRa32 V2.1 (OLED pratique pour debug, ESP32 WiFi pour forwarder). Cout total 18 nodes + 1 gateway : ~600 TND. ## 3. Code Node : DHT22 + LoRa send + deep sleep Le node doit etre obsedant sur l'energie. Chaque microampere compte. Cycle type : reveil > init capteurs (200 ms) > mesure (250 ms pour DHT22) > init LoRa (50 ms) > envoi (350 ms en SF10) > deep sleep (5 min). Temps eveil : ~1 sec. Temps dormance : 299 sec. Taux : 0,33%. #include #include #include #include #define LORA_SS 18 #define LORA_RST 14 #define LORA_DIO0 26 #define DHT_PIN 4 #define DHT_TYPE DHT22 #define NODE_ID 1 // Unique par node : 1, 2, 3... #define SLEEP_SEC 300 // 5 minutes DHT dht(DHT_PIN, DHT_TYPE); // Compteur boot persistant en RTC memory RTC_DATA_ATTR int bootCount = 0; void setup() { Serial.begin(115200); bootCount++; Serial.printf("Reveil #%d node %dn", bootCount, NODE_ID); // Mesure capteur dht.begin(); delay(2000); // DHT22 needs 2 sec float t = dht.readTemperature(); float h = dht.readHumidity(); float vbat = analogRead(35) * 3.3 / 4095 * 2; // diviseur 1:1 // Init LoRa LoRa.setPins(LORA_SS, LORA_RST, LORA_DIO0); if (!LoRa.begin(868E6)) { Serial.println("Echec LoRa"); goSleep(); } LoRa.setSpreadingFactor(10); LoRa.setSignalBandwidth(125E3); LoRa.setCodingRate4(5); LoRa.setTxPower(14); LoRa.enableCrc(); // Trame : ID;BOOT;TEMP;HUM;VBAT String payload = String(NODE_ID) + ";" + bootCount + ";" + String(t,1) + ";" + String(h,1) + ";" + String(vbat,2); // CSMA-CA simple : ecouter 500ms delay(random(50, 500)); // Backoff aleatoire pour eviter collisions LoRa.beginPacket(); LoRa.print(payload); LoRa.endPacket(); Serial.println("Envoye : " + payload); // Sleep LoRa.sleep(); goSleep(); } void goSleep() { Serial.println("Sleep " + String(SLEEP_SEC) + " sec"); esp_sleep_enable_timer_wakeup(SLEEP_SEC * 1000000ULL); esp_deep_sleep_start(); } void loop() { // Vide, setup() est rejoue apres chaque reveil } ## 4. Code Gateway : LoRa receive + WiFi MQTT forward #include #include #include #include #include #define LORA_SS 18 #define LORA_RST 14 #define LORA_DIO0 26 const char* ssid = "DIDACTICO_WIFI"; const char* pwd = "motdepasse"; const char* mqtt_server = "192.168.1.100"; WiFiClient espClient; PubSubClient client(espClient); void setup() { Serial.begin(115200); WiFi.begin(ssid, pwd); while (WiFi.status() != WL_CONNECTED) delay(500); Serial.println("WiFi OK " + WiFi.localIP().toString()); client.setServer(mqtt_server, 1883); LoRa.setPins(LORA_SS, LORA_RST, LORA_DIO0); LoRa.begin(868E6); LoRa.setSpreadingFactor(10); LoRa.setSignalBandwidth(125E3); LoRa.enableCrc(); Serial.println("Gateway pret"); } void loop() { // Reconnect MQTT si besoin if (!client.connected()) { while (!client.connect("didactico-gateway")) delay(2000); } client.loop(); // Ecouter LoRa int size = LoRa.parsePacket(); if (size) { String msg = ""; while (LoRa.available()) msg += (char)LoRa.read(); int rssi = LoRa.packetRssi(); float snr = LoRa.packetSnr(); Serial.printf("RX [%d dBm / %.1f dB]: %sn", rssi, snr, msg.c_str()); // Parser ID;BOOT;TEMP;HUM;VBAT int v[5]; int s = 0; String parts[5]; for (int i = 0; i < msg.length(); i++) { if (msg[i] == ';') s++; else if (s < 5) parts[s] += msg[i]; } // Construire JSON StaticJsonDocument<256> doc; doc["id"] = parts[0].toInt(); doc["boot"] = parts[1].toInt(); doc["temp"] = parts[2].toFloat(); doc["hum"] = parts[3].toFloat(); doc["vbat"] = parts[4].toFloat(); doc["rssi"] = rssi; doc["snr"] = snr; String json; serializeJson(doc, json); String topic = "didactico/farm/node/" + parts[0]; client.publish(topic.c_str(), json.c_str()); Serial.println("Pub MQTT " + topic); } } ## 5. Protocole : ASCII simple vs CBOR optimise Le format de trame impacte fortement le temps en air (= consommation) et le duty cycle. Trois options : ## ASCII delimite (ce qu'on a fait) Simple a debugger, lisible, mais verbeux. 1;42;23.5;65.2;3.85 = 22 octets. ## JSON {"id":1,"t":23.5,"h":65.2} = 27 octets. A eviter en LoRa, gaspille du payload. ## CBOR (RFC 8949) Concise Binary Object Representation. Compact, parsable, type-safe. Meme donnee : 11 octets seulement (50% de gain). Utiliser la lib arduino-cbor de Joe Hewitt. ## Binaire pack manuel Pour le minimum absolu : packez en struct binaire de 8 octets. // Trame compacte 8 octets struct LoRaPacket { uint8_t node_id; // 0-255 uint8_t boot_low; uint16_t boot_high; int16_t temp_x10; // temp * 10, ex : 23.5 -> 235 uint8_t hum; // 0-100% uint8_t vbat_x20; // vbat * 20, ex : 3.85V -> 77 } __attribute__((packed)); LoRaPacket pkt; pkt.node_id = 1; pkt.temp_x10 = (int16_t)(temp * 10); // ... LoRa.beginPacket(); LoRa.write((uint8_t*)&pkt, sizeof(pkt)); LoRa.endPacket(); ## 6. Gerer plusieurs nodes : CSMA-CA et collisions Avec 1 node, aucun probleme. Avec 20 nodes qui se reveillent tous a la meme seconde, vous avez collision garantie : les paquets se superposent, le gateway ne recupere rien. ## Solution 1 : decalage temporel (TDMA simplifie) Le node N attend N*10 secondes avant d'envoyer. Node 1 -> T+10s, Node 2 -> T+20s, etc. Simple mais rigide. ## Solution 2 : CSMA-CA (Carrier Sense Multiple Access) Avant d'emettre, le node ecoute si le canal est libre. S'il y a du trafic, il attend un temps aleatoire (backoff) puis recommence. bool isChannelBusy() { // Lire RSSI ambiant int rssi = LoRa.rssi(); return (rssi > -90); // si signal > -90 dBm = occupe } void sendWithCSMA(String msg) { int attempts = 0; while (isChannelBusy() && attempts < 5) { int backoff = random(100, 1000) * (1 << attempts); delay(backoff); attempts++; } LoRa.beginPacket(); LoRa.print(msg); LoRa.endPacket(); } ## Solution 3 : ACK + retry Le gateway repond par un ACK apres reception. Le node retransmet si pas d'ACK apres 2 secondes. Maximum 3 tentatives. ## 7. Encryption AES-128 sur LoRa Par defaut, LoRa transmet en clair. N'importe qui avec un module RFM95 peut sniffer vos donnees. Pour les usages serieux (agriculture commerciale, smart city), il faut chiffrer. L'ESP32 a un module AES hardware. Utilisez la lib AESLib ou mbedtls. #include AESLib aes; byte aes_key[16] = {0x44, 0x49, 0x44, 0x41, 0x43, 0x54, 0x49, 0x43, 0x4F, 0x32, 0x30, 0x32, 0x36, 0x4B, 0x45, 0x59}; byte aes_iv[16]; void sendEncrypted(String plain) { // Padder a multiple de 16 byte plainBuf[64]; memset(plainBuf, 0, 64); plain.getBytes(plainBuf, plain.length() + 1); byte cipherBuf[64]; aes.set_IV((uint64_t)millis()); aes.encrypt(plainBuf, 32, cipherBuf, aes_key, 128, aes_iv); LoRa.beginPacket(); LoRa.write(aes_iv, 16); // IV en clair (necessaire pour decryptage) LoRa.write(cipherBuf, 32); LoRa.endPacket(); }⚠️ Cle AES = cle bancaireLa cle AES doit etre stockee dans le NVS ou dans la zone eFuse de l'ESP32 (irrecuperable). NE JAMAIS la committer dans un repository git public. Utilisez le secure boot ESP32 en production. Si la cle fuite, tous les nodes deployes sont compromis. ## 8. Energie : LiPo 2000 mAh + panneau solaire 6V 1W Pour une autonomie illimitee, le combo gagnant est : - Batterie LiPo 2000 mAh (couts ~20 TND) - Panneau solaire 6V 1W (etanche, ~25 TND) - Module MPPT TP4056 + protection (charge intelligent, ~5 TND) - Coffret IP65 exterieur (~15 TND) Bilan energetique : ESP32 + LoRa + DHT22 en deep sleep cycle 5 min Sleep (299 sec)20 µA = 5,98 mAs/cycle Wake mesure + envoi (1 sec)120 mA = 120 mAs/cycle Total/cycle125,98 mAs Cycles/jour288 (1 toutes 5 min) Consommation/jour~10 mAh Autonomie batterie 2000 mAh seule~200 jours Avec panneau solaire 6V 1W (4h/jour)illimitee ## 9. Cas d'usage agriculture intelligente Tunisie ## Oliveraies de Kerkennah (capteur humidite sol) 18 nodes (capacitif sol + DHT22 air) sur 15 ha. Gateway TTGO sur depot. Donnees vers serveur OVH (Roubaix). Dashboard Grafana avec carte par parcelle. Alertes Telegram si humidite < 25%. Economie eau estimee : 30%. ## Palmeraies Tozeur (niveau cuve eau) 10 cuves de 5000L avec capteur ultrasonique JSN-SR04T. Gateway 4G (SIM Orange) car pas de WiFi. Envoi 4x/jour. Notification SMS au gerant si cuve < 20%. ## Tracker betail Mahres (T-Beam GPS) 40 colliers T-Beam sur vaches laitieres. Position GPS envoyee 1x/heure. Geofencing au niveau gateway : alerte si une vache quitte le perimetre. Detection vol resolu en 2 heures (vs 3 jours avant). ## Serres connectees Sahel 5 serres avec capteurs DHT22 + BH1750 (luminosite) + capteur CO2 (MH-Z19B) + sol. Reseau LoRa interne, gateway WiFi vers cloud. Controle automatique aerateurs et ombrieres. ## 10. Comparaison NB-IoT Orange Tunisie Orange Tunisie a deploye un reseau NB-IoT (Narrowband IoT) sur ses tours 4G. Comparaison frontale : CritereLoRa P2P/LoRaWANNB-IoT Orange Cout module15 TND (RFM95)40 TND (SIM7080) Abonnement0 TND (P2P)10-30 TND/mois Couverture10-15 km LoRaReseau cellulaire Gateway requiseOUI (custom)NON Penetration interieurMoyenneExcellente Latence1-5 sec10-30 sec Autonomie batterie2-5 ans1-3 ans 💡 Quand choisir NB-IoTSi vos nodes sont disperses sur des dizaines de kilometres (pas concentres sur 10 km), ou en interieur dense (sous-sol immeuble), NB-IoT est plus pertinent. Pour une exploitation agricole compacte avec un point haut pour la gateway, LoRa gagne sur le ROI a partir de 5 nodes. ## 11. Evolution vers LoRaWAN avec RAK7268 Quand vous depassez 20-30 nodes ou voulez exposer vos donnees a TTN (The Things Network), passez en LoRaWAN avec une vraie gateway 8 canaux. La RAK7268 (RAKwireless) est la gateway industrielle reference : 8 canaux SX1302, GPS, Ethernet, WiFi, 4G optionnel, boitier IP30 indoor (RAK7268C pour outdoor IP67). Cout ~600 TND. Configurer LoRaWAN cote node avec la lib MCCI LMIC. ADR (Adaptive Data Rate) ajuste automatiquement le SF et la TX power selon la qualite du lien. ChirpStack (open-source) ou TTN community fournit le network server. ## 12. Dashboard Grafana + InfluxDB Architecture cloud type : - MQTT broker Mosquitto sur VPS (~25 TND/mois OVH Eco) - Telegraf ecoute MQTT, transforme en time-series - InfluxDB 2.x stocke (retention 1 an, ~500 Mo pour 18 nodes) - Grafana visualise (gratuit OSS ou Grafana Cloud free tier) - Alerting Grafana > Telegram bot # docker-compose.yml gateway cloud Didactico version: '3' services: mosquitto: image: eclipse-mosquitto:2 ports: ["1883:1883", "9001:9001"] volumes: ["./mosquitto:/mosquitto/config"] influxdb: image: influxdb:2.7 ports: ["8086:8086"] volumes: ["influx-data:/var/lib/influxdb2"] telegraf: image: telegraf:1.28 depends_on: [mosquitto, influxdb] volumes: ["./telegraf.conf:/etc/telegraf/telegraf.conf:ro"] grafana: image: grafana/grafana:10 ports: ["3000:3000"] volumes: ["grafana-data:/var/lib/grafana"] volumes: influx-data: grafana-data:🌾 RECOMMANDE AGRICULTURE ## TTGO LoRa32 V2.1 - Gateway tout-en-un ESP32 + SX1276 868 MHz + OLED + lecteur SD + batterie. La carte ideale pour votre gateway LoRa-to-WiFi. Compatible avec tous nos nodes RFM95 et T-Beam disponibles en stock Didactico Sfax. Decouvrir TTGO → ## 13. FAQ - ESP32 LoRa Reseau Capteurs Combien de nodes peut gerer une gateway ESP32 ?En P2P custom avec CSMA-CA : 20-30 confortablement. En LoRaWAN avec gateway 8 canaux (RAK7268) : 1000+. Le facteur limitant est le duty cycle, pas le hardware ESP32. Quel SF utiliser pour un reseau de 15 nodes sur 5 km ?SF9 ou SF10 sur 868 MHz BW125. Trame courte (~200 ms), capacite ~30 messages/heure par node sans saturer. Pour SF12, vous saturez le canal des 8-10 messages/heure. Le DHT22 est-il fiable en exterieur ?Oui dans un boitier ventile abrite. NON exposé directement au soleil ou pluie. Pour les conditions extremes, prefere BME280 (plus precis, I2C) ou SHT31 (industriel). Faut-il un MOSFET pour couper les capteurs en deep sleep ?Pour des projets pousses oui. Un DHT22 consomme 1,5 mA permanent meme non interroge. Un MOSFET P-channel commute par GPIO ESP32 economise 100% de cette conso pendant le sleep, allongeant l'autonomie de 40%. Que faire si la gateway plante ?(1) Watchdog hardware ESP32 (deja active par defaut). (2) Reboot si pas de trame recue pendant 30 min. (3) Idealement, 2 gateways redondantes. (4) Monitoring du gateway via heartbeat MQTT toutes les minutes. Peut-on utiliser Wi-Fi ET LoRa en meme temps sur ESP32 ?Oui, c'est le principe meme du gateway TTGO LoRa32. ESP32 multitasking gere les deux radios. Attention juste a ne pas faire d'envoi LoRa pendant une connexion WiFi intensive (peut causer reset par pic de conso). Combien coute un deploiement complet 15 nodes + gateway + cloud ?Hardware : 15x (ESP32 + RFM95 + batterie + panneau + boitier) = 15x ~70 TND = 1050 TND. Gateway TTGO LoRa32 + boitier : 100 TND. VPS Cloud OVH Eco : 25 TND/mois. Total deploiement initial ~1150 TND. ## Conclusion : l'agriculture intelligente, c'est maintenant et en Tunisie L'ESP32 + LoRa n'est pas une futurologie. C'est une realite operationnelle aujourd'hui en Tunisie, deployee chez des dizaines de producteurs de Sfax, Tozeur, Mahres, Kerkennah et du Sahel. L'investissement initial (1000-1500 TND) est amorti en 6-12 mois par les economies d'eau, de carburant, et de main-d'oeuvre. Pour vos projets PFE en ENIT, INSAT, ESPRIT ou ISET autour de l'IoT agricole, Didactico Sfax fournit tous les composants (TTGO LoRa32, T-Beam, RFM95, DHT22, BME280, capacitifs sol, batteries, panneaux solaires) avec livraison 24-48h en Tunisie. Decouvrez aussi notre guide Module LoRa SX1276 longue portee et ESP32 WiFi envoi donnees Internet. --- # ESP32 WiFi : Envoyer vos Donnees IoT sur Internet (Guide Complet) URL: https://didactico.tn/esp32-wifi-envoyer-donnees-internet-iot-tunisie/ Résumé: Guide expert ESP32 WiFi : envoyer des donnees IoT sur Internet via HTTP/HTTPS, MQTT, ThingSpeak, Firebase. WiFiManager, OTA, deep sleep, certificats Let's Encrypt et bonnes pratiques securite pour vos projets IoT en Tunisie. Mars 2024. Un etudiant ENIT en PFE me montre fierement son projet : un ESP32 qui envoie la temperature de son aquarium sur Internet. Le code marche... 12 heures, puis crash. Le WiFi se deconnecte, il faut redemarrer manuellement. Le mot de passe WiFi est ecrit en clair dans le firmware (probleme si on flash 100 appareils chez des clients). Aucune reconnexion automatique. Aucune mise a jour OTA. Aucun chiffrement HTTPS. Sa note ? 12/20. Le mois suivant, on a refait le projet ensemble. Resultat : autonomie 6 mois sur 2 piles AA grace au deep sleep, connexion WiFi via portail captif (l'utilisateur configure depuis son telephone), HTTPS avec certificat Let's Encrypt, MQTT pour la latence faible, OTA pour mises a jour a distance. Note finale : 19/20. Dans ce guide, on construit ensemble cette architecture professionnelle. Pas du tutoriel "Hello World ThingSpeak", mais du vrai code production utilise dans 50+ projets deployes en Tunisie. ## 📋 Table des matieres - 1. Architecture ESP32 : ce qu'il faut savoir - 2. Installation core ESP32 dans Arduino IDE 2.x - 3. Connexion WiFi avec WiFiManager (portail captif) - 4. HTTP GET/POST avec HTTPClient - 5. HTTPS securise + certificat Let's Encrypt - 6. Envoi vers ThingSpeak avec dashboard - 7. MQTT temps reel avec PubSubClient - 8. Firebase Realtime Database - 9. OTA Updates : mises a jour a distance - 10. Deep sleep et autonomie sur batterie - 11. Securite : ne JAMAIS hardcoder de mots de passe - 12. FAQ ## 1. Architecture ESP32 : ce qu'il faut savoir L'ESP32 d'Espressif (Shanghai, 2016) est probablement le meilleur rapport prix/performances jamais conçu pour l'IoT. Pour 15 TND chez Didactico, vous obtenez : - CPU dual-core Xtensa LX6 @ 240 MHz : deux fois plus rapide qu'un Arduino UNO multiplie par 100 - 520 KB SRAM + 4 MB Flash (versions standard) - WiFi 802.11 b/g/n 2,4 GHz avec antenne PCB integree - Bluetooth 4.2 classic + BLE - 34 GPIO dont 18 ADC 12-bit, 16 PWM channels, 2 DAC 8-bit, I2C, SPI, UART, CAN, I2S - Hall sensor, touch sensors, deep sleep < 10 µA - Cryptographie hardware : AES, SHA, RSA, ECC, RNG ## ESP32 vs ESP32-S2/S3/C3 : quel choisir ? VarianteCoresWiFiBTUSBCas d'usage ESP32 (classique)2x LX6 240MHzOUIBT4.2 + BLENon nativeIoT general ESP32-S21x LX7 240MHzOUINONUSB OTGHID, USB host ESP32-S32x LX7 240MHzOUIBLE 5USB OTGAI/Vision ESP32-C31x RISC-V 160MHzOUIBLE 5USB SerialEconomique ## 2. Installation core ESP32 dans Arduino IDE 2.x - Ouvrir Arduino IDE 2.x > Fichier > Preferences - Dans "URL de gestionnaires de cartes supplementaires", coller : https://espressif.github.io/arduino-esp32/package_esp32_index.json - Aller dans Outils > Type de carte > Gestionnaire de cartes - Chercher "esp32" et installer "esp32 by Espressif Systems" (version 3.0.x ou +) - Selectionner Outils > Carte > ESP32 Arduino > ESP32 Dev Module ⚠️ Driver CP2102/CH340 obligatoireL'ESP32 utilise un convertisseur USB-Serial. Sur Windows, il faut installer le driver CP2102 (Silicon Labs) ou CH340 selon la carte. Sans driver, le port COM n'apparait pas. Telechargez-les avant la premiere utilisation. ## 3. Connexion WiFi avec WiFiManager (portail captif) Hardcoder le SSID/mot de passe dans le code est une faute de debutant. Si vous deployez 50 capteurs chez 50 clients differents, vous devez tous les reflasher. Solution professionnelle : WiFiManager. WiFiManager (lib de tzapu) lance un point d'acces WiFi au demarrage si aucun reseau connu. L'utilisateur se connecte avec son telephone a "DIDACTICO-AP", est redirige vers une page web ou il choisit son WiFi et entre le mot de passe. Les credentials sont stockes en NVS Flash, jamais perdus. #include #include // installer via Library Manager void setup() { Serial.begin(115200); WiFiManager wm; // Si pas de WiFi configure, lance portail captif // SSID : "DIDACTICO-IoT-Setup" // Pwd : "didactico2026" bool res = wm.autoConnect("DIDACTICO-IoT-Setup", "didactico2026"); if (!res) { Serial.println("Echec connexion. Redemarrage..."); delay(3000); ESP.restart(); } Serial.print("WiFi connecte ! IP : "); Serial.println(WiFi.localIP()); } void loop() { // Verifier connexion regulierement if (WiFi.status() != WL_CONNECTED) { WiFi.reconnect(); delay(5000); } }💡 Astuce reset configPour effacer les credentials stockes (utile pendant le developpement) : wm.resetSettings(); avant autoConnect(). Ou ajoutez un bouton physique "Reset WiFi" qui appelle cette fonction. ## 4. HTTP GET/POST avec HTTPClient Pour envoyer des donnees a un serveur, utilisez la bibliotheque HTTPClient incluse dans le core ESP32. #include #include void envoyerDonnee(float temp, float hum) { if (WiFi.status() != WL_CONNECTED) return; HTTPClient http; String url = "http://api.didactico.tn/iot/temp"; http.begin(url); http.addHeader("Content-Type", "application/json"); http.addHeader("X-API-Key", "VOTRE_CLE_API"); String payload = "{"temp":" + String(temp) + ","hum":" + String(hum) + ","device":"esp32-01"}"; int httpCode = http.POST(payload); if (httpCode > 0) { String response = http.getString(); Serial.printf("HTTP %d : %sn", httpCode, response.c_str()); } else { Serial.printf("Echec HTTP : %sn", http.errorToString(httpCode).c_str()); } http.end(); } ## 5. HTTPS securise + certificat Let's Encrypt En 2026, envoyer des donnees IoT en HTTP clair, c'est inadmissible. Mais HTTPS sur ESP32 demande un detail crucial : integrer le certificat racine pour valider la chaine de confiance. Let's Encrypt utilise le root certificate ISRG Root X1. Voici comment l'inclure : #include #include #include // ISRG Root X1 (Let's Encrypt) const char* root_ca = "-----BEGIN CERTIFICATE-----n" "MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAwn" "...n" "-----END CERTIFICATE-----n"; void envoyerHTTPS(float temp) { WiFiClientSecure client; client.setCACert(root_ca); HTTPClient https; if (https.begin(client, "https://api.didactico.tn/iot")) { https.addHeader("Content-Type", "application/json"); String payload = "{"temp":" + String(temp) + "}"; int code = https.POST(payload); Serial.printf("HTTPS code: %dn", code); https.end(); } }⚠️ Validite des certificatsLe ISRG Root X1 expire en 2035. Mais le certificat de votre serveur expire tous les 90 jours (Let's Encrypt). Heureusement, valider la chaine racine suffit, vous n'avez pas a mettre a jour l'ESP32 a chaque renouvellement. Pensez juste a verifier l'heure du RTC interne car la validation depend de la date courante (utilisez NTP). ## 6. Envoi vers ThingSpeak avec dashboard ThingSpeak (MathWorks) est le service IoT le plus simple pour debuter. Compte gratuit limite a 8200 messages/jour, dashboard inclus, MATLAB analytics. Etapes : - Creer compte sur thingspeak.com - Creer un nouveau Channel avec 8 fields (temp, hum, etc.) - Recuperer la Write API Key - Envoyer en HTTP GET #include #include String apiKey = "VOTRE_WRITE_API_KEY"; String server = "http://api.thingspeak.com/update"; void envoyerThingSpeak(float temp, float hum, float lux) { HTTPClient http; String url = server + "?api_key=" + apiKey + "&field1=" + String(temp) + "&field2=" + String(hum) + "&field3=" + String(lux); http.begin(url); int code = http.GET(); Serial.printf("ThingSpeak %dn", code); http.end(); } void loop() { envoyerThingSpeak(23.5, 65.2, 480); delay(20000); // Min 15 sec entre envois (free tier) } ## 7. MQTT temps reel avec PubSubClient HTTP, c'est bien pour des envois ponctuels. MQTT, c'est pour le temps reel. Latence < 100 ms, payload minimal (~10 octets de header), QoS 0/1/2, support de millions de connexions simultanees. Architecture : un broker MQTT (Mosquitto, HiveMQ, EMQX) au centre, des publishers (vos ESP32) et des subscribers (vos dashboards, apps mobiles). Les messages sont organises en topics hierarchiques. #include #include const char* mqtt_server = "broker.hivemq.com"; const int mqtt_port = 1883; // 8883 pour TLS WiFiClient espClient; PubSubClient client(espClient); void callback(char* topic, byte* payload, unsigned int length) { String msg = ""; for (int i = 0; i < length; i++) msg += (char)payload[i]; Serial.printf("Recu [%s] : %sn", topic, msg.c_str()); // Exemple : commande LED if (String(topic) == "didactico/esp32-01/cmd/led") { digitalWrite(LED_BUILTIN, msg == "ON" ? HIGH : LOW); } } void reconnectMQTT() { while (!client.connected()) { String clientId = "DIDA-" + String(WiFi.macAddress()); if (client.connect(clientId.c_str())) { Serial.println("MQTT connecte"); client.subscribe("didactico/esp32-01/cmd/#"); } else { delay(5000); } } } void setup() { Serial.begin(115200); // WiFi.begin(...) ou WiFiManager client.setServer(mqtt_server, mqtt_port); client.setCallback(callback); } void loop() { if (!client.connected()) reconnectMQTT(); client.loop(); // Publier toutes les 10 sec static unsigned long lastPub = 0; if (millis() - lastPub > 10000) { lastPub = millis(); String payload = "{"temp":23.5,"hum":65}"; client.publish("didactico/esp32-01/data", payload.c_str()); } }💡 Topic conventionAdoptez une convention claire : {org}/{device_id}/{type}/{measure}. Exemple : didactico/esp32-01/data/temperature. Les wildcards MQTT (+ pour un niveau, # pour tout en aval) permettent d'ecouter intelligemment. ## 8. Firebase Realtime Database Pour synchroniser un ESP32 avec une app mobile (Flutter, React Native), Firebase Realtime Database est imbattable. La lib Firebase ESP32 Client de Mobizt (mobizt/Firebase-ESP-Client) gere tout. #include #include #define API_KEY "VOTRE_API_KEY" #define DATABASE_URL "https://didactico-iot-default-rtdb.firebaseio.com" #define USER_EMAIL "esp32@didactico.tn" #define USER_PASSWORD "motdepasse" FirebaseData fbdo; FirebaseAuth auth; FirebaseConfig config; void setup() { // ... WiFi setup config.api_key = API_KEY; config.database_url = DATABASE_URL; auth.user.email = USER_EMAIL; auth.user.password = USER_PASSWORD; Firebase.begin(&config, &auth); } void loop() { if (Firebase.ready()) { Firebase.RTDB.setFloat(&fbdo, "/esp32-01/temp", 23.5); Firebase.RTDB.setFloat(&fbdo, "/esp32-01/hum", 65.2); Firebase.RTDB.setInt(&fbdo, "/esp32-01/ts", millis()); } delay(5000); } ## 9. OTA Updates : mises a jour a distance Imaginez : 100 ESP32 deployes dans 100 maisons clients. Vous trouvez un bug. Il faut tous les recuperer pour reflasher ? Non. OTA (Over The Air) permet de pousser un nouveau firmware via WiFi en 30 secondes. #include #include void setup() { // ... WiFi setup ArduinoOTA.setHostname("esp32-didactico-01"); ArduinoOTA.setPassword("didacticoOTA2026"); ArduinoOTA.onStart([]() { Serial.println("OTA Start"); }); ArduinoOTA.onEnd([]() { Serial.println("OTA End"); }); ArduinoOTA.onProgress([](unsigned int p, unsigned int t) { Serial.printf("OTA %u%%n", (p / (t / 100))); }); ArduinoOTA.onError([](ota_error_t error) { Serial.printf("Erreur OTA: %un", error); }); ArduinoOTA.begin(); } void loop() { ArduinoOTA.handle(); // ... votre code }Dans Arduino IDE : Outils > Port > choisissez l'ESP32 par son hostname (apparait apres 30 sec). Code uploade via WiFi. ## 10. Deep sleep : autonomie de plusieurs mois sur batterie Un ESP32 en marche normale consomme 80-160 mA. En deep sleep, 10 µA. La difference est de 1 a 16 000. Pour un capteur qui envoie 1 mesure toutes les 15 min, le deep sleep multiplie l'autonomie par 50-100. #include #define uS_TO_S_FACTOR 1000000ULL #define TIME_TO_SLEEP 900 // 15 minutes en secondes void setup() { Serial.begin(115200); // Reveil rapide, lecture capteur, envoi MQTT, dormir connectWiFi(); // ~3 secondes float temp = readSensor(); sendMQTT(temp); Serial.println("Sleep 15 min..."); esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR); esp_deep_sleep_start(); } void loop() { // Jamais execute, le setup() est rejoue apres chaque reveil }💡 Optimisations avanceesPour atteindre vraiment 10 µA : (1) desactiver le LDO de la carte dev (souvent 5-10 mA), preferer une alimentation directe 3,3V. (2) couper l'alimentation des capteurs externes via un MOSFET. (3) utiliser des ESP32 nu (ESP32-S2 ULP, ou ESP32-C3). (4) eviter le module USB-Serial sur la carte de production. ## 11. Securite : les 7 commandements de l'ESP32 en production - JAMAIS hardcoder les credentials WiFi dans le firmware. Utiliser WiFiManager + NVS Preferences. - JAMAIS HTTP en clair. HTTPS avec certificat valide ou MQTT avec TLS sur le port 8883. - API keys uniques par device. Generez un token JWT signé par votre serveur. - Flash encryption + Secure Boot en production. Active dans menuconfig (ESP-IDF). - OTA signe. Verifier la signature du firmware avant flash. - Limiter les ports ouverts. Si vous n'utilisez pas Telnet, ne lancez pas le service. - WiFi Enterprise (WPA2-EAP) pour entreprises. Authentification par certificat client. 📶 BEST-SELLER ## Carte ESP32 WROOM-32 CP2102 (30 pin) La carte de developpement ESP32 la plus populaire. CP2102 pour upload USB stable, antenne PCB integree, 30 pins accessibles. Ideal pour vos projets PFE et prototypes IoT en Tunisie. Voir la carte ESP32 → ## 12. FAQ - ESP32 WiFi IoT L'ESP32 supporte-t-il le WiFi 5 GHz ?Non. L'ESP32 (et la majorite des ESP32-S/C) supportent uniquement le WiFi 2,4 GHz 802.11 b/g/n. Si votre routeur diffuse en 5 GHz exclusivement, il faut activer une bande 2,4 GHz. Quelle est la portee WiFi typique d'un ESP32 ?Avec antenne PCB integree : 30-50 m en interieur, 100-150 m en exterieur LoS. Avec antenne externe (variantes WROOM-32U + antenne externe IPX) : 200-300 m exterieur. Combien d'objets peut gerer un broker MQTT ?Mosquitto sur un Raspberry Pi 4 gere confortablement 10 000 connexions simultanees. HiveMQ Cloud free tier : 100 connexions. EMQX commercial : millions. Pour 90% des projets PFE et makers, le broker public HiveMQ public suffit en developpement. Puis-je alimenter un ESP32 avec une pile 18650 Li-Ion ?Oui, mais ATTENTION : l'ESP32 fonctionne en 3,3V. La 18650 fait 3,0-4,2V. Il faut un regulateur LDO 3,3V (AMS1117) ou utiliser une carte avec gestion batterie integree (TTGO T-Beam, Wemos LOLIN32). HTTPS sur ESP32 ralentit-il beaucoup ?Premiere requete : ~2 secondes (handshake TLS). Requetes suivantes (memes session) : ~200 ms. Le hardware crypto integre (AES, SHA) accelere significativement. Pour 1 envoi/min, l'impact est negligeable. Comment debugger une connexion WiFi qui echoue ?(1) Verifier que vous etes en 2,4 GHz. (2) SSID sans caracteres speciaux. (3) Pas de MAC filtering sur le routeur. (4) WPA2-Personal (pas WPA3, mauvais support core 1.x). (5) Verifier WiFi.status() et afficher les codes d'erreur. OTA peut-il bricker mon ESP32 ?Si le firmware uploade est corrompu et OTA n'a pas de bootloader de secours, oui. Solution : utiliser 2 partitions OTA (par defaut dans le partition scheme "Default with 2 OTA"). Si la nouvelle ne demarre pas, retour automatique a l'ancienne. ## Conclusion : l'ESP32 est le futur de l'IoT en Tunisie L'ESP32 n'est pas juste "l'Arduino avec WiFi". C'est une plateforme IoT complete avec WiFi, BT, BLE, cryptographie hardware, 18 ADC, et un ecosysteme Arduino mature. Pour 15 TND chez Didactico, vous avez la puissance de calcul d'un PC de 2005 dans un module qui tient sur un dirham. Pour aller plus loin, decouvrez nos guides ESP32 vs ESP8266 : Lequel Choisir ? et ESP32 LoRa pour l'Agriculture Tunisienne. Livraison 24-48h partout en Tunisie depuis notre stock Sfax. Etudiants ENIT, INSAT, ESPRIT, ISET : tarif preferentiel sur presentation de carte etudiante. --- # Module LoRa Arduino SX1276 : Communication 10 km Longue Portée URL: https://didactico.tn/module-lora-communication-longue-distance-arduino-tunisie/ Résumé: Tout ce qu'il faut savoir pour deployer une communication LoRa SX1276 longue portee (jusqu'a 10 km) avec Arduino ou ESP32 : modules, Spreading Factor, code emetteur/recepteur, antennes, reglementation 868 MHz Tunisie et cas d'usage agriculture intelligente. Septembre 2024. Une oliveraie de 80 hectares dans la region de Sfax, perdue entre Agareb et Sakiet Ezzit. L'ingenieur agronome veut suivre l'humidite du sol, la temperature et l'etat des pompes de 12 forages disperses sur 7 kilometres. Le WiFi ne passe pas. La 4G coute 12 abonnements SIM. Le Bluetooth se moque de lui. Sa solution finale ? Un node LoRa a 9 dinars par capteur, une gateway sur le toit du depot, et une portee mesuree a 8,4 km en LoS avec un Spreading Factor 12. Total facture electronique : moins de 400 TND. Total facture telecom mensuelle : zero. Bienvenue dans le monde de LoRa, la technologie radio qui a discretement reecrit les regles de l'IoT longue distance. Dans ce guide expert, on demonte SX1276/SX1278, on calcule la portee reelle (pas celle des fiches marketing), on code en Arduino et ESP32, et on explore la reglementation tunisienne ISM 868 MHz souvent ignoree. ## 📋 Table des matieres - 1. La technologie LoRa demystifiee (CSS Semtech) - 2. Bandes ISM : 433, 868 ou 915 MHz ? - 3. Quel module choisir : RFM95, Ra-02, TTGO, Heltec - 4. Parametres LoRa : SF, BW, CR, TX Power - 5. Calcul de portee theorique vs reelle - 6. Code Arduino emetteur et recepteur - 7. Point-to-point vs LoRaWAN - 8. Antennes : helice, spirale, externe - 9. Applications reelles en Tunisie - 10. Reglementation IUT-R et ANF Tunisie - 11. FAQ ## 1. La technologie LoRa demystifiee : le secret du Chirp Spread Spectrum LoRa, c'est l'acronyme de Long Range. Mais ce nom marketing cache une modulation radio brillante developpee par la startup grenobloise Cycleo en 2009, rachetee par Semtech en 2012 pour 5 millions de dollars. Aujourd'hui, plus de 300 millions de dispositifs LoRa sont deployes dans le monde, et Semtech vend les puces SX1276, SX1278, SX1262 sous brevet ferme jusqu'en 2029. ## Chirp Spread Spectrum (CSS) : la magie de Cycleo Contrairement au WiFi (OFDM) ou au Bluetooth (FHSS), LoRa utilise une modulation par etalement de spectre a chirp. Concretement, chaque symbole binaire est code par un signal sinusoidal dont la frequence monte ou descend de maniere lineaire sur toute la bande passante. Cette technique offre trois superpouvoirs : - Sensibilite extreme : -148 dBm (vs -90 dBm pour le WiFi). On peut recevoir un signal plus faible que le bruit thermique de fond ! - Immunite Doppler : les chirps sont insensibles aux decalages de frequence, ideal pour des objets mobiles (tracker betail, drone). - Resistance multi-trajets : les reflexions sur les batiments ne degradent pas le signal. ## Le compromis : debit ridicule Le prix a payer ? Un debit anemique : de 0,3 a 50 kbps selon les parametres. LoRa n'est PAS conçu pour streamer Netflix. Il est conçu pour envoyer 20 octets toutes les 5 minutes pendant 10 ans sur une pile AA. Parfait pour un capteur de niveau de cuve d'eau, pas pour une camera de surveillance. ## 2. Bandes ISM : 433, 868 ou 915 MHz ? Le choix critique LoRa fonctionne sur les bandes ISM (Industrial, Scientific, Medical) libres de licence. Mais attention : chaque region a sa propre bande autorisee. Utiliser la mauvaise frequence en Tunisie est illegal et peut bloquer votre signal. BandeRegionModule typiquePorteeRestrictions 433 MHzAsie, Afrique (autorisee Tunisie)Ra-02 SX12785-8 kmAntennes plus longues (17 cm) 868 MHzEurope, TunisieRFM95 SX12768-15 kmDuty Cycle < 1% 915 MHzAmerique, AustralieSX1276 US version10-15 kmPas de DC mais limite TX 2,4 GHzMondial (SX1280)SX12801-3 kmConcurrence WiFi ⚠️ Tunisie = 868 MHz officielL'Agence Nationale des Frequences (ANF) tunisienne s'aligne sur les regles europeennes ETSI EN 300 220. La bande 868,0-868,6 MHz est libre de licence avec une puissance max de 14 dBm (25 mW) et un duty cycle < 1%. La bande 433 MHz est techniquement autorisee mais avec des restrictions de puissance (10 mW), ce qui reduit la portee. ## 3. Quel module LoRa choisir ? Le guide d'achat 2026 ## RFM95W (HopeRF) - Le module nu, polyvalent Le RFM95W est un module compact (16x16 mm) bati autour de la puce Semtech SX1276. Il communique en SPI, accepte 3,3V (PAS 5V, attention aux Arduino UNO !), et coute environ 15 TND chez Didactico. Il faut l'associer a un MCU separe (Arduino Nano, Pro Mini 3.3V, ESP32). Idéal pour des nodes optimises en consommation (sleep < 1 µA). ## Ra-02 (Ai-Thinker) - SX1278 433 MHz Version chinoise economique du RFM95 mais sur 433 MHz (SX1278). Tres populaire en Asie. Attention : utilise 433 MHz, donc antenne de 17 cm requise. Eviter en Tunisie sauf si vous ne diffusez qu'a faible puissance. ## TTGO LoRa32 V2.1 - Le couteau suisse ESP32 Notre coup de coeur Didactico. Combine sur un seul PCB : ESP32 (WiFi + BT + dual core), SX1276 868 MHz, ecran OLED 0,96", lecteur SD, batterie LiPo avec charge USB-C, antenne SMA femelle. Coute environ 65 TND. Parfait pour un gateway LoRa-to-WiFi car l'ESP32 peut relayer les trames LoRa vers MQTT/HTTP. ## TTGO T-Beam v1.2 - Avec GPS NEO-6M Identique au LoRa32 mais avec un module GPS NEO-6M et un porte-pile 18650. C'est LE choix pour les trackers betail, drones, ou applications de geolocalisation autonomes. Autonomie 2-3 semaines sur une seule cellule 18650. ## Heltec WiFi LoRa V3 - ESP32-S3 + SX1262 La generation 2024 : ESP32-S3 (dual core 240 MHz + AI acceleration), SX1262 (consommation reduite de 30%, sensibilite -148 dBm), USB-C, OLED. Le futur, mais 25% plus cher. 📡 RECOMMANDE ## TTGO T-Beam (ESP32 + LoRa SX1276 + GPS) La carte tout-en-un pour vos projets LoRa avec geolocalisation : tracker betail, drone, capteur mobile. Antenne SMA incluse, porte-pile 18650 integre. Voir le produit → ## 4. Parametres LoRa : SF, BW, CR, TX Power expliques C'est ici que la plupart des tutoriels generiques abandonnent. Pourtant, comprendre ces 4 parametres est la difference entre 500 m et 12 km de portee. ## Spreading Factor (SF) : de 7 a 12 Le SF determine le nombre de "chirps" par symbole. Plus le SF est eleve, plus la portee est grande, mais plus le debit chute. SFSensibiliteDebit (BW 125 kHz)Temps en air (10 octets)Usage SF7-123 dBm5,5 kbps56 msUrbain courte distance SF9-129 dBm1,7 kbps185 msPeriurbain SF11-135 dBm440 bps660 msRural longue SF12-137 dBm250 bps1320 msExtreme distance ## Bandwidth (BW) : 7,8 a 500 kHz La largeur de bande. 125 kHz est le standard LoRaWAN. Diminuer a 62,5 kHz augmente la sensibilite de 3 dB mais double le temps en air. ## Coding Rate (CR) : 4/5 a 4/8 Le ratio FEC (Forward Error Correction). 4/5 = 20% de redondance. 4/8 = 100% de redondance (double le payload). Utile en environnement bruite. ## TX Power : 2 a 20 dBm La puissance d'emission. En Europe/Tunisie, limite a 14 dBm sur 868 MHz. Ne JAMAIS depasser 17 dBm en LoRa pur point-to-point (degradation de la puce et illegal). 💡 Configuration golden ratioPour 90% des cas en Tunisie rurale : SF10, BW 125 kHz, CR 4/5, TX 14 dBm. Vous obtiendrez 5-8 km en LoS avec un payload de 50 octets en 370 ms. Si la distance est superieure a 8 km, passez en SF12 mais respectez le duty cycle (max 36 secondes/heure transmises). ## 5. Calcul de portee theorique vs reelle Le link budget LoRa se calcule ainsi : // Link Budget LoRa Link_Budget_dB = P_TX + G_ant_TX + G_ant_RX - Sensibilite_RX // Exemple SF12, BW 125 kHz, TX 14 dBm, antennes 3 dBi de chaque cote Link_Budget = 14 + 3 + 3 - (-137) = 157 dB // Distance theorique en espace libre (FSPL) FSPL(d) = 20*log10(d_km) + 20*log10(f_MHz) + 32,45 157 = 20*log10(d) + 20*log10(868) + 32,45 20*log10(d) = 157 - 58,78 - 32,45 = 65,77 d = 10^(65,77/20) = 1944 km en theorie ! Mais en pratique, la realite est plus dure. Les obstacles (zone de Fresnel), la courbure terrestre, les pertes de cable et l'attenuation atmospherique reduisent ce chiffre. Voici nos mesures terrain Didactico en 2024 : EnvironnementSF7 BW125SF10 BW125SF12 BW125 Urbain dense (Tunis centre)400 m1,2 km2,5 km Periurbain (Sfax banlieue)1,5 km4 km7 km Rural (oliveraies Sakiet)3 km8 km14 km LoS colline a colline8 km20 km40+ km ## 6. Code Arduino : emetteur et recepteur ## Bibliotheque LoRa.h par Sandeep Mistry Installez la lib LoRa de Sandeep Mistry via le gestionnaire Arduino (Library Manager). Cest la plus stable et compatible avec tous les modules SX127x. ## Code emetteur (Arduino Nano + RFM95) #include #include // Cablage SPI : NSS=10, RESET=9, DIO0=2 #define LORA_SS 10 #define LORA_RST 9 #define LORA_DIO0 2 int compteur = 0; void setup() { Serial.begin(115200); while (!Serial); Serial.println("Emetteur LoRa Didactico"); LoRa.setPins(LORA_SS, LORA_RST, LORA_DIO0); // Frequence Tunisie : 868 MHz if (!LoRa.begin(868E6)) { Serial.println("Echec init LoRa"); while (1); } // Configuration optimale rural Tunisie LoRa.setSpreadingFactor(10); // SF10 LoRa.setSignalBandwidth(125E3); // 125 kHz LoRa.setCodingRate4(5); // 4/5 LoRa.setTxPower(14); // 14 dBm = limite legale LoRa.enableCrc(); // Activer CRC Serial.println("LoRa pret"); } void loop() { Serial.print("Envoi paquet : "); Serial.println(compteur); LoRa.beginPacket(); LoRa.print("DIDA-NODE-01:"); LoRa.print(compteur); LoRa.print(":TEMP="); LoRa.print(25.7); LoRa.print(":HUM="); LoRa.print(48); LoRa.endPacket(); compteur++; delay(60000); // Respecter Duty Cycle < 1% sur 868 MHz } ## Code recepteur avec RSSI/SNR #include #include #define LORA_SS 10 #define LORA_RST 9 #define LORA_DIO0 2 void setup() { Serial.begin(115200); LoRa.setPins(LORA_SS, LORA_RST, LORA_DIO0); if (!LoRa.begin(868E6)) { Serial.println("Echec init LoRa"); while (1); } LoRa.setSpreadingFactor(10); LoRa.setSignalBandwidth(125E3); LoRa.enableCrc(); Serial.println("Recepteur pret"); } void loop() { int packetSize = LoRa.parsePacket(); if (packetSize) { String message = ""; while (LoRa.available()) { message += (char)LoRa.read(); } int rssi = LoRa.packetRssi(); float snr = LoRa.packetSnr(); Serial.print("RX: "); Serial.print(message); Serial.print(" | RSSI: "); Serial.print(rssi); Serial.print(" dBm | SNR: "); Serial.print(snr); Serial.println(" dB"); // Diagnostic qualite if (rssi > -100) Serial.println("Excellent"); else if (rssi > -120) Serial.println("Bon"); else Serial.println("Limite"); } }⚠️ Cablage critique 3,3VLe RFM95 supporte UNIQUEMENT 3,3V. Si vous utilisez un Arduino UNO (5V), il FAUT un convertisseur de niveau logique sur les broches SPI (MOSI, SCK, NSS, DIO0). Sinon, le module grille en quelques minutes. Prefere un Arduino Pro Mini 3,3V ou directement un ESP32. ## 7. Point-to-point vs LoRaWAN : que choisir ? LoRa (la couche physique) et LoRaWAN (le protocole reseau) sont deux choses differentes. ## LoRa point-to-point Communication directe node-to-node ou node-to-gateway custom. Vous controlez tout : protocole, format, encryption. Parfait pour 1 a 20 nodes. Pas de frais. Pas de TTN. Pas de gateway publique. ## LoRaWAN Protocole standardise (LoRa Alliance) avec gateways publiques (The Things Network), serveurs reseau (ChirpStack), ADR automatique. Necessite un gateway 8 canaux (RAK7268 a 600 TND). Adapte des 50+ nodes ou pour deploiement commercial. CritereP2PLoRaWAN Cout setup30 TND/node30 TND/node + 600 TND gateway Nodes max~2010 000+ SecuriteA coderAES-128 native (AppKey/NwkKey) Couverture publiqueNonOui (TTN) ComplexiteFaibleElevee ## 8. Antennes : helice, spirale, externe L'antenne est le facteur le plus sous-estime. Une mauvaise antenne diminue la portee de 70%. ## Antenne helice (whip) 868 MHz 17 cm de long (quart d'onde), gain 2-3 dBi. Standard fournie avec les modules. Bonne pour les nodes mobiles. ## Antenne spirale (PCB) Integree sur PCB, gain 0-1 dBi. Compact mais portee reduite de 30%. Utilisez seulement pour les wearables. ## Antenne externe Yagi-Uda directionnelle 5-12 dBi, directive. Idéale pour un lien point-to-point entre deux sites fixes (gateway-to-station distante). Permet d'atteindre 20-40 km. Compter 80 TND pour une Yagi 8 dBi. ## Antenne fibre de verre omnidirectionnelle 4-8 dBi, omni. Pour une gateway au centre d'un reseau de nodes. 60 TND pour 5 dBi de qualite. 💡 Astuce zone de FresnelPour un lien LoRa de 5 km a 868 MHz, la zone de Fresnel a un rayon de 9,3 m au milieu du trajet. Si un obstacle (batiment, colline, arbre) penetre cette zone, le signal degrade. Surelevez vos antennes ! Un mat de 6 m peut tripler votre portee. ## 9. Applications reelles en Tunisie ## Oliveraies connectees de Sfax Capteurs d'humidite du sol (tensiometre Watermark + ADS1115) tous les 200 m sur 50 hectares. SF11 BW125, 3 trames/jour. Autonomie 18 mois sur 2 piles AA. Gateway TTGO LoRa32 sur le toit du dar (relais WiFi vers serveur OVH). ## Tracker betail Mahres TTGO T-Beam (GPS + LoRa) sur collier de vache. Position envoyee toutes les 30 min. Autonomie 3 semaines sur batterie 18650 3000mAh. Detection de fugue hors zone (geofencing serveur). ## Qualite air Sfax Reseau de 15 capteurs PM2.5 (SDS011) deployes par l'universite. Donnees LoRa vers gateway centrale, puis envoi vers InfluxDB + Grafana. Cout total : 1200 TND vs 15 000 TND pour solution commerciale. ## Niveau cuve eau a Tozeur Capteur ultrasonique JSN-SR04T dans cuve de 5000L. Envoi LoRa 1 fois par heure. Alerte SMS si niveau < 20%. Parfait pour les exploitants de palmeraies. ## 10. Reglementation IUT-R et ANF Tunisie L'Agence Nationale des Frequences (ANF) tunisienne suit la recommandation IUT-R SA.1879. Pour 868 MHz : - Puissance max : 14 dBm (25 mW ERP) - Duty cycle max : 1% sur 1 heure = 36 secondes d'emission max par heure - Spacing canal : 100 kHz - LBT (Listen Before Talk) : optionnel mais recommande Concretement, si vous envoyez un paquet de 50 octets en SF12 (1,3 sec), vous ne pouvez emettre que 27 fois par heure. Au-dela, vous violez la reglementation. Pour les usages commerciaux, declarez votre installation a l'ANF (ce n'est pas obligatoire pour usage personnel/recherche mais recommande). ## 11. FAQ - Module LoRa Arduino Quelle est la portee maximale realiste de LoRa en Tunisie ?En rural avec antennes 3 dBi des deux cotes, SF12, 14 dBm : comptez 8-15 km. En urbain dense, descendez a 2-3 km. Le record monde (avec balon meteo) est de 832 km mais en conditions exceptionnelles. Puis-je utiliser LoRa 433 MHz en Tunisie ?Techniquement oui, la bande 433 MHz est autorisee (10 mW max). Mais la bande 868 MHz offre 4x plus de puissance autorisee et donc une meilleure portee. Pour des projets serieux, choisissez 868 MHz. Quelle difference entre SX1276 et SX1278 ?Le SX1276 couvre 137-1020 MHz (utilise pour 868/915 MHz). Le SX1278 couvre 137-525 MHz (utilise pour 433 MHz). Architecture identique, seulement la frequence diffère. Combien de nodes peut gerer une gateway LoRa point-to-point ?En P2P custom avec CSMA-CA et ID unique : 10-30 nodes confortablement, 50-100 maximum avec gestion fine du duty cycle. Pour 100+, passez en LoRaWAN avec gateway 8 canaux. Faut-il declarer son installation LoRa a l'ANF Tunisie ?Pour usage personnel, projet PFE etudiant ENIT/INSAT/ESPRIT/ISET ou recherche : non obligatoire. Pour deploiement commercial (smart city, exploitant agricole, telcom) : declaration recommandee aupres de l'ANF. LoRa marche-t-il sous la pluie ?Oui, 868 MHz est tres peu attenue par la pluie (contrairement au 2,4 GHz WiFi). La pluie forte peut reduire la portee de 10-15% maximum. Aucun probleme dans la realite tunisienne. Quelle autonomie batterie pour un node LoRa ?Avec deep sleep ESP32 + 1 trame/heure SF10 : 18-24 mois sur 2 piles AA Lithium (3600 mAh equivalents). Avec un Arduino Pro Mini 3.3V optimise (sleep < 1 µA) : 3-5 ans ! ## Conclusion : LoRa est l'epine dorsale silencieuse de votre IoT LoRa n'est pas glamour. Il ne fera pas tourner un jeu video. Mais c'est la technologie radio la plus fiable et la plus economique pour relier des centaines de capteurs disperses sur des kilometres carres, sans facture telecom mensuelle. Pour l'agriculture connectee tunisienne, pour les projets PFE en ENIT/INSAT/ESPRIT, pour les makers de Sfax qui veulent reellement deployer (pas juste prototyper), LoRa est l'arme secrete. Chez Didactico Sfax, on stocke les modules LoRa RFM95, Ra-02, TTGO LoRa32 et T-Beam avec livraison 24-48h partout en Tunisie. Decouvrez aussi notre guide ESP32 LoRa : Reseau Multi-Capteurs pour l'Agriculture pour aller plus loin. --- # Pulse Sensor Arduino : Construire une Station Santé DIY Complète URL: https://didactico.tn/capteur-pulsations-cardiaque-station-sante-arduino-tunisie/ Résumé: Du Pulse Sensor analogique à la station santé multi-capteurs : code de détection de pic avec période réfractaire, alertes BPM, journalisation SD-card et dashboard web ESP32 — tout ce qu'il faut savoir pour bâtir un wearable maison sérieux. Imaginez la scène : amphi de l'INSAT, défense de projet de fin d'études. Deux étudiants présentent successivement leur prototype. Le premier sort fièrement un boîtier élégant à 280 DT contenant un MAX30102, un ESP32, un écran tactile, un module SD et toute la quincaillerie. Le second pose sur la table un Arduino UNO et un petit disque rouge avec un câble à trois fils — un Pulse Sensor à 8 DT. Il branche, pose son doigt, et instantanément, la LED clignote à son rythme cardiaque et le moniteur série affiche 72 BPM. Le jury, intrigué, passe finalement plus de temps sur le second projet — parce que son code de détection de pic est plus propre, plus pédagogique, plus instructif que toutes les couches d'abstraction du premier. Le Pulse Sensor est un capteur fascinant par sa simplicité radicale. Aucun protocole I2C compliqué, aucune librairie obscure de 3000 lignes, aucun registre à configurer. Trois fils : +5V, GND, signal analogique. Vous le branchez sur A0, vous lisez avec analogRead(), et vous voyez votre cœur battre dans un graphique. C'est l'introduction parfaite à la photopléthysmographie analogique, et la base d'innombrables projets de station santé DIY. ⚠️ Information importanteLe Pulse Sensor est un capteur pédagogique et de prototypage, non certifié dispositif médical. Les mesures ne doivent pas servir au diagnostic, au suivi de patients ou à toute décision thérapeutique. Pour un usage clinique, utilisez un appareil homologué selon la norme ISO 80601-2-61. ## 📋 Table - Pulse Sensor vs MAX30102 : pas le même usage - Principe : une LED IR et une photodiode - Câblage et précautions - Détection de pic : seuil et période réfractaire - Calcul BPM en temps réel - Alertes tachycardie et bradycardie - Projet : station santé multi-capteurs - Version ESP32 avec dashboard web - Vers un wearable maison - Comparaison avec les montres connectées - FAQ ## Pulse Sensor vs MAX30102 : pas le même usage Avant d'aller plus loin, clarifions ce qui distingue ces deux capteurs souvent mis en concurrence chez Didactico Sfax : CritèrePulse SensorMAX30100 / MAX30102 InterfaceAnalogique (A0)I2C numérique (0x57) LEDs1 LED verte 525 nm ou IR2 LEDs : Rouge 660 nm + IR 880 nm Mesure BPMOuiOui Mesure SpO2Non (impossible avec 1 LED)Oui Complexité codeTrès simple (~50 lignes)Moyenne (librairie requise) Précision BPM±2-3 BPM en conditions stables±1-2 BPM Forme physiqueDisque souple avec attache velcroModule rigide Prix Tunisie8-15 DT15-25 DT Cas d'usage idéalApprentissage, fitness DIY, wearable simpleOxymètre médical éducatif, projet PFE biomédical En résumé : si votre objectif est de mesurer uniquement le rythme cardiaque et d'apprendre l'algorithmique de détection de pic à partir d'un signal analogique brut, le Pulse Sensor est imbattable. Si vous voulez en plus la SpO2 et un signal plus stable, le MAX30102 est préférable. ## Principe : une LED IR et une photodiode Le Pulse Sensor World (le modèle de référence conçu par Joel Murphy) utilise une LED verte à 525 nm pointée vers la peau et une photodiode APDS-9008 placée juste à côté. La lumière verte pénètre dans le derme sur quelques millimètres et est partiellement absorbée par l'hémoglobine du sang capillaire. Ce qui n'est pas absorbé est rétro-diffusé par les tissus environnants et capté par la photodiode. À chaque battement, le volume de sang augmente sous le capteur, plus de lumière est absorbée, moins est renvoyée à la photodiode — le signal baisse. Entre deux battements, le signal remonte. Pourquoi la lumière verte plutôt que rouge ou IR ? Parce que l'hémoglobine absorbe très fortement à 525 nm (pic d'absorption secondaire). Le signal AC est donc beaucoup plus contrasté qu'en lumière rouge, et le rapport signal-sur-bruit excellent même avec une électronique simple. C'est aussi pour cette raison que les Apple Watch et les capteurs cardiaques de Garmin, Fitbit, Polar, utilisent quasi tous des LEDs vertes (regardez le dessous de votre montre dans le noir, vous verrez les LEDs vertes pulser). L'inconvénient du vert : il ne pénètre pas suffisamment pour faire de l'oxymétrie. Pour mesurer le SpO2, il faut absolument deux longueurs d'onde (rouge + IR), donc le Pulse Sensor en est intrinsèquement incapable. Une seule LED, une seule mesure : le rythme cardiaque. ## Câblage et précautions Trois fils : c'est tout. - Fil rouge (ou marqué "+") → 5V Arduino (ou 3,3 V — fonctionne aussi) - Fil noir (ou marqué "-") → GND Arduino - Fil violet/jaune (ou marqué "S") → A0 Arduino Précautions de pose : - La face avec la LED et la photodiode doit être plaquée contre la peau. La face arrière reste libre. - L'endroit le plus fiable : bout du doigt (index ou majeur), avec attache velcro. Lobe d'oreille fonctionne aussi. - Ne pas exercer une pression excessive — vous écraseriez les capillaires. - Éviter la lumière ambiante directe sur la face avant du capteur (idéalement, sous attache velcro opaque). - Le capteur est fragile : ne pas plier le PCB, ne pas mouiller (sauf si vous l'enrobez de résine époxy pour un projet wearable). 💡 Découplage du bruit secteurLe signal analogique du Pulse Sensor est très sensible aux parasites 50 Hz du secteur. Ajoutez un condensateur céramique 100 nF entre la broche S et GND, au plus près de l'Arduino. Cela atténue les harmoniques 50 Hz qui pourraient être interprétées comme des fausses pulsations. ## Détection de pic : seuil et période réfractaire Voici le cœur algorithmique du Pulse Sensor : transformer un signal analogique bruité en une détection fiable de chaque battement. Le code de base, sans librairie, tient en moins de 80 lignes et démystifie complètement la photopléthysmographie. /* * Pulse Sensor — Detection de battement par seuillage * Methode : seuil adaptatif + periode refractaire * Branchement : signal sur A0, alim 5V */ const uint8_t PIN_SIGNAL = A0; const uint8_t PIN_LED_BAT = 13; // LED interne qui clignote au rythme // Parametres de detection const int SEUIL_INIT = 550; // Seuil initial (sera adapte) const unsigned long REFRACTAIRE = 300; // ms — periode aveugle apres pic const int FENETRE_MIN_MAX = 100; // echantillons pour calcul seuil adaptatif int seuil = SEUIL_INIT; int signalMin = 1024, signalMax = 0; int compteur = 0; bool surSeuil = false; unsigned long dernierPic = 0; unsigned long intervalle = 0; float bpm = 0; void setup() { pinMode(PIN_LED_BAT, OUTPUT); Serial.begin(115200); } void loop() { int signalBrut = analogRead(PIN_SIGNAL); unsigned long maintenant = millis(); // Suivi min/max pour seuillage adaptatif if (signalBrut < signalMin) signalMin = signalBrut; if (signalBrut > signalMax) signalMax = signalBrut; compteur++; if (compteur >= FENETRE_MIN_MAX) { // Seuil = 70% entre min et max seuil = signalMin + (signalMax - signalMin) * 7 / 10; signalMin = 1024; signalMax = 0; compteur = 0; } // Detection de franchissement vers le haut if (signalBrut > seuil && !surSeuil && (maintenant - dernierPic) > REFRACTAIRE) { surSeuil = true; intervalle = maintenant - dernierPic; dernierPic = maintenant; // Filtrage intervalles aberrants (BPM 30-220 plausibles) if (intervalle > 270 && intervalle < 2000) { bpm = 60000.0 / intervalle; digitalWrite(PIN_LED_BAT, HIGH); Serial.print(F("BPM: ")); Serial.println(bpm, 1); } } else if (signalBrut < seuil && surSeuil) { surSeuil = false; digitalWrite(PIN_LED_BAT, LOW); } delay(2); // ~500 Hz d'echantillonnage } ## Pourquoi un seuil adaptatif ? Si vous fixez un seuil à 550 en dur, ça marchera pour vous, à un instant T, avec cette pression du doigt et cette lumière ambiante. Mais demain, après-demain, ou pour un autre utilisateur, le signal sera centré sur 480, ou 620, et votre détection s'effondrera. Le seuil adaptatif recalibre toutes les 100 mesures (~200 ms) en se basant sur le min et le max observés, garantissant une détection robuste quelles que soient les conditions. ## Pourquoi une période réfractaire ? Un battement cardiaque dans le signal PPG comporte typiquement un pic principal (systole) suivi parfois d'un pic secondaire plus petit (dicrote, reflet de la fermeture de la valve aortique). Sans période réfractaire, votre algorithme compterait deux battements par cycle. 300 ms correspond à un BPM maximum de 200 — au-delà, vous êtes en tachycardie sévère qui nécessite une consultation médicale immédiate de toute façon. ## Calcul BPM en temps réel Le BPM instantané calculé à chaque battement (60000 / intervalle) est très variable d'un cycle à l'autre — c'est la variabilité de la fréquence cardiaque (HRV), normale et même souhaitable. Pour un affichage stable et lisible, lissez avec une moyenne mobile sur 8 ou 10 intervalles consécutifs : const uint8_t TAILLE_MOYENNE = 10; unsigned long historiqueIntervalles[TAILLE_MOYENNE]; uint8_t idxHistorique = 0; bool historiqueRempli = false; float bpmLisse() { if (!historiqueRempli && idxHistorique < TAILLE_MOYENNE) return 0; // Pas encore assez de donnees unsigned long somme = 0; uint8_t taille = historiqueRempli ? TAILLE_MOYENNE : idxHistorique; for (uint8_t i = 0; i < taille; i++) somme += historiqueIntervalles[i]; return 60000.0 * taille / somme; } // A appeler a chaque pic detecte valide : void enregistrerIntervalle(unsigned long inter) { historiqueIntervalles[idxHistorique] = inter; idxHistorique = (idxHistorique + 1) % TAILLE_MOYENNE; if (idxHistorique == 0) historiqueRempli = true; } ## Alertes tachycardie et bradycardie Définitions cliniques de référence chez l'adulte au repos : - Bradycardie : BPM < 60. Normal chez les sportifs entraînés. Pathologique en dehors. - Fréquence normale au repos : 60-100 BPM - Tachycardie : BPM > 100 au repos. Pathologique si persistant sans effort ni stress. - Seuils d'alerte fonctionnelle dans la plupart des wearables : alerte basse à 50 BPM, alerte haute à 120 BPM, alerte rouge au-dessus de 150 ou en-dessous de 40 BPM. const float SEUIL_BRADY = 50; const float SEUIL_TACHY = 120; const float SEUIL_URGENCE_BAS = 40; const float SEUIL_URGENCE_HAUT = 150; void surveiller(float bpm) { if (bpm == 0) return; // Pas encore stabilise if (bpm < SEUIL_URGENCE_BAS || bpm > SEUIL_URGENCE_HAUT) { declencher(NIVEAU_ROUGE); } else if (bpm < SEUIL_BRADY) { declencher(NIVEAU_BRADY); } else if (bpm > SEUIL_TACHY) { declencher(NIVEAU_TACHY); } else { rassurer(); } }L'alerte peut être un buzzer piezo (PWM avec fréquence variable selon gravité), une LED RGB qui change de couleur (vert/jaune/rouge), un message SMS via module GSM SIM800L, une notification push via ESP32 + IFTTT. 💗 CAPTEURS BIOMÉDICAUX ## Pulse Sensor + Capteurs Santé Didactico Pulse Sensor, DHT22, AD8232 ECG, MAX30102 — tout le nécessaire pour construire une station santé DIY complète. Livraison 24-48h en Tunisie. Voir les capteurs santé → ## Projet : station santé multi-capteurs L'objectif : un dispositif Arduino capable de mesurer simultanément le rythme cardiaque, la température corporelle, l'humidité ambiante, et de journaliser le tout horodaté sur une carte SD avec affichage OLED. Coût total chez Didactico : environ 65 DT. ## Liste de matériel - Arduino Nano ou UNO - Pulse Sensor (canal A0) - DHT22 (température corporelle au front + humidité ambiante) - Module RTC DS3231 (horodatage précis I2C) - Module SD-card SPI - Écran OLED 0,96" SSD1306 I2C - Bouton poussoir (démarrer/arrêter session) - Buzzer piezo (alertes) - Batterie 9V + interrupteur ## Bus utilisés sur Arduino UNO - I2C (A4/A5) : OLED + RTC en parallèle - SPI (D10-D13) : carte SD - Analogique A0 : Pulse Sensor - Numérique D2 : DHT22, D3 : bouton, D4 : buzzer ## Architecture logicielle void loop() { // 1. Lecture Pulse Sensor — DOIT etre TRES rapide (~2 ms) lirePulseSensor(); // 2. Calculs et detections (a chaque pic) if (nouveauPic) { bpm = bpmLisse(); surveiller(bpm); } // 3. Lecture DHT22 — lente (250 ms), pas a chaque iteration static unsigned long tDHT = 0; if (millis() - tDHT > 2000) { tempCorporelle = dht.readTemperature(); humidite = dht.readHumidity(); tDHT = millis(); } // 4. Mise a jour ecran — 5 Hz suffisent static unsigned long tOLED = 0; if (millis() - tOLED > 200) { afficher(bpm, tempCorporelle, humidite, etat); tOLED = millis(); } // 5. Journalisation SD — chaque 5 secondes static unsigned long tSD = 0; if (millis() - tSD > 5000) { enregistrer(rtc.now(), bpm, tempCorporelle, humidite); tSD = millis(); } // 6. Bouton — debounce gererBouton(); }Le défi est d'ordonnancer ces tâches sans bloquer la lecture du Pulse Sensor — d'où l'usage systématique de millis() et l'absence de delay() long. La lecture du DHT22 prend 250 ms ; si elle est faite dans la loop() à chaque tour, vous perdez 80 % des battements cardiaques. ## Format CSV pour journal SD timestamp,bpm,temp_C,humidite_%,etat 2026-05-15 14:32:05,72.4,36.8,52,NORMAL 2026-05-15 14:32:10,73.1,36.8,52,NORMAL 2026-05-15 14:32:15,124.7,37.1,53,TACHY_LEGER 2026-05-15 14:32:20,118.2,37.1,53,NORMALFormat CSV simple, ouvrable dans Excel ou tableur, analysable en Python avec pandas pour exploitation pédagogique (graphique BPM dans le temps, corrélation avec température, distribution statistique, etc.). ## Version ESP32 avec dashboard web Pour transformer la station en objet connecté moderne, remplacez l'Arduino UNO par un ESP32 DevKit (15 DT chez Didactico). L'ESP32 apporte : Wi-Fi natif, Bluetooth, deux cœurs, 520 KB de RAM, et surtout la possibilité d'héberger un mini serveur web qui affiche les mesures temps réel sur smartphone. ## Architecture - Cœur 0 : lecture haute fréquence Pulse Sensor + détection de pic - Cœur 1 : serveur web + WebSocket vers navigateur Le serveur web sert une page HTML/JS qui ouvre un WebSocket vers l'ESP32. Toutes les 100 ms, l'ESP32 envoie un JSON {"bpm": 72.4, "raw": 542} au client. Le JS dessine une courbe en temps réel avec Chart.js — exactement comme un oxymètre médical hospitalier, mais sur le smartphone des étudiants. ## Squelette de code ESP32 #include #include #include WebServer serveur(80); WebSocketsServer ws(81); const char* SSID = "DidacticoLab"; const char* PASS = "Sfax2026"; void tachePulseSensor(void* p) { for (;;) { lirePulseSensor(); if (nouveauPic) { char msg[64]; snprintf(msg, 64, "{"bpm":%.1f}", bpmLisse()); ws.broadcastTXT(msg); } vTaskDelay(2 / portTICK_PERIOD_MS); } } void setup() { Serial.begin(115200); WiFi.begin(SSID, PASS); while (WiFi.status() != WL_CONNECTED) delay(500); Serial.println(WiFi.localIP()); serveur.on("/", []() { serveur.send(200, "text/html", pageHTML); }); serveur.begin(); ws.begin(); // Tache haute priorite sur coeur 0 xTaskCreatePinnedToCore(tachePulseSensor, "pulse", 8192, NULL, 2, NULL, 0); } void loop() { serveur.handleClient(); ws.loop(); } ## Vers un wearable maison Un wearable est un objet qu'on porte au poignet, à l'oreille ou au cou de manière continue. Pour le construire à partir du Pulse Sensor, il faut résoudre trois problèmes : alimentation, encombrement, ergonomie. ## Alimentation : batterie LiPo + charge USB Une LiPo 3,7 V 500 mAh est l'idéal. Avec un module TP4056 (charge USB-C avec protection) et un step-up MT3608 (vers 5 V pour le Pulse Sensor s'il en a besoin — vérifiez avec 3,3 V d'abord, ça marche souvent). Autonomie typique avec un ESP32 en deep-sleep entre mesures : 8 à 12 heures de mesure continue, plusieurs jours en usage intermittent. ## Encombrement : ESP32-C3 ou Seeed XIAO Le DevKit ESP32 classique est trop gros pour un poignet. Privilégiez l'ESP32-C3 Super Mini (18×11 mm) ou la série Seeed XIAO. Le PCB est de la taille d'une pièce de monnaie. ## Ergonomie : bracelet 3D imprimé + résine Boîtier en TPU souple imprimé en 3D, électronique enrobée de résine époxy transparente (étanchéité), bracelet à attache silicone. Le Pulse Sensor est placé au niveau du poignet côté radial (où on prend le pouls manuellement). C'est un peu moins fiable qu'au doigt mais c'est la zone de référence des wearables. ## Comparaison avec les montres connectées Une Apple Watch ou une Galaxy Watch coûte 800 à 3000 DT. Que vaut votre station santé DIY à 65 DT en comparaison ? CritèreWearable commercialStation santé DIY Didactico Précision BPM±1 BPM (cliniquement validée)±2-3 BPM en bonnes conditions SpO2Oui (4-5 LEDs)Non avec Pulse Sensor, oui avec MAX30102 ECGOui sur modèles haut de gammeOui avec AD8232 ajouté Autonomie18-48 h8-12 h (extensible avec sleep mode) Personnalisation logicielleTrès limitéeTotale (vous écrivez le firmware) Possibilité d'apprentissageBoîte noireVous comprenez chaque ligne Prix800-3000 DT50-150 DT Crédibilité PFEAucuneExcellente (vous l'avez fait) Le DIY n'a pas pour ambition de remplacer un produit commercial validé cliniquement. Il a pour ambition de comprendre ce qui se passe dans la boîte noire que vous portez au poignet, et de pouvoir le reproduire avec 50 DT et 200 lignes de code. C'est cette compétence-là qui vous fera embaucher dans une startup biomédicale tunisienne ou un labo de R&D. ## FAQ Le Pulse Sensor ne donne aucun signal, que faire ?Vérifications : (1) câblage rouge/noir/jaune correct, (2) tension d'alimentation 5 V stable, (3) la LED verte du capteur doit être allumée quand vous le branchez — sinon, capteur défectueux, (4) doigt bien plaqué et immobile sur la face active, (5) analogRead(A0) doit retourner des valeurs entre 100 et 900 typiquement — si la valeur est figée à 0 ou 1023, problème de câblage ou capteur HS. Faut-il acheter la librairie PulseSensor Playground ?Elle est gratuite et open-source sur GitHub. Pour les débutants, oui, elle simplifie le démarrage. Pour comprendre vraiment la photopléthysmographie et personnaliser l'algorithme, écrivez votre propre détecteur (comme dans cet article) — c'est 50 lignes et c'est instructif. Quelle différence entre Pulse Sensor et un capteur à pince à doigt commercial ?Le Pulse Sensor est conçu pour être pédagogique : open hardware, signal analogique brut, attache velcro. Un capteur à pince à doigt commercial (type SpO2 médical) intègre LED rouge + IR + photodiode + ADC + DSP + protocole numérique dans un boîtier ergonomique. Plus précis, mais boîte noire. Puis-je mesurer le pouls au poignet directement ?Oui, mais le signal est plus faible qu'au bout du doigt. Placez le capteur sur l'artère radiale (côté pouce du poignet, où vous prenez le pouls manuellement) avec une attache velcro pas trop serrée. Augmentez si possible le gain en amplifiant le signal analogique avec un AOP. Les wearables commerciaux utilisent une LED plus puissante pour compenser. Le signal est bruité même immobile, normal ?Plusieurs sources de bruit possibles : (1) parasites 50 Hz secteur — ajoutez condensateur 100 nF entre A0 et GND, (2) variations d'éclairement ambiant — calez le capteur sous une attache opaque, (3) tremblements involontaires du doigt — posez la main sur la table, (4) alimentation USB instable — testez sur batterie 9 V. Ajoutez aussi un filtre passe-bas logiciel (moyenne mobile sur 3-5 échantillons). Le DHT22 mesure-t-il vraiment la température corporelle ?Le DHT22 est conçu pour mesurer la température ambiante (-40 à 80 °C, précision ±0,5 °C), pas spécifiquement la peau humaine. Placé au front avec un bon contact, il donne une indication grossière de la température corporelle (±1 °C) mais ce n'est pas un thermomètre médical. Pour une mesure médicale, utilisez plutôt un MLX90614 (infrarouge sans contact, ±0,2 °C en zone du front). Mon BPM affiche 0 après quelques secondes de mesure stable, pourquoi ?Probablement un dépassement de la période de timeout : si aucun pic n'est détecté pendant plus de 3-4 secondes, beaucoup d'algorithmes remettent le BPM à 0. Vérifiez que le seuil adaptatif n'a pas dérivé trop haut (par exemple si le signal a perdu en amplitude à cause d'un déplacement du doigt). Réinitialisez le seuil quand vous détectez une période d'inactivité. ## Conclusion Le Pulse Sensor est, à mon sens, le capteur biomédical le plus pédagogique du marché. Trois fils, un signal analogique, et tout le reste — détection de pic, calcul BPM, alertes, journalisation, dashboard temps réel — est entre vos mains. C'est exactement le profil de composant qui sépare un étudiant ENIT, INSAT, ISBS ou ISET qui sait coller des briques de bibliothèques d'un ingénieur qui comprend vraiment ce qu'il fait. Chez Didactico, vous trouverez le Pulse Sensor, le DHT22, le MLX90614, l'AD8232 ECG, les modules SD, les RTC DS3231, les écrans OLED, les ESP32 — et tout l'écosystème nécessaire pour bâtir votre station santé DIY ou votre wearable. Livraison sous 24 à 48 heures partout en Tunisie depuis Sfax. Les étudiants en filière biomédicale trouvent souvent au FabLab Sfax les conseils méthodologiques pour structurer leur projet de fin d'études autour de ces capteurs. Bon prototypage — et écoutez votre cœur, au sens propre comme au figuré. --- # MAX30100 Arduino : Capteur SpO2 et Rythme Cardiaque DIY URL: https://didactico.tn/max30100-rythme-cardiaque-spo2-arduino-tunisie/ Résumé: Comprendre la photopléthysmographie, l'absorption infrarouge de l'hémoglobine, le calcul du SpO2 par ratio R/IR et programmer un oxymètre de pouls Arduino avec MAX30100 — guide technique complet incluant projet PFE et comparaison avec le MAX30102. Mars 2020. Pendant que le monde entier se ruait sur les masques chirurgicaux, dans les laboratoires d'instrumentation biomédicale de l'ISBS et de l'ENIT, des étudiants en PFE se sont concentrés sur un autre objet devenu soudainement vital : l'oxymètre de pouls. Cette pince à doigt anodine qui mesure la saturation en oxygène du sang est passée du statut d'accessoire médical méconnu à celui d'instrument grand public. Le composant clé de la majorité de ces appareils — y compris les smartwatches Apple Watch et Galaxy Watch — c'est un minuscule capteur SMD de 5,6 × 2,8 mm signé Maxim Integrated : le MAX30100. Cinq ans plus tard, ce capteur reste l'un des composants pédagogiques les plus fascinants à manipuler. Il condense en quelques millimètres carrés un siècle de physique optique appliquée à la biologie, deux LEDs spectralement précises, un photodétecteur ultra-sensible, et toute une chaîne de traitement analogique-numérique intégrée. Pour 12 à 20 DT chez Didactico Sfax, vous tenez dans la main une technologie qui valait des dizaines de milliers de dollars dans les années 1970. ⚠️ Avertissement médicalLe MAX30100 est un capteur pédagogique et de recherche, NON certifié dispositif médical (pas de marquage CE médical, pas d'agrément FDA). Les mesures qu'il produit ne doivent JAMAIS servir au diagnostic clinique, au suivi de patients hospitalisés ou à toute décision thérapeutique. Pour un usage médical, utilisez exclusivement un oxymètre homologué (norme ISO 80601-2-61). Ce guide vise l'apprentissage de la photopléthysmographie et le prototypage de projets éducatifs. ## 📋 Table - La photopléthysmographie : voir le pouls avec de la lumière - Pourquoi deux longueurs d'onde : 660 nm et 880 nm - Le ratio R/IR et le calcul du SpO2 - Le MAX30100 en pratique : matériel et brochage - Communication I2C et initialisation - Code Arduino avec la librairie oxullo - Traitement du signal : moyenne mobile et détection de pic - Affichage sur écran OLED SSD1306 - MAX30100 vs MAX30102 : lequel choisir ? - Projet PFE : oxymètre portable LiPo avec alerte SpO2 - FAQ ## La photopléthysmographie : voir le pouls avec de la lumière Posez votre doigt contre une LED rouge puissante dans le noir. Vous verrez la lumière traverser votre doigt et ressortir orangée — c'est votre sang qui filtre la lumière. C'est exactement le principe de la photopléthysmographie (abrégée PPG) découvert dans les années 1930. À chaque battement cardiaque, le ventricule gauche éjecte un volume de sang dans les artères. Cette pulsation arrive à vos extrémités (doigt, lobe d'oreille) et fait varier le volume sanguin capillaire au rythme du pouls. Or, le sang absorbe la lumière. Plus il y a de sang dans le tissu, plus la lumière est atténuée. Si vous mesurez en continu la quantité de lumière transmise à travers le doigt, vous obtenez un signal qui oscille : minimum quand le sang afflue (plus d'absorption), maximum quand il reflue. La fréquence de cette oscillation, c'est votre rythme cardiaque. La forme de la courbe — appelée pleth wave — porte aussi de précieuses informations sur la rigidité artérielle et la perfusion périphérique. ## Pourquoi deux longueurs d'onde : 660 nm et 880 nm Si la PPG donnait uniquement le rythme cardiaque, le MAX30100 n'aurait qu'une seule LED. Mais il en a deux : une rouge à 660 nm et une infrarouge à 880 nm. Pourquoi ? Parce que l'hémoglobine — la molécule du sang qui transporte l'oxygène — n'absorbe pas la lumière de la même manière selon qu'elle est oxygénée ou non. FormeAbsorption à 660 nm (rouge)Absorption à 940/880 nm (IR) Hémoglobine oxygénée HbO2FaibleModérée Hémoglobine désoxygénée HbForteFaible C'est pour cela qu'une artère oxygénée apparaît rouge vif (elle laisse passer le rouge) et qu'une veine paraît bleutée (l'hémoglobine désoxygénée absorbe le rouge). Cette différence spectrale est la clé du calcul du SpO2. ## Le ratio R/IR et le calcul du SpO2 Le signal PPG enregistré pour chaque longueur d'onde comporte deux composantes : - Composante DC : la grosse moyenne, due à l'absorption par les tissus statiques (peau, os, sang veineux, eau). - Composante AC : la petite oscillation autour de cette moyenne, due au volume pulsatile artériel. On définit le ratio R : R = (AC_rouge / DC_rouge) / (AC_IR / DC_IR)Ce ratio est très astucieux : en divisant AC par DC pour chaque canal, on s'affranchit de l'intensité absolue (l'épaisseur du doigt, la pigmentation de la peau, la distance LED-photodiode). Il ne reste que la signature spectrale de l'hémoglobine, qui ne dépend que du SpO2. La conversion R → SpO2 n'est pas linéaire et nécessite un étalonnage empirique (Beer-Lambert ne s'applique pas parfaitement aux milieux diffusants). Maxim fournit une approximation polynomiale typique : SpO2 (%) ≈ 110 - 25 × RCette formule donne 100 % pour R ≈ 0,4 et 80 % pour R ≈ 1,2. Les fabricants d'oxymètres médicaux utilisent des tables de calibration multi-points dérivées de tests cliniques sur des volontaires en hypoxie contrôlée. ## Le MAX30100 en pratique : matériel et brochage Le module Didactico typique contient le MAX30100 monté sur une petite PCB rouge avec niveau-shifter intégré pour permettre la connexion à un Arduino UNO (5V) sans destruction (le MAX30100 fonctionne strictement en 1,8-3,3 V). Brochage du module : - VIN : 3,3 V ou 5 V selon module (vérifiez la sérigraphie) - GND : masse commune - SCL : I2C clock → A5 sur UNO, D22 sur Mega, GPIO22 sur ESP32 - SDA : I2C data → A4 sur UNO, D21 sur Mega, GPIO21 sur ESP32 - INT : interruption optionnelle (chute à LOW quand donnée prête) - IRD / RD : broches IR et Red drive — non utilisées sur modules I2C Le capteur lui-même contient : - Une LED rouge 660 nm et une LED infrarouge 880 nm, dont l'intensité est programmable de 0 à 50 mA par pas de 0,2 mA. - Une photodiode large bande avec amplificateur transimpédance intégré. - Un convertisseur ADC 16 bits à 50-1000 échantillons par seconde. - Un FIFO de 16 échantillons. - Un capteur de température interne (±1 °C) pour compenser la dérive des LEDs. ## Communication I2C et initialisation Le MAX30100 communique en I2C standard à l'adresse fixe 0x57. Le bus accepte 100 kHz (standard) ou 400 kHz (fast mode), ce dernier étant recommandé pour ne pas perdre d'échantillons. L'initialisation consiste à : - Vérifier la présence du capteur (lecture du registre 0xFF qui doit valoir 0x11) - Configurer le mode SpO2 (registre MODE_CONFIG = 0x03) - Régler la fréquence d'échantillonnage (100 SPS typiquement) - Régler la largeur d'impulsion LED (1600 µs = résolution 16 bits) - Régler le courant des LEDs rouge et IR (typiquement 27,1 mA chacune) ## Code Arduino avec la librairie oxullo La librairie de référence est MAX30100lib par oxullo (installable depuis le gestionnaire de bibliothèques Arduino IDE). Elle encapsule toute l'arithmétique I2C et fournit un objet de haut niveau avec callbacks. /* * Lecture rythme cardiaque + SpO2 avec MAX30100 * Librairie : MAX30100lib (oxullo) * Câblage : SDA→A4, SCL→A5 sur Arduino UNO */ #include #include "MAX30100_PulseOximeter.h" #define INTERVAL_RAPPORT 1000 // ms PulseOximeter poximetre; uint32_t dernierRapport = 0; // Callback : appelée par la librairie a chaque battement detecte void surBattement() { Serial.println(F("♥ Battement detecte")); } void setup() { Serial.begin(115200); Serial.print(F("Init MAX30100... ")); // begin() retourne false si capteur introuvable if (!poximetre.begin()) { Serial.println(F("ECHEC")); while (1) delay(1000); // Bloque } Serial.println(F("OK")); // Intensite des LEDs : compromis precision / consommation poximetre.setIRLedCurrent(MAX30100_LED_CURR_27_1MA); poximetre.setOnBeatDetectedCallback(surBattement); } void loop() { // Lecture FIFO non-bloquante — DOIT etre appelee constamment poximetre.update(); if (millis() - dernierRapport > INTERVAL_RAPPORT) { float bpm = poximetre.getHeartRate(); uint8_t spo2 = poximetre.getSpO2(); Serial.print(F("BPM: ")); Serial.print(bpm, 1); Serial.print(F(" SpO2: ")); Serial.print(spo2); Serial.println(F("%")); dernierRapport = millis(); } } ## Pièges classiques avec la librairie 1. Ne mettez jamais de delay() dans la loop(). La librairie a besoin que update() soit appelée plus de 100 fois par seconde pour vider le FIFO du capteur avant qu'il déborde. Tout délai supérieur à 10 ms dégrade le signal. 2. La détection de battement converge en 10 à 15 secondes après pose du doigt. Pendant ce temps, les valeurs sont nulles ou aberrantes. Affichez "mesure en cours..." au lieu de zéros qui inquiètent. 3. La pression du doigt sur le capteur compte énormément. Trop fort, vous écrasez les capillaires et le signal disparaît. Trop léger, la lumière parasite ambiante perturbe la mesure. Le point optimal est une pression équivalente à celle d'un stylo posé sur du papier. 💗 CAPTEUR RECOMMANDÉ ## Capteur MAX30100 Rythme Cardiaque + SpO2 Module I2C avec level-shifter intégré, compatible Arduino UNO/Mega/ESP32, idéal pour projets de fin d'études en instrumentation biomédicale. Disponible chez Didactico Sfax. Voir le capteur MAX30100 → ## Traitement du signal : moyenne mobile et détection de pic Si vous souhaitez aller au-delà de la librairie et accéder au signal brut, le MAX30100 expose les échantillons IR et RED dans son FIFO. Le signal brut ressemble à ceci (échantillonnage 100 Hz) : Échantillon IR brut : 32500, 32480, 32450, 32420, 32395, 32420, 32480, ... ↑ baseline DC ≈ 32450, AC ≈ ±50Le ratio AC/DC est faible (0,15 %) et le signal est noyé dans plusieurs sources de bruit : 50 Hz secteur (couplage électromagnétique), tremblements du doigt, lumière ambiante. Les traitements clés : - Filtre passe-bande [0,5 - 5 Hz] : conserve les fréquences cardiaques plausibles (30-300 BPM) et élimine la composante DC et les harmoniques secteur. Implémentation simple : différence entre moyenne mobile courte (5 échantillons) et longue (50 échantillons). - Détection de pic par seuillage adaptatif : un battement = passage du signal au-dessus de seuil_haut puis redescente sous seuil_bas. Période réfractaire de 300 ms minimum pour éviter de compter deux fois le même battement. - Calcul du BPM : moyenne mobile sur les 8 derniers intervalles inter-pics. BPM = 60000 / moyenne_intervalle_ms. ## Affichage sur écran OLED SSD1306 Pour transformer la lecture série en oxymètre utilisable, l'écran OLED 0,96 pouces SSD1306 (128×64 pixels, I2C, adresse 0x3C) est le partenaire idéal. Il partage le même bus I2C que le MAX30100, donc deux fils SDA/SCL suffisent pour les deux. Librairie : Adafruit_SSD1306 + Adafruit_GFX. #include #define LARGEUR 128 #define HAUTEUR 64 Adafruit_SSD1306 ecran(LARGEUR, HAUTEUR, &Wire, -1); void afficherMesure(float bpm, uint8_t spo2) { ecran.clearDisplay(); ecran.setTextSize(1); ecran.setTextColor(SSD1306_WHITE); ecran.setCursor(0, 0); ecran.println(F("Oxymetre Didactico")); ecran.drawLine(0, 10, 128, 10, SSD1306_WHITE); ecran.setTextSize(2); ecran.setCursor(0, 16); ecran.print(F("BPM ")); ecran.println((int)bpm); ecran.setCursor(0, 40); ecran.print(F("SpO2 ")); ecran.print(spo2); ecran.println(F("%")); ecran.display(); } ## MAX30100 vs MAX30102 : lequel choisir ? Question posée à chaque commande chez Didactico : faut-il prendre le MAX30100 ou son successeur le MAX30102 ? Réponse courte : prenez le MAX30102 si vous en avez le choix. CritèreMAX30100MAX30102 Année de sortie20142017 Tension d'alimentation logique1,8 V uniquement (level-shifter requis)1,8 ou 3,3-5,5 V natif LEDsRouge 660 nm + IR 880 nmRouge 660 nm + IR 880 nm + driver amélioré Résolution ADC16 bits18 bits (4× plus précis) Mode HR-onlyNonOui (IR seule, économie énergie) Compensation lumière ambianteBasiqueAvancée Prix typique en Tunisie15-20 DT18-25 DT Le MAX30102 est plus stable, supporte directement les 5 V de l'Arduino UNO sans level-shifter externe, donne un signal moins bruité, et coûte à peine plus cher. La librairie sparkfun ou la même MAX30100lib (en mode compatible) fonctionne dessus avec un changement minime. ## Projet PFE : oxymètre portable LiPo avec alerte SpO2 Voici un cahier des charges complet pour un projet de fin d'études d'environ trois mois en instrumentation biomédicale : ## Cahier des charges - Portable, autonome sur batterie LiPo 3,7 V 1000 mAh, recharge USB-C - Mesure SpO2 et BPM en continu - Écran OLED affichant valeurs + courbe pleth en temps réel - Buzzer + LED rouge clignotants si SpO2 < 90 % - Enregistrement sur SD-card horodaté pour traçabilité - Bouton on/off, indication batterie faible - Boîtier 3D imprimé ergonomique pour pince à doigt ## Liste de matériel (BoM) - Arduino Pro Mini 3,3 V ou ESP32 (préféré pour BLE futur) - Module MAX30102 (plus stable que 30100) - Écran OLED 0,96" SSD1306 I2C - Module TP4056 (charge LiPo USB-C avec protection) - Régulateur step-up 3,3 V MT3608 (si UNO) ou intégré ESP32 - Batterie LiPo 1S 1000 mAh - Buzzer piezo passif - LED rouge 5 mm + résistance 220 Ω - Bouton poussoir momentané - Carte microSD + module SD-card SPI - Câblage, boîtier PLA imprimé Coût total : 90 à 130 DT chez Didactico Sfax. Comparable à un oxymètre d'entrée de gamme acheté en pharmacie, avec en bonus l'apprentissage de la chaîne complète : capteur → traitement signal → IHM → stockage. ## Pseudo-architecture logicielle setup(): init_I2C(MAX30102, OLED_SSD1306) init_SPI(SD_card) init_GPIO(bouton, LED, buzzer) ouvrir_fichier_log() loop(): poximetre.update() // CRITIQUE — appel haute frequence if (millis() - tDernierAffichage > 100): afficher_courbe_pleth(echantillon_brut) if (millis() - tDernierRapport > 1000): bpm = poximetre.getHeartRate() spo2 = poximetre.getSpO2() afficher_chiffres(bpm, spo2) sd.println(millis(), bpm, spo2) if (spo2 > 0 && spo2 < 90): activer_alerte(buzzer, LED) else: desactiver_alerte() if (millis() - tBatterieCheck > 30000): afficher_niveau_batterie() ## Calibration vs oxymètre médical L'étape de validation est essentielle pour tout PFE sérieux. Procédure : enregistrer simultanément les mesures de votre prototype et celles d'un oxymètre médical homologué (CMS-50D par exemple) sur 20 sujets pendant 5 minutes au repos. Tracer le graphique de Bland-Altman. Si la moyenne des écarts est inférieure à ±2 % de SpO2 et l'écart-type inférieur à 3 %, votre prototype est dans les clous de la précision "grand public". L'agrément médical (norme ISO 80601-2-61) nécessite des tests sur sujets en hypoxie contrôlée, hors de portée d'un PFE. ## Pour aller plus loin Pour un projet biomédical complet, le MAX30100 peut être combiné avec un module ECG AD8232 pour obtenir simultanément la fréquence cardiaque optique et électrique, et calculer le temps de transit du pouls (PTT) — une approximation de la pression artérielle non invasive. ## FAQ Pourquoi je n'arrive pas à détecter le capteur sur l'I2C ?Vérifiez : (1) tension d'alimentation (3,3 V sur capteur nu, 5 V toléré sur module avec level-shifter), (2) résistances de pull-up sur SDA/SCL (4,7 kΩ — souvent intégrées au module), (3) Wire.begin() avant l'utilisation. Lancez un scanner I2C : si l'adresse 0x57 n'apparaît pas, c'est un problème matériel ou d'alimentation. Le BPM affiché varie entre 60 et 200 sans raison, que faire ?C'est presque toujours un problème de stabilité de pose. Le MAX30100 est très sensible au mouvement et à la pression. Solutions : (1) immobilisez le doigt, (2) ajustez la pression (modérée), (3) augmentez le courant LED si l'environnement est lumineux (44 mA au lieu de 27 mA), (4) attendez la convergence du filtre (10-15 secondes), (5) appliquez votre propre filtre passe-bande sur le signal brut. Le SpO2 affiche 98 % en permanence, est-ce correct ?Probablement correct ! Un adulte en bonne santé au repos a typiquement un SpO2 entre 96 % et 99 %. En dessous de 95 % au repos, c'est anormal. En dessous de 90 %, c'est une urgence médicale. Si vous voulez tester votre montage, retenez votre respiration : la SpO2 descend progressivement après 30-40 secondes (ne dépassez pas 1 minute, et n'essayez pas en cas de pathologie cardiaque). Puis-je mesurer mon pouls au lobe d'oreille au lieu du doigt ?Oui, c'est même préférable dans certains cas. Le lobe d'oreille est moins sensible aux mouvements de la main et moins gêné par le vernis à ongles. Le signal y est plus faible (tissu plus épais) donc augmentez le courant LED à 44-50 mA. Pratique pour un casque audio sportif intégrant un MAX30102. Le vernis à ongles affecte-t-il vraiment la mesure ?Oui, énormément, surtout les vernis rouges et noirs qui absorbent dans la bande 660 nm et faussent complètement le ratio R/IR. Le SpO2 peut être sous-estimé de 5 à 15 %. Les vernis transparents perturbent moins mais réduisent quand même le signal. Pour des mesures fiables : ongle nu, propre, sec. Puis-je utiliser le MAX30100 sur ESP32 plutôt que Arduino ?Absolument, et c'est même recommandé. L'ESP32 (GPIO21=SDA, GPIO22=SCL par défaut) a beaucoup plus de RAM pour stocker les buffers de signal, un Wi-Fi pour envoyer les données vers un dashboard cloud (Blynk, ThingsBoard, Firebase) et un CPU dual-core qui permet de traiter le signal sur un cœur et l'IHM sur l'autre. Le code Arduino fonctionne tel quel avec quelques ajustements de broches. Quelle est la consommation électrique pour un appareil portable ?MAX30100 en mode SpO2 actif : environ 8-12 mA (LEDs incluses). Arduino Pro Mini 3,3V au repos : 4 mA. OLED SSD1306 : 8-15 mA selon contenu. Total typique : 25-35 mA. Avec une LiPo 1000 mAh, autonomie d'environ 30-40 heures de mesure continue. Avec mise en veille de l'OLED et lecture périodique du capteur, on dépasse facilement 100 heures. ## Conclusion Le MAX30100 reste, neuf ans après sa sortie, l'une des plus belles introductions à l'instrumentation biomédicale qu'un étudiant puisse manipuler. Il condense des décennies de recherche en photopléthysmographie dans un boîtier accessible à 15 DT. Pour les étudiants de l'ISBS, de l'ENIT-Bio, de l'INSAT ou de l'ISET en filière biomédicale, c'est le composant de référence pour un projet de fin d'études abordable mais techniquement riche. Chez Didactico, vous trouverez aussi bien le MAX30100 que son successeur MAX30102, les écrans OLED SSD1306, les modules de gestion de batterie LiPo TP4056, et l'ensemble du matériel pour bâtir une station santé complète. Livraison sous 24 à 48 heures partout en Tunisie depuis notre dépôt de Sfax. Le FabLab Sfax est aussi un excellent terrain de validation pour vos prototypes biomédicaux avant soutenance. Bonne mesure — et n'oubliez jamais : ce que vous mesurez n'a de valeur scientifique que ce que vous savez sur les limites de la mesure. --- # Module Relais 8 Canaux Arduino : Piloter le 220V en Sécurité (Guide Pro) URL: https://didactico.tn/module-relais-8-canaux-220v-arduino-tunisie/ Résumé: Le guide complet pour comprendre, câbler et programmer un module relais 8 canaux Arduino avec du 220V — principe électromécanique, isolation optocoupleur, code multi-canaux, charges inductives et les 10 règles de sécurité absolues à ne jamais transgresser. C'était un samedi soir au FabLab de Sfax. Yassine, étudiant en troisième année à l'ENIT, voulait impressionner son frère avec un prototype de domotique : éclairage, ventilateur, pompe d'aquarium et chauffe-eau, tout piloté depuis son téléphone via un module relais 8 canaux et un ESP32. Le câblage côté bas niveau était impeccable. Mais une connexion fil-secteur mal serrée a chauffé, fait fondre l'isolant, et provoqué un court-circuit qui a déclenché le disjoncteur de l'immeuble en pleine soirée. Heureusement, le disjoncteur différentiel 30 mA était bien en place — sinon, Yassine aurait pu y laisser la main. Cette histoire, je l'ai entendue dix fois sous différentes formes. Le module relais 8 canaux est le composant le plus excitant et le plus dangereux que vous achèterez probablement chez Didactico cette année. Excitant, parce qu'il transforme votre Arduino — un jouet en plastique de 50 grammes — en chef d'orchestre du courant secteur. Dangereux, parce que le 220 V tunisien à 50 Hz vous tue en moins d'une seconde si vous touchez la mauvaise piste à la mauvaise tension. ⚠️ DANGER MORTEL — 220V ALTERNATIFCe guide manipule la tension secteur (220-240V AC, 50 Hz, STEG). Une erreur de câblage peut causer : électrocution mortelle, incendie domestique, destruction de l'Arduino, des appareils connectés et de toute votre installation. Ne câblez JAMAIS sous tension. Coupez TOUJOURS le disjoncteur général avant intervention. Un disjoncteur différentiel 30 mA est OBLIGATOIRE sur la ligne. Si vous n'êtes pas certain à 100 % de ce que vous faites, faites valider votre montage par un électricien qualifié. Didactico vend les composants — la responsabilité du câblage final vous incombe. ## 📋 Table - Principe : un électroaimant qui ferme un interrupteur - Anatomie d'un module 8 canaux - L'isolation par optocoupleur ITR9608 - La logique inversée LOW=ON qui surprend tout le monde - Câblage 220V : NO, NC, COM expliqués - Code Arduino : du canal unique aux 8 canaux - Charges inductives : le piège du retour de courant - 3 applications réelles et complètes - Les 10 règles de sécurité ABSOLUES - Normes électriques tunisiennes essentielles - FAQ ## Principe : un électroaimant qui ferme un interrupteur Un relais électromécanique est, dans son essence, l'invention la plus élégante de l'électrotechnique du XIXe siècle. Vous appliquez une petite tension (typiquement 5 V continu pour les modules Arduino) sur une bobine de cuivre. Cette bobine génère un champ magnétique qui attire une lamelle métallique. Cette lamelle, en se déplaçant, ferme (ou ouvre) un contact mécanique capable de laisser passer une tout autre tension — du 220 V alternatif dans notre cas, jusqu'à 10 A typiquement. L'intérêt est limpide : votre Arduino, qui ne peut sortir que 5 V à 40 mA maximum sur une broche GPIO, peut commander des appareils tirant 2200 W (10 A × 220 V) sans aucun contact électrique direct. La séparation entre le côté commande (faible tension) et le côté puissance (secteur) est totale, mécanique, garantie. ## Pourquoi pas un transistor ? Un transistor MOSFET peut commuter de fortes intensités, mais en courant continu, sur des charges résistives, et avec une masse commune. Pour le 220 V alternatif, il faudrait un triac ou un SSR (Solid State Relay). Le relais électromécanique reste imbattable sur trois points : isolation galvanique parfaite, capacité à commuter aussi bien du DC que de l'AC, tolérance aux surcharges momentanées. Son talon d'Achille : il s'use mécaniquement (typiquement 100 000 cycles sous charge nominale) et il fait "clic". ## Anatomie d'un module 8 canaux Le module relais 8 canaux que vous achetez chez Didactico Sfax est en réalité une carte sandwich composée de cinq étages : - Étage d'entrée 5V : les 8 broches IN1 à IN8 reçoivent les signaux logiques de l'Arduino. - Étage d'isolation : 8 optocoupleurs (le plus souvent ITR9608 ou PC817) découplent électriquement la commande des bobines. - Étage de pilotage : 8 transistors NPN (généralement S8050) amplifient le signal pour alimenter les bobines. - Étage relais : 8 relais électromécaniques (souvent des SRD-05VDC-SL-C, parfois des HF115F-005 pour les modules industriels). - Étage de contact : pour chaque relais, 3 borniers à vis NO (Normalement Ouvert), COM (Commun) et NC (Normalement Fermé). ## SRD-05VDC-SL-C vs HF115F-005 : ne choisissez pas au hasard Le SRD-05VDC-SL-C de Songle est le relais cubique bleu classique : 10 A sous 250 V AC en théorie, mais en pratique limitez-vous à 5-6 A en charge continue, surtout en climat chaud comme à Sfax l'été où les contacts s'oxydent plus vite. Bobine 5 V tirant environ 70 mA — c'est important : 8 relais activés simultanément consomment 560 mA, votre alimentation Arduino USB ne suivra pas. Prévoyez une alimentation externe 5 V / 2 A pour le module. Le HF115F-005 de Hongfa est un relais de qualité industrielle : meilleur contact argent-cadmium, endurance mécanique supérieure (10 millions de cycles), supporte mieux les charges inductives. Il coûte plus cher mais reste le bon choix pour une installation domestique permanente. ## L'isolation par optocoupleur ITR9608 L'optocoupleur est le héros silencieux de votre montage. À l'intérieur de ce minuscule boîtier DIP-4, il y a en réalité deux composants : une LED infrarouge et un phototransistor, séparés par une couche d'air ou de résine isolante. Quand l'Arduino envoie un signal, la LED s'allume, le phototransistor conduit — mais aucun fil de cuivre ne traverse la barrière. La tension de claquage typique est de 5 000 V. C'est-à-dire qu'en cas de surtension catastrophique côté 220 V (coup de foudre par exemple), le retour vers votre Arduino est physiquement impossible. Sur les modules bon marché, vérifiez que le jumper JD-VCC / VCC est bien retiré et que vous alimentez la partie relais (JD-VCC + GND) avec une alimentation séparée 5 V externe. Si vous laissez le jumper en place, vous shuntez l'isolation et vous perdez tout l'intérêt de l'optocoupleur. C'est une erreur de débutant qui coûte cher. 💡 Astuce laboSur le module 8 canaux, repérez la sérigraphie "JD-VCC | VCC | GND". Retirez le jumper jaune. Alimentez : 5V Arduino → VCC (côté logique), Alim externe 5V → JD-VCC (côté bobines), GND commun aux deux. Isolation préservée, Arduino protégé. ## La logique inversée LOW=ON qui surprend tout le monde Quasiment tous les modules relais Arduino chinois fonctionnent en logique inversée : un état LOW (0 V) sur l'entrée IN active le relais, un état HIGH (5 V) le désactive. Ce n'est pas un bug, c'est lié à la topologie du circuit d'attaque avec optocoupleur où le courant doit "sortir" de la broche Arduino vers la masse à travers la LED de l'opto. Conséquence directe : à la mise sous tension de votre Arduino, pendant les quelques millisecondes avant l'exécution du setup(), les broches GPIO sont en état flottant ou HIGH par défaut — les relais restent désactivés. Bien. Mais si vous écrivez digitalWrite(pin, HIGH) en pensant "j'allume", vous éteignez. Et inversement. // ❌ ERREUR CLASSIQUE digitalWrite(relai1, HIGH); // Pense "ON", en réalité OFF // ✅ CORRECT — définir des constantes lisibles #define RELAI_ON LOW #define RELAI_OFF HIGH digitalWrite(relai1, RELAI_ON); // Limpide ## Câblage 220V : NO, NC, COM expliqués Sur chaque canal du module, vous avez trois borniers à vis : - COM (Commun) : la borne pivot du contact. C'est ici que vous amenez la phase 220 V venant du tableau électrique (après le disjoncteur). - NO (Normalement Ouvert) : déconnecté de COM quand le relais est au repos, connecté quand le relais est activé. C'est ce bornier que vous utiliserez dans 95 % des cas — votre lampe est éteinte par défaut et s'allume quand l'Arduino le décide. - NC (Normalement Fermé) : connecté à COM au repos, déconnecté quand activé. Utile pour la logique inverse (alarme qui sonne par défaut, désactivée par badge par exemple) ou la sécurité fail-safe. Schéma de câblage type pour une lampe 220V : STEG Phase ───┬─[Disjoncteur 16A]─[Diff 30mA]─┬──→ COM │ │ STEG Neutre ──┴────────────────────────────────┼──→ Lampe (borne N) │ NO ─────┴──→ Lampe (borne L) Neutre/Terre ──→ Châssis lampe (carcasse métal) +5V Externe ──→ JD-VCC GND Externe ──→ GND module +5V Arduino ──→ VCC module (côté logique) GND Arduino ──→ GND module (commun) D2 Arduino ──→ IN1 ## Code Arduino : du canal unique aux 8 canaux Voici un sketch complet, propre, qui pilote les 8 canaux avec gestion d'état, anti-claquements et série monitor de debug : /* * Pilotage Module Relais 8 Canaux * Logique inversée : LOW = relais activé, HIGH = relais désactivé * Auteur : exemple Didactico — pour usage pédagogique */ #define NB_RELAIS 8 #define RELAI_ON LOW #define RELAI_OFF HIGH // Broches Arduino utilisées (évitez D0, D1 — UART) const uint8_t pinsRelais[NB_RELAIS] = {2, 3, 4, 5, 6, 7, 8, 9}; bool etatRelais[NB_RELAIS] = {false, false, false, false, false, false, false, false}; // Délai minimum entre deux commutations pour éviter l'usure prématurée const unsigned long DELAI_MIN_COMMUT = 200; // ms unsigned long derniereCommut[NB_RELAIS] = {0}; void setup() { Serial.begin(9600); // Sécurité maximale : on configure HIGH AVANT de passer en OUTPUT // Sinon, pendant 1-2 µs, la broche flotte et le relais peut claquer for (uint8_t i = 0; i < NB_RELAIS; i++) { digitalWrite(pinsRelais[i], RELAI_OFF); pinMode(pinsRelais[i], OUTPUT); digitalWrite(pinsRelais[i], RELAI_OFF); // Double sécurité } Serial.println(F("Module relais 8 canaux pret")); Serial.println(F("Tapez 1-8 pour basculer, 0 pour tout eteindre")); } void commuterRelais(uint8_t numero, bool etat) { if (numero >= NB_RELAIS) return; unsigned long maintenant = millis(); if (maintenant - derniereCommut[numero] < DELAI_MIN_COMMUT) { Serial.print(F("Trop rapide sur canal ")); Serial.println(numero + 1); return; } digitalWrite(pinsRelais[numero], etat ? RELAI_ON : RELAI_OFF); etatRelais[numero] = etat; derniereCommut[numero] = maintenant; Serial.print(F("Canal ")); Serial.print(numero + 1); Serial.println(etat ? F(" : ON") : F(" : OFF")); } void toutEteindre() { for (uint8_t i = 0; i < NB_RELAIS; i++) { commuterRelais(i, false); delay(50); // Évite pic de courant si chaîne de relais sur même alim } } void loop() { if (Serial.available()) { char c = Serial.read(); if (c >= '1' && c <= '8') { uint8_t n = c - '1'; commuterRelais(n, !etatRelais[n]); // Toggle } else if (c == '0') { toutEteindre(); } } } ## Points importants du code Notez l'ordre dans setup() : on écrit HIGH (relais désactivé) avant de configurer la broche en OUTPUT. Ce détail évite que pendant la transition INPUT→OUTPUT, la broche tire transitoirement à 0 et active brièvement le relais — claquement parasite au démarrage qui surprend tout le monde. Le délai minimum entre deux commutations protège mécaniquement les contacts. Un relais qui clique 10 fois par seconde s'use en quelques heures. ⚡ PRODUIT RECOMMANDÉ ## Module Relais 8 Canaux 5V Arduino Module 8 canaux avec optocoupleur, relais SRD-05VDC-SL-C 10A, idéal domotique et automatisation — livraison 24-48h partout en Tunisie depuis Sfax. Voir le module relais → ## Charges inductives : le piège du retour de courant Une lampe à incandescence ou un radiateur sont des charges purement résistives. Vous ouvrez le contact, le courant s'arrête, fin de l'histoire. Mais un moteur, une pompe, un transformateur, un solénoïde, un relais lui-même, sont des charges inductives. Lors de l'ouverture du contact, l'énergie magnétique stockée dans la bobine provoque une surtension transitoire qui peut atteindre plusieurs centaines de volts et créer un arc électrique entre les contacts qui s'écartent. Cet arc : - Brûle progressivement la couche d'argent des contacts (oxydation, micro-soudures) - Génère des parasites radioélectriques (RFI) qui plantent votre Arduino - Réduit la durée de vie de 100 000 cycles à parfois 10 000 ## Solution côté DC : la diode roue libre Pour une charge inductive en courant continu (servomoteur, électrovanne 12 V), placez une diode 1N4007 en parallèle inverse sur la charge : cathode au +, anode au -. Quand le contact s'ouvre, la diode offre un chemin de bouclage au courant inductif. ## Solution côté AC : le snubber RC En courant alternatif, la diode ne sert à rien. Utilisez un snubber : une résistance 100 Ω 1 W en série avec un condensateur 100 nF / 400 V (X2 anti-parasites obligatoire) câblés en parallèle sur les contacts NO-COM du relais. Le snubber absorbe l'énergie inductive et étouffe l'arc. Composants peu coûteux, effet spectaculaire sur la durée de vie. ## 3 applications réelles et complètes ## Application 1 — Domotique multi-pièces Bluetooth HC-05 Une maison à 5 pièces, 8 circuits indépendants : salon, chambre, cuisine, terrasse, couloir, chauffe-eau, ventilateur, pompe d'aquarium. Arduino UNO + module HC-05 Bluetooth + module relais 8 canaux + application Android (Bluetooth Electronics ou Arduino Bluetooth Controller). Architecture : l'app Android envoie un caractère ASCII via Bluetooth ('1', '2', ... '8' pour toggle, 'A' pour tout éteindre). Le HC-05 transmet à l'UART de l'Arduino qui exécute la commande. Coût matériel total : moins de 70 DT chez Didactico. Coût d'un système commercial équivalent : 800 DT minimum. ## Application 2 — Pompe d'arrosage automatique avec capteur d'humidité de sol Un seul canal sur les 8 utilisés, mais c'est l'application la plus utile en agriculture tunisienne. Capteur d'humidité capacitif (SEN0193 ou similaire) plongé dans le sol → entrée analogique A0. Sous un seuil (à étalonner empiriquement, typiquement 450 sur 0-1023), le relais alimente une pompe 220V immergée. const int seuilSec = 450; // ADC : sol sec const int seuilHumide = 700; // ADC : sol humide (arrêt) const unsigned long dureeMaxPompe = 30000UL; // 30 sec sécurité const unsigned long pauseEntreCycles = 3600000UL; // 1h unsigned long debutPompe = 0; unsigned long finPompe = 0; bool pompeActive = false; void loop() { int humidite = analogRead(A0); unsigned long maintenant = millis(); if (!pompeActive && humidite < seuilSec && (maintenant - finPompe) > pauseEntreCycles) { digitalWrite(pinPompe, RELAI_ON); pompeActive = true; debutPompe = maintenant; } if (pompeActive && (humidite > seuilHumide || (maintenant - debutPompe) > dureeMaxPompe)) { digitalWrite(pinPompe, RELAI_OFF); pompeActive = false; finPompe = maintenant; } delay(5000); }Le watchdog dureeMaxPompe est essentiel : si le capteur tombe en panne, la pompe ne tournera jamais plus de 30 secondes consécutives. Sans cette sécurité, vous risquez l'inondation. ## Application 3 — Programmateur ESP32 + NTP Pour un éclairage public miniature, une enseigne, un poulailler avec lumière progressive, l'ESP32 (à privilégier sur l'UNO pour le WiFi natif) synchronise son horloge sur un serveur NTP (pool.ntp.org). Les horaires d'allumage/extinction sont programmés en dur ou via interface web. Précision : 1 seconde, dérive nulle car re-synchronisation périodique. ## Les 10 règles de sécurité ABSOLUES - Coupez le disjoncteur général avant tout câblage côté 220 V. Vérifiez l'absence de tension au multimètre — ne faites jamais confiance à un interrupteur seul. - Disjoncteur différentiel 30 mA obligatoire en amont. Sans lui, une fuite à la terre vous électrocute en 100 ms. C'est la seule chose qui sauve une vie. - Section de câble adaptée à l'intensité : 0,75 mm² jusqu'à 6 A (lampes), 1,5 mm² jusqu'à 16 A (prises, gros électroménager), 2,5 mm² jusqu'à 20 A. JAMAIS de câble inférieur côté secteur. - Borniers à vis bien serrés au tournevis : un faux contact chauffe, fond, prend feu. Tirez sur le fil après serrage pour vérifier. - Boîtier isolant fermé autour du module relais. PVC, ABS, polycarbonate. Pas de bois (humidité), pas de carton, pas de boîtier métal sans mise à la terre. - Distance d'isolation de 8 mm minimum entre pistes 220 V et pistes basse tension. Sur la plupart des modules chinois, cette distance n'est pas respectée — entoilez avec de la résine époxy ou achetez un module certifié CE. - Ne dépassez jamais 60 % du calibre du relais en charge continue. Un relais 10 A = 6 A max en pratique. La fiche technique optimiste du fabricant est testée 5 secondes, pas 5 ans. - Mise à la terre de tout châssis métallique (boîtier, carcasse d'appareil) reliée à la terre du tableau via un fil vert/jaune. - Étiquetez chaque canal du module au feutre indélébile : "canal 3 → pompe aquarium". Dans 6 mois, vous ne vous rappellerez plus. - Testez à vide d'abord. Branchez la commande Arduino, écoutez les clics, vérifiez la continuité au multimètre. Câblez le secteur en DERNIER. ## Normes électriques tunisiennes essentielles La Tunisie applique la norme NT 88.34 (équivalent IEC 60364) pour les installations basse tension domestiques. Points-clés : - Tension nominale : 230 V ± 10 % (donc 207 à 253 V) à 50 Hz - Régime de neutre : TT (neutre relié à la terre côté STEG) - Couleurs des conducteurs : rouge ou marron pour la phase, bleu pour le neutre, vert-jaune pour la terre. Respectez ces couleurs au câblage du module relais. - Section minimum éclairage : 1,5 mm² — Section minimum prises : 2,5 mm² - Disjoncteur différentiel 30 mA obligatoire en tête de circuits de prises et salle de bain Pour une installation permanente dans une habitation, le contrôle par un installateur agréé STEG reste indispensable pour la conformité et l'assurance habitation. ## FAQ Puis-je alimenter le module 8 canaux directement depuis le port USB de l'Arduino ?Non, surtout pas. 8 bobines actives consomment environ 560 mA. Le port USB d'un ordinateur fournit 500 mA maximum, et l'Arduino lui-même consomme déjà 50 à 100 mA. Vous risquez la chute de tension, le reset intempestif, voire d'endommager le port USB. Utilisez une alimentation 5 V / 2 A externe pour le JD-VCC et gardez l'USB uniquement pour la communication. Pourquoi mes relais s'activent tout seuls au démarrage ?Trois causes possibles : (1) vous configurez la broche en OUTPUT avant d'écrire HIGH dessus — inversez l'ordre. (2) Le jumper JD-VCC/VCC est mal positionné. (3) Bruit secteur ou alimentation mal filtrée — ajoutez un condensateur 1000 µF en parallèle sur l'alimentation 5 V du module. Combien de temps dure un relais SRD-05VDC en pratique ?La fiche dit 100 000 cycles à charge nominale et 10 millions à vide. En conditions réelles tunisiennes (charge 50-70 %, charges inductives, climat chaud et humide), comptez 20 000 à 50 000 cycles avant oxydation perceptible. Avec snubber RC, vous doublez facilement cette durée de vie. Pour une installation permanente, préférez le HF115F. Module relais ou SSR (relais statique) ?SSR (Solid State Relay) = pas de mécanique, pas de bruit, commutation au zéro de tension (moins de parasites), durée de vie quasi infinie. Mais plus cher, dissipation thermique nécessaire (radiateur), risque de claquage en cas de surtension. Pour de la domotique basique avec lampes et prises, le relais électromécanique reste plus économique et tolérant aux erreurs. Mon Arduino plante quand le relais commute. Pourquoi ?Quasi-certainement parasites de commutation sur charge inductive. Solutions : (1) snubber RC en parallèle sur la charge AC, (2) condensateur 100 nF céramique entre VCC et GND du module, (3) câbles courts et éloignés du câblage 220 V, (4) alimentation Arduino indépendante de celle du module relais, (5) si tout échoue, optocoupleur supplémentaire entre Arduino et IN du module. Peut-on piloter du triphasé 380V avec ce module ?Non, pas directement. Les contacts sont calibrés 250 V AC monophasé. Pour du triphasé industriel (380-400 V), il faut des contacteurs de puissance (type Schneider LC1D) que l'on commande via le relais bas niveau. Le relais Arduino ferme le circuit de bobine 24 V du contacteur, qui lui-même ferme les trois phases. Existe-t-il un risque pour les étudiants qui font ce TP ?Oui, c'est pour cela que dans les laboratoires de l'ENIT, l'INSAT, l'ISBS ou l'ISET, les TP sur module relais sont systématiquement faits sous tension TBTS (Très Basse Tension de Sécurité) — typiquement 12 V ou 24 V — avec une lampe basse tension à la place de l'ampoule secteur. Ce n'est qu'après validation du câblage et du code que le passage au 220 V s'effectue, sous supervision d'un enseignant. ## Conclusion : entre l'envie et la responsabilité Le module relais 8 canaux est une porte d'entrée fabuleuse vers la domotique, l'automatisme industriel léger et l'IoT. Pour 25 à 40 DT chez Didactico, vous obtenez un outil qui aurait coûté plusieurs centaines de dinars il y a vingt ans. Mais derrière l'enthousiasme du prototypage, la réalité physique demeure : le 220 V tue. Respectez les 10 règles. Câblez hors tension. Mettez un différentiel 30 mA. Faites valider votre installation finale. Étudiant ENIT, INSAT, ISBS, ISET — ou amateur passionné — vous trouverez chez Didactico tous les composants nécessaires : modules relais 1, 2, 4, 8 et 16 canaux, optocoupleurs séparés, snubbers RC, transformateurs 220/12V, capteurs d'humidité, modules HC-05 Bluetooth et ESP32. Livraison sous 24 à 48 heures partout en Tunisie depuis notre dépôt de Sfax. Le FabLab Sfax est aussi un excellent endroit pour faire valider vos premiers montages avant la mise en service. Bon prototypage, et surtout : coupez toujours le disjoncteur. --- # Servomoteur Arduino : Du SG90 au Bras Robotique 6 Axes URL: https://didactico.tn/servomoteur-bras-robotique-arduino-tunisie/ Résumé: Servomoteur Arduino : principe interne, librairie Servo.h, alimentation correcte, PCA9685, bras robotique 4 axes et cinématique inverse en Tunisie. En 1937, l'ingénieur américain Walter Good fabrique le premier servomoteur de modélisme à partir de pièces d'horlogerie et d'un petit moteur électrique, pour piloter à distance un avion radiocommandé. Quatre-vingt-sept ans plus tard, le SG90 que vous achetez à 8 dinars chez Didactico utilise exactement le même principe : un moteur DC, un train d'engrenages réducteur, un potentiomètre de feedback, et une petite carte de contrôle qui compare la position désirée à la position réelle. Cette simplicité géniale est la raison pour laquelle un bras robotique 6 axes, une porte automatique, un radar à ultrasons et le mouvement d'antenne d'un satellite reposent tous sur la même mécanique fondamentale. Dans ce guide complet, vous allez apprendre à maîtriser le servomoteur — du minuscule SG90 jusqu'au bras robotique 6 axes contrôlé en cinématique inverse, en passant par les pièges d'alimentation qui détruisent silencieusement vos Arduino. Table des matières - 1. Qu'y a-t-il dans un servo ? Démontage et principe - 2. Le signal PWM 50 Hz expliqué - 3. Types de servos et choix selon le projet - 4. Librairie Servo.h et premier code - 5. Alimentation : LE point critique - 6. PCA9685 : piloter 16 servos par I2C - 7. Construire un bras robotique 4 axes - 8. Cinématique inverse simplifiée - 9. Mode teach : enregistrer des positions - 10. Ajouter une caméra ESP32-CAM - FAQ ## 1. Qu'y a-t-il dans un servo ? Démontage et principe Démontez un SG90 (4 vis) et vous découvrez quatre éléments : - Un moteur DC à courant continu miniature (3-6 V, quelques centaines de mA). - Un train d'engrenages réducteur en plastique (SG90) ou métal (MG90S, MG996R) qui démultiplie le couple typiquement par 200 à 300. - Un potentiomètre mécaniquement couplé à l'axe de sortie : il fournit en permanence à l'électronique la position réelle de l'axe. - Une carte de contrôle qui lit le signal PWM entrant, mesure la tension du potentiomètre, calcule l'erreur de position, et alimente le moteur dans le bon sens jusqu'à la position cible. Ce système en boucle fermée (closed-loop) est la définition même d'un servomécanisme. C'est ce qui distingue un servo d'un simple moteur DC : il connaît sa position et corrige automatiquement. ## 2. Le signal PWM 50 Hz expliqué Le standard servo, hérité de la radiocommande RC des années 1970, est un signal PWM à 50 Hz (période de 20 ms). La position est codée par la largeur d'impulsion HIGH : Position 0 1.0 ms HIGH puis 19.0 ms LOW Position 90 1.5 ms HIGH puis 18.5 ms LOW Position 180 2.0 ms HIGH puis 18.0 ms LOW Pour un servo standard, la plage est 1 à 2 ms. Certains servos étendus acceptent 0,5 à 2,5 ms (correspondant à 0-180° voire 0-270°). La librairie Servo.h d'Arduino gère cela transparemment. Pourquoi 50 Hz ?À 50 Hz, le servo a 20 ms pour ajuster sa position avant le prochain ordre. C'est largement assez pour les mécaniques de modélisme. Les servos digitaux modernes (Dynamixel, Robotis) montent à 333 Hz ou plus pour des mouvements plus réactifs, mais le SG90 et MG996R restent à 50 Hz. Inutile de pousser plus haut, ça ne servira à rien. ## 3. Types de servos et choix selon le projet ModèleCouplePoidsEngrenagesUsage SG901,8 kg·cm9 gPlastiquePrototypes, antennes, petites portes MG90S2,2 kg·cm13 gMétalBras robotique pédagogique 4 axes MG996R10 kg·cm55 gMétalBras robotique avancé, direction DS321820 kg·cm60 gMétalRobotique industrielle légère MG90D (continu)2 kg·cm13 gMétalRoues motrices de petit robot Pour 90 % des projets étudiants en Tunisie, démarrez avec 4 × SG90 ou MG90S. Le MG996R devient intéressant dès qu'il y a de la charge à soulever (pince qui attrape un objet de 100 g). Servo continu : attention, ces servos n'ont plus de potentiomètre de feedback. La commande PWM contrôle la vitesse (1,5 ms = stop, 1 ms = arrière max, 2 ms = avant max), pas la position. Idéal pour des roues motrices. ## 4. Librairie Servo.h et premier code #include Servo monServo; const byte BROCHE_SERVO = 9; void setup() { monServo.attach(BROCHE_SERVO); // par defaut 544-2400 us // Ou avec plage personnalisee : monServo.attach(9, 500, 2500); } void loop() { for (int angle = 0; angle <= 180; angle++) { monServo.write(angle); delay(15); } for (int angle = 180; angle >= 0; angle--) { monServo.write(angle); delay(15); } } Sur Arduino UNO, la librairie Servo.h utilise Timer 1 et permet jusqu'à 12 servos. Sur ESP32, utilisez ESP32Servo qui pilote jusqu'à 16 servos via les canaux LEDC. Attention : sur UNO, l'usage de Servo.h désactive le PWM sur D9 et D10 (analogWrite). ## 5. Alimentation : LE point critique RÈGLE NUMÉRO 1Ne jamais alimenter un servomoteur (même un seul SG90) directement depuis le 5V de l'Arduino UNO via USB. Le SG90 peut tirer jusqu'à 600 mA en pic au démarrage. L'Arduino, alimenté en USB, fournit 500 mA totaux. Vous allez reset l'Arduino à chaque mouvement, ou pire, abîmer le régulateur. C'est l'erreur que je vois le plus souvent au FabLab Sfax. ## Schéma d'alimentation correcte +-------------+ | Source | | externe 5-6V| | (batterie, | | alim murale,| | regulateur) | +------+------+ | +---+-- VCC servo (fil rouge) | | | +-- VCC servo 2, 3, 4... | [Condensateur 470 uF] | +------+------+ | GND |--- commun avec GND Arduino +-------------+ Arduino pin D9 --- Signal servo (fil orange/jaune) Trois points capitaux : (1) alimentation séparée pour les servos ; (2) condensateur de 470 µF à 1000 µF en parallèle pour absorber les pics ; (3) GND commun obligatoire entre alim servo et Arduino. Choix de l'alimentation : - 1 à 2 SG90 : alimentation USB séparée 5V/2A (chargeur smartphone) ou pile 4 AA - 4 SG90/MG90S (bras robotique pédagogique) : alimentation 5V/4A ou batterie LiPo 2S + step-down - 4 MG996R : alimentation 6V/10A (compter 1,5 A par servo en pic) ## 6. PCA9685 : piloter 16 servos par I2C Au-delà de 4-5 servos, le câblage devient un cauchemar et les timers Arduino sont saturés. La solution professionnelle : le module PCA9685. C'est un driver PWM 16 canaux, 12 bits de résolution (4096 niveaux), pilotable en I2C (2 fils seulement). Chaînable jusqu'à 62 modules = 992 servos. #include #include Adafruit_PWMServoDriver pca = Adafruit_PWMServoDriver(); const uint16_t SERVO_MIN = 150; // ~500 us pulse const uint16_t SERVO_MAX = 600; // ~2500 us pulse void setup() { pca.begin(); pca.setOscillatorFrequency(27000000); pca.setPWMFreq(50); // 50 Hz pour servos } void loop() { for (uint16_t pulse = SERVO_MIN; pulse < SERVO_MAX; pulse++) { pca.setPWM(0, 0, pulse); // canal 0 delay(5); } } // Helper : convertir un angle en pulse PCA9685 uint16_t angleVersPulse(int angle) { return map(angle, 0, 180, SERVO_MIN, SERVO_MAX); } Le PCA9685 a sa propre entrée d'alimentation V+ pour les servos, totalement séparée du 5V logique I2C. Câblage parfait : Arduino → SDA/SCL/GND vers PCA9685 logic, et une alimentation 5V/6A séparée vers V+ du PCA9685. 🦾 CATEGORIE ROBOTIQUE ## Servos, drivers et kits bras robotique SG90, MG90S, MG996R, modules PCA9685, kits bras robotique 4 et 6 axes. Composants Espressif (ESP32), Raspberry Pi et Arduino disponibles à Sfax. Livraison 24-48h en Tunisie. Voir la robotique → ## 7. Construire un bras robotique 4 axes Architecture classique d'un bras à 4 degrés de liberté (DOF) : - Axe 1 — Base (rotation horizontale) : MG996R, supporte le poids de tout le bras - Axe 2 — Épaule : MG996R, supporte avant-bras + pince + charge - Axe 3 — Coude : MG90S ou MG996R selon la portée - Axe 4 — Pince ou rotation poignet : SG90 suffit Pour la mécanique, vous avez deux options principales en Tunisie : (1) acheter un kit acrylique pré-découpé chez Didactico (rapide, économique) ; (2) imprimer en 3D avec un Bambu Lab P1S ou A1 — c'est ce que nous faisons au FabLab Sfax pour les projets de PFE personnalisés. Fichiers STL disponibles librement (cherchez "4DOF robot arm" sur Printables). ## Code de pilotage joystick → 4 servos #include Servo base, epaule, coude, pince; const byte JOY_X = A0; const byte JOY_Y = A1; const byte JOY_BTN = 2; int angleBase = 90; int angleEpaule = 90; int angleCoude = 90; bool pinceFermee = false; void setup() { base.attach(3); base.write(90); epaule.attach(5); epaule.write(90); coude.attach(6); coude.write(90); pince.attach(9); pince.write(45); pinMode(JOY_BTN, INPUT_PULLUP); } void loop() { int x = analogRead(JOY_X); int y = analogRead(JOY_Y); // Zone morte centrale int dx = (abs(x - 512) > 80) ? (x - 512) / 200 : 0; int dy = (abs(y - 512) > 80) ? (y - 512) / 200 : 0; angleBase = constrain(angleBase + dx, 0, 180); angleEpaule = constrain(angleEpaule + dy, 30, 150); base.write(angleBase); epaule.write(angleEpaule); if (digitalRead(JOY_BTN) == LOW) { pinceFermee = !pinceFermee; pince.write(pinceFermee ? 90 : 30); delay(300); } delay(20); } ## 8. Cinématique inverse simplifiée Plutôt que de piloter chaque servo séparément, la cinématique inverse (IK — Inverse Kinematics) permet de spécifier la position cible de la pince en (x, y, z) et de calculer automatiquement les angles. Pour un bras 2D simple (épaule + coude, longueurs L1 et L2) : #include #include Servo epaule, coude; const float L1 = 12.0; // cm avant-bras const float L2 = 10.0; // cm bras bool deplacer(float x, float y) { float d = sqrt(x*x + y*y); if (d > L1 + L2 || d < fabs(L1 - L2)) { return false; // hors de portee } // Loi des cosinus float cos_coude = (x*x + y*y - L1*L1 - L2*L2) / (2 * L1 * L2); float angle_coude = acos(cos_coude); float angle_epaule = atan2(y, x) - atan2(L2 * sin(angle_coude), L1 + L2 * cos(angle_coude)); int deg_epaule = degrees(angle_epaule); int deg_coude = degrees(angle_coude); epaule.write(constrain(90 + deg_epaule, 0, 180)); coude.write(constrain(90 + deg_coude, 0, 180)); return true; } void setup() { epaule.attach(5); coude.attach(6); Serial.begin(115200); } void loop() { // Trace un cercle dans le plan vertical for (int t = 0; t < 360; t += 5) { float rad = radians(t); float x = 15.0 + 4 * cos(rad); float y = 12.0 + 4 * sin(rad); deplacer(x, y); delay(50); } } Pour un bras 3D (4 ou 6 axes), les équations se compliquent mais le principe reste le même. Pour aller plus loin, regardez la librairie RobotIK ou ROS sur Raspberry Pi. ## 9. Mode teach : enregistrer des positions Le "teach mode" est utilisé dans l'industrie : on déplace manuellement le bras à une position, on appuie sur un bouton pour enregistrer les angles, puis on rejoue la séquence en boucle. Code simplifié : const byte NB_POS = 10; int sequence[NB_POS][4]; // 4 angles par position byte nbEnregistrees = 0; bool modeReplay = false; void loop() { if (digitalRead(BTN_REC) == LOW && nbEnregistrees < NB_POS) { sequence[nbEnregistrees][0] = angleBase; sequence[nbEnregistrees][1] = angleEpaule; sequence[nbEnregistrees][2] = angleCoude; sequence[nbEnregistrees][3] = anglePince; nbEnregistrees++; delay(500); } if (digitalRead(BTN_PLAY) == LOW) modeReplay = true; if (modeReplay) { for (byte i = 0; i < nbEnregistrees; i++) { deplacerVers(sequence[i][0], sequence[i][1], sequence[i][2], sequence[i][3]); delay(1500); } modeReplay = false; } } Pour un mouvement fluide entre deux positions enregistrées, interpolez linéairement sur 50 étapes au lieu de sauter directement (sinon le servo va au max de vitesse). ## 10. Ajouter une caméra ESP32-CAM L'ESP32-CAM (puce Espressif ESP32 + caméra OV2640) transforme votre bras robotique en système de vision. Trois usages pratiques : - Streaming Wi-Fi : voir en temps réel ce que voit la pince depuis votre smartphone. - Détection de couleur : la pince attrape uniquement les objets rouges (filtrage HSV via OpenCV sur Raspberry Pi qui pilote l'ESP32). - Détection AprilTag ou QR : le bras se positionne précisément face à un tag pour effectuer une opération. Workflow type : ESP32-CAM streame vidéo en MJPEG sur Wi-Fi, un Raspberry Pi 4 ou un PC traite l'image avec OpenCV (Python), calcule la position cible (x, y) en cm, et envoie les coordonnées à l'Arduino via UART qui calcule la cinématique inverse et pilote les servos. C'est exactement la chaîne que nous avons montée pour un projet de PFE INSAT en avril 2025. ## Dépannage rapide : 5 problèmes fréquents - Le servo tremble en permanence → Alimentation trop faible OU câble signal trop long sans masse de référence. Ajoutez un condensateur de 470 µF et raccourcissez les fils. - Arduino se reset au démarrage du servo → Vous alimentez le servo via Arduino 5V. Séparez les alimentations. - Le servo tourne dans le mauvais sens → Inversez la conversion : servo.write(180 - angle). - Le servo refuse d'aller jusqu'à 0° ou 180° → Plage par défaut 544-2400 µs trop conservative. Essayez attach(broche, 500, 2500). - Le servo "chante" doucement quand il maintient une position → Comportement normal sur servos analogiques bon marché. Passez à un servo digital pour silence total. 🎓 PROJET ETUDIANTS ## Kit bras robotique 4 axes complet Idéal pour les projets PFE/Mini-projet en ENIT, INSAT, ISBS, ISET, ESPRIT. Servos MG996R + MG90S, structure acrylique, électronique et code source inclus. Livraison rapide Tunisie. Voir les kits robotique → ## FAQ — Servomoteur Arduino bras robotique Quelle différence entre SG90, MG90S et MG996R ?SG90 : 9 g, engrenages plastique (fragiles), couple 1,8 kg·cm — bon pour prototypes légers. MG90S : 13 g, engrenages métal, couple 2,2 kg·cm — meilleur rapport qualité/prix. MG996R : 55 g, engrenages métal, couple 10 kg·cm — pour axes qui portent du poids (épaule de bras robotique, direction de voiture RC). Pour un premier bras robotique pédagogique, mixez : MG996R pour la base et l'épaule, MG90S pour coude et pince. Combien de servos puis-je piloter sur un seul Arduino UNO ?La librairie Servo.h supporte jusqu'à 12 servos sur Arduino UNO (limite imposée par Timer 1) et 48 sur Mega 2560. Mais le vrai goulot d'étranglement, c'est l'alimentation : 12 SG90 en mouvement simultané = 7 A de pic. En pratique, pour plus de 4 servos, utilisez un PCA9685 et une alimentation 5V/10A séparée. Pourquoi mon Arduino redémarre quand je bouge le servo ?C'est l'erreur la plus fréquente : vous alimentez le servo via le 5V de l'Arduino. Un seul SG90 en pic de démarrage tire 600 mA, et l'Arduino USB ne fournit que 500 mA total. Solution : alimentation externe 5V/2A minimum dédiée aux servos, avec masse commune avec l'Arduino et un condensateur 470 µF en parallèle. C'est non négociable. Servo standard ou servo continu : lequel choisir ?Servo standard (SG90, MG90S, MG996R) : position absolue 0-180°. Idéal pour bras robotique, gouvernail, antenne mobile. Servo continu (FS90R, MG90D modifié) : la commande PWM contrôle la vitesse et la rotation est libre 360° à l'infini. Idéal pour roues motrices de petit robot, treuil. Ne pas confondre les deux : un servo standard cassera ses butées si vous tentez la rotation continue. Comment alimenter 4 servos pour un bras robotique ?Quatre MG996R en pic peuvent demander 6 A à 6V. Trois solutions : (1) alimentation murale 6V/10A (la plus fiable) ; (2) batterie LiPo 2S 5000 mAh + régulateur step-down 6V/10A (pour mobilité) ; (3) batteries 4 piles AA en série + condensateur d'amortissement (économique mais limité). Toujours ajouter un condensateur 1000 µF sur la rail d'alim et fusible 10A. Servo.h fonctionne-t-il sur ESP32 ?Non, pas directement. Sur ESP32, utilisez la librairie ESP32Servo de Kevin Harrington, parfaitement compatible avec la syntaxe Servo.h habituelle. Avantages : 16 canaux PWM matériels via LEDC, résolution 16 bits, fréquences personnalisables. Installation : Outils → Gérer bibliothèques → "ESP32Servo". Faut-il un PCA9685 pour un bras 4 axes ?Pas obligatoire, mais fortement recommandé dès le second projet. Avantages : (1) seulement 2 fils (SDA/SCL) vers l'Arduino au lieu de 4 fils signal ; (2) alimentation servo totalement séparée de la logique I2C ; (3) résolution 12 bits (4096 niveaux) au lieu de l'approximation de Servo.h ; (4) extensible à 16 servos par module, chaînable jusqu'à 62 modules. Coût : 8-15 DT chez Didactico. Indispensable au-delà de 5 servos. ## Conclusion Le servomoteur est probablement le composant le plus magique de l'électronique grand public : une mécanique de précision, une boucle de contrôle en temps réel, un protocole vieux de 50 ans toujours en vigueur, et un prix qui démarre à 8 dinars. Du minuscule SG90 qui anime la queue d'un robot-chat imprimé en 3D jusqu'au bras industriel à 6 axes piloté en ROS, vous travaillez toujours avec le même principe : un signal PWM qui code une position, et un système en boucle fermée qui s'y rend. Chez Didactico Sfax, nous tenons en stock permanent toute la gamme : SG90, MG90S, MG996R, DS3218, servos continus FS90R, modules PCA9685, kits bras robotique 4 axes en acrylique, structures imprimables 3D, alimentations 5V/10A et batteries LiPo. Pour les étudiants ENIT, INSAT, ISBS, ISET et ESPRIT en projet de fin d'études, livraison 24-48h dans toute la Tunisie. Nous travaillons aussi avec les imprimantes Bambu Lab (P1S, A1, X1C) au FabLab Sfax pour réaliser des structures de bras sur-mesure, et avec l'écosystème Espressif (ESP32, ESP32-CAM) pour la partie vision. Pour aller plus loin, consultez notre guide complet Arduino UNO R3. Quel sera votre prochain projet servo ? Un bras industriel miniature, un robot quadrupède, un gimbal pour caméra ? Partagez en commentaire — les meilleures idées seront retenues pour le prochain workshop FabLab. --- # Potentiomètre Arduino PWM : Contrôler une LED, un Servo et un Moteur URL: https://didactico.tn/potentiometre-pwm-led-arduino-tunisie/ Résumé: Maîtrisez le potentiomètre Arduino et le PWM : ADC 10-bit, map(), filtrage, 4 projets concrets (LED, servo, moteur, sélecteur) et upgrade ADS1115. Un soir d'octobre 2024, un étudiant INSAT m'envoie une vidéo : sa LED censée gradiente proprement clignote nerveusement à chaque rotation du potentiomètre. Le code semble correct, le câblage aussi. Sur l'oscilloscope, je vois immédiatement le coupable : un signal analogique parfaitement propre... transformé en sortie PWM qui saute de 5 unités à 23 puis revient à 7. Pas de moyenne glissante, pas de filtrage, pas de zone morte. Le potentiomètre est sans doute le composant le plus simple de l'électronique — une résistance variable à trois pattes — et pourtant 80 % des débutants l'utilisent mal. Dans ce guide complet, on va voir comment lire un potentiomètre proprement, comprendre le PWM Arduino jusque dans ses fréquences cachées, et construire quatre projets concrets : LED gradable, vitesse de servo, vitesse de moteur DC, et sélecteur de mode à 5 positions. Table des matières - 1. Le potentiomètre, résistance variable à 3 pattes - 2. Types de potentiomètres - 3. L'ADC 10-bit d'Arduino expliqué - 4. Le PWM : fréquences, duty cycle et broches - 5. La fonction map() et ses pièges - 6. Filtrer la lecture pour stabiliser - 7. Quatre projets complets - 8. Upgrade pro : ADS1115 16-bit - FAQ ## 1. Le potentiomètre, résistance variable à 3 pattes Un potentiomètre est techniquement un diviseur de tension réglable. Trois pattes : deux extrémités (souvent notées 1 et 3) et un curseur central (patte 2, le "wiper"). Quand on tourne, le curseur se déplace le long d'une piste résistive, modifiant le rapport de division. +5V ----+ | [1] | Piste resistive . (10 k typique) . <----- Curseur sortant . vers Arduino A0 | [3] | GND ----+ Si le curseur est au milieu, on lit 2,5 V à la patte 2. À fond à gauche, 0 V. À fond à droite, 5 V. C'est ce signal continu et variable que l'Arduino convertit en nombre. ## 2. Types de potentiomètres TypeCaractéristiqueUsage typiquePrix Tunisie Rotatif linéaire (B)Variation proportionnelleRéglage générique, débutants1 - 2 DT Rotatif logarithmique (A)Variation logarithmiqueVolume audio1,5 - 3 DT Linéaire sliderCurseur droitMixage audio, animatronique3 - 6 DT Multi-tours (10/20 tours)Précision hauteCalibration laboratoire5 - 12 DT TrimmerPetit, ajustement uniqueCalibration interne d'un PCB0,3 - 0,8 DT Numérique I2C/SPIPilotable par codeAuto-calibration, télécommande8 - 20 DT Pour 90 % des projets Arduino, prenez un potentiomètre rotatif linéaire B10K (10 kΩ). C'est le standard universel. ## 3. L'ADC 10-bit d'Arduino expliqué Le microcontrôleur ATmega328P de l'Arduino UNO intègre un convertisseur analogique-numérique 10 bits. Cela signifie qu'il transforme une tension continue 0-5 V en un entier compris entre 0 et 1023 (2^10 = 1024 niveaux). Précision théorique : 5 V / 1024 = 4,88 mV par pas. int valeur = analogRead(A0); // 0 a 1023 Sur un ESP32, l'ADC est 12 bits (0 à 4095, 0,80 mV par pas) — quatre fois plus précis. Sur un Arduino Due, c'est aussi 12 bits. Limites de l'ADC interneL'ADC d'Arduino UNO partage son convertisseur entre toutes les broches analogiques et présente du bruit (typiquement ±2 LSB). Pour des mesures précises (cellule de charge, capteur de force), passez à un ADS1115 (16 bits, ±0,1 % linéarité) que nous traitons en section 8. Vitesse d'analogRead() : environ 100 µs par lecture, soit 10 000 lectures par seconde maximum. Largement suffisant pour un potentiomètre tourné à la main. ## 4. Le PWM : fréquences, duty cycle et broches Arduino ne sait pas générer un vrai signal analogique en sortie (pas de DAC sur UNO). Il triche en utilisant le PWM (Pulse Width Modulation) : il envoie un signal carré 0-5 V à fréquence fixe, mais en faisant varier le rapport temps HIGH / temps total (duty cycle) entre 0 % et 100 %. Le moyen d'une LED (ou la bobine d'un moteur) lisse ce signal et perçoit une intensité variable. Duty 25% ──┐ ┌───┐ ┌───┐ ┌── │ │ │ │ │ │ HIGH LOW HIGH LOW HIGH LOW Duty 75% ──┐ ┌───────┐ ┌── │ │ │ │ HIGH LOW HIGH LOW HIGH La fonction analogWrite(broche, valeur) attend une valeur entre 0 (toujours LOW = 0 %) et 255 (toujours HIGH = 100 %). À ne pas confondre avec analogRead qui renvoie 0-1023. ## Broches PWM sur Arduino UNO et leurs fréquences BrochesTimerFréquence par défaut D3, D11Timer 2490 Hz D5, D6Timer 0980 Hz D9, D10Timer 1490 Hz Les broches D5 et D6 sont à 980 Hz car Timer 0 sert aussi à millis() et delay(). Si vous changez sa fréquence, vous cassez la mesure du temps. Pour un moteur DC, 490 Hz est parfois trop lent et donne un sifflement audible : utilisez plutôt D9/D10 et changez le prescaler du Timer 1 pour monter à 31 kHz (silencieux). // Augmenter la frequence PWM des broches D9 et D10 a 31 kHz (silencieux) TCCR1B = (TCCR1B & 0b11111000) | 0x01; ## 5. La fonction map() et ses pièges Lecture potentiomètre = 0-1023. Sortie PWM = 0-255. Sortie servo = 0-180°. Pour convertir, on utilise map() : int pot = analogRead(A0); // 0-1023 int pwm = map(pot, 0, 1023, 0, 255); // 0-255 analogWrite(9, pwm); Trois pièges courants : - map() ne contraint pas : si pot = 1100 (lecture aberrante), pwm = 274. Toujours ajouter pwm = constrain(pwm, 0, 255); derrière. - map() utilise des entiers : pour des valeurs flottantes, écrivez votre propre fonction mapFloat(). - map() inverse : map(pot, 0, 1023, 255, 0) inverse le sens — pratique si votre câblage est dans le mauvais sens. ## 6. Filtrer la lecture pour stabiliser Une lecture brute oscille typiquement de ±2 LSB. Sur 1024 niveaux, ce n'est rien. Mais une fois mappé sur 0-180° (servo), ±2 LSB devient ±0,4°, soit un servo qui tremble en permanence — inacceptable. Trois techniques cumulables : ## Moyenne glissante const byte N = 8; int buffer[N]; byte idx = 0; long somme = 0; int lirePot() { somme -= buffer[idx]; buffer[idx] = analogRead(A0); somme += buffer[idx]; idx = (idx + 1) % N; return somme / N; } ## Filtre exponentiel (plus économe en mémoire) float potFiltre = 0; const float ALPHA = 0.15; void loop() { int brut = analogRead(A0); potFiltre = ALPHA * brut + (1 - ALPHA) * potFiltre; } ## Zone morte (hystérésis) int dernier = -10; void loop() { int actuel = analogRead(A0); if (abs(actuel - dernier) > 3) { // 3 LSB de tolerance dernier = actuel; appliquerValeur(actuel); } } Recette anti-tremblementPour un servo piloté par potentiomètre : moyenne glissante sur 8 lectures + zone morte de 4 LSB + délai minimum de 30 ms entre deux écritures servo. Vous obtenez un mouvement parfaitement stable. C'est la recette que nous appliquons sur les bras robotiques au FabLab Sfax. ## 7. Quatre projets complets ## Projet 1 — LED gradable proprement const byte POT = A0; const byte LED = 9; float valFiltree = 0; void setup() {} void loop() { int brut = analogRead(POT); valFiltree = 0.2 * brut + 0.8 * valFiltree; int pwm = map((int)valFiltree, 0, 1023, 0, 255); analogWrite(LED, pwm); delay(15); } Pour rendre la luminosité perçue linéaire (l'œil voit en logarithmique), appliquez une courbe gamma : int pwm = pow(valFiltree / 1023.0, 2.2) * 255; ## Projet 2 — Vitesse et position d'un servo SG90 #include Servo srv; const byte POT = A0; void setup() { srv.attach(9); } void loop() { static long somme = 0; somme = somme - (somme >> 3) + analogRead(POT); int filtre = somme >> 3; // moyenne sur 8 int angle = map(filtre, 0, 1023, 0, 180); srv.write(angle); delay(20); } ## Projet 3 — Vitesse moteur DC via L298N Câblage : potentiomètre sur A0, ENA du L298N sur D9 (PWM), IN1 sur D7, IN2 sur D8. Bouton sur D4 inverse le sens. const byte POT = A0; const byte ENA = 9; const byte IN1 = 7; const byte IN2 = 8; const byte BTN_SENS = 4; bool avant = true; void setup() { pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT); pinMode(ENA, OUTPUT); pinMode(BTN_SENS, INPUT_PULLUP); // PWM 31 kHz silencieux sur D9/D10 TCCR1B = (TCCR1B & 0b11111000) | 0x01; } void loop() { if (digitalRead(BTN_SENS) == LOW) { avant = !avant; delay(200); // anti-rebond grossier } digitalWrite(IN1, avant ? HIGH : LOW); digitalWrite(IN2, !avant ? HIGH : LOW); int pot = analogRead(POT); int pwm = map(pot, 0, 1023, 0, 255); if (pwm < 30) pwm = 0; // zone morte demarrage moteur analogWrite(ENA, pwm); } ## Projet 4 — Sélecteur de mode à 5 positions Un seul potentiomètre = 5 modes distincts pour un projet (Stop / Lent / Normal / Rapide / Turbo). byte modeActuel = 99; void loop() { int pot = analogRead(A0); byte mode; if (pot < 200) mode = 0; // Stop else if (pot < 410) mode = 1; // Lent else if (pot < 615) mode = 2; // Normal else if (pot < 820) mode = 3; // Rapide else mode = 4; // Turbo if (mode != modeActuel) { modeActuel = mode; appliquerMode(mode); Serial.print("Mode "); Serial.println(mode); } } void appliquerMode(byte m) { static const byte vitesses[5] = {0, 80, 150, 200, 255}; analogWrite(9, vitesses[m]); } 🎛️ PACK DEBUTANT ## Composants Arduino + Potentiomètres Lot de potentiomètres B10K, breadboard 830 points, LEDs RGB, résistances. Le pack idéal pour démarrer vos projets PWM avec Arduino UNO ou Elegoo UNO R3. Voir les composants → ## 8. Upgrade pro : ADS1115 16-bit I2C Quand 10 bits ne suffisent plus (cellule de charge, capteur de pH, mesures différentielles précises), passez à l'ADS1115 de Texas Instruments. Quatre canaux 16 bits différentiels, communication I2C, jusqu'à 860 échantillons/seconde, PGA intégré (gain réglable de 2/3 à 16). Précision pratique : ±0,01 %. #include #include Adafruit_ADS1115 ads; void setup() { Serial.begin(115200); if (!ads.begin()) { Serial.println("ADS1115 introuvable"); while (1); } ads.setGain(GAIN_ONE); // +/-4.096V, 1 LSB = 0.125mV } void loop() { int16_t v = ads.readADC_SingleEnded(0); // 0-32767 (en mode unipolaire) float volts = ads.computeVolts(v); Serial.print(volts, 4); Serial.println(" V"); delay(100); } Au FabLab Sfax, nous utilisons l'ADS1115 systématiquement pour les projets de PFE en mesure de précision : mesure de tension de pile à hydrogène, capteur de pression différentielle, électrode pH-mètre. Disponible chez Didactico. ## FAQ — Potentiomètre Arduino PWM Quelle valeur de potentiomètre choisir : 1k, 10k ou 100k ?Pour Arduino, le standard universel est 10 kΩ. Trop faible (1 kΩ) consomme inutilement de courant à travers le diviseur. Trop élevé (100 kΩ et plus) rend la lecture plus sensible au bruit (l'impédance d'entrée de l'ADC ne lit plus aussi proprement). 10 kΩ est le compromis idéal pour 95 % des projets. Pourquoi ma lecture saute entre deux valeurs ?L'ADC d'Arduino UNO présente naturellement un bruit de ±2 LSB. C'est normal. Trois solutions : (1) ajoutez un condensateur de 100 nF entre le wiper et GND pour lisser le signal ; (2) implémentez une moyenne glissante sur 8 lectures dans le code ; (3) ajoutez une zone morte (hystérésis) de 3-4 LSB avant d'appliquer la valeur. analogWrite() fonctionne-t-il sur toutes les broches Arduino ?Non. Sur Arduino UNO, seules les broches 3, 5, 6, 9, 10 et 11 supportent analogWrite() matériel (PWM). Sur Mega : 13 broches. Sur Nano : identique à UNO. Sur ESP32 : presque toutes les broches via les canaux LEDC. Pour faire du PWM logiciel sur les autres broches, utilisez la librairie SoftPWM (mais qualité moindre, consomme du CPU). Comment faire du PWM silencieux sur un moteur DC ?La fréquence par défaut (490 ou 980 Hz) est dans le spectre audible et fait "chanter" certains moteurs. Solution : changer le prescaler du Timer 1 pour pousser les broches D9 et D10 à 31 kHz : TCCR1B = (TCCR1B & 0b11111000) | 0x01;. Le sifflement disparaît et le rendement du moteur s'améliore. Puis-je remplacer un potentiomètre par un signal externe ?Oui. Tout signal continu 0-5 V est lisible par analogRead() : capteur LM35 (température), photorésistance LDR (luminosité), capteur de courant ACS712 (jusqu'à 30 A), sortie d'un autre Arduino, signal d'un PLC industriel via opto-isolateur. Vérifiez juste que la tension ne dépasse jamais 5 V (5,5 V endommage l'ATmega328P). Quelle différence entre ADC 10-bit (Arduino) et 16-bit (ADS1115) ?10 bits = 1024 niveaux, 1 LSB = 4,88 mV. 16 bits = 65 536 niveaux, 1 LSB = 0,125 mV (avec gain 1 sur ADS1115). En pratique, l'Arduino est suffisant pour potentiomètres, joysticks, photorésistances. L'ADS1115 devient indispensable pour des mesures fines (cellule de charge, thermocouple amplifié, pH-mètre), des mesures différentielles, ou des mesures précises de tension/courant. Un joystick Arduino, c'est juste deux potentiomètres ?Exactement. Un joystick analogique type Arduino (KY-023) contient deux potentiomètres 10K à 90° l'un de l'autre + un bouton-poussoir activé par appui sur le manche. Lecture : x = analogRead(A0); y = analogRead(A1); bouton = digitalRead(2);. Tout ce que vous avez appris sur le potentiomètre s'applique : filtrage, zone morte au centre (~512 ±20), map() vers la plage utile. ## Conclusion Le potentiomètre est le composant qui m'a fait comprendre, il y a des années, le concept de signal analogique, de quantification, de bruit et de filtrage. Quatre concepts qui resservent ensuite partout : capteurs, audio, mesure, contrôle. Maîtrisez la lecture propre d'un potentiomètre, le PWM en sortie, la fonction map() et un bon filtre, et vous avez les briques de 70 % des projets Arduino. Chez Didactico Tunisie, basée à Sfax, nous tenons en stock permanent les potentiomètres B10K rotatifs, sliders linéaires, multi-tours pour calibration, trimmers, joysticks analogiques KY-023, ADS1115, drivers L298N, Arduino UNO R3, Elegoo UNO, Raspberry Pi et tout l'écosystème Espressif (ESP32, ESP8266). Livraison 24-48h dans toute la Tunisie pour les étudiants ENIT, INSAT, ISBS, ISET et ESPRIT. Pour aller plus loin, lisez notre guide Arduino UNO R3 complet avec 10 projets. Vous avez un projet PWM en tête ? Décrivez-le dans les commentaires, je sélectionnerai les plus intéressants pour les prochains tutoriels FabLab Sfax. --- # Bouton Poussoir Arduino : Débounce, Pull-up et Interruptions en Tunisie URL: https://didactico.tn/bouton-poussoir-led-arduino-tunisie/ Résumé: Maîtrisez le bouton poussoir Arduino : pull-up, debounce avec millis(), Bounce2, interruptions, appui long et double-clic. 5 patterns prêts à l'emploi. En 1947, dans les laboratoires Bell, William Shockley et son équipe inventent le transistor. Soixante-dix ans plus tard, un étudiant ISET passe trois nuits à comprendre pourquoi sa LED s'allume "deux fois" quand il appuie une seule fois sur son bouton. Le coupable n'est ni le transistor, ni Arduino, ni le code — c'est un phénomène mécanique vieux de cent ans que les ingénieurs appellent rebond de contact. Quand deux lamelles métalliques se touchent, elles oscillent pendant 1 à 15 ms avant de se stabiliser. Pour un humain, c'est invisible. Pour un Arduino à 16 MHz, ce sont des centaines d'événements ON/OFF interprétés comme autant d'appuis. Apprendre à lire correctement un bouton poussoir, c'est apprendre la moitié de l'électronique embarquée. Ce guide vous donne les clés. Table des matières - 1. Les types de boutons et leurs usages - 2. Pull-up vs pull-down : la base à maîtriser - 3. INPUT_PULLUP : le secret d'Arduino - 4. Le problème des rebonds illustré - 5. Debounce logiciel avec millis() - 6. La librairie Bounce2 - 7. Interruptions matérielles INT0/INT1 - 8. Appui long et double-clic - 9. L'encodeur rotatif KY-040 - 10. 5 patterns de code réutilisables - FAQ ## 1. Les types de boutons et leurs usages Tous les "boutons" ne se valent pas. Choisir le mauvais type, c'est garantir trois soirées de débogage stérile. Voici la typologie que nous utilisons chez Didactico : TypeComportementUsage typiquePrix Tunisie Tactile 6×6 mmMomentané (appuyé = ON)Breadboard, prototypes0,3 - 0,5 DT Poussoir 12 mm panneauMomentané, robusteBoîtier de projet final1,5 - 3 DT TTP223 capacitifDétection tactile sans contactInterface premium, derrière acrylique2 - 4 DT Toggle SPDTBistable (ON ou OFF maintenu)Interrupteur d'alimentation1 - 2 DT Bouton arcade 30 mmMomentané grande courseBorne d'arcade, jeux5 - 12 DT Reed switch magnétiqueON par proximité aimantAlarme porte, compteur tours1 - 3 DT Pour 90 % des projets, vous utiliserez un bouton tactile 6×6 mm pour le prototype, puis un poussoir 12 mm pour la version finale en boîtier. ## 2. Pull-up vs pull-down : la base à maîtriser Un bouton seul ne suffit pas. Quand il est ouvert (non pressé), la broche d'entrée Arduino n'est connectée à rien : elle "flotte" et capte le bruit ambient, donnant des LOW et HIGH aléatoires. Il faut imposer un état par défaut grâce à une résistance. ## Pull-down (état par défaut = LOW) 5V | / Bouton | +------ Arduino pin D2 | [R 10k] <-- pull-down | GND Au repos : la résistance tire la broche à GND, donc digitalRead() = LOW. Appui : le 5V est connecté à la broche, digitalRead() = HIGH. ## Pull-up (état par défaut = HIGH) 5V | [R 10k] <-- pull-up | +------ Arduino pin D2 | / Bouton | GND Au repos : la résistance tire la broche à 5V, digitalRead() = HIGH. Appui : la broche est court-circuitée à GND, digitalRead() = LOW. Convention industrielle99 % des projets professionnels utilisent le pull-up. Pourquoi ? Parce qu'en cas de fil coupé, la broche reste à HIGH (état "sûr" = bouton non pressé), évitant les fausses détections. Adoptez ce réflexe dès le premier jour. ## 3. INPUT_PULLUP : le secret d'Arduino Tous les microcontrôleurs ATmega328P (UNO, Nano), ESP32, ESP8266, STM32 intègrent des résistances de pull-up internes d'environ 20-50 kΩ activables par logiciel. Plus besoin de soudure ! Un simple : pinMode(2, INPUT_PULLUP); active le pull-up interne. Le bouton se câble alors entre la broche D2 et GND, point final. Voici le code minimal : const byte BOUTON = 2; const byte LED = 13; void setup() { pinMode(BOUTON, INPUT_PULLUP); pinMode(LED, OUTPUT); } void loop() { // INPUT_PULLUP : appuye = LOW, relache = HIGH if (digitalRead(BOUTON) == LOW) { digitalWrite(LED, HIGH); } else { digitalWrite(LED, LOW); } } Simple, élégant, fonctionne immédiatement. Mais ce code n'est pas robuste : il ne gère pas les rebonds. On y vient. ## 4. Le problème des rebonds illustré Quand vous appuyez sur un bouton, voici ce que voit réellement l'Arduino sur l'oscilloscope : Tension Appui Relache HIGH ----+ +-+ +--+ +-+ +---- | | | | | | | | | | | | | STABLE | | | LOW +-+-+ +-+-+ +--------------+-+------+ <~~~ 5 a 15 ms rebonds ~~~> Cinq à quinze millisecondes de rebonds chaotiques. Si votre loop() tourne à 50 000 itérations/seconde (typique sur Arduino UNO), elle voit chaque rebond comme un appui distinct. Résultat : votre compteur incrémente de 7 au lieu de 1, votre menu saute trois lignes, votre relais claque sept fois. ## 5. Debounce logiciel avec millis() Le principe est simple : on ignore tout changement d'état qui survient moins de 30 à 50 ms après le précédent. Voici un debounce robuste sans aucune librairie : const byte BOUTON = 2; const byte LED = 13; const unsigned long DEBOUNCE_MS = 50; byte etatLed = LOW; byte dernierEtatLu = HIGH; byte etatStable = HIGH; unsigned long dernierChangement = 0; void setup() { pinMode(BOUTON, INPUT_PULLUP); pinMode(LED, OUTPUT); } void loop() { byte lecture = digitalRead(BOUTON); // Si l'etat change, on memorise l'instant if (lecture != dernierEtatLu) { dernierChangement = millis(); } // Si l'etat est stable depuis assez longtemps if (millis() - dernierChangement > DEBOUNCE_MS) { if (lecture != etatStable) { etatStable = lecture; // On agit uniquement sur front descendant (appui) if (etatStable == LOW) { etatLed = !etatLed; digitalWrite(LED, etatLed); } } } dernierEtatLu = lecture; } Ce pattern est l'un des plus utilisés en embarqué. Apprenez-le par cœur : il marche identiquement pour 1 ou pour 50 boutons, sur Arduino comme sur ESP32. ## 6. La librairie Bounce2 — la solution propre Pour ne pas réécrire ce code à chaque projet, Thomas Fredericks a créé Bounce2, devenue le standard. Installation : Outils → Gérer les bibliothèques → "Bounce2". #include Bounce bouton = Bounce(); const byte LED = 13; bool etatLed = false; void setup() { bouton.attach(2, INPUT_PULLUP); bouton.interval(25); // 25 ms de debounce pinMode(LED, OUTPUT); } void loop() { bouton.update(); if (bouton.fell()) { // front descendant = appui etatLed = !etatLed; digitalWrite(LED, etatLed); } } Bounce2 expose plusieurs méthodes très pratiques : fell() (front descendant), rose() (front montant), read() (état stable), currentDuration() (depuis combien de temps dans cet état). Pour 5 boutons, vous créez simplement 5 objets Bounce. Aucune complexité. 🔘 COMPOSANTS BREADBOARD ## Boutons, résistances, breadboard Pack tactiles 6×6 mm (lot de 25), résistances 10kΩ, fils Dupont. Tout le nécessaire pour vos prototypes Arduino. En stock à Sfax, livré sous 24-48h en Tunisie. Voir les composants → ## 7. Interruptions matérielles INT0/INT1 Le polling (digitalRead() dans la loop) a un défaut : si votre loop met 200 ms à s'exécuter, vous pouvez rater un appui bref. La solution radicale : les interruptions matérielles. Le processeur arrête immédiatement ce qu'il fait pour exécuter une fonction spéciale (ISR — Interrupt Service Routine). Sur Arduino UNO, deux broches supportent les interruptions externes : D2 (INT0) et D3 (INT1). Sur Mega : D2, D3, D18, D19, D20, D21. Sur ESP32 : presque toutes les broches. const byte BOUTON = 2; // INT0 const byte LED = 13; volatile bool changement = false; volatile unsigned long dernierTick = 0; void ISR_bouton() { // Debounce dans l'ISR (45 ms) unsigned long t = millis(); if (t - dernierTick > 45) { changement = true; dernierTick = t; } } void setup() { pinMode(BOUTON, INPUT_PULLUP); pinMode(LED, OUTPUT); attachInterrupt(digitalPinToInterrupt(BOUTON), ISR_bouton, FALLING); } void loop() { if (changement) { changement = false; digitalWrite(LED, !digitalRead(LED)); } // ICI tout votre code applicatif, meme long } Règles d'or des ISR1. Toute variable partagée ISR/loop doit être déclarée volatile. 2. Une ISR doit être la plus courte possible : pas de Serial.print(), pas de delay(), pas de calculs flottants lourds. 3. Mettre un drapeau (flag = true) et traiter dans la loop, pas dans l'ISR. 4. millis() fonctionne dans une ISR mais delay() bloque tout. ## 8. Appui long et double-clic Vos utilisateurs aiment les interactions riches : appui court = action A, appui long = action B, double-clic = action C. Voici comment l'implémenter proprement : #include Bounce btn = Bounce(); const unsigned long SEUIL_LONG = 1000; // 1 s const unsigned long FENETRE_DOUBLE = 350; // 350 ms unsigned long tDebutAppui = 0; unsigned long tDernierClic = 0; bool attenteSecondClic = false; bool appuiLongDetecte = false; void setup() { Serial.begin(115200); btn.attach(2, INPUT_PULLUP); btn.interval(25); } void loop() { btn.update(); if (btn.fell()) { // debut appui tDebutAppui = millis(); appuiLongDetecte = false; } // Detection appui long pendant que le bouton est tenu if (btn.read() == LOW && !appuiLongDetecte && (millis() - tDebutAppui > SEUIL_LONG)) { Serial.println("APPUI LONG"); appuiLongDetecte = true; } if (btn.rose()) { // relachement if (appuiLongDetecte) return; // deja traite if (attenteSecondClic && (millis() - tDernierClic < FENETRE_DOUBLE)) { Serial.println("DOUBLE CLIC"); attenteSecondClic = false; } else { attenteSecondClic = true; tDernierClic = millis(); } } // Si la fenetre double-clic expire, c'etait un simple clic if (attenteSecondClic && (millis() - tDernierClic > FENETRE_DOUBLE)) { Serial.println("SIMPLE CLIC"); attenteSecondClic = false; } } Pour plus de simplicité, regardez la librairie OneButton qui implémente nativement attachClick(), attachDoubleClick(), attachLongPressStart() — idéale pour les interfaces multi-boutons. ## 9. L'encodeur rotatif KY-040 (introduction) Quand un seul bouton ne suffit plus, l'encodeur rotatif est la suite logique : rotation gauche/droite + bouton intégré. Le KY-040 est l'un des plus répandus en Tunisie. Brochage : CLK, DT (les deux signaux quadrature), SW (bouton-poussoir intégré), +, GND. Lecture quadrature simplifiée : const byte CLK = 2; const byte DT = 3; const byte SW = 4; volatile int compteur = 0; volatile byte ancien = 0; void setup() { Serial.begin(115200); pinMode(CLK, INPUT_PULLUP); pinMode(DT, INPUT_PULLUP); pinMode(SW, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(CLK), lireEncodeur, CHANGE); } void lireEncodeur() { byte clk = digitalRead(CLK); byte dt = digitalRead(DT); if (clk == dt) compteur++; else compteur--; } void loop() { static int dernier = 0; if (compteur != dernier) { Serial.println(compteur); dernier = compteur; } } Pour un projet propre, utilisez la librairie RotaryEncoder de Matthias Hertel qui gère parfaitement les rebonds et la quadrature. ## 10. 5 patterns de code réutilisables ## Pattern A — Bouton ON/OFF (toggle) if (btn.fell()) etat = !etat; digitalWrite(LED, etat); ## Pattern B — Bouton momentané (relais tant qu'appuyé) btn.update(); digitalWrite(RELAIS, btn.read() == LOW ? HIGH : LOW); ## Pattern C — Compteur incrémental if (btn.fell()) { compteur++; Serial.println(compteur); } ## Pattern D — Sélecteur de mode cyclique (5 modes) if (btn.fell()) { mode = (mode + 1) % 5; appliquerMode(mode); } ## Pattern E — Boot mode (appui maintenu au démarrage) void setup() { pinMode(BOUTON, INPUT_PULLUP); delay(50); // stabilisation if (digitalRead(BOUTON) == LOW) { Serial.println("Mode configuration"); modeConfig = true; } } 🎓 RECOMMANDÉ ÉTUDIANTS ## Arduino UNO R3 + Kit Découverte Le combo idéal pour les étudiants ENIT, INSAT, ISBS, ISET et ESPRIT. Inclut Arduino UNO authentique, breadboard, LEDs, boutons et résistances pour démarrer. Voir les Arduino → ## FAQ — Bouton poussoir Arduino Faut-il toujours une résistance pull-up externe avec Arduino ?Non. Tous les Arduino (UNO, Nano, Mega, Leonardo) possèdent des résistances de pull-up internes activables avec pinMode(pin, INPUT_PULLUP). Vous gagnez une résistance et un câble. La résistance externe n'est nécessaire que si vous avez un câble très long (> 50 cm) ou un environnement très bruyant (proximité moteurs), où il faut une valeur plus faible (1-4,7 kΩ). Quelle est la différence entre digitalRead() et l'interruption ?digitalRead() dans la loop (polling) vérifie l'état à chaque tour : si la loop est lente, vous ratez les appuis brefs. L'interruption matérielle (attachInterrupt) déclenche immédiatement une fonction dès que la broche change, même si le processeur est occupé. Utilisez les interruptions pour les événements critiques (arrêt d'urgence, capteur rapide) et le polling pour les boutons utilisateur standards. Combien de boutons puis-je connecter sur un Arduino UNO ?L'Arduino UNO a 14 broches numériques (D0-D13) + 6 broches analogiques utilisables en numérique (A0-A5), soit 20 boutons maximum. Pour plus, utilisez un multiplexeur 74HC4051 (8 entrées sur 3 broches), un PCF8574 (8 entrées en I2C, chaînable jusqu'à 64), ou une matrice clavier 4×4 (16 boutons sur 8 broches). Pourquoi ma LED clignote au lieu de rester allumée ?Vous lisez probablement le bouton sans debounce et utilisez !etatLed dans la loop : à chaque rebond, la LED change d'état des dizaines de fois pendant l'appui. Solution : utilisez la librairie Bounce2 avec btn.fell() qui ne renvoie true qu'une seule fois par appui propre. Quelle valeur de résistance pull-up choisir ?10 kΩ est la valeur standard de référence, idéale pour 99 % des cas. 1 kΩ pour les environnements très bruyants (moteurs, contacteurs) au prix d'une consommation plus forte. 47-100 kΩ pour les projets ultra-basse consommation sur batterie. Le pull-up interne d'Arduino vaut 20-50 kΩ, ce qui est parfait dans la majorité des situations. Comment gérer 16 boutons sans utiliser 16 broches ?Trois solutions : (1) matrice clavier 4×4 sur 8 broches avec la librairie Keypad ; (2) chaînage de PCF8574 en I2C (16 boutons sur 2 broches) ; (3) division de tension avec résistances différentes lue sur une broche analogique unique (R-2R ladder, jusqu'à 8 boutons sur 1 broche). La matrice est la plus courante pour les claviers numériques. Le bouton tactile capacitif TTP223 vaut-il le coup ?Oui pour les projets premium : pas de partie mécanique (donc pas d'usure ni de rebond), détection à travers un panneau acrylique ou verre jusqu'à 5 mm. Le TTP223 expose directement un signal numérique propre, aucun debounce nécessaire. Idéal pour les interfaces de produit fini (boîtier domotique, lampe tactile, console de jeu maison). Disponible chez Didactico Tunisie. ## Conclusion Lire un bouton poussoir n'est pas trivial. C'est le sujet sur lequel les programmeurs embarqués passent leurs premières heures de débogage, et ironiquement, c'est aussi celui sur lequel ils retombent encore après dix ans d'expérience, en migrant vers un STM32 ou un ESP32-S3. Maîtrisez les cinq patterns présentés dans ce guide, ajoutez Bounce2 à votre boîte à outils, comprenez les interruptions, et 95 % des projets devient une formalité. Chez Didactico Sfax, nous tenons en stock permanent tous les composants nécessaires : boutons tactiles 6×6 mm, poussoirs 12 mm pour panneau, TTP223 capacitifs, encodeurs rotatifs KY-040, résistances 10 kΩ, breadboards 830 points et fils Dupont mâle-femelle. Pour les étudiants ENIT, INSAT, ISBS, ISET et ESPRIT, livraison 24-48h dans toute la Tunisie. Pour aller plus loin sur Arduino, lisez notre guide complet Arduino UNO R3. Si ce guide vous a aidé, partagez-le avec un camarade de promo qui galère encore avec les rebonds. La maîtrise du bouton, c'est le passage initiatique de tout maker. --- # Feu de Signalisation LED Arduino : du Tricolore au Carrefour Intelligent URL: https://didactico.tn/feu-signalisation-led-arduino-tunisie/ Résumé: Du simple feu tricolore avec delay() au carrefour 4 voies synchronisé avec détection de véhicules — apprenez la machine à états, l'écriture non-bloquante avec millis() et la programmation propre par arrays, dans un projet Arduino pédagogique progressif. Avenue Habib Bourguiba à Sfax, 7h45 du matin, un mardi de mars. Le feu tricolore au croisement avec la rue Hédi Chaker passe au vert pour les véhicules venant du sud. Pendant 47 secondes, les voitures s'écoulent. Puis vient le jaune, 4 secondes. Puis le rouge, 53 secondes — pendant que les piétons traversent et que la rue Hédi Chaker reçoit son tour. Un cycle complet dure environ 1 minute 44. Multiplié par les milliers de feux du pays, c'est l'algorithme le plus exécuté de Tunisie après le clignotant de votre voiture. Ce feu, dans son apparente banalité, est en réalité une machine à états finie d'une élégance redoutable. Quatre états (vert, jaune, rouge, rouge+bouton piéton), des transitions temporisées, des entrées asynchrones (bouton piéton, détecteur de véhicule), parfois une synchronisation entre plusieurs feux. Quand vous l'aborderez en TP de robotique à l'ISET ou à l'INSAT, vous serez surpris par la profondeur algorithmique qu'on peut y mettre. C'est pourquoi le projet "feu de signalisation" est un classique absolu de l'enseignement Arduino — et pourquoi cet article va le décortiquer en cinq versions, du débutant au carrefour intelligent. ## 📋 Table - Version 1 : feu tricolore avec delay() - Version 2 : ajout du bouton piéton - Version 3 : passage en non-bloquant avec millis() - Version 4 : carrefour 4 voies synchronisé - Version 5 : feu intelligent avec détection véhicule - Durées réelles d'un feu tunisien - La machine à états en détail - Buzzer pour piétons malvoyants - Projet maquette pour école primaire - FAQ ## Version 1 : feu tricolore avec delay() La version originelle, celle qu'on trouve dans tous les tutos en 5 minutes. Trois LEDs, trois résistances, trois delay(). Ça marche, c'est satisfaisant, et c'est la pire base de code possible pour quoi que ce soit de sérieux. ## Câblage - LED rouge → broche D2 (avec résistance 220 Ω vers GND) - LED jaune → broche D3 (avec résistance 220 Ω vers GND) - LED verte → broche D4 (avec résistance 220 Ω vers GND) Pourquoi 220 Ω ? Une LED standard tombe environ 2 V (3,2 V pour une LED bleue ou blanche). L'Arduino sort 5 V. Reste 3 V à dissiper. À 15 mA (courant sûr pour la LED et l'Arduino), R = U/I = 3 / 0,015 = 200 Ω. On arrondit à 220 Ω, valeur standard. ## Code minimum viable const uint8_t PIN_ROUGE = 2; const uint8_t PIN_JAUNE = 3; const uint8_t PIN_VERT = 4; void setup() { pinMode(PIN_ROUGE, OUTPUT); pinMode(PIN_JAUNE, OUTPUT); pinMode(PIN_VERT, OUTPUT); } void loop() { // Phase verte digitalWrite(PIN_VERT, HIGH); digitalWrite(PIN_JAUNE, LOW); digitalWrite(PIN_ROUGE, LOW); delay(30000); // 30 s vert // Phase jaune digitalWrite(PIN_VERT, LOW); digitalWrite(PIN_JAUNE, HIGH); delay(4000); // 4 s jaune // Phase rouge digitalWrite(PIN_JAUNE, LOW); digitalWrite(PIN_ROUGE, HIGH); delay(30000); // 30 s rouge } ## Le problème fondamental de delay() Quand l'Arduino exécute delay(30000), il ne fait absolument rien pendant 30 secondes. Il ne peut pas lire un bouton, pas répondre à un capteur, pas envoyer un message série, pas mettre à jour un écran. C'est un sommeil profond bloquant. Pour un feu isolé qui n'attend rien d'autre, ça suffit. Pour un feu avec bouton piéton, c'est rédhibitoire. ## Version 2 : ajout du bouton piéton On ajoute un bouton poussoir sur D5 (avec pull-up interne) et une LED piétonne (rouge/verte) sur D6/D7. L'objectif : si le piéton appuie pendant la phase verte des véhicules, on raccourcit la phase verte et on passe au cycle piéton. Première approche naïve : sonder le bouton entre les delay(). Vous découvrez vite que c'est inutilisable — le piéton appuie pendant delay(30000), et l'Arduino ne s'en aperçoit qu'après 30 secondes, soit le temps qu'il faut pour traverser à pied une avenue. Inacceptable. Deuxième approche : utiliser une interruption externe. const uint8_t PIN_BOUTON = 2; // D2 = INT0 sur UNO volatile bool demandePieton = false; void surAppui() { demandePieton = true; } void setup() { // ... pinMode des LEDs comme avant ... pinMode(PIN_BOUTON, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(PIN_BOUTON), surAppui, FALLING); }Mieux, mais l'interruption ne fait que lever un flag. Pendant delay(), le programme principal ne lit toujours pas ce flag. Conclusion : delay() doit disparaître. Place à millis(). ## Version 3 : passage en non-bloquant avec millis() La fonction millis() retourne le nombre de millisecondes écoulées depuis le démarrage de l'Arduino (overflow après 49 jours environ — gérable avec une soustraction unsigned). On l'utilise pour mesurer le temps écoulé sans bloquer. ## Pattern fondamental unsigned long debutPhase = 0; int phaseCourante = 0; void loop() { unsigned long maintenant = millis(); if (phaseCourante == 0 && (maintenant - debutPhase) >= 30000) { // 30s écoulées, on passe à la phase suivante phaseCourante = 1; debutPhase = maintenant; } // ... autres phases ... // ICI on peut lire un bouton, un capteur, etc. if (digitalRead(PIN_BOUTON) == LOW) { demandePieton = true; } }Chaque tour de loop() prend moins d'une milliseconde. L'Arduino lit le bouton 1000 fois par seconde. Le délai de réaction est imperceptible. ## Implémentation complète en machine à états enum Etat { VERT, JAUNE, ROUGE, ROUGE_AVEC_PIETON }; Etat etat = ROUGE; unsigned long debutEtat = 0; bool demandePieton = false; const unsigned long DUREE_VERT = 30000; const unsigned long DUREE_JAUNE = 4000; const unsigned long DUREE_ROUGE = 30000; const unsigned long DUREE_PIETON = 15000; void setup() { pinMode(PIN_ROUGE, OUTPUT); pinMode(PIN_JAUNE, OUTPUT); pinMode(PIN_VERT, OUTPUT); pinMode(PIN_BOUTON, INPUT_PULLUP); pinMode(PIN_LED_PIETON_R, OUTPUT); pinMode(PIN_LED_PIETON_V, OUTPUT); passerA(ROUGE); } void passerA(Etat e) { etat = e; debutEtat = millis(); // Activation des bonnes LEDs selon l'etat digitalWrite(PIN_ROUGE, etat == ROUGE || etat == ROUGE_AVEC_PIETON); digitalWrite(PIN_JAUNE, etat == JAUNE); digitalWrite(PIN_VERT, etat == VERT); digitalWrite(PIN_LED_PIETON_V, etat == ROUGE_AVEC_PIETON); digitalWrite(PIN_LED_PIETON_R, etat != ROUGE_AVEC_PIETON); } void loop() { // Lecture bouton avec anti-rebond logiciel static unsigned long dernierAppui = 0; if (digitalRead(PIN_BOUTON) == LOW && (millis() - dernierAppui) > 250) { demandePieton = true; dernierAppui = millis(); } unsigned long ecoule = millis() - debutEtat; switch (etat) { case VERT: // Si piéton demande, on raccourcit le vert a 5s min if ((demandePieton && ecoule >= 5000) || ecoule >= DUREE_VERT) { passerA(JAUNE); } break; case JAUNE: if (ecoule >= DUREE_JAUNE) { if (demandePieton) { demandePieton = false; passerA(ROUGE_AVEC_PIETON); } else { passerA(ROUGE); } } break; case ROUGE_AVEC_PIETON: if (ecoule >= DUREE_PIETON) { passerA(ROUGE); } break; case ROUGE: if (ecoule >= DUREE_ROUGE) { passerA(VERT); } break; } } ## Anti-rebond logiciel Un bouton poussoir mécanique "rebondit" : ses contacts oscillent pendant 5 à 50 ms avant de se stabiliser. Sans précaution, l'Arduino lit 5, 10, parfois 50 appuis pour une seule pression du doigt. La condition (millis() - dernierAppui) > 250 filtre cela : un nouvel appui n'est considéré qu'après 250 ms de silence. ## Version 4 : carrefour 4 voies synchronisé On passe au monde réel : un carrefour en croix avec 4 directions (Nord, Sud, Est, Ouest). En Tunisie comme partout, le pattern standard est : - Nord+Sud verts, Est+Ouest rouges (30 s) - Nord+Sud jaunes, Est+Ouest rouges (4 s) - Tous rouges (2 s — phase de sécurité "all-red") - Est+Ouest verts, Nord+Sud rouges (30 s) - Est+Ouest jaunes, Nord+Sud rouges (4 s) - Tous rouges (2 s) - Retour à l'étape 1 ## Code propre avec arrays La pire chose à faire serait de gérer 12 LEDs avec 12 variables et 12 digitalWrite() par phase. Au lieu de cela, organisons en arrays : // Indices : 0=Nord, 1=Sud, 2=Est, 3=Ouest const uint8_t pinRouge[4] = {2, 5, 8, 11}; const uint8_t pinJaune[4] = {3, 6, 9, 12}; const uint8_t pinVert[4] = {4, 7, 10, 13}; // Phases : pour chaque etat, pour chaque direction, // quelle LED allumer (R, J, V) enum Couleur { R, J, V }; struct Phase { unsigned long duree; Couleur couleurs[4]; // Nord, Sud, Est, Ouest }; const Phase phases[] = { { 30000, {V, V, R, R} }, // N+S vert { 4000, {J, J, R, R} }, // N+S jaune { 2000, {R, R, R, R} }, // all-red securite { 30000, {R, R, V, V} }, // E+O vert { 4000, {R, R, J, J} }, // E+O jaune { 2000, {R, R, R, R} } // all-red securite }; const uint8_t NB_PHASES = sizeof(phases) / sizeof(phases[0]); uint8_t phaseCourante = 0; unsigned long debutPhase = 0; void setup() { for (uint8_t d = 0; d < 4; d++) { pinMode(pinRouge[d], OUTPUT); pinMode(pinJaune[d], OUTPUT); pinMode(pinVert[d], OUTPUT); } appliquerPhase(0); } void appliquerPhase(uint8_t p) { for (uint8_t d = 0; d < 4; d++) { digitalWrite(pinRouge[d], phases[p].couleurs[d] == R); digitalWrite(pinJaune[d], phases[p].couleurs[d] == J); digitalWrite(pinVert[d], phases[p].couleurs[d] == V); } debutPhase = millis(); phaseCourante = p; } void loop() { if (millis() - debutPhase >= phases[phaseCourante].duree) { appliquerPhase((phaseCourante + 1) % NB_PHASES); } }Le code total tient en 35 lignes, fonctionne pour n'importe quel pattern de phases, et est trivialement modifiable. Ajouter une 7e phase ? Une ligne dans le tableau. Inverser une direction ? Un caractère. C'est ça, la différence entre code amateur et code propre. ## Version 5 : feu intelligent avec détection de véhicule Dans les villes modernes, les feux ne sont plus toujours temporisés bêtement. Ils adaptent leur cycle selon le trafic : si aucune voiture n'attend dans une direction, on raccourcit son vert pour libérer la direction où il y a la file. C'est ce qu'on appelle l'actuation des feux. ## Capteurs de détection Pour détecter un véhicule à proximité du feu : - LDR (photorésistance) : enterrée dans la chaussée, détecte l'ombre d'un véhicule. Solution pédagogique simple, peu fiable en pratique (météo). - Capteur infrarouge actif (HC-SR501 ou IR break-beam) : émetteur d'un côté de la voie, récepteur de l'autre. Plus fiable. - Capteur à boucle inductive : ce qui est utilisé en vrai sous l'asphalte. Détecte la masse métallique d'un véhicule. Pas réaliste à reproduire en TP. - Capteur ultrasonique HC-SR04 : pointé vers la voie, détecte par écho. Simple, peu coûteux, idéal en pédagogie. - Caméra avec traitement d'image : ESP32-CAM ou Raspberry Pi Camera + OpenCV. Plus ambitieux. ## Algorithme adaptatif const unsigned long VERT_MIN = 8000; // 8 s vert minimum const unsigned long VERT_MAX = 45000; // 45 s vert maximum const unsigned long EXTENSION = 5000; // +5 s par vehicule detecte const unsigned long TIMEOUT_DETECT = 3000; // 3s sans detection = fin unsigned long dernierVehicule = 0; void loop() { if (vehiculeDetecteSurVoieVerte()) { dernierVehicule = millis(); } if (etat == VERT) { unsigned long ecoule = millis() - debutEtat; // Pas avant le minimum if (ecoule < VERT_MIN) return; // Apres le maximum, on force le passage if (ecoule >= VERT_MAX) { passerA(JAUNE); return; } // Entre les deux : on continue tant que des vehicules passent if ((millis() - dernierVehicule) > TIMEOUT_DETECT) { passerA(JAUNE); } } }Cette logique garantit que le feu reste vert si du trafic est détecté en continu (jusqu'à 45 s max pour ne pas affamer les autres directions), mais bascule rapidement au jaune si la voie se vide. Algorithme utilisé dans toutes les villes intelligentes du monde. 🚦 PACK PROJET ## Pack LEDs + Résistances Didactico Kit de LEDs 5mm rouge/jaune/vert + résistances 220Ω + boutons poussoirs + breadboard — tout ce qu'il faut pour bâtir votre feu de signalisation. Idéal TP étudiants ou maquette pédagogique. Voir les composants → ## Durées réelles d'un feu tunisien Pour un projet pédagogique crédible, il est utile de connaître les ordres de grandeur réels appliqués par la Direction Générale des Transports Routiers en Tunisie : PhaseDurée typiquePlage observée Vert véhicules en heure de pointe40-60 s30-90 s sur grands axes Vert véhicules hors pointe20-30 s15-40 s Jaune3-4 s3-5 s (norme internationale) Rouge total (all-red sécurité)1-2 s0-3 s Rouge véhicules (= vert autre direction)30-60 s20-90 s Vert piéton10-15 s5-25 s selon largeur du passage Rouge piéton clignotant (fin de phase)5-8 s3-10 s Cycle complet60-120 s40-180 s Notez que le jaune fait toujours 3 à 4 secondes — c'est une norme de sécurité internationale calée sur le temps moyen de réaction d'un conducteur (1 s) plus le temps de freinage à 50 km/h (2-3 s). Faire un jaune de 1 s, c'est garantir des accidents. ## La machine à états en détail Le diagramme d'états d'un feu avec bouton piéton se représente classiquement ainsi : ┌──────────────┐ │ ROUGE (init) │◄──────────────────────┐ └──────┬───────┘ │ │ 30s écoulées │ ▼ │ ┌──────────────┐ │ │ VERT │ │ └──┬───────────┘ │ │ ▲ bouton piéton (rapide) │ │ │ │ │ 30s OU bouton+5s minimum │ ▼ │ ┌──────────────┐ │ │ JAUNE │ │ └──┬───────────┘ │ │ 4s, bouton actif ? │ │ ┌─────────────────────────┐ │ │ ▼ │ │ │ ┌──────────────────┐ │ │ │ │ROUGE_AVEC_PIETON │──15s─────┤ │ │ └──────────────────┘ │ │ │ │ │ └───────────────────────────────┴───┘ non 30s Cette représentation visuelle est précieuse au moment de la conception. Avant d'écrire une ligne de code, dessinez votre machine à états sur papier. Vous identifierez les transitions impossibles, les états absorbants, les conditions de course. Tous les bugs de logique se révèlent au tableau, pas au moniteur série. ## Buzzer pour piétons malvoyants Dans les pays développés, et de plus en plus en Tunisie (autour des écoles, hôpitaux, gares), les feux piétons sont équipés d'un signal sonore. La norme française NF S 32-002, souvent reprise en Tunisie, prévoit : - Pendant le vert piéton : son périodique aigu (440 Hz environ, équivalent au La 4 musical) à raison de 2 bips par seconde, audible à 10 m mais pas perçant au-delà de 30 m. - Pendant le rouge piéton : silence ou son grave intermittent espacé (signale aux malvoyants où se trouve le poteau). - Volume réglable selon le bruit ambiant (5 dB au-dessus du bruit de fond, mesuré toutes les minutes). Implémentation en Arduino avec buzzer piezo passif : const uint8_t PIN_BUZZER = 8; const int FREQ_TRAVERSEE = 440; const int FREQ_POTEAU = 220; void gererBuzzer(Etat e) { static unsigned long dernier = 0; static bool sonActif = false; unsigned long maintenant = millis(); if (e == ROUGE_AVEC_PIETON) { // 2 bips par seconde, durée 100 ms if (!sonActif && (maintenant - dernier) >= 400) { tone(PIN_BUZZER, FREQ_TRAVERSEE); sonActif = true; dernier = maintenant; } else if (sonActif && (maintenant - dernier) >= 100) { noTone(PIN_BUZZER); sonActif = false; dernier = maintenant; } } else { // Son discret du poteau toutes les 2s if (!sonActif && (maintenant - dernier) >= 2000) { tone(PIN_BUZZER, FREQ_POTEAU); sonActif = true; dernier = maintenant; } else if (sonActif && (maintenant - dernier) >= 80) { noTone(PIN_BUZZER); sonActif = false; dernier = maintenant; } } } ## Projet maquette pour école primaire Le projet "feu de signalisation" est aussi un magnifique support pédagogique pour les écoles primaires tunisiennes : code de la route, sciences électriques, programmation visuelle. Voici un kit clé en main pour réaliser une maquette de carrefour didactique destinée à des enfants de 8-12 ans. ## Cahier des charges adapté - Maquette en plexiglas découpé au laser (FabLab Sfax peut faire la découpe) représentant un carrefour avec routes peintes, trottoirs, passages piétons. - 4 feux véhicules (mâts en tube PVC blanc avec LEDs 5mm encastrées dans des perles décoratives translucides). - 4 feux piétons (LEDs rouge/verte). - 4 boutons piétons placés sur les trottoirs. - Programmation Arduino avec interrupteur "mode automatique" ou "mode interactif" (les enfants pilotent eux-mêmes les feux). - Petits véhicules en bois ou impression 3D pour mise en situation. - Mode "démonstration" qui parle (via module DFPlayer Mini et MP3) : "Le feu est rouge, les voitures s'arrêtent". ## Pédagogie associée - Séance 1 : observation du carrefour réel, prise de notes des phases observées avec chronomètre. - Séance 2 : montage électrique (les enfants insèrent les LEDs et résistances dans une breadboard pré-câblée). - Séance 3 : programmation visuelle (Scratch for Arduino ou MakerBlock) pour modifier les durées des phases. - Séance 4 : règle d'or du jaune, traversée piétonne, sécurité routière. - Séance 5 : présentation aux autres classes, démonstration du carrefour intelligent qui détecte les voitures. Coût du kit chez Didactico : moins de 100 DT pour le matériel électronique. L'effet sur des enfants qui voient leur maquette s'animer, c'est inestimable. ## FAQ Pourquoi utiliser une résistance avec chaque LED ?Une LED est une diode : sa tension est presque constante (2 V environ pour rouge/jaune/vert standard), mais son courant peut monter à l'infini si rien ne le limite. Sans résistance, vous tirez 50, 100, 500 mA et vous détruisez à la fois la LED et la broche Arduino (qui supporte 20 mA max recommandé, 40 mA absolu). 220 Ω limite à 13-15 mA, dans les clous. Mon code avec millis() ne marche pas après 49 jours, pourquoi ?millis() retourne un unsigned long (32 bits) qui déborde à 4 294 967 295 ms ≈ 49 jours 17 heures. Si vous écrivez millis() > 30000, ça marche en début de vie de l'Arduino mais peut planter au bout de 49 jours. Solution propre : toujours soustraire — (millis() - debutPhase) >= 30000. Cette soustraction reste correcte même au passage de l'overflow (arithmétique unsigned modulo 2^32). Faut-il un transistor pour piloter les LEDs ?Non, pas pour des LEDs 5 mm standard. Une broche Arduino sort 20 mA confortablement, ce qui suffit pour une LED bien lumineuse avec 220 Ω. Le transistor devient nécessaire si vous voulez piloter une rampe de plusieurs LEDs en parallèle, une LED de puissance (1 W ou plus), ou un éclairage 12 V (auquel cas un MOSFET IRLZ44N est idéal). Comment synchroniser plusieurs Arduinos pour un grand projet de plusieurs carrefours ?Plusieurs approches : (1) un seul Arduino Mega avec beaucoup de broches qui pilote tout — simple, fiable. (2) Plusieurs Arduinos communiquant en I2C (un maître, plusieurs esclaves) — plus modulaire. (3) Plusieurs ESP32 en WiFi avec MQTT — moderne, scalable, idéal pour un projet "smart city" simulé. Comment éviter le scintillement des LEDs ?Le scintillement vient en général d'un delay() mal placé ou d'un analogWrite() qui passe par PWM. Pour un feu de signalisation simple en logique numérique pure (HIGH/LOW), il ne devrait pas y avoir de scintillement. Si vous voyez de l'instabilité, vérifiez votre alimentation (USB peut être bruyante — testez avec une alim externe stable) et vos masses (tous les GND doivent être connectés). Peut-on faire ce projet sans Arduino, juste avec des composants discrets ?Oui, et c'est même l'origine historique. Avec un NE555 en mode astable et quelques bascules CD4017, on peut bâtir un feu tricolore 100 % analogique. Mais on perd toute la souplesse : pas de bouton piéton, pas de détection de véhicule, pas de modification de durées sans changer les composants. L'Arduino est la voie moderne. Quel est le bon nombre de LEDs par projet ?Pour un feu simple : 3 LEDs. Pour un feu avec piéton : 5 LEDs. Pour un carrefour 4 voies : 12 LEDs (3 par direction). Pour un carrefour avec piétons sur les 4 directions : 20 LEDs. À partir de 12-15 LEDs sur un UNO, vérifiez bien que votre consommation totale reste sous 200 mA pour rester safe sur l'alimentation. Pour 30+ LEDs, passez à un Arduino Mega ou ajoutez des shift registers 74HC595. ## Conclusion Le projet feu de signalisation est l'un des plus beaux outils pédagogiques de l'écosystème Arduino. Il commence par trois LEDs et trois delay() que tout débutant maîtrise en une heure. Il finit par une machine à états multi-direction synchronisée avec détection de véhicules en temps réel — un projet de niveau ingénieur. Entre les deux, vous traversez la quasi-totalité des concepts fondamentaux de la programmation embarquée : machines à états, programmation non-bloquante, anti-rebond, interruptions, organisation par arrays. Chez Didactico, vous trouverez tout le nécessaire : Arduino UNO ou Mega, LEDs 5 mm rouge/jaune/vert en kit de 100, résistances 220 Ω en sachet, boutons poussoirs, breadboards, jumpers. Pour les enseignants, des packs spécifiques "feu de signalisation" sont disponibles. Livraison sous 24 à 48 heures partout en Tunisie depuis Sfax. Le FabLab Sfax est aussi un excellent endroit pour faire découper au laser un boîtier élégant qui transformera votre breadboard en maquette présentable. Que vous soyez étudiant à l'ENIT, à l'INSAT, à l'ISBS, à l'ISET, ou enseignant en école primaire, le feu de signalisation reste l'archétype du projet qui enseigne plus que ce qu'il montre. --- # HC-SR04 Arduino : Mesurer une Distance avec Précision en Tunisie URL: https://didactico.tn/hc-sr04-mesurer-distance-arduino-tunisie/ Résumé: Maîtrisez le HC-SR04 avec Arduino en Tunisie : formules, code NewPing, filtrage médian, 3 projets concrets et version étanche JSN-SR04T. Il était 23 h dans un atelier poussiéreux de Sfax. Un étudiant de l'ENIT, penché sur sa breadboard, tentait depuis trois heures de stabiliser la lecture d'un capteur HC-SR04 destiné à un projet de parking intelligent. Les mesures sautaient de 12 cm à 287 cm sans raison. Le diagnostic ? Aucun condensateur de découplage, un câble jumper trop long, et surtout : aucun filtrage logiciel. Trente minutes plus tard, après ajout d'un filtre médian sur 5 mesures et passage à la librairie NewPing, son capteur affichait une précision de ±3 mm. Le HC-SR04 n'est pas un mauvais capteur — c'est un capteur qu'on comprend mal. Dans ce guide complet, vous allez apprendre à le maîtriser comme un ingénieur : de la physique des ultrasons à 40 kHz jusqu'aux projets industriels que nous montons au FabLab Sfax. Table des matières - 1. Comment fonctionne réellement le HC-SR04 - 2. Brochage et câblage propre - 3. Code basique avec pulseIn() - 4. Correction selon la température tunisienne - 5. Passer au niveau pro avec NewPing - 6. Filtrage médian et moyenne glissante - 7. Lecture non-bloquante avec NewPingTimer - 8. Trois projets complets - 9. JSN-SR04T : la version étanche extérieur - 10. Multi-capteurs sans interférence - FAQ ## 1. Comment fonctionne réellement le HC-SR04 Le HC-SR04 est un capteur de distance par ultrasons composé de deux transducteurs piézoélectriques : un émetteur (T) et un récepteur (R). Lorsque vous envoyez une impulsion HIGH d'au moins 10 µs sur la broche TRIG, le module génère automatiquement une rafale de 8 cycles à 40 kHz. Cette onde ultrasonore se propage dans l'air, frappe un obstacle, rebondit, et revient au récepteur. La broche ECHO passe à HIGH dès l'émission et retombe à LOW à la réception. La durée pendant laquelle ECHO reste à HIGH correspond donc au temps d'aller-retour (Time of Flight). La formule fondamentale est distance = (vitesse_son × temps) / 2. À 20 °C, la vitesse du son dans l'air sec est de 343 m/s, soit 0,0343 cm/µs. On obtient donc la formule pratique : distance (cm) = durée (µs) / 58,2. Mais attention : à Sfax en juillet, il fait facilement 38 °C, et la vitesse du son grimpe à 354 m/s. Si vous utilisez la constante 58,2 sans correction, vous accumulez 3 % d'erreur, soit 6 mm sur 20 cm. ## Plage de mesure réelle Le datasheet annonce 2 cm à 400 cm. En pratique, voici ce que nous mesurons en laboratoire à Didactico : Distance ciblePrécision typiqueConditions 2 - 30 cm±2 mmSurface plane perpendiculaire 30 - 150 cm±5 mmConditions idéales 150 - 300 cm±1 cmPas de courants d'air 300 - 400 cm±3 cmSurface large et dure > 400 cmInutilisableTrop d'atténuation ## 2. Brochage et câblage propre Le HC-SR04 possède 4 broches : VCC (5V), TRIG (entrée), ECHO (sortie), GND. Sur Arduino UNO R3, un câblage typique : - VCC → 5V de l'Arduino - GND → GND - TRIG → broche numérique 9 - ECHO → broche numérique 10 Piège classiqueLe HC-SR04 fonctionne en 5V. Si vous l'utilisez avec un ESP32 ou un Raspberry Pi (3,3V logique), placez un pont diviseur 1kΩ / 2kΩ sur la broche ECHO sinon vous risquez d'endommager le microcontrôleur. La version HC-SR04+ disponible chez Didactico accepte directement le 3,3V. ## 3. Code basique avec pulseIn() Voici le code minimal sans aucune librairie. Il fonctionne, mais nous verrons ses limites : // HC-SR04 - Version basique avec pulseIn() // Didactico Tunisie - didactico.tn const byte TRIG = 9; const byte ECHO = 10; void setup() { Serial.begin(115200); pinMode(TRIG, OUTPUT); pinMode(ECHO, INPUT); digitalWrite(TRIG, LOW); } void loop() { // 1) Impulsion de declenchement : 10 us a HIGH digitalWrite(TRIG, LOW); delayMicroseconds(2); digitalWrite(TRIG, HIGH); delayMicroseconds(10); digitalWrite(TRIG, LOW); // 2) Lecture de la duree d'echo (timeout 30 ms = ~5 m) unsigned long duree = pulseIn(ECHO, HIGH, 30000UL); // 3) Conversion en centimetres (formule a 20 C) float distance_cm = duree / 58.2; if (duree == 0) { Serial.println("Hors plage"); } else { Serial.print("Distance : "); Serial.print(distance_cm, 1); Serial.println(" cm"); } delay(100); // 10 lectures par seconde max } Ce code marche, mais il bloque le programme pendant l'attente de l'écho (jusqu'à 30 ms par mesure). Pour un projet qui ne fait que mesurer une distance, c'est acceptable. Pour un robot qui doit aussi lire un joystick, gérer un afficheur OLED et communiquer en Wi-Fi, c'est rédhibitoire. ## 4. Correction selon la température tunisienne La vitesse du son varie selon la formule : v = 331,3 + 0,606 × T (T en °C, v en m/s). En Tunisie, on passe facilement de 12 °C en janvier à 42 °C en août. Voici l'impact concret : TempératureVitesse son (m/s)Facteur (µs/cm)Erreur si on garde 58,2 10 °C337,459,3+1,9 % 20 °C343,458,2référence 30 °C349,557,2-1,7 % 40 °C355,556,3-3,4 % Si la précision compte (cuve d'eau, métrologie, projet académique noté), couplez le HC-SR04 avec un capteur de température DS18B20 ou un DHT22 : #include DHT dht(2, DHT22); float distanceCompensee() { float T = dht.readTemperature(); if (isnan(T)) T = 25.0; // fallback float vitesse = 331.3 + 0.606 * T; // m/s float facteur = 20000.0 / vitesse; // us pour parcourir 1 cm aller-retour digitalWrite(TRIG, LOW); delayMicroseconds(2); digitalWrite(TRIG, HIGH); delayMicroseconds(10); digitalWrite(TRIG, LOW); unsigned long t = pulseIn(ECHO, HIGH, 30000UL); if (t == 0) return -1.0; return t / facteur; } 📡 CAPTEUR PHARE ## HC-SR04 Capteur Ultrason 3,3V/5V Le capteur de distance le plus populaire au monde, version compatible 3,3V et 5V. Stock permanent à Sfax, livraison 24-48h partout en Tunisie. Voir le HC-SR04 → ## 5. Passer au niveau pro avec NewPing La librairie NewPing de Tim Eckel est, depuis 2012, la référence absolue pour piloter des capteurs ultrasons sur Arduino. Elle remplace pulseIn() par une lecture interne plus rapide, gère le timeout matériel, intègre la correction de température et permet le multi-capteurs. Installation : Outils → Gérer les bibliothèques → chercher "NewPing". #include #define TRIG_PIN 9 #define ECHO_PIN 10 #define MAX_DISTANCE 300 // cm NewPing sonar(TRIG_PIN, ECHO_PIN, MAX_DISTANCE); void setup() { Serial.begin(115200); } void loop() { delay(50); // 50 ms minimum entre deux pings unsigned int distance = sonar.ping_cm(); Serial.print(distance); Serial.println(" cm"); } NewPing expose aussi ping_median(iterations) qui réalise 5 (ou plus) mesures et renvoie la médiane — exactement ce qu'il faut pour éliminer les valeurs aberrantes. ## 6. Filtrage médian et moyenne glissante Un capteur ultrason renvoie occasionnellement des valeurs absurdes : un courant d'air, une réflexion parasite sur un obstacle latéral, ou simplement le bruit électrique d'un moteur PWM voisin. Deux techniques se complètent. ## Filtrage médian (robuste aux outliers) On prend 5 mesures, on les trie, et on garde celle du milieu. Une seule valeur folle dans le lot est automatiquement écartée. float medianDistance() { float v[5]; for (int i = 0; i < 5; i++) { v[i] = sonar.ping_cm(); delay(30); } // Tri par insertion (5 elements, c'est trivial) for (int i = 1; i < 5; i++) { float k = v[i]; int j = i - 1; while (j >= 0 && v[j] > k) { v[j+1] = v[j]; j--; } v[j+1] = k; } return v[2]; // valeur mediane } ## Moyenne glissante exponentielle (lissage continu) float distanceLissee = 0; const float ALPHA = 0.3; // 0.1 = tres lisse, 0.5 = reactif void loop() { float brut = sonar.ping_cm(); if (brut > 0) { distanceLissee = ALPHA * brut + (1 - ALPHA) * distanceLissee; } Serial.println(distanceLissee, 1); } Astuce de proCombinez les deux : un filtre médian sur 5 mesures pour éliminer les outliers, suivi d'une moyenne glissante exponentielle pour lisser. Vos lectures deviennent stables au millimètre près. C'est l'approche que nous enseignons aux étudiants INSAT lors de nos workshops au FabLab Sfax. ## 7. Lecture non-bloquante avec NewPingTimer Dans un robot ou un projet IoT, vous ne pouvez pas vous permettre d'attendre 30 ms à chaque mesure. NewPing fournit ping_timer() qui déclenche une interruption Timer2 dès qu'un écho revient : #include NewPing sonar(9, 10, 300); unsigned long prochain = 0; volatile unsigned int distanceCm = 0; void echoRecu() { if (sonar.check_timer()) { distanceCm = sonar.ping_result / US_ROUNDTRIP_CM; } } void loop() { if (millis() >= prochain) { prochain = millis() + 50; sonar.ping_timer(echoRecu); } // ICI vous pouvez gerer LCD, Wi-Fi, moteurs, etc. // sans aucun blocage } ## 8. Trois projets complets ## Projet 1 — Alarme de distance (anti-intrusion) Buzzer actif sur D8, LED rouge sur D7. Quand un objet passe sous 30 cm, alarme. #include NewPing sonar(9, 10, 200); const byte BUZZER = 8; const byte LED = 7; const int SEUIL = 30; void setup() { pinMode(BUZZER, OUTPUT); pinMode(LED, OUTPUT); } void loop() { delay(50); unsigned int d = sonar.ping_median(5) / US_ROUNDTRIP_CM; if (d > 0 && d < SEUIL) { digitalWrite(LED, HIGH); tone(BUZZER, 2000); } else { digitalWrite(LED, LOW); noTone(BUZZER); } } ## Projet 2 — Niveau d'eau dans une cuve (très utile en Tunisie) Le HC-SR04 est fixé au sommet d'une cuve de 1,5 m. Hauteur du capteur au fond = 150 cm. Niveau d'eau = 150 - distance mesurée. const float HAUTEUR_CUVE = 150.0; // cm const float CAPACITE_LITRES = 1000.0; void loop() { delay(500); unsigned int d = sonar.ping_median(7) / US_ROUNDTRIP_CM; if (d == 0 || d > HAUTEUR_CUVE) return; float niveauCm = HAUTEUR_CUVE - d; float pourcentage = (niveauCm / HAUTEUR_CUVE) * 100.0; float litres = (niveauCm / HAUTEUR_CUVE) * CAPACITE_LITRES; Serial.print(litres, 0); Serial.print(" L ("); Serial.print(pourcentage, 0); Serial.println(" %)"); } Combiné à un ESP32 et MQTT, vous avez un système de monitoring de citerne accessible depuis votre téléphone — projet idéal pour les zones rurales du sud tunisien. ## Projet 3 — Aide au stationnement (parking assist) Trois zones sonores : vert (> 80 cm), jaune (40-80 cm, bip lent), rouge (< 40 cm, bip rapide), STOP (< 15 cm, son continu). void loop() { unsigned int d = sonar.ping_median(5) / US_ROUNDTRIP_CM; if (d == 0) { noTone(BUZZER); return; } if (d > 80) noTone(BUZZER); else if (d > 40) { tone(BUZZER, 1500); delay(80); noTone(BUZZER); delay(400); } else if (d > 15) { tone(BUZZER, 2000); delay(80); noTone(BUZZER); delay(150); } else tone(BUZZER, 2500); } 🤖 KIT DEBUTANT ## Arduino UNO R3 + Pack Capteurs UNO authentique, breadboard 830 points, jumpers, HC-SR04, LEDs et résistances. Tout pour démarrer vos projets en moins de 30 minutes. Voir les kits → ## 9. JSN-SR04T : la version étanche extérieur Le HC-SR04 classique n'aime ni l'humidité, ni la poussière, ni les variations brutales de température. Pour un projet extérieur (cuve d'eau exposée, capteur de proximité sur portail, robot d'exploration), la solution est le JSN-SR04T : capteur unique étanche IP67 séparé de l'électronique par un câble de 2,5 m. Brochage identique au HC-SR04, code identique avec NewPing. Portée typique : 25 cm à 450 cm, précision ±1 cm. Disponible chez Didactico avec connecteur étanche. ## 10. Multi-capteurs sans interférence Si vous installez 4 HC-SR04 sur un robot (avant, arrière, gauche, droite), ils ne doivent jamais émettre simultanément, sinon ils captent les échos des autres. NewPing fournit NewPing::timer_ms(34, sequenceSonars) qui orchestre proprement la séquence : #include #define NB 4 NewPing sonars[NB] = { NewPing(2, 3, 200), NewPing(4, 5, 200), NewPing(6, 7, 200), NewPing(8, 9, 200) }; unsigned int cm[NB]; byte courant = 0; void setup() { Serial.begin(115200); NewPing::timer_ms(33, suivant); } void suivant() { if (courant > 0) cm[courant - 1] = sonars[courant - 1].ping_result / US_ROUNDTRIP_CM; if (courant == NB) { courant = 0; for (byte i = 0; i < NB; i++) { Serial.print(cm[i]); Serial.print(' '); } Serial.println(); } sonars[courant].ping_timer(echo); courant++; } void echo() { if (sonars[courant - 1].check_timer()) sonars[courant - 1].ping_result = sonars[courant - 1].ping_result; } ## Les 5 erreurs qui ruinent votre projet - Alimentation faible : le HC-SR04 consomme jusqu'à 15 mA en pic. Si vous l'alimentez via la sortie 3,3V d'un Arduino UNO (limitée à 50 mA totaux), il devient instable. Toujours sur 5V. - Surface molle ou inclinée : un tapis absorbe les ultrasons, une vitre les renvoie ailleurs. Testez sur surface plane et dure. - Cône de mesure de 30° : le faisceau s'élargit avec la distance. Un obstacle de 10 cm de large à 2 m peut être manqué. - Pas de masse commune : si capteur et Arduino sont alimentés séparément, reliez impérativement les GND. - Fréquence d'échantillonnage trop élevée : minimum 50 ms entre deux pings, sinon les échos précédents polluent. ## FAQ — HC-SR04 Arduino en Tunisie Le HC-SR04 fonctionne-t-il en 3,3V comme sur ESP32 ?Le HC-SR04 standard nécessite 5V. Sur ESP32 (logique 3,3V), placez un pont diviseur (1kΩ + 2kΩ) sur la broche ECHO pour ramener le signal à 3,3V. Sinon, optez pour la version HC-SR04+ ou HC-SR04P qui accepte nativement 3,3V — c'est celle que nous recommandons chez Didactico pour tout projet ESP32 ou Raspberry Pi. Quelle est la différence entre HC-SR04 et JSN-SR04T ?Le HC-SR04 est un module compact avec ses deux transducteurs visibles, conçu pour usage intérieur. Le JSN-SR04T sépare l'électronique d'un transducteur étanche (IP67) relié par câble de 2,5 m. Idéal pour mesurer un niveau d'eau dans une cuve, un capteur de portail, ou tout projet exposé aux intempéries du climat tunisien. Pourquoi mon HC-SR04 renvoie-t-il 0 cm ou des valeurs incohérentes ?Trois causes principales : (1) timeout dépassé (objet trop loin ou absorbant), (2) câblage défectueux ou GND non commun, (3) interférence d'un autre capteur ultrason à proximité. Activez la sortie série, ajoutez un filtre médian sur 5 mesures, et vérifiez l'alimentation (idéalement 5V avec condensateur de 100 µF en parallèle). Combien de HC-SR04 puis-je connecter sur un Arduino UNO ?Jusqu'à 15 capteurs avec la librairie NewPing en mode multi-capteurs (un timer matériel orchestre les déclenchements pour éviter les interférences). Au-delà, passez à un Arduino Mega 2560 ou un ESP32. Au FabLab Sfax, nous avons construit un robot d'évitement avec 6 capteurs orientés à 60° les uns des autres. Le HC-SR04 mesure-t-il à travers une vitre ?Non. Les ultrasons à 40 kHz sont presque entièrement réfléchis par le verre. Le capteur mesure la distance à la vitre, pas à l'objet derrière. Pour mesurer à travers, il faut un capteur radar 24 GHz (type RCWL-0516 ou LD2410) — également disponibles chez Didactico. Quelle précision réelle en projet académique ?Avec un code basique : ±1 à 2 cm. Avec NewPing + filtre médian sur 5 mesures + compensation de température : ±2 à 5 mm sur la plage 5-100 cm. C'est largement suffisant pour un projet de fin d'études ISET, INSAT ou ENIT. Pour de la métrologie millimétrique, passez au VL53L0X (laser ToF, ±3 mm jusqu'à 2 m). Comment alimenter un projet HC-SR04 sur batterie ?Le HC-SR04 consomme 15 mA actif et 2 mA en veille. Sur une batterie Li-ion 18650 de 3000 mAh à travers un step-up MT3608, comptez 80-100 heures d'autonomie en mesure continue toutes les 500 ms, ou plusieurs semaines si vous utilisez le sleep mode de l'Arduino entre les mesures (librairie LowPower.h). ## Conclusion Le HC-SR04 est l'archétype du capteur qui semble simple en surface et révèle une profondeur insoupçonnée à mesure qu'on l'utilise. De la mesure brute à 1 cm près jusqu'au système multi-capteurs millimétrique avec compensation thermique, c'est probablement le composant qui m'a le plus appris en électronique embarquée. Si vous démarrez, prenez un HC-SR04 et un Arduino UNO, suivez les exemples de ce guide étape par étape, et en une après-midi vous aurez compris des concepts qui resservent dans 80 % des projets capteurs. Chez Didactico Tunisie, nous tenons en stock permanent à Sfax les HC-SR04 (versions 5V et 3,3V/5V), les JSN-SR04T étanches, les DS18B20 pour compensation thermique, et tous les Arduino UNO R3 authentiques. Livraison 24-48h dans toute la Tunisie (Tunis, Sousse, Sfax, Bizerte, Gabès, Nabeul, Monastir, Kairouan…). Pour aller plus loin, consultez notre guide complet Arduino UNO R3 et 10 projets pour débutants. Et vous, quel projet montez-vous avec un HC-SR04 ? Partagez en commentaire — les meilleures idées rejoindront nos prochains tutoriels FabLab. --- # Raspberry Pi Zero : 65×30 mm de Puissance Linux pour vos Projets IoT URL: https://didactico.tn/raspberry-pi-zero-guide-projets-tunisie/ Résumé: Guide complet du Raspberry Pi Zero en Tunisie : specs, GPIO, installation Raspberry Pi OS, 3 projets IoT détaillés (caméra, météo, serveur Flask). Livraison 24-48h Sfax. Cambridge, Royaume-Uni, automne 2012. Dans un petit bureau de la Fondation Raspberry Pi, Eben Upton tient entre ses doigts un rectangle de plastique vert pas plus grand qu'une carte de crédit. Son obsession : donner à chaque enfant du monde un véritable ordinateur, programmable, hackable, à un prix qui ne soit pas un obstacle. Trois ans plus tard, en novembre 2015, la fondation crée la stupéfaction en commercialisant le Raspberry Pi Zero à 5 dollars. Une machine Linux complète, dans un format de 65×30 mm, distribuée gratuitement avec le magazine MagPi. Aujourd'hui en Tunisie, cette même philosophie continue de transformer des projets de PFE, des FabLabs et des startups IoT. Plongeons dans l'univers du plus petit géant de l'informatique embarquée. ## 📋 Table des matières - Histoire de la Fondation Raspberry Pi - La famille Zero : v1.3, Zero W, Zero 2 W - GPIO 40 pins et niveau logique 3.3V - Installation Raspberry Pi OS et SSH headless - Projet 1 — Caméra surveillance MotionEyeOS - Projet 2 — Station météo BME280 + Grafana - Projet 3 — Serveur Flask DHT22 + API REST - Alimentation, boîtier 3D et performances - Cas d'usage industriels en Tunisie - FAQ Raspberry Pi Zero ## Histoire de la Fondation Raspberry Pi : éducation avant tout Quand Eben Upton et ses collègues du laboratoire informatique de l'Université de Cambridge fondent la Raspberry Pi Foundation en 2008, le constat est inquiétant : le niveau des étudiants en informatique chute, les enfants ne touchent plus à de vraies machines, ils ne font que consommer. Le mantra devient « a computer for kids ». L'objectif n'est pas de vendre du matériel pour faire du chiffre — la Fondation est une organisation caritative — mais de fournir un outil pédagogique abordable, ouvert, hackable. Le premier Raspberry Pi modèle B sort en février 2012. En 6 ans, plus de 25 millions d'unités sont écoulées. En novembre 2015, la fondation pousse l'idée jusqu'à l'extrême avec le Pi Zero : un SoC BCM2835, 512 Mo de RAM, le tout pour 5$. La machine est tellement demandée qu'elle devient introuvable pendant des mois. Aujourd'hui en Tunisie, le Pi Zero W (avec WiFi/Bluetooth) et le Pi Zero 2 W (quad-core) sont les références pour tout projet IoT à faible coût. 💡 Le saviez-vous ? La Raspberry Pi Foundation a aussi développé un programme massif d'éducation : Code Club, CoderDojo, et plus de 100 000 enseignants formés à travers le monde. En Tunisie, plusieurs écoles primaires et lycées suivent ce modèle dans leurs clubs robotique. ## La famille Zero : v1.3 vs Zero W vs Zero 2 W Avant d'acheter, il faut comprendre les trois versions qui cohabitent. Le tableau ci-dessous compare les caractéristiques clés : ## Spécifications comparées - Pi Zero v1.3 — SoC BCM2835, ARM1176JZF-S mono-cœur à 1 GHz, 512 Mo RAM LPDDR2, pas de WiFi, pas de Bluetooth, mini HDMI, micro USB OTG, connecteur caméra CSI. Idéal pour des projets où la connectique n'est pas critique (data logger SD card, robot autonome). - Pi Zero W / WH — Même SoC BCM2835, mais on ajoute la puce Cypress CYW43438 qui apporte le WiFi 2.4 GHz et le Bluetooth 4.1. La version WH a les pins GPIO pré-soudés (gain de temps énorme pour prototypage rapide). C'est le modèle le plus polyvalent pour 95% des projets IoT. - Pi Zero 2 W — Sortie fin 2021. Saut de performance majeur : SoC BCM2710A1 quad-core ARM Cortex-A53 à 1 GHz, soit la même puce que le Pi 3. Toujours 512 Mo de RAM (la limitation principale), mais avec 4× plus de cœurs CPU, on parle de gain réel de 3 à 4× sur les charges parallélisables. WiFi 2.4 GHz + Bluetooth 4.2 inclus. ## Lequel choisir ? Pour un projet web (serveur Flask, dashboard, REST API), le Zero 2 W est obligatoire — le mono-cœur du Zero W étrangle Python sous Flask en quelques requêtes. Pour un data logger lent (lecture I2C toutes les 5 minutes), le Zero W suffit largement. Pour un projet hors ligne sans réseau (capteur GPS, enregistreur SD), le Zero v1.3 économique fait l'affaire. ⚠️ Attention Le Pi Zero v1.3 sans WiFi est devenu rare. Sur didactico.tn, privilégiez la version Zero W ou Zero 2 W qui couvrent la quasi-totalité des besoins IoT modernes. ## GPIO 40 pins : compatibilité Pi 3/4 et le piège du 3.3V Tous les Pi Zero partagent le même connecteur 40 pins GPIO que les Pi 3, Pi 4 et Pi 5. C'est une décision d'ingénierie majeure : un projet conçu sur Pi 4 peut être miniaturisé sur Zero sans réécrire une ligne de code. Le brochage standard inclut : - 2× UART (TX/RX) pour communiquer avec Arduino, modules GPS ou modems - 1× SPI principal (MOSI/MISO/SCLK + 2 CE) pour écrans TFT rapides ou ADC MCP3008 - 1× I2C principal (SDA1/SCL1) pour capteurs BME280, OLED, RTC DS3231 - 4× canaux PWM hardware pour moteurs et LED - 5V (2 pins), 3.3V (2 pins), GND (8 pins) ⚠️ Niveau logique 3.3V STRICT Contrairement à un Arduino UNO qui tolère du 5V sur ses pins digitaux, les GPIO du Raspberry Pi sont en 3.3V uniquement. Brancher un capteur 5V (ex. DHT11 alimenté en 5V, capteur ultrason HC-SR04 sortie ECHO en 5V) grille définitivement le SoC. Utilisez systématiquement un convertisseur de niveau bidirectionnel (TXS0108E, ou simple pont diviseur résistif 1k/2k pour les signaux unidirectionnels). ## Installation Raspberry Pi OS et SSH headless L'installation moderne passe exclusivement par Raspberry Pi Imager (téléchargeable sur raspberrypi.com). C'est l'outil officiel qui a remplacé NOOBS depuis 2020. Voici la procédure complète pour un setup headless (sans écran ni clavier) : ## Étapes Raspberry Pi Imager - Insérer une carte microSD de 16 Go minimum (classe A1 recommandée — SanDisk Ultra ou Samsung EVO Plus) - Lancer Imager, choisir « Raspberry Pi Zero 2 W » (ou la version Zero) - OS recommandé : Raspberry Pi OS Lite (64-bit) pour Zero 2 W, 32-bit pour Zero W - Cliquer sur l'icône engrenage ⚙ pour ouvrir les options avancées ## Configuration avancée à remplir impérativement # Dans Raspberry Pi Imager > Settings : Hostname : pi-zero-iot.local Enable SSH : ✓ Use password authentication Username : didactico Password : un_mot_de_passe_fort_24_caracteres Configure wireless LAN : SSID : VotreReseauWiFi Password : motdepasseWiFi Country : TN (très important pour les canaux 2.4GHz légaux) Locale settings : Time zone : Africa/Tunis Keyboard layout : fr (azerty) Une fois ces champs validés, écrivez l'image. Insérez la SD dans le Pi Zero, alimentez via micro USB (5V/2A minimum). Au bout de 90 secondes, le Pi rejoint votre WiFi. ## Première connexion SSH depuis Windows/Mac/Linux # Sur votre machine : ssh didactico@pi-zero-iot.local # Si .local ne résout pas (Windows ancien sans Bonjour) : ping pi-zero-iot.local # Récupérer l'IP ssh didactico@192.168.1.42 # Connexion directe par IP # Mise à jour immédiate : sudo apt update && sudo apt full-upgrade -y sudo apt install -y python3-pip python3-venv git vim htop sudo reboot ## Projet 1 — Caméra surveillance MotionEyeOS avec Pi Camera v3 Le Pi Zero W + Pi Camera v3 constitue une caméra de surveillance autonome à moins de 80 dinars de matériel. MotionEyeOS est une distribution Linux préconfigurée qui transforme le Pi en NVR (Network Video Recorder) avec détection de mouvement. ## Matériel nécessaire - Pi Zero W ou Zero 2 W (35-55 DT chez Didactico) - Pi Camera Module v3 ou v2 (90 DT) - Câble nappe CSI 22 pins (le Zero a un connecteur plus petit que le Pi 4) - microSD 32 Go classe A1 - Alimentation 5V/2A micro USB - Boîtier 3D imprimé (Bambu Lab A1 mini ou P1S, PLA noir) ## Installation MotionEyeOS # Sur Raspberry Pi OS Lite déjà installé : sudo apt install -y motion ffmpeg v4l-utils # Activer la caméra : sudo raspi-config > Interface Options > Camera > Enable # Tester : libcamera-hello --timeout 5000 libcamera-jpeg -o test.jpg # Configurer motion (édition fichier) : sudo nano /etc/motion/motion.conf # Paramètres clés à modifier : # daemon on # width 1280 # height 720 # framerate 15 # threshold 2000 # on_event_start /usr/local/bin/notify.sh sudo systemctl enable motion sudo systemctl start motion ## Détection de mouvement avec masque et webhook Telegram # /usr/local/bin/notify.sh #!/bin/bash # Envoyer une photo Telegram dès qu'un mouvement est détecté TOKEN="votre_bot_token" CHAT_ID="votre_chat_id" IMG=$(ls -t /var/lib/motion/*.jpg | head -1) curl -s -F chat_id=${CHAT_ID} -F photo=@${IMG} -F caption="🚨 Mouvement détecté $(date '+%H:%M:%S')" https://api.telegram.org/bot${TOKEN}/sendPhoto Pour éviter les fausses alertes (oiseaux, ombres), MotionEye permet de définir un masque PNG où les zones noires ignorent les mouvements. Très utile pour exclure une rue passante ou un arbre qui bouge au vent. ## Projet 2 — Station météo BME280 + BH1750 + OLED + Grafana Voici une station météo complète qui mesure température, humidité, pression barométrique, luminosité, affiche les valeurs sur OLED et envoie tout vers InfluxDB + Grafana pour des courbes magnifiques 24h/7j/30j. ## Câblage I2C (4 fils partagés) Tous les capteurs partagent le bus I2C — c'est la beauté du protocole : - BME280 (température/humidité/pression) — adresse 0x76 - BH1750 (luminosité en lux) — adresse 0x23 - OLED 0.96" SSD1306 — adresse 0x3C - VCC → 3.3V, GND → GND, SDA → GPIO2, SCL → GPIO3 ## Code Python complet #!/usr/bin/env python3 """Station météo Pi Zero — Lecture I2C et push InfluxDB.""" import time from datetime import datetime import board import busio import adafruit_bme280.advanced as bme280 import adafruit_bh1750 from luma.core.interface.serial import i2c from luma.oled.device import ssd1306 from luma.core.render import canvas from influxdb_client import InfluxDBClient, Point from influxdb_client.client.write_api import SYNCHRONOUS # Initialisation I2C i2c_bus = busio.I2C(board.SCL, board.SDA) bme = bme280.Adafruit_BME280_I2C(i2c_bus, address=0x76) bh = adafruit_bh1750.BH1750(i2c_bus) oled = ssd1306(i2c(port=1, address=0x3C)) # Calibration altitude Sfax (3 m) bme.sea_level_pressure = 1013.25 # InfluxDB cloud ou local client = InfluxDBClient( url="http://localhost:8086", token="votre_token", org="didactico" ) write_api = client.write_api(write_options=SYNCHRONOUS) def mesurer(): """Retourne un dict avec les 4 valeurs mesurées.""" return { "temperature": bme.temperature, "humidite": bme.relative_humidity, "pression": bme.pressure, "luminosite": bh.lux, "ts": datetime.utcnow() } def afficher_oled(data): """Dessine les 4 valeurs sur l'écran 128x64.""" with canvas(oled) as draw: draw.text((0, 0), f"T: {data['temperature']:.1f} C", fill="white") draw.text((0, 16), f"H: {data['humidite']:.0f} %", fill="white") draw.text((0, 32), f"P: {data['pression']:.0f} hPa", fill="white") draw.text((0, 48), f"L: {data['luminosite']:.0f} lx", fill="white") def pousser_influx(data): """Envoie un Point à InfluxDB.""" point = (Point("meteo") .tag("location", "sfax") .field("temperature", data["temperature"]) .field("humidite", data["humidite"]) .field("pression", data["pression"]) .field("luminosite", data["luminosite"]) .time(data["ts"])) write_api.write(bucket="meteo", record=point) if __name__ == "__main__": while True: try: d = mesurer() afficher_oled(d) pousser_influx(d) print(f"{d['ts']} | {d['temperature']:.1f}°C | {d['humidite']:.0f}%") except Exception as e: print(f"Erreur : {e}") time.sleep(60) # mesure toutes les minutes ## Dashboard Grafana Dans Grafana, créez un dashboard avec 4 panneaux (Time series) : Température, Humidité, Pression, Luminosité. La query Flux ressemble à : from(bucket: "meteo") |> range(start: -24h) |> filter(fn: (r) => r._measurement == "meteo") |> filter(fn: (r) => r._field == "temperature") |> aggregateWindow(every: 5m, fn: mean) ## Projet 3 — Serveur Flask DHT22 + API REST + Nginx Transformons le Pi Zero 2 W en mini serveur API qui expose les mesures DHT22 sur HTTP, le tout déployé en production avec gunicorn, nginx en reverse proxy et systemd pour le démarrage automatique. ## API Flask # app.py — API REST minimaliste import adafruit_dht import board from flask import Flask, jsonify from datetime import datetime app = Flask(__name__) dht = adafruit_dht.DHT22(board.D4) @app.route("/api/v1/health") def health(): return jsonify({"status": "ok", "ts": datetime.utcnow().isoformat()}) @app.route("/api/v1/sensor") def sensor(): try: return jsonify({ "temperature_c": dht.temperature, "humidity_pct": dht.humidity, "ts": datetime.utcnow().isoformat() }) except RuntimeError as e: # DHT22 échoue parfois — c'est normal, on retry return jsonify({"error": str(e)}), 503 if __name__ == "__main__": app.run(host="0.0.0.0", port=8000) ## Déploiement production avec gunicorn + nginx + systemd # /etc/systemd/system/dida-sensor.service [Unit] Description=Didactico Sensor API After=network.target [Service] User=didactico WorkingDirectory=/home/didactico/sensor-api ExecStart=/home/didactico/sensor-api/venv/bin/gunicorn --workers 2 --bind 127.0.0.1:8000 app:app Restart=always [Install] WantedBy=multi-user.target # /etc/nginx/sites-available/dida-sensor server { listen 80; server_name pi-zero-iot.local; location / { proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } # Activation : sudo systemctl enable --now dida-sensor sudo ln -s /etc/nginx/sites-available/dida-sensor /etc/nginx/sites-enabled/ sudo nginx -t && sudo systemctl reload nginx Test depuis n'importe quel client du réseau : curl http://pi-zero-iot.local/api/v1/sensor # {"temperature_c":24.7,"humidity_pct":58.0,"ts":"2026-05-15T10:32:11"} 🥧 PRODUIT VEDETTE ## Raspberry Pi Zero W / Zero 2 W Le micro-ordinateur Linux 65×30 mm parfait pour vos projets IoT, caméras et serveurs embarqués. Stock disponible en Tunisie, livraison 24-48h depuis Sfax. Voir les Pi Zero → ## Alimentation, boîtier 3D et performances réelles ## Alimentation : le piège qui tue 80% des projets débutants Le Pi Zero consomme peu (150-300 mA), mais la qualité de l'alimentation est cruciale. Une alim chinoise « 5V/1A » non régulée délivre 4.7V sous charge → l'icône éclair jaune apparaît, la SD card se corrompt, le WiFi se déconnecte aléatoirement. - Recommandé : alim officielle Raspberry Pi 5V/2.5A ou Anker PowerPort 12W - USB PD : un chargeur de téléphone moderne fonctionne, mais préférez un câble micro USB court (< 1 m) et gros calibre (24 AWG) - Pas de PoE sur Pi Zero — pour PoE, il faut un Pi 4 + HAT PoE+ ## Boîtier 3D imprimé Pour un boîtier sur mesure, deux options : impression FDM (PLA, PETG) sur Bambu Lab A1 mini ou P1S pour la précision et la rapidité, ou impression résine sur Elegoo Saturn si vous voulez des détails ultra-fins (textes en relief, joints toriques). Les fichiers STL gratuits abondent sur Printables et Thingiverse. Comptez 4-8 g de filament soit moins de 200 millimes de matière. ## Performances réelles : Zero W vs Zero 2 W vs Pi 4 - Pi Zero W (BCM2835, mono 1GHz) — Suffisant pour : data logger I2C, GPIO simples, MotionEye SD basse résolution. Insuffisant pour : Flask sous charge, recompilation Python, OpenCV temps réel. - Pi Zero 2 W (BCM2710A1, quad 1GHz) — Environ 4× plus rapide qu'un Zero W sur charge parallélisable. Tient un Flask + nginx + InfluxDB sans broncher. OpenCV en 640×480 fluide. - Pi 4 4GB — 8-10× plus rapide encore. Indispensable si : vous faites du traitement vidéo HD, Home Assistant + 30 intégrations, ou un NAS avec disque USB 3.0. 💡 Quand monter en gamme ? Si votre Pi Zero affiche une load average > 2.0 en permanence (htop), ou si vcgencmd measure_temp dépasse 75°C même avec un dissipateur, c'est le signal pour passer au Pi 4. Pour 95% des projets IoT en Tunisie, le Zero 2 W est largement suffisant. ## Cas d'usage industriels en Tunisie Au-delà des projets éducatifs, le Pi Zero trouve sa place dans plusieurs secteurs en Tunisie : ## Compteurs d'eau communicants Plusieurs startups tunisiennes utilisent un Pi Zero W + module LoRa SX1276 + capteur à effet Hall pour transformer des compteurs d'eau classiques en compteurs intelligents. Coût matériel : ~120 DT par point de mesure. Données remontées toutes les 15 minutes via LoRaWAN The Things Network. ## Caméras agricoles oliveraies Dans la région de Sfax (capitale de l'huile d'olive), des oléiculteurs déploient des Pi Zero W + Pi Camera + panneau solaire 10W + batterie LiFePO4 12V pour surveiller les vergers contre le vol et la mouche de l'olive. Le Zero consomme si peu que 5W de solaire suffit en moyenne annuelle. ## Kiosques tactiles et signalétique Pour de l'affichage dynamique en boutique (menu restaurant, vitrine), un Pi Zero 2 W + écran HDMI 7" + Chromium en kiosk-mode revient à moins de 250 DT vs 800-1500 DT pour une solution Android propriétaire. ## Projets étudiants ENIT / INSAT / ISBS / ISET Le Pi Zero est devenu le standard de facto des PFE (Projets de Fin d'Études) en IoT et systèmes embarqués des écoles tunisiennes. Sur le FabLab Sfax, on croise régulièrement des prototypes de drones, robots, stations environnementales basés sur Zero W et Zero 2 W. Didactico fournit la majorité de ces composants avec livraison 24-48h partout en Tunisie. ## FAQ Raspberry Pi Zero Quelle différence entre Pi Zero W et Pi Zero 2 W ?Le Zero W a un CPU mono-cœur ARM11 à 1 GHz (BCM2835), le Zero 2 W a un CPU quad-core Cortex-A53 à 1 GHz (BCM2710A1). Concrètement, le Zero 2 W est 3 à 4× plus rapide sur des charges multi-threads, supporte le 64-bit, et fait tourner Flask/Node.js sans broncher. Pour 10-15 DT de plus, prenez systématiquement le Zero 2 W. Puis-je alimenter mon Pi Zero en USB depuis un PC ?Techniquement oui, mais déconseillé. Un port USB 2.0 ne garantit que 500 mA — le Pi tient au repos mais crashera dès qu'il sollicite WiFi + caméra. Utilisez une vraie alim 5V/2A avec câble court et de qualité. Comment savoir si mon GPIO grille mes capteurs ?Les GPIO du Pi sont en 3.3V STRICT. Si vous branchez un signal 5V (Arduino TX, capteur HC-SR04 ECHO, etc.), vous pouvez endommager le SoC de manière irréversible. Utilisez un convertisseur de niveau TXS0108E ou un simple pont diviseur 1k/2k pour les signaux unidirectionnels. Quelle carte microSD choisir ?Une classe A1 minimum, marque Samsung EVO Plus ou SanDisk Ultra, 32 Go idéalement. Évitez les cartes < 8 Go (Raspberry Pi OS Lite fait déjà 3 Go) et les marques inconnues qui peuvent corrompre des données aléatoirement. Le Pi Zero peut-il faire tourner Home Assistant ?Pas confortablement. HA OS demande au moins 2 Go de RAM pour fonctionner avec quelques intégrations. Le Zero 2 W avec 512 Mo se traîne. Pour Home Assistant, partez sur un Pi 4 4GB ou 8GB. Différence entre Pi Camera v2 et v3 ?La v2 utilise un capteur Sony IMX219 de 8 MP. La v3 utilise un IMX708 de 12 MP avec autofocus et HDR. Pour de la surveillance, la v3 est nettement meilleure (autofocus = pas besoin de tourner la lentille). Compatible avec Pi Zero via le câble nappe CSI 22 pins. Peut-on programmer un Pi Zero sans connaître Linux ?Oui, grâce à des distributions clés en main comme MotionEyeOS (caméra), RetroPie (jeux rétro), RaspBee/Phoscon (Zigbee). Mais pour un projet IoT custom, quelques notions de Linux (ssh, apt, systemd, nano) sont indispensables. Didactico Sfax propose régulièrement des formations en présentiel et en ligne. ## Conclusion Le Raspberry Pi Zero incarne une vision rare dans la tech : maximiser la valeur éducative au minimum de coût. En Tunisie, il est devenu le compagnon des FabLabs, des PFE étudiants et des startups IoT. Le Zero 2 W avec son quad-core ARM Cortex-A53 et son WiFi intégré offre aujourd'hui un rapport puissance/prix imbattable pour 95% des projets embarqués. Que vous fabriquiez une caméra de surveillance, une station météo connectée ou un serveur Flask domestique, ce petit board délivre Linux complet dans 65×30 mm de PCB. Pour aller plus loin, consultez notre guide des 5 projets Raspberry Pi pour débutants et passez commande sur didactico.tn pour recevoir votre Pi Zero W ou Zero 2 W en 24-48h partout en Tunisie depuis notre entrepôt de Sfax. --- # Arduino UNO R3 en Tunisie : Le Guide Pilier 2026 avec 5 Projets Pratiques URL: https://didactico.tn/arduino-uno-r3-guide-projets-tunisie/ Résumé: Le guide pilier 2026 sur l'Arduino UNO R3 en Tunisie : histoire, anatomie ATmega328P, brochage 20 broches, installation IDE, 5 projets pratiques, optimisations, 10 pièges à éviter. Référence Didactico Sfax. En 2005, à l'Interaction Design Institute d'Ivrea (Italie), un groupe d'étudiants en design avait un problème : ils voulaient apprendre l'électronique sans devoir devenir ingénieurs en électronique. Massimo Banzi, leur professeur, conçut alors une carte simple, ouverte, peu chère. Il la nomma Arduino — du nom d'un bar fréquenté par les étudiants, lui-même nommé d'après Arduino d'Ivrée, roi d'Italie au XIᵉ siècle. Vingt ans plus tard, la planète a fabriqué plus de 30 millions de cartes Arduino. Et la version la plus emblématique, celle qui peuple les écoles d'ingénieurs de Tunis à Sfax, c'est l'Arduino UNO R3. Cet article est le guide pilier de référence sur l'Arduino UNO R3 en Tunisie. Il s'adresse autant à l'étudiant ENIT/INSAT/ISET qui prépare son premier TP qu'à l'ingénieur confirmé qui veut redécouvrir cette carte mythique. Au programme : histoire, anatomie de l'ATmega328P, brochage exhaustif, installation pas à pas, premier programme, 5 projets pratiques, optimisations avancées et pièges à éviter. ## 📋 Table des matières - Histoire et philosophie Arduino - L'ATmega328P : le cerveau disséqué - Caractéristiques techniques complètes - Brochage Arduino UNO R3 (14+6 broches) - Installation IDE Arduino (Windows/Mac/Linux) - Premier programme : Blink + Serial - Projet 1 — Station météo DHT22 + OLED - Projet 2 — Bouton anti-rebond + interruption - Projet 3 — Alarme distance HC-SR04 - Projet 4 — Servo + potentiomètre temps réel - Projet 5 — Logger SD card avec horodatage - Optimisations avancées (PROGMEM, sleep, ports) - 10 pièges classiques à éviter - FAQ Arduino UNO R3 ## Histoire et philosophie Arduino L'esprit Arduino tient en trois mots : simple, ouvert, communautaire. Le code source de l'IDE, les schémas des cartes, le bootloader, tout est open-source sous licence Creative Commons et GPL. C'est cette ouverture qui a permis à des dizaines de fabricants chinois de produire des compatibles à 40% du prix officiel — et qui a démocratisé l'électronique embarquée dans le monde entier, particulièrement en Afrique du Nord où l'Arduino UNO est devenu le standard universitaire de facto. L'UNO R3 sortie en 2011 reste, 15 ans plus tard, la version de référence. Sa robustesse (5V tolerant, courant max 40 mA par broche), sa documentation exhaustive en 30 langues, et le millier de bibliothèques disponibles en font le couteau suisse parfait pour démarrer. ## L'ATmega328P : le cerveau disséqué Au cœur de l'Arduino UNO bat un microcontrôleur Atmel ATmega328P (aujourd'hui Microchip après le rachat en 2016). C'est un 8-bit AVR cadencé à 16 MHz. Comparons-le à ses concurrents directs : CaractéristiqueATmega328P (UNO)STM32F103 (Blue Pill)ESP32 (DevKit) ArchitectureAVR 8-bitARM Cortex-M3 32-bitXtensa LX6 32-bit dual-core Horloge16 MHz72 MHz240 MHz Flash32 KB64 KB4 MB RAM2 KB20 KB520 KB GPIO20 broches37 broches34 broches Sans-filAucunAucunWiFi + BT + BLE Prix TunisieBasTrès basMoyen L'ATmega328P est intentionnellement "lent" — c'est ce qui le rend pédagogique. Avec 2 KB de RAM, vous apprenez à optimiser, à utiliser la mémoire flash via PROGMEM, à éviter les String dynamiques. Ces contraintes forgent de meilleurs ingénieurs embarqués que n'importe quel langage moderne sans limites. ## Caractéristiques techniques complètes - Microcontrôleur : ATmega328P, 8-bit AVR RISC, 16 MHz - Tension de fonctionnement : 5V (logic), 7-12V VIN recommandé - Plage VIN absolue : 6-20V (au-delà, le régulateur AMS1117 surchauffe) - Courant 5V max : 500 mA (USB) ou 1 A (jack DC via régulateur) - Courant DC par I/O : 20 mA recommandé, 40 mA absolu max - Courant total cumulé I/O : 200 mA max - Broches numériques I/O : 14 (D0-D13), dont 6 PWM (~) - Broches analogiques : 6 (A0-A5), ADC 10-bit (0-1023), Vref 5V par défaut - Mémoire Flash : 32 KB dont 0.5 KB occupés par le bootloader - SRAM : 2 KB - EEPROM : 1 KB (cycle d'écriture limité à 100 000 fois) - Interfaces : 1× UART, 1× I2C (A4/A5), 1× SPI (D10-D13), 2× interruptions externes (D2/D3) - Connecteurs : USB type B, jack DC 2.1 mm, header ICSP, bouton RESET - LED intégrée : sur D13 - Régulateur : NCP1117ST50T3G (5V/1A) + LP2985-33DBVR (3.3V/150mA) - Quartz : 16 MHz cristal - Dimensions : 68.6 × 53.4 mm - Poids : 25 g 🛒 Produit star Didactico ## Carte Arduino UNO R3 — Version Officielle Réf DAR-01-A001 · Officielle ou compatible CH340 · En stock · Livraison 24-48h Tunisie Voir le produit → ## Brochage Arduino UNO R3 (14+6 broches) ## Broches numériques D0 à D13 - D0 (RX) et D1 (TX) : UART hardware. À ÉVITER pour autre chose pendant le debug Serial — vous perdrez la communication USB. - D2 et D3 : interruptions externes (INT0/INT1). Permettent de réagir à un événement (bouton, capteur) sans bloquer la boucle loop(). - D3, D5, D6, D9, D10, D11 : 6 sorties PWM (490 Hz ou 980 Hz selon le timer associé). Idéales pour LEDs gradables, servos, vitesses moteurs. - D10 (SS), D11 (MOSI), D12 (MISO), D13 (SCK) : bus SPI. Utilisé par module SD card, écran TFT, RFID RC522, etc. - D13 : LED intégrée à la carte. Pratique pour tester sans LED externe — exactement ce que fait l'exemple "Blink". ## Broches analogiques A0 à A5 L'ADC 10-bit convertit 0-5V en 0-1023. Précision : 5V / 1024 ≈ 4.88 mV par pas. - A4 (SDA) et A5 (SCL) : bus I2C. Utilisé par : OLED SSD1306, BME280, MPU6050, RTC DS3231, MAX30102, écran LCD I2C, etc. - Les A0-A5 peuvent aussi servir de broches numériques (référer à elles par leur numéro 14-19 ou par A0-A5). - A6 et A7 : présentes uniquement sur Nano/Mini, PAS sur UNO R3. ## Broches alimentation - 5V : sortie 5V régulée (500 mA USB / 1A jack) - 3.3V : sortie 3.3V (50 mA max, fragile) - VIN : entrée alimentation (7-12V), shunte le régulateur si vous alimentez ici - GND : 3 broches de masse - AREF : référence externe pour l'ADC (rarement utilisé) - IOREF : indique aux shields la tension logique (5V sur UNO, 3.3V sur Due) ## Installation IDE Arduino (Windows/Mac/Linux) - Téléchargez Arduino IDE 2.x sur arduino.cc/en/software (~ 150 Mo) - Lancez l'installateur. Sur Windows, acceptez l'installation des drivers USB (FTDI, CH340). - Pour les cartes compatibles (CH340), si non détectées, installez manuellement CH341SER.exe. Sur Mac/Linux, ces drivers sont natifs. - Branchez votre Arduino UNO via le câble USB-A → USB-B (le câble est inclus avec la carte chez Didactico) - Dans l'IDE : Outils → Type de carte → Arduino AVR Boards → Arduino UNO - Dans l'IDE : Outils → Port → COMx (Windows) ou /dev/cu.usbmodemXXXX (Mac) - Pour tester : Fichier → Exemples → 01.Basics → Blink, puis cliquez sur la flèche "Téléverser" Si la compilation prend 30+ secondes, c'est normal au premier upload (l'IDE compile toutes les bibliothèques standard). Les uploads suivants prennent 5-10 secondes. ## Premier programme : Blink + Serial // Blink + Serial Hello — pour valider USB et port serie // Didactico Tunisie const int LED = LED_BUILTIN; // = 13 sur UNO int compteur = 0; void setup() { pinMode(LED, OUTPUT); Serial.begin(115200); Serial.println("Didactico ECG Arduino UNO R3 - Bonjour !"); } void loop() { digitalWrite(LED, HIGH); delay(500); digitalWrite(LED, LOW); delay(500); compteur++; Serial.print("Battement #"); Serial.println(compteur); } Ouvrez le Moniteur Série (Ctrl+Maj+M) à 115200 bauds. Vous verrez les messages s'afficher au rythme du clignotement. Si vous voyez des caractères chinois ou symboles bizarres, c'est que vous n'avez pas réglé le bon débit. Toujours 115200 pour les développements modernes (9600 est obsolète). ## Projet 1 — Station météo DHT22 + OLED SSD1306 ## Matériel - 1 × Capteur DHT22 (température + humidité) - 1 × Écran OLED 0.96" I2C SSD1306 - 1 × Résistance pull-up 10 kΩ ## Câblage - DHT22 : VCC → 5V, GND → GND, DATA → D7 (avec pull-up 10 kΩ entre DATA et VCC) - OLED : VCC → 5V, GND → GND, SCL → A5, SDA → A4 ## Code #include #include #include #define DHTPIN 7 #define DHTTYPE DHT22 DHT dht(DHTPIN, DHTTYPE); Adafruit_SSD1306 oled(128, 64, &Wire); void setup() { dht.begin(); oled.begin(SSD1306_SWITCHCAPVCC, 0x3C); oled.setTextColor(WHITE); } void loop() { float t = dht.readTemperature(); float h = dht.readHumidity(); oled.clearDisplay(); oled.setTextSize(2); oled.setCursor(0, 0); oled.print(t, 1); oled.println(" C"); oled.print(h, 0); oled.println(" %"); oled.setTextSize(1); oled.print("Didactico.tn"); oled.display(); delay(2000); } ## Projet 2 — Bouton anti-rebond avec interruption Le but : compter chaque appui sans aucun faux positif dû aux rebonds mécaniques. Solution : interruption matérielle + debounce 50 ms. const int BTN = 2; // INT0 const int LED = 13; volatile unsigned long last_int = 0; volatile int compteur = 0; void ISR_bouton() { unsigned long now = millis(); if (now - last_int > 50) { // debounce 50ms compteur++; last_int = now; } } void setup() { pinMode(BTN, INPUT_PULLUP); pinMode(LED, OUTPUT); Serial.begin(115200); attachInterrupt(digitalPinToInterrupt(BTN), ISR_bouton, FALLING); } void loop() { static int prev = 0; if (compteur != prev) { prev = compteur; Serial.print("Appui n°"); Serial.println(compteur); digitalWrite(LED, !digitalRead(LED)); } } ## Projet 3 — Alarme distance HC-SR04 Voir notre guide HC-SR04 complet. En résumé : un buzzer s'active si distance < 20 cm — utile pour parking de voiture ou robot d'évitement. ## Projet 4 — Servo + potentiomètre temps réel #include Servo s; void setup() { s.attach(9); } void loop() { int angle = map(analogRead(A0), 0, 1023, 0, 180); s.write(angle); delay(15); } Cette boucle de 4 lignes fait tourner un servomoteur SG90 ou MG996R selon la position d'un potentiomètre 10 kΩ. Idéal pour un bras robotique manuel. ## Projet 5 — Logger SD card avec horodatage RTC Combinaison module SD card SPI + RTC DS3231 I2C + capteur DHT22. Toutes les 5 minutes, écriture d'une ligne CSV : 2026-05-16 10:23:00, 28.5, 45. Application : journal météo d'une serre, monitoring chambre froide, logger PFE. #include #include #include #include const int CS = 10; RTC_DS3231 rtc; DHT dht(7, DHT22); void setup() { SD.begin(CS); rtc.begin(); dht.begin(); } void loop() { DateTime now = rtc.now(); File f = SD.open("meteo.csv", FILE_WRITE); if (f) { f.print(now.timestamp()); f.print(","); f.print(dht.readTemperature(), 1); f.print(","); f.println(dht.readHumidity(), 0); f.close(); } delay(300000); // 5 minutes } ## Optimisations avancées ## PROGMEM : stocker en flash au lieu de RAM Les chaînes constantes occupent par défaut la RAM (2 KB seulement !). En les déplaçant en Flash (32 KB) avec PROGMEM, vous libérez la RAM pour les variables critiques. const char message[] PROGMEM = "Message tres long stocke en flash"; Serial.println((__FlashStringHelper*)message); // Ou plus simplement avec le macro F() : Serial.println(F("Texte direct en flash")); ## Sleep mode : économiser la batterie #include void deep_sleep() { set_sleep_mode(SLEEP_MODE_PWR_DOWN); sleep_enable(); sleep_mode(); // L'Arduino reste endormi (~ 0.1 mA) jusqu'a interruption externe sleep_disable(); } ## Accès direct aux ports (PORTB, PORTD) digitalWrite() prend ~ 4 µs. En manipulant directement les registres PORTB/PORTD, vous descendez à 0.1 µs — 40× plus rapide. Indispensable pour le PWM software haute fréquence ou le contrôle de bandes LED WS2812. ## 10 pièges classiques à éviter - Brancher du 5V sur la broche 3.3V → grille le régulateur LP2985 - Tirer > 40 mA sur une seule broche → fritte la sortie (ex: alimenter directement une LED 1W ou un moteur) - Polariser une LED à l'envers sans résistance → court-circuit, grille la broche - Utiliser delay(1000) partout → bloque tout, préférez millis() pour multi-tâche - Déclarer des String dans loop() → fragmente la RAM, plantage après 30 minutes - Mélanger 5V et 3.3V sans level shifter → grille votre ESP32 ou capteur 3.3V - Oublier les capacités de découplage 100 nF près des CI sensibles → instabilité bizarre - Sauvegarder à chaque cycle dans l'EEPROM → 100 000 cycles max, atteint en quelques jours - Alimenter servomoteur via 5V Arduino → reset intempestif dû au pic de courant - Ne pas mettre pinMode() dans setup() → comportement imprévisible des broches ## FAQ Arduino UNO R3 Arduino UNO vs Arduino UNO R3 : quelle différence ? Le "R3" désigne la révision 3 de l'Arduino UNO, sortie en 2011. Elle reste la version officielle vendue aujourd'hui. La R3 ajoute deux broches SDA/SCL dédiées (en plus de A4/A5), une broche IOREF pour les shields, et un circuit ATmega16U2 (au lieu du FTDI) pour la communication USB. Quand on dit "Arduino UNO", on parle implicitement de l'UNO R3. Arduino UNO R3 officielle vs compatible chinoise : faut-il payer plus ? Les compatibles utilisent l'ATmega328P (puce identique) mais un convertisseur USB CH340 au lieu de l'ATmega16U2. Fonctionnellement, c'est 100% équivalent pour 99% des projets. La différence : la compatible est ~ 40% moins chère, mais nécessite l'installation manuelle du driver CH340 sur Windows. Pour étudiants, allez sur la compatible. Pour un produit pro vendu à un client, prenez l'officielle (logo + garantie + qualité de fabrication). Quelle est l'autonomie d'une Arduino UNO sur pile 9V ? Pile 9V alcaline (~ 500 mAh utile) + Arduino UNO en fonctionnement actif (~ 50 mA) = 10 heures. En mode sleep + interruptions (consommation moyenne ~ 5 mA) = 100 heures. Pour de l'autonomie longue, préférez un pack 4×AA NiMH (8 heures), un module solaire 6V + 18650 (autonomie infinie en extérieur ensoleillé), ou un ESP32 en deep sleep (mois). Combien de bibliothèques sont disponibles pour Arduino UNO ? Plus de 5000 bibliothèques dans le Library Manager officiel, dont 80% compatibles UNO. Tous les capteurs/modules vendus chez Didactico ont une bibliothèque dédiée bien documentée. Les plus populaires : DHT (température), Adafruit_SSD1306 (OLED), Servo, Wire (I2C), RTClib (horloge), SD (carte mémoire), NewPing (ultrason), FastLED (LEDs WS2812). Peut-on faire de l'intelligence artificielle sur Arduino UNO ? Avec seulement 2 KB de RAM et 32 KB de flash, c'est très limité. Vous pouvez faire des arbres de décision simples (ex: classification capteurs en 3 classes), des filtres signal, ou un perceptron 5-10 neurones. Pour du vrai TinyML (TensorFlow Lite Micro), il faut passer à l'ESP32 (520 KB RAM) ou Nano 33 BLE Sense (256 KB RAM Cortex-M4). L'Arduino UNO supporte-t-il les écrans tactiles ? Pour des écrans simples (Nokia 5110, ILI9341 2.4"), oui via SPI. Mais avec 2 KB de RAM, vous ne pouvez pas afficher des images bitmap. Pour du tactile riche, préférez ESP32 + écran TFT 3.5", ou Raspberry Pi + écran HDMI 7". Quel est le prix de l'Arduino UNO R3 en Tunisie en 2026 ? Tarif actuel disponible sur la fiche produit Didactico. La carte officielle reste l'investissement de référence pour étudiants ENIT/INSAT/ISET/ESPRIT. La version compatible est aussi disponible pour les budgets serrés. Livraison 24-48h dans toute la Tunisie, paiement à la livraison. ## Conclusion : 20 ans plus tard, toujours pertinent Beaucoup ont annoncé la "mort de l'Arduino UNO" avec l'arrivée de l'ESP32. La réalité de 2026 ? L'UNO R3 reste la carte la plus vendue au monde dans l'éducation, et le standard universel pour démarrer en embarqué. Sa simplicité est une force pédagogique : pas de WiFi qui distrait, pas de Bluetooth complexe, juste un microcontrôleur, 20 broches, et 5000 bibliothèques. Du Maker au futur ingénieur, l'Arduino UNO reste la première étape obligée. Chez Didactico Sfax, l'Arduino UNO R3 est notre produit le plus commandé depuis 2012. Pour vos TP, projets de fin d'études, ou kits FabLab, nous proposons des tarifs HT pour les établissements et un support technique gratuit. Découvrez toutes nos cartes Arduino. --- # Démarrer en Arduino en Tunisie : Le Guide Ultime pour Débutants (2026) URL: https://didactico.tn/guide-demarrer-arduino-tunisie/ Résumé: Café de la médina, Sfax, un samedi de septembre. Ahmed, fraîchement admis en première année à l'ENIT, regarde une vidéo YouTube où un Américain barbu fait ... Café de la médina, Sfax, un samedi de septembre. Ahmed, fraîchement admis en première année à l'ENIT, regarde une vidéo YouTube où un Américain barbu fait clignoter une LED avec un "Arduino UNO". Il veut faire pareil. Mais il ne sait pas : faut-il prendre l'officielle italienne à 80 DT ou la compatible chinoise à 30 DT ? Existe-t-il une boutique en Tunisie qui livre vraiment ou doit-il commander sur AliExpress et attendre 3 semaines ? Quel kit acheter ? Faut-il apprendre le C++ avant ou pendant ? Et surtout — par où commencer concrètement quand on n'a jamais soudé de sa vie ? Ce guide répond à tout ça. Il est écrit spécifiquement pour le débutant tunisien (étudiant, lycéen technique, autodidacte adulte) qui veut démarrer dans l'embarqué en 2026. Pas de tuto traduit d'un site anglais : des conseils concrets, des prix réels du marché tunisien, des ressources francophones validées, et un parcours d'apprentissage testé sur des centaines d'étudiants ENIT, INSAT, ISBS, ISET, ESPRIT et FabLab Sfax. ## 📋 Table des matières - Arduino dans le paysage embarqué : où ça se situe ? - Choisir sa première carte : UNO, Nano, Mega ? - Le kit débutant idéal en Tunisie - Installation Arduino IDE 2.x pas à pas - Premier projet : Blink, puis LED externe - Ressources d'apprentissage francophones - Communautés tunisiennes - Parcours d'apprentissage en 4 mois - Au-delà d'Arduino : ESP32, STM32, Raspberry Pi - Erreurs débutant à éviter absolument - FAQ ## Arduino dans le paysage embarqué : où ça se situe ? Avant d'investir dans une carte, comprenez à quoi sert Arduino par rapport aux alternatives. Confondre Arduino, ESP32 et Raspberry Pi est l'erreur la plus fréquente des débutants tunisiens. ## Arduino UNO (et famille AVR/AVR-XMEGA) Micro-contrôleur ATmega328P, 16 MHz, 32 Ko mémoire programme, 2 Ko RAM. Programmation en C/C++ via Arduino IDE. Forces : simplicité absolue, communauté massive (10+ ans de tutoriels), bibliothèques pour tout, faibles risques de bricks. Faiblesses : pas de Wi-Fi/Bluetooth intégrés, performance modeste (pas de virgule flottante hardware), peu de RAM. Idéal pour : apprendre, projets simples sans connectivité, robots, capteurs autonomes. ## ESP32 / ESP8266 Famille Espressif, processeur dual-core 240 MHz, 520 Ko RAM, Wi-Fi et Bluetooth intégrés. Programmation en Arduino IDE (oui, on peut programmer un ESP32 avec l'IDE Arduino, c'est le secret bien gardé), ou en MicroPython, ou ESP-IDF natif. Forces : connectivité native, puissance 10× supérieure à UNO, prix similaire (30-40 DT). Faiblesses : 3.3V (attention compatibilité capteurs), plus de complexité initiale. Idéal pour : projets IoT, domotique, dashboard temps réel, dès que la connectivité entre en jeu. ## STM32 (et famille ARM Cortex-M) STMicroelectronics, processeurs ARM Cortex-M0 à M7, jusqu'à 480 MHz et 2 Mo de RAM, périphériques riches (CAN bus, DCMI caméra, USB OTG). Programmation en C natif via STM32CubeIDE ou via Arduino IDE (cartes Blue Pill/Black Pill compatibles). Forces : performance professionnelle, périphériques pro, choix industriel. Faiblesses : courbe d'apprentissage raide, moins de tutos accessibles. Idéal pour : niveau Master ou ingénieur, projets industriels, certifications embarqué. ## Raspberry Pi (et famille SBC) Ce n'est pas un micro-contrôleur mais un ordinateur complet avec Linux, processeur ARM Cortex-A 1-2 GHz, 1-8 Go RAM, sortie HDMI, USB, Ethernet, Wi-Fi. Programmation en Python, C, JavaScript, n'importe quel langage Linux. Forces : puissance totale, écosystème logiciel infini, machine learning faisable. Faiblesses : consommation 5-10× plus élevée qu'un Arduino, démarrage lent (20-30 s), pas de "vrai" temps réel. Idéal pour : vision artificielle, serveurs personnels, projets nécessitant un OS complet, NAS, console retro. ## MicroPython et CircuitPython Ce sont des langages, pas des cartes. MicroPython est une mini-version de Python 3 qui tourne sur micro-contrôleurs (ESP32, RP2040 Pico, STM32). Beaucoup plus accessible que C/C++ pour débuter. Performances 5-10× inférieures à C/C++ équivalent, mais cadeau pédagogique énorme. Idéal pour : initiation collège/lycée, scripting rapide sur ESP32. Notre recommandation atelier : commencez avec un Arduino UNO. Une fois à l'aise (typiquement 1-2 mois), passez à l'ESP32 quand vous voulez la connectivité Wi-Fi. Le saut vers STM32 ou Raspberry Pi se fait en deuxième ou troisième année, jamais dès le démarrage. ## Choisir sa première carte : UNO, Nano, Mega ? ## Arduino UNO R3 (officielle vs compatible) - UNO officielle italienne : 80-95 DT chez Didactico. Plaque verte premier choix, étiquette "Made in Italy", connecteur USB-B large. Qualité irréprochable, garantie marque. Surcoût justifié pour cadeau ou environnement éducatif officiel. - UNO compatible CH340 : 25-35 DT chez Didactico. Carte rouge ou bleue, électronique identique côté ATmega328P, juste la puce USB-série remplacée par une CH340 (nécessite installation pilote sous Windows, gratuit, 2 min). 99% des projets fonctionnent à l'identique. Notre recommandation pour débutant à budget serré. ## Arduino Nano Version miniature de l'UNO (45×18 mm contre 68×53 mm pour UNO). Même puce ATmega328P, mêmes broches, même IDE. Connectique mini-USB (officielle) ou USB-C (récentes compatibles). 20-30 DT en compatible CH340. Idéal pour : projets finals à intégrer dans un boîtier compact, breadboard, robotique miniature. Pour apprendre, l'UNO reste plus pratique (broches mieux étiquetées, plus solide). ## Arduino Mega 2560 Le "gros" Arduino : ATmega2560 à 16 MHz, 256 Ko flash (8× UNO), 54 broches digitales (contre 14), 16 entrées analogiques (contre 6), 4 ports série hardware. 60-80 DT en compatible. Idéal pour : projets qui débordent l'UNO (imprimante 3D Marlin, robot avec 10+ servos, contrôleur d'éclairage à 20 canaux). Pour démarrer, sur-dimensionné — restez sur UNO. ## Arduino Leonardo / Micro Niche : ces cartes peuvent simuler un clavier ou une souris USB (HID natif). Utile pour projets gadgets (raccourcis clavier custom, joystick fait main). Pour débuter, n'apporte rien de plus. ## Le kit débutant idéal en Tunisie Voici la BOM que nous recommandons systématiquement aux étudiants qui débutent. Coût total : 120-160 DT, suffisant pour 3-6 mois d'apprentissage intensif avec 20+ projets différents. ## Composants essentiels (à acheter en priorité) - Arduino UNO R3 compatible CH340 avec câble USB-B inclus : 30 DT - Breadboard 830 points : 5 DT. Indispensable pour prototyper sans souder - Kit de fils jumper (M-M, M-F, F-F) : 8 DT. Au moins 60 fils mélangés - Sachet de LEDs (5mm rouge, jaune, vert, bleu, blanc) : 3 DT, pour 50 LEDs - Résistances 1/4W assortiment (220Ω, 330Ω, 1kΩ, 10kΩ) : 8 DT - 2-3 boutons poussoirs tactiles : 1 DT - 1 potentiomètre 10kΩ : 2 DT - 1 buzzer piézo passif (pour produire des sons/mélodies) : 2 DT - 1 écran OLED 0.96" 128×64 I2C : 18 DT. Plus motivant qu'un afficheur LCD HD44780 pour démarrer ## Capteurs de base - 1 DHT22 température + humidité : 8 DT - 1 HC-SR04 distance ultrasonique : 5 DT - 1 LDR + résistance 10kΩ luminosité : 1 DT - 1 servo SG90 9g : 7 DT ## Outils - 1 multimètre de base (DT830) : 15 DT. Mesure tension, courant, continuité. Indispensable. - Pince coupante fine : 8 DT Total : ~120 DT pour le kit "barebone", 160 DT avec multimètre et pince. À Didactico Sfax, nous proposons un kit débutant complet pré-assemblé à 140 DT, livré en 24-48h. Conseil budget : N'achetez pas de "kit Arduino 37-in-1" à 200 DT trouvé sur AliExpress. La plupart contiennent des modules que vous n'utiliserez jamais (relais, joystick PS2, capteur de flamme) et de la qualité variable. Mieux vaut le kit ciblé ci-dessus, puis acheter au fur et à mesure les capteurs nécessaires à chaque nouveau projet. ## Installation Arduino IDE 2.x pas à pas L'Arduino IDE est l'environnement de développement officiel et gratuit. Version 2.x lancée en 2022, complètement réécrite, beaucoup plus moderne que la 1.x. Compatible Windows, macOS, Linux. ## Windows 10 / 11 - Allez sur arduino.cc/en/software et téléchargez "Win 10 and newer" (~250 Mo) - Lancez l'installeur, acceptez tous les composants par défaut - Branchez votre Arduino par USB. Si carte officielle : Windows installe le pilote automatiquement. Si carte compatible CH340 : il faut installer manuellement le pilote depuis sparks.gogo.co.nz/ch340.html (sites tiers de confiance) ou via Didactico Sfax qui fournit le pilote sur clé USB en boutique - Vérifiez dans le Gestionnaire de périphériques Windows : votre Arduino doit apparaître sous "Ports COM" comme "USB-SERIAL CH340 (COMx)" - Ouvrez Arduino IDE, menu Outils → Type de carte → "Arduino UNO", puis Outils → Port → choisir COMx ## macOS - Téléchargez le .dmg, glissez Arduino IDE dans Applications - Pour cartes CH340, installer le pilote macOS depuis github.com/WCHSoftGroup/ch34xser_macos - Sur macOS Ventura+, autoriser le kext dans Réglages → Confidentialité & sécurité - Reste identique à Windows pour le choix de carte et de port ## Linux (Ubuntu / Debian) - Téléchargez l'AppImage 64-bit Linux - Rendez-le exécutable : chmod +x arduino-ide_2.x.x_Linux_64bit.AppImage - Exécutez-le directement - Pour accéder au port série sans sudo : ajoutez votre utilisateur au groupe dialout : sudo usermod -a -G dialout $USER puis déconnectez/reconnectez la session - Les pilotes CH340 sont déjà inclus dans le noyau Linux depuis 2014, rien à installer ## Premier projet : Blink, puis LED externe ## Blink — la LED interne L'Arduino UNO a une LED soudée sur la carte, connectée à la broche D13. Aucun câblage requis. Code dans Arduino IDE : // Blink - faire clignoter la LED interne (broche 13) void setup() { pinMode(13, OUTPUT); // configure broche 13 en sortie numérique } void loop() { digitalWrite(13, HIGH); // allume la LED (5V sur la broche) delay(500); // attend 500 millisecondes digitalWrite(13, LOW); // éteint la LED (0V sur la broche) delay(500); } Cliquez sur le bouton flèche "Téléverser" en haut à gauche. Trois secondes plus tard, la LED orange à côté de "L" sur votre carte clignote. Bravo, vous êtes un programmeur embarqué. ## Projet 2 — LED externe + résistance Sur la breadboard, montez ce circuit ultra-simple : Arduino D8 ----[Résistance 220Ω]----[+ LED -]---- GND Arduino La résistance limite le courant à environ (5V - 2V) / 220Ω = 13 mA C'est suffisant pour allumer la LED sans la griller et sans dépasser le courant max d'une broche Arduino (40 mA spec, 20 mA recommandé). // LED externe sur broche D8 const int PIN_LED = 8; void setup() { pinMode(PIN_LED, OUTPUT); } void loop() { digitalWrite(PIN_LED, HIGH); delay(1000); digitalWrite(PIN_LED, LOW); delay(1000); } Ce qui paraît trivial vous fait apprendre 5 concepts fondamentaux : la breadboard, la résistance, le sens de la LED (la patte longue = +, la courte = -), la déclaration de constante, le câblage d'une sortie numérique. Tout l'embarqué dérive de cette base. ## Ressources d'apprentissage francophones ## Sites et blogs - Locoduino (locoduino.org) : référence francophone Arduino + modélisme ferroviaire. Excellents articles techniques sur les concepts (interruptions, machines à états, timers) - Blog Didactico : tutoriels en français adaptés au contexte tunisien, projets utilisant des composants disponibles localement - Locoduino + RobotShop blog français : tutos appliqués robotique - OpenClassrooms cours Arduino : cours gratuit en français, parfait premier pas - Random Nerd Tutorials (en anglais, mais essentiel) : la mine d'or pour ESP32 et IoT, bien expliqué même pour un anglais débutant ## Chaînes YouTube en français - Eskimon (chaîne historique francophone) : tutos Arduino, jeux vidéo rétro, électronique générale. Bonne pédagogie - Heliox Lab : projets ambitieux IoT, ESP32, domotique. Niveau intermédiaire - Anas Bensy : tutos Arduino en français accessibles aux étudiants tunisiens - EduRobot (Heliox associé) : initiation robotique éducative ## Livres recommandés - "L'Arduino pour les nuls" – John Nussey : très accessible, recommandé en collège/lycée technique - "Arduino : démarrez avec les microcontrôleurs" – Tahar Neffati : livre francophone par auteur tunisien, parfait pour le contexte universitaire local (ENIT, INSAT) - "Programming Arduino: Getting Started with Sketches" – Simon Monk : référence anglophone, sérieux et progressif - "Le grand livre d'Arduino" – Erik Bartmann : bible exhaustive en français, 600+ pages, projets variés ## Communautés tunisiennes : où rencontrer d'autres makers L'apprentissage en groupe accélère tout. Voici les lieux et communautés où retrouver d'autres passionnés en Tunisie. ## FabLabs et hackerspaces - FabLab Sfax (campus de l'ENIS) : ouvert aux étudiants et grand public, équipé en imprimantes 3D, découpeuses laser, postes de soudure, oscilloscopes. Ateliers réguliers, partenaire historique de Didactico - FabLab Solidaire Tunis – IHEC Carthage : très actif, accueille des projets sociaux et étudiants - FabLab Médenine, FabLab Gabès : développements régionaux, parfaits pour étudiants ISET et IIT du Sud - Hackerspace Sfax : groupe informel makers et bricoleurs, événements ponctuels ## Événements - Maker Faire Tunis (généralement octobre) : THE évènement de l'année, démos, concours, networking - Robotic Days ENIT / INSAT / ENSI : compétitions robotiques annuelles entre écoles d'ingénieurs - Salon IFTECH Sfax : salon professionnel et étudiant des technologies industrielles ## Groupes en ligne - Groupe Facebook "Arduino Tunisie" : 15k+ membres, entraide rapide - Groupe Facebook "Makers Tunisia" : communauté broad maker (impression 3D, CNC, électronique) - Discord "Tunisian Makers" : conversation temps réel, montant en audience depuis 2024 ## Parcours d'apprentissage en 4 mois Voici le plan que nous recommandons depuis 5 ans aux étudiants qui débutent. Testé sur des dizaines de promotions ENIT, ISBS, ISET Sfax. Rythme : 5h/semaine en moyenne. ## Mois 1 — Les bases Objectif : maîtriser l'écriture/téléversement, les entrées-sorties numériques, les structures de contrôle. - Semaine 1 : installation IDE, Blink, LED externe - Semaine 2 : bouton poussoir + LED (input numérique), pull-up résistances internes - Semaine 3 : PWM avec analogWrite (fade de LED), potentiomètre + analogRead - Semaine 4 : buzzer + mélodies (fonction tone()), petit projet à choisir librement ## Mois 2 — Les capteurs Objectif : lire et exploiter des capteurs variés, comprendre I2C. - Semaine 5 : DHT22 + affichage moniteur série - Semaine 6 : HC-SR04 distance, conditions et seuils - Semaine 7 : écran OLED I2C, afficher température + distance simultanément - Semaine 8 : LDR + photo-détection, mini station météo locale ## Mois 3 — Les actionneurs Objectif : faire bouger le monde réel, comprendre les contraintes d'alimentation. - Semaine 9 : servo SG90 + potentiomètre (contrôle direct) - Semaine 10 : moteur DC + driver L298N, sens et vitesse - Semaine 11 : relais 5V pour commander 220V (éclairage, prise) — sécurité avant tout - Semaine 12 : matrice LED 8×8 ou bande WS2812 (effets visuels) ## Mois 4 — Le projet complet Objectif : intégrer tout ce qui précède dans un projet personnel et significatif. Quelques exemples qui marchent bien : - Robot 2WD avec évitement d'obstacles (voir notre guide) - Station météo IoT avec ESP32 + écran + envoi données vers serveur ThingSpeak - Système d'arrosage automatique pour plantes (capteur humidité sol + pompe + relais) - Compteur de visiteurs au FabLab avec HC-SR04 + écran OLED + buzzer - Alarme intrusion avec PIR + buzzer + SMS via module SIM800L Astuce clé : au mois 3, achetez aussi un ESP32 pour 35 DT. Tester votre code Arduino sur ESP32 (compatible IDE Arduino) vous prépare en douceur au monde IoT. Et l'ESP32 a la pile Wi-Fi native, ce qui débloque tout un univers de projets. ## Au-delà d'Arduino : ESP32, STM32, Raspberry Pi Vous maîtrisez Arduino UNO ? Voici quand passer à autre chose. ## Passer à l'ESP32 quand… ... vous voulez de la connectivité (Wi-Fi, Bluetooth), ou plus de RAM pour stocker des données (logger, buffer), ou des performances supérieures (filtrage signal, calcul). Le saut est doux : même IDE, même langage, juste quelques différences (tension 3.3V, gestion broches légèrement différente). Carte recommandée : ESP32 DevKit V1 30 broches à 35 DT chez Didactico. ## Passer à un STM32 quand… ... vous suivez un cursus d'ingénieur en systèmes embarqués (3ème année ENIT, INSAT, ENSI, ESPRIT), ou vous voulez vous rapprocher du monde professionnel industriel. Carte d'entrée : STM32F103C8T6 "Blue Pill" à 25 DT, compatible Arduino IDE (avec le board manager STM32duino). Pour aller plus loin, NUCLEO-F411RE à 60 DT avec STM32CubeIDE. ## Passer à Raspberry Pi quand… ... vous voulez faire de la vision artificielle (OpenCV, TensorFlow Lite), un serveur personnel (Plex, Pi-hole), une console retro (RetroPie), un NAS, ou des projets qui demandent un vrai système d'exploitation. Modèle d'entrée : Raspberry Pi 4 4GB à 250-300 DT en Tunisie. Le Pi 5 (2024) est encore difficile à trouver et coûteux. 📚 DÉMARREZ MAINTENANT ## Boutique Didactico — kits Arduino & ESP32 Cartes Arduino UNO, Nano, Mega, modules ESP32, kits débutants complets, capteurs, alimentations. Livraison 24-48h dans toute la Tunisie. Conseil personnalisé en boutique Sfax pour les étudiants ENIT, INSAT, ISBS, ISET, ESPRIT, IIT, ENSI. Voir les kits → ## Erreurs débutant à éviter absolument ## Erreur 1 — Brancher sur 220V sans relais correctement isolé Le piège classique : vouloir piloter une lampe ou un ventilateur 220V directement depuis l'Arduino. Sans relais ou triac correctement isolé optiquement, vous risquez l'électrocution ET la destruction de l'Arduino. Toujours utiliser un module relais avec opto-coupleur, et idéalement un boîtier isolé. ## Erreur 2 — Oublier la résistance de pull-up sur un bouton Un bouton poussoir laissé "en l'air" sans pull-up flotte électriquement et provoque des détections aléatoires. Solution : soit ajouter une résistance 10kΩ externe entre la broche et VCC, soit utiliser pinMode(PIN, INPUT_PULLUP) qui active la pull-up interne de l'ATmega328P. Bouton à câbler alors entre la broche et GND, et lire "LOW = appuyé". ## Erreur 3 — delay() qui bloque tout delay(1000) gèle l'Arduino pendant 1 seconde : impossible de lire un bouton, recevoir des données série, mettre à jour un écran pendant ce temps. Pour des projets non triviaux, utilisez millis() et le pattern "non-blocking delay" : unsigned long dernierBlink = 0; const long INTERVALLE = 1000; bool etatLed = false; void loop() { unsigned long maintenant = millis(); if (maintenant - dernierBlink >= INTERVALLE) { dernierBlink = maintenant; etatLed = !etatLed; digitalWrite(13, etatLed); } // ici, le reste du loop continue de tourner : // lecture boutons, capteurs, communication, etc. } ## Erreur 4 — Alimentation sous-dimensionnée Voir notre guide alimentations 2026. Erreur n°1 chez les débutants : pile 9V pour robot, Arduino qui redémarre à chaque pic moteur. ## Erreur 5 — Mauvaise tension capteur (3.3V vs 5V) Certains capteurs (BMP280, MPU6050) fonctionnent en 3.3V natif et peuvent griller à 5V. Vérifiez la datasheet, ou prenez les versions "breakout" qui intègrent un régulateur 3.3V (la plupart des modules pour Arduino sont compatibles 5V grâce à cela). ## Erreur 6 — Code sans commentaires Vous reprendrez votre code dans 3 mois et vous n'y comprendrez plus rien. Commentez en français toutes les fonctions, toutes les broches dès le début. Bonne pratique pour les rapports de TP/TD en école d'ingénieur, et pour le portfolio GitHub. ## FAQ — Questions fréquentes des débutants tunisiens Faut-il connaître le C++ avant de démarrer Arduino ?Non. Le "C++ Arduino" est un sous-ensemble simplifié et orienté embarqué. Vous apprendrez en chemin : variables, fonctions, conditions, boucles. C'est même une excellente manière d'apprendre la programmation en voyant les effets physiques immédiats. Beaucoup d'étudiants en filière non-informatique (ISET mécanique, ISBS biomédical) maîtrisent l'Arduino sans avoir suivi de cours de C++. Où acheter de l'Arduino en Tunisie hors capitale ?Didactico Sfax livre dans toute la Tunisie en 24-48h via Aramex/Tunisie Express avec paiement à la livraison. C'est notre service phare pour les étudiants en région (Gabès, Kasserine, Le Kef, Tozeur, Mahdia). Vous commandez en ligne, vous payez le livreur, vous recevez. Sans risque. Mon Arduino n'est pas détecté sur le COM port. Que faire ?Cinq vérifications dans l'ordre : (1) câble USB de qualité, certains câbles sont "charge seule" sans data — testez avec un autre câble ; (2) pilote CH340 installé si carte compatible ; (3) Gestionnaire de périphériques Windows : voir si un "USB Serial" apparaît avec ! jaune (pilote manquant) ; (4) menu Outils → Port dans IDE rafraîchi ; (5) tester sur un autre PC pour éliminer un problème logiciel local. Quelle différence entre Arduino IDE et PlatformIO ?Arduino IDE est l'environnement officiel, simple, parfait pour débuter. PlatformIO est une extension VS Code plus puissante (gestion de versions, debug pas-à-pas, multi-cartes en un projet), recommandée à partir du niveau intermédiaire. Pour les 3-6 premiers mois, restez sur Arduino IDE 2.x. Combien de temps pour devenir "correct" en Arduino ?En suivant le parcours 4 mois proposé : vous pouvez aborder n'importe quel projet débutant à intermédiaire. Pour atteindre un niveau de projet de fin d'études ENIT/INSAT (ESP32 IoT complet, robot autonome, IHM industrielle), comptez 12-18 mois de pratique régulière (5-10h/semaine). Est-ce que je peux faire de l'argent avec mes compétences Arduino ?Oui — plusieurs voies : (1) freelance en domotique pour particuliers (alarmes, automatisations, irrigation jardin) ; (2) stages PFE rémunérés en startups tunisiennes (Telnet, Vermeg, Sofrecom, BIAT digital lab) ; (3) projets sur Upwork/Fiverr pour clients internationaux ; (4) création de produit (le maker tunisien Hatem Charfi a lancé sa propre marque de domotique en 2023). Ne sous-estimez pas la valeur de ces compétences sur le marché. Faut-il un ordinateur puissant pour faire de l'Arduino ?Non. L'Arduino IDE tourne sur un PC d'entrée de gamme (4 Go RAM, Core i3 ou équivalent). Même un vieux laptop sous Linux léger (Lubuntu, Linux Mint) suffit largement. C'est l'avantage de l'embarqué : tout le "calcul" se passe sur le micro-contrôleur, pas sur le PC. Idéal pour les étudiants tunisiens à budget serré. ## Conclusion : votre voyage commence maintenant Démarrer en Arduino, c'est ouvrir la porte à un univers immense : robotique, IoT, domotique, biomédical, agronomie, art interactif, automobile, aéronautique amateur. Chaque domaine a une communauté tunisienne active qui vous accueillera dès vos premières questions. La barre d'entrée est ridiculement basse (30 DT et une après-midi pour la première LED qui clignote), mais le plafond est infini. Le seul vrai conseil que nous donnons depuis 8 ans à Didactico Sfax : commencez maintenant, pas demain. Acheter la carte est 5% du chemin ; les 95% restants se construisent en posant les mains sur les composants et en débuggant les erreurs. Pour démarrer dès aujourd'hui, passez en boutique Sfax ou commandez en ligne notre kit débutant Arduino avec livraison 24-48h partout en Tunisie. Et lisez ensuite notre guide robot 2WD pour votre premier vrai projet motivant, ou notre guide choix capteur pour étendre vos horizons. À très vite dans le monde des makers tunisiens ! --- # 5 Projets Raspberry Pi Incontournables pour Devenir Maker (2026) URL: https://didactico.tn/raspberry-pi-5-projets-debutants/ Résumé: 5 projets Raspberry Pi détaillés pour débuter en 2026 : NAS, Pi-hole, caméra, station météo Grafana, RetroPie. Matériel, code et déploiement complets. Tunisie. Sfax, juillet 2025, dans une chambre étudiante de l'ENET'Com. Mehdi, étudiant en 2ème année d'ingénierie électronique, déballe son premier Raspberry Pi 4. Il a hésité pendant des semaines : « Mais qu'est-ce que je vais en faire concrètement ? ». Six mois plus tard, sa chambre s'est transformée en mini-datacenter personnel : un NAS qui héberge ses cours en 4K accessibles depuis n'importe quel coin de l'université, un Pi-hole qui bloque toutes les pubs du WiFi familial, une caméra qui surveille l'entrée de la maison familiale, une station météo qui trace les anomalies thermiques de l'appartement, et un Pi RetroPie qu'il sort le vendredi soir avec ses amis pour rejouer à Street Fighter II. Total dépensé : moins de 400 dinars. Total appris : une vie entière de compétences DevOps, Linux, réseau, IoT. Voici les 5 projets qui ont transformé Mehdi en vrai maker. ## 📋 Table des matières - Quel Raspberry Pi choisir pour débuter ? - Projet 1 — NAS personnel avec OpenMediaVault - Projet 2 — Pi-hole, le bloqueur de pub réseau - Projet 3 — Caméra surveillance MotionEyeOS - Projet 4 — Station météo Grafana stack - Projet 5 — Console retrogaming RetroPie - FAQ projets Raspberry Pi débutant ## Quel Raspberry Pi choisir pour débuter ? Avant de plonger dans les projets, posons les bases. Tous les Pi ne se valent pas, et acheter le mauvais modèle gâche l'expérience. Voici la matrice de décision rapide pour débutants : - Pi 4 4GB — Le choix universel. Tient tous les projets de cette liste sauf un NAS multi-utilisateurs intensif. ~180 DT chez Didactico. - Pi 4 8GB — Si vous voulez tout faire en parallèle (NAS + Pi-hole + Grafana sur la même machine via Docker). ~280 DT. - Pi Zero 2 W — Pour les projets monotâche IoT (caméra, capteur). Trop limité pour les autres projets de la liste. ~55 DT. - Pi 5 4GB/8GB — Plus rapide (jusqu'à 2-3×), mais chauffe et demande une alim 27W spéciale. Overkill pour débuter. 💡 Conseil Didactico Pour démarrer sereinement avec ces 5 projets, prenez un Pi 4 4GB + microSD SanDisk Ultra 64 Go classe A1 + alim officielle 5V/3A USB-C + boîtier ventilé. Budget : environ 250 DT chez Didactico Sfax avec livraison 24-48h partout en Tunisie. ## Projet 1 — NAS personnel avec OpenMediaVault Niveau : Intermédiaire — Temps : 2-3 heures — Budget total : ~350-500 DT (selon disques) Un NAS (Network Attached Storage) est un disque dur accessible via le réseau. Au lieu de payer 6€/mois pour 200 Go iCloud, vous hébergez 4 To chez vous, accessibles depuis Mac, Windows, Linux, iPhone et Android. Un Pi 4 + 2 disques durs USB transforme votre maison en mini-cloud personnel. ## Matériel exact - Raspberry Pi 4 4GB (180 DT) - Alim officielle USB-C 5V/3A (25 DT) - microSD 32 Go classe A1 (25 DT) - 2× disques durs externes USB 3.0 — idéalement WD Elements 2 ou 4 To (140-220 DT pièce) - Hub USB 3.0 alimenté si les disques sont gros (le Pi seul ne fournit pas assez de courant) - Boîtier ventilé Argon ONE M.2 ou équivalent (optionnel mais recommandé) ## Installation OpenMediaVault # 1. Flasher Raspberry Pi OS Lite 64-bit avec Imager # (configurer SSH et hostname "dida-nas.local" en avancé) # 2. SSH dans le Pi puis : ssh didactico@dida-nas.local sudo apt update && sudo apt full-upgrade -y # 3. Installer OpenMediaVault (script officiel) : wget -O - https://github.com/OpenMediaVault-Plugin-Developers/installScript/raw/master/install | sudo bash # Le script prend 15-20 minutes, le Pi reboote 2 fois. # Identifiants par défaut : admin / openmediavault # Puis ouvrir http://dida-nas.local dans le navigateur ## Configuration des partages SMB / NFS / AFP Dans l'interface web OMV : - Stockage > Disques : OMV détecte vos USB. Cliquez « Effacer » sur chaque disque (formatage propre). - Stockage > Système de fichiers : créez un EXT4 sur chaque disque, montez-les. - Stockage > RAID (si 2 disques identiques) : créez un RAID 1 (mirror) — vos données sont dupliquées, vous survivez à la panne d'un disque. - Stockage > Partages dossier : créez « Documents », « Photos », « Films ». - Services > SMB/CIFS : activez, ajoutez les partages. Accessible depuis Windows en \dida-nasDocuments. - Services > NFS : activez pour Mac/Linux (plus rapide que SMB sur LAN gigabit). ## Accès depuis Mac, Windows, Linux # Windows (Explorateur de fichiers) : \dida-nasDocuments # macOS (Finder > Cmd+K) : smb://dida-nas.local/Documents afp://dida-nas.local # Plus rapide sur Mac # Linux (terminal) : sudo mount -t cifs //dida-nas.local/Documents /mnt/nas -o username=didactico,password=mdp,uid=1000,gid=1000 # iOS/Android : App "Files" > Se connecter au serveur > smb://dida-nas.local ⚠️ Sauvegarde Un RAID 1 ne remplace pas une sauvegarde ! Si vous supprimez par erreur un fichier, il disparaît des deux disques simultanément. Activez le plugin OMV Backup pour synchroniser une fois par semaine vers un 3ème disque externe (règle 3-2-1). ## Projet 2 — Pi-hole, le bloqueur de pub niveau réseau Niveau : Débutant — Temps : 30 minutes — Budget : ~80 DT (Pi Zero 2 W suffit) Pi-hole transforme le Pi en serveur DNS local. Tout appareil de votre maison (TV Samsung, iPhone, Xbox, PC) qui demande la résolution d'un domaine de pub se voit retourner 0.0.0.0 → la pub ne s'affiche jamais, ni dans Safari, ni dans les apps, ni dans la Smart TV. Différence majeure avec uBlock Origin : Pi-hole bloque partout sur le réseau, sans installation côté client. ## Matériel - Pi Zero 2 W ou Pi 4 (Zero 2 W suffit, charge CPU < 5%) - microSD 16 Go - Alim 5V/2A - Câble Ethernet recommandé (plus fiable que WiFi pour DNS) ## Installation en une commande # Après avoir flashé Raspberry Pi OS Lite : curl -sSL https://install.pi-hole.net | bash # Le wizard pose 8 questions : # 1. Interface réseau ? → eth0 ou wlan0 # 2. DNS amont ? → Cloudflare 1.1.1.1 ou Quad9 9.9.9.9 # 3. Liste de blocage ? → StevenBlack (default) # 4. Protocoles ? → IPv4 + IPv6 si dispo # 5. IP statique ? → OUI (très important !) # 6. Web admin interface ? → OUI # 7. Lighttpd web server ? → OUI # 8. Log queries ? → OUI (sinon pas de stats) # À la fin, le script affiche le mot de passe admin. # Notez-le ou changez-le : pihole -a -p ## Configurer la box Internet Le seul point délicat : pointer votre box vers le Pi-hole. - Connectez-vous à votre box (Topnet, Orange, Ooredoo : 192.168.1.1 ou 192.168.0.1) - Allez dans DHCP / Paramètres réseau / DNS - Remplacez le DNS primaire par l'IP du Pi-hole (ex : 192.168.1.50) - DNS secondaire : laissez vide ou mettez 1.1.1.1 (sinon Windows contourne Pi-hole) - Sauvegardez et redémarrez la box Au bout de 24h, ouvrez le dashboard http://pi.hole/admin. Vous verrez le nombre de requêtes DNS, le % bloqué (typiquement 20-40%), et les domaines les plus filtrés. ## Listes noires personnalisées # Ajouter des listes anti-malware (Group Management > Adlists) : https://urlhaus.abuse.ch/downloads/hostfile/ https://blocklistproject.github.io/Lists/malware.txt https://blocklistproject.github.io/Lists/phishing.txt https://blocklistproject.github.io/Lists/scam.txt # Whitelister un domaine cassé par Pi-hole : pihole -w t.co pihole -w cdn.discordapp.com # Statistiques par client : pihole -q google-analytics.com ## Projet 3 — Caméra surveillance MotionEyeOS Niveau : Débutant — Temps : 1 heure — Budget : ~180 DT Détecter un mouvement à l'entrée de la maison, enregistrer une vidéo, recevoir une notification sur Telegram. Le tout sans abonnement Ring ou Arlo. ## Matériel - Pi Zero W ou Zero 2 W - Pi Camera v2 ou v3 + câble CSI 22 pins (spécifique au Zero) - microSD 32 Go - Alim 5V/2A - Boîtier 3D imprimé (Bambu Lab A1 mini parfait, fichiers STL gratuits sur Printables) ## Installation # Sur Raspberry Pi OS Lite : sudo apt install -y motion ffmpeg python3-pip sudo raspi-config # Interface Options > Camera > Enable # Tester la caméra : libcamera-hello --timeout 5000 libcamera-vid -t 10000 -o test.h264 # Configurer Motion : sudo nano /etc/motion/motion.conf # Modifier : # daemon on # stream_localhost off # width 1280 # height 720 # framerate 15 # threshold 2000 # minimum_motion_frames 3 # pre_capture 2 # post_capture 5 # target_dir /var/lib/motion # on_event_start /usr/local/bin/telegram-notify.sh %f sudo systemctl enable motion sudo systemctl start motion ## Notifications Telegram automatiques # /usr/local/bin/telegram-notify.sh #!/bin/bash TOKEN="VOTRE_BOT_TOKEN" # Obtenu via @BotFather CHAT="VOTRE_CHAT_ID" # Obtenu via @userinfobot IMG="$1" # Motion passe le chemin de la dernière image curl -s -F chat_id=${CHAT} -F photo=@${IMG} -F caption="🚨 Mouvement $(date '+%H:%M:%S')" https://api.telegram.org/bot${TOKEN}/sendPhoto Le flux vidéo live est accessible sur http://pi-cam.local:8081. Pour les masques de détection (ignorer la rue passante), créez une image PNG noir/blanc où les zones noires = ignorées, et pointez Motion vers cette image avec mask_file. ## Projet 4 — Station météo Grafana stack Niveau : Intermédiaire-avancé — Temps : 3-4 heures — Budget : ~250 DT Mesurez température, humidité, pression, qualité de l'air en continu. Stockez les données dans InfluxDB. Visualisez avec Grafana. Recevez des alertes Telegram quand le seuil est dépassé. ## Matériel - Pi 4 4GB (NAS et station peuvent cohabiter) - Capteur BME280 (température/humidité/pression, I2C, ~25 DT) - Capteur BH1750 (luminosité lux, I2C, ~12 DT) - Capteur MQ-135 ou SGP30 (qualité air CO2/VOC, ~30 DT) - Écran OLED 0.96" SSD1306 (I2C, ~18 DT) - Quelques jumpers M-F ## Stack InfluxDB + Grafana via Docker # Installer Docker sur le Pi : curl -fsSL https://get.docker.com | sh sudo usermod -aG docker $USER # docker-compose.yml dans /home/didactico/meteo/ : version: "3.8" services: influxdb: image: influxdb:2.7 container_name: influxdb ports: ["8086:8086"] volumes: ["./influxdb:/var/lib/influxdb2"] environment: DOCKER_INFLUXDB_INIT_MODE: setup DOCKER_INFLUXDB_INIT_USERNAME: didactico DOCKER_INFLUXDB_INIT_PASSWORD: motdepasse24car DOCKER_INFLUXDB_INIT_ORG: dida-org DOCKER_INFLUXDB_INIT_BUCKET: meteo grafana: image: grafana/grafana:latest container_name: grafana ports: ["3000:3000"] volumes: ["./grafana:/var/lib/grafana"] depends_on: [influxdb] # Lancer : docker compose up -d # Grafana sur http://pi.local:3000 (admin/admin) # InfluxDB sur http://pi.local:8086 ## Script de mesure Python # meteo.py — Mesure toutes les minutes import time, board, busio import adafruit_bme280.advanced as bme280 import adafruit_bh1750 from influxdb_client import InfluxDBClient, Point from influxdb_client.client.write_api import SYNCHRONOUS i2c = busio.I2C(board.SCL, board.SDA) bme = bme280.Adafruit_BME280_I2C(i2c, address=0x76) bh = adafruit_bh1750.BH1750(i2c) client = InfluxDBClient( url="http://localhost:8086", token="VOTRE_TOKEN_INFLUX", org="dida-org" ) write_api = client.write_api(write_options=SYNCHRONOUS) while True: p = (Point("environnement") .tag("location", "chambre") .field("temp_c", bme.temperature) .field("humid_pct", bme.relative_humidity) .field("press_hpa", bme.pressure) .field("lux", bh.lux)) write_api.write(bucket="meteo", record=p) time.sleep(60) ## Alertes Grafana → Telegram Dans Grafana, créez une Alert Rule qui se déclenche si la température dépasse 30°C pendant 10 minutes, et configurez un contact point Telegram (avec votre bot token). À 30°C en chambre étudiante l'été, vous recevez un push « Allume la clim ! ». ## Projet 5 — Console retrogaming RetroPie Niveau : Débutant — Temps : 2 heures — Budget : ~280 DT Replongez dans la NES, la SNES, la Megadrive, la PS1, et même la PSP — sur une seule console DIY connectée à votre TV en HDMI. RetroPie est une distribution Linux qui transforme le Pi en machine d'arcade. ## Matériel - Pi 4 4GB (le Pi 5 est overkill, le Pi Zero limite trop la PS1) - microSD 64 Go classe A1 (les ROMs occupent vite de la place) - Manette 8BitDo SN30 Pro ou 8BitDo Ultimate (Bluetooth, parfaite compatibilité) - Câble HDMI vers TV (un Pi 4 a 2 micro-HDMI — vérifiez votre câble) - Boîtier NESPi 4 Case ou SNESPi Case (factor nostalgique +++, slot SSD M.2 inclus) ## Installation RetroPie # 1. Télécharger l'image officielle : https://retropie.org.uk/download/ # 2. Flasher avec Raspberry Pi Imager # (choisir "Use custom" et sélectionner l'image .img.gz) # 3. Premier boot : RetroPie demande de configurer la manette # (suivre les instructions à l'écran) # 4. Activer SSH pour transférer les ROMs : # F4 pour sortir d'EmulationStation # sudo raspi-config > Interface Options > SSH > Enable # 5. Transférer les ROMs depuis Mac/PC : scp Super_Mario.smc pi@retropie.local:/home/pi/RetroPie/roms/snes/ scp Sonic.md pi@retropie.local:/home/pi/RetroPie/roms/megadrive/ # Ou via partage SMB (RetroPie expose un share automatique) : smb://retropie.local/roms/snes/ ⚠️ Légalité des ROMs En Tunisie comme ailleurs, les ROMs sont des œuvres protégées par copyright. Légalement, vous pouvez utiliser des ROMs uniquement si vous possédez la cartouche/disque original ou si elles sont distribuées librement (Homebrew, démos officielles, jeux abandonware libres). Privilégiez les hubs légaux comme Itch.io. ## Scraper artwork avec EmulationStation Le scraper télécharge automatiquement les jaquettes, screenshots et descriptions pour chaque ROM. - Dans EmulationStation, appuyer sur Start > Scraper - Choisir source : ScreenScraper (créez un compte gratuit sur screenscraper.fr) - Lancer le scraping → l'interface devient visuelle, avec jaquettes en grille ## Thèmes EmulationStation Le thème par défaut « Carbon » est correct mais daté. Essayez ES-DE ou Maximuss pour une interface moderne avec animations et videos preview. 🎮 CATÉGORIE COMPLÈTE ## Raspberry Pi chez Didactico Tous les Pi (Zero W, Zero 2 W, Pi 4 4GB/8GB, Pi 5), accessoires officiels, alimentations USB-C, caméras, capteurs et boîtiers. Stock Sfax, livraison 24-48h partout en Tunisie. Voir la catégorie Pi → ## FAQ projets Raspberry Pi débutant Combien de Pi me faut-il pour faire les 5 projets en parallèle ?Idéalement 3 Pi : un Pi 4 4GB qui mutualise NAS + Pi-hole + Grafana (via Docker), un Pi Zero W dédié caméra, et un Pi 4 séparé pour RetroPie (HDMI + manettes occupent toute la machine). Total : ~400 DT chez Didactico. Puis-je faire tourner Pi-hole + NAS sur le même Pi ?Oui, parfaitement. Pi-hole consomme < 50 Mo de RAM et < 5% de CPU. Sur un Pi 4 4GB, il coexiste sans problème avec OpenMediaVault, Docker, Grafana et même Home Assistant. Quel disque dur USB pour le NAS ?Privilégiez les Western Digital Elements ou Seagate Expansion 2-4 To USB 3.0. Évitez les SSD USB-C bon marché qui surchauffent. Pour un usage intensif, un mini-PC ou un vrai NAS Synology DS220+ reste plus pertinent — le Pi NAS est avant tout un projet d'apprentissage. Pi-hole fonctionne-t-il avec la box Topnet / Orange / Ooredoo ?Oui sur les box récentes (Huawei HG8245H5, Sagemcom Fast 5366) qui permettent de modifier les DNS DHCP. Pour les anciennes box bloquées, vous pouvez désactiver le DHCP de la box et laisser Pi-hole jouer le rôle de serveur DHCP (mode plus avancé). RetroPie supporte-t-il la PS2 ou la GameCube ?Sur Pi 4, oui mais difficilement : PS2 (PCSX2) demande énormément de CPU, on tourne à 30-50% de la vitesse normale. GameCube/Wii (Dolphin) idem. Pour ces consoles, mieux vaut un Pi 5 ou même un mini-PC x86 sous Batocera. Comment imprimer les boîtiers en 3D ?Une Bambu Lab A1 mini (550 DT environ) ou P1S est parfaite : impression rapide, peu de réglages, PLA noir mat élégant pour les boîtiers Pi. Pour des détails ultra-fins (textes en relief, joints toriques), passez sur Elegoo Saturn en résine. Fichiers STL gratuits sur Printables.com et Thingiverse. Quel système choisir pour démarrer si je ne connais rien ?Raspberry Pi OS « avec Bureau » version 64-bit. Interface graphique familière, navigateur Chromium, Python et VS Code préinstallés. Une fois à l'aise, basculez en Lite (sans bureau) pour les projets serveur — vous gagnez 1 Go de RAM disponible. ## Conclusion Ces 5 projets couvrent l'essentiel des compétences modernes d'un maker : Linux, réseau, Docker, capteurs I2C, bases de données time-series, dashboarding, automation Telegram. Aucun ne demande de soudure. Tous peuvent être réalisés en un week-end avec un Pi 4 chez Didactico Sfax. Mehdi, notre étudiant du début, a depuis évolué vers Home Assistant, Kubernetes K3s et un cluster de 4 Pi pour son PFE à l'ENET'Com. Le Raspberry Pi n'est pas un produit, c'est une porte d'entrée vers tout l'univers DevOps. Pour aller plus loin, consultez notre guide complet du Raspberry Pi Zero ou notre tutoriel Pi + Arduino pour la surveillance avancée. --- # ESP32 vs ESP8266 : Lequel Choisir pour votre Projet IoT en Tunisie (2026) URL: https://didactico.tn/esp32-vs-esp8266-projet-iot/ Résumé: Comparatif technique exhaustif ESP32 vs ESP8266 en 2026 : architecture, benchmarks Dhrystone/CoreMark, GPIO, deep sleep, prix Tunisie, et grille de decision par type de projet IoT pour etudiants et makers tunisiens. Janvier 2026. Dans le laboratoire d'electronique de l'INSAT, deux equipes d'etudiants en PFE me presentent leurs projets. Equipe 1 : un thermostat connecte ESP8266, 12 TND par carte, 4 mois de developpement. Equipe 2 : une station meteo + camera + BLE beacon ESP32, 18 TND par carte, 5 mois de developpement. Les deux marchent. Les deux notent 18/20. Question : qui a fait le bon choix ? La reponse, comme souvent en electronique, est "ca depend". Mais cette fois, je vais vous donner des criteres precis, des benchmarks reels mesures au laboratoire Didactico, et une grille de decision claire. A la fin de cet article, vous saurez exactement quelle carte commander pour votre prochain projet IoT. ## 📋 Table des matieres - 1. Histoire Espressif : de 2014 a 2026 - 2. Tableau comparatif exhaustif - 3. Benchmarks reels (Dhrystone, CoreMark, FFT) - 4. La famille ESP32 : S2, S3, C3, H2 - 5. Pourquoi l'ESP8266 reste pertinent - 6. Grille de decision par type de projet - 7. 8 exemples decisifs reels - 8. Evolution prix Tunisie 2020-2026 - 9. Recommandation Didactico 2026 - 10. FAQ ## 1. Histoire Espressif : de 2014 a 2026 Pour comprendre les choix techniques, il faut connaitre la trajectoire d'Espressif Systems (Shanghai, fondee en 2008). - 2014 - ESP8266 : sortie du module ESP-01 a 5 USD. Premiere demonstration mondiale qu'un MCU WiFi peut coûter moins qu'un sandwich. Disruption totale du marche IoT, etranglement de TI CC3000 et Microchip MRF24WB0. - 2016 - ESP32 : reponse aux limites de l'ESP8266 (1 core, peu de RAM, pas de BT). Architecture Xtensa LX6 dual-core, BT 4.2 + BLE, AES hardware. - 2019 - ESP32-S2 : USB OTG natif, plus securise, mais single core (deception). - 2020 - ESP32-S3 : retour du dual core LX7, vector accelerator pour AI (TinyML), BLE 5, USB OTG. Le successeur naturel de l'ESP32. - 2021 - ESP32-C3 : premier ESP en RISC-V. Single core 160 MHz, BLE 5, WiFi, low cost. Concurrent direct de l'ESP8266 avec BT en plus. - 2023 - ESP32-H2 : 802.15.4 (Zigbee, Thread, Matter). Pas de WiFi, BLE 5. - 2024 - ESP32-P4 : MCU haute performance avec RISC-V 400 MHz, MIPI-DSI/CSI, HD camera/display. Pas de WiFi, prevu en combo avec ESP32-C6 wireless. - 2026 - ESP32-C6 et C5 : WiFi 6, Zigbee, Thread, Matter, Bluetooth LE 5. Le futur connecte. ## 2. Tableau comparatif exhaustif CaracteristiqueESP8266 (NodeMCU)ESP32 (WROOM-32) Architecture CPUTensilica L106 32-bitXtensa LX6 32-bit dual-core Frequence max80 MHz (160 MHz overclock)240 MHz Cores12 RAM80 KB user (160 KB total)520 KB SRAM Flash4 MB (typique)4 MB (typique, jusqu'a 16 MB) WiFi802.11 b/g/n 2,4 GHz802.11 b/g/n 2,4 GHz BluetoothNONBT 4.2 classic + BLE GPIO total17 (dont 11 utiles)34 (dont 25 utiles) ADC1 canal, 10-bit18 canaux, 12-bit DACNON2 canaux 8-bit PWM channels4 (software)16 (hardware LEDC) I2C1 (software)2 (hardware) SPI24 UART2 (1 vraiment utile)3 I2S12 CANNON1 (TWAI) EthernetNONRMII 10/100 (optionnel) Touch sensorsNON10 Hall sensorNON1 (interne) SecuriteWPA/WPA2 onlyWPA/WPA2/WPA3, AES, SHA, RSA, ECC, Secure Boot, Flash Encryption Deep sleep20 µA10 µA Operating Voltage3,3V (3,0-3,6V)3,3V (3,0-3,6V) Courant max actif~80 mA WiFi TX~240 mA WiFi TX Temperature-40 a +125 °C-40 a +125 °C Prix Didactico 202610-14 TND (NodeMCU)15-22 TND (WROOM-32) ## 3. Benchmarks reels mesures au laboratoire Didactico Tests effectues sur ESP8266 NodeMCU v3 (160 MHz overclock) vs ESP32 DevKit V1 WROOM-32 (240 MHz). Mesures moyennes sur 100 iterations. ## Dhrystone (DMIPS) ESP8266 @ 160 MHz180 DMIPS ESP32 @ 240 MHz (1 core)504 DMIPS ESP32 @ 240 MHz (2 cores)~1000 DMIPS ## CoreMark ESP8266 @ 160 MHz358 CoreMark ESP32 @ 240 MHz (1 core)506 CoreMark ESP32-S3 @ 240 MHz (1 core)613 CoreMark ## FFT 1024 points (float32) ESP826689 ms ESP3214 ms ESP32-S3 (avec vector accel)5,2 ms ## Web server requests/sec (HTTP /hello) ESP8266 ESPAsyncWebServer~60 req/s ESP32 ESPAsyncWebServer~280 req/s 💡 Lecture des benchmarksL'ESP32 est 3 a 6 fois plus rapide que l'ESP8266 selon les charges. Mais pour 80% des projets IoT (envoyer 1 mesure toutes les 5 min), cette difference est invisible. Vous payez +5 TND pour des cycles CPU que vous n'utilisez jamais. ## 4. La famille ESP32 : S2, S3, C3, H2 - quel choisir ? VarianteArchitectureWiFiBTUSBSpecificitePrix TND ESP32 classic2x LX6 240MHz2,4GHz4.2 + BLENon nativePolyvalent15-22 ESP32-S21x LX7 240MHz2,4GHzNONOTG hostHID, USB host20-30 ESP32-S32x LX7 240MHz2,4GHzBLE 5OTG hostAI (vector accel)25-35 ESP32-C31x RISC-V 160MHz2,4GHzBLE 5USB serialEconomique, RISC-V18-25 ESP32-H21x RISC-V 96MHzNONBLE 5USB serialZigbee, Thread, Matter22-30 ESP32-C61x RISC-V 160MHzWiFi 6BLE 5USB serialWiFi 6 + Zigbee + Thread30-40 ## 5. Pourquoi l'ESP8266 reste pertinent en 2026 L'ESP8266 est ne en 2014. Treize ans plus tard, on pourrait penser qu'il est mort. Faux. Voici pourquoi il garde sa place : - Prix imbattable : 10-12 TND vs 15-22 TND pour ESP32. Sur 100 capteurs, ca fait 500-1000 TND d'economie. - Maturite logicielle : 12 ans de bibliotheques debuggees, exemples pleins de StackOverflow, Tasmota qui marche au poil. - Disponibilite garantie : Espressif continue la production (pas d'EOL annonce). Distribution massive en Asie. - Simplicite : 1 core, pas de FreeRTOS lourd, debug plus facile pour debutants. - Suffisant 80% des cas : pour un capteur DHT22 + WiFi MQTT, l'ESP8266 fait largement le travail. ## Pourquoi l'ESP8266 disparait progressivement - Pas de BLE : exclu de tout projet wearable, beacon, configuration mobile. - Pas de WPA3 : posera probleme sur les nouveaux routeurs. - Crypto faible : pas d'AES hardware, lent en HTTPS. - Single core : impossible de faire WiFi + capteur temps reel sans glitches. - 10-bit ADC + 1 canal : limitations pour applications analogiques. ## 6. Grille de decision par type de projet Type de projetRecommandationPourquoi Capteur unique + WiFi + MQTTESP8266Suffisant, economique Smart home (relais, capteurs Tasmota)ESP8266Ecosysteme Tasmota mature Station meteo multi-capteursESP32Plus d'ADC, deep sleep optimal Configuration WiFi via BluetoothESP32BLE necessaire Beacon BLE / iBeaconESP32 ou ESP32-C3BLE 4.2 ou BLE 5 Wearable (montre, bracelet)ESP32-S3BLE 5, low power Audio (lecteur MP3, voix)ESP32 ou S32x I2S, DAC Camera ESP32-CAM, vision AIESP32 ou S3PSRAM, vector accel S3 Drone, robot temps reelESP32Dual core (1 RTOS + 1 control) USB Host (clavier, manette)ESP32-S2 ou S3USB OTG natif Domotique Zigbee / Thread / MatterESP32-H2 ou C6802.15.4 WiFi 6 (routeurs modernes)ESP32-C6Seul WiFi 6 Projet pedagogique tres economiqueESP8266Cout, simplicite Projet industriel certifieESP32 + Secure BootSecurite hardware ## 7. Huit exemples decisifs reels (Didactico 2024-2026) ## Exemple 1 : Thermostat radiateur (PFE ENIT 2024) ESP8266 NodeMCU + DHT22 + relais 5V. 30 unites deployees. Cout total : 30x 25 TND = 750 TND. ESP8266 : choix correct. ESP32 aurait fait 30x 35 TND = 1050 TND inutilement. ## Exemple 2 : Station meteo IoT (Sfax beach) ESP32 + BME280 + UV ML8511 + anemometre + pluviometre + LoRa. ESP32 necessaire car 4 capteurs analogiques (ESP8266 a 1 ADC), deep sleep < 15 µA, BLE pour config initiale. ## Exemple 3 : Tracker bus universitaire INSAT TTGO T-Beam (ESP32 + GPS + LoRa). 12 bus equipes. ESP32 obligatoire car GPS NMEA parsing + LoRa simultane + ecran OLED. ## Exemple 4 : Robot WiFi controle smartphone ESP32 DevKit + L298N + 4 moteurs DC + camera. ESP32 evident : un core fait le webserver streaming MJPEG, l'autre fait le PID des moteurs. ## Exemple 5 : Badge BLE conference ESP32-C3 + petit ecran e-paper. 200 unites pour event tech. ESP32-C3 ideal : BLE 5 + USB serial pour charge, prix economique 200x18 TND. ## Exemple 6 : Smart meter electrique maison ESP8266 + capteur ACS712 30A + relais. Mesure conso, MQTT vers Home Assistant. ESP8266 parfait, 12 TND, autonomie 5 ans sans souci. ## Exemple 7 : Domotique multiproto (Zigbee + WiFi) ESP32-C6 + capteurs Zigbee voisins (Aqara). ESP32-C6 obligatoire : seul avec 802.15.4 + WiFi pour faire bridge. ## Exemple 8 : Camera surveillance solaire ESP32-CAM (OV2640) + carte SD + LoRa pour signal. Detection mouvement, photo, envoi. ESP32 necessaire pour pipeline JPEG + DMA + memoire PSRAM 8 MB. ## 8. Evolution des prix en Tunisie 2020-2026 AnneeESP8266 NodeMCUESP32 DevKitESP32-S3ESP32-C3 202014 TND25 TNDNANA 202212 TND22 TND38 TND28 TND 202411 TND18 TND32 TND22 TND 202610 TND15 TND28 TND20 TND Tendances : ESP8266 plafonne (commodity), ESP32 baisse continuellement, ESP32-S3 et C3 democratisent. En 2026, l'ecart ESP8266 / ESP32 n'est plus que de 5 TND. La question economique perd de son sens. ## 9. Recommandation Didactico 2026 💡 Verdict 2026Pour 90% des projets IoT et PFE etudiants ENIT/INSAT/ESPRIT/ISET : ESP32 par defaut. La marge de 5 TND est negligeable face aux capacites (BLE, dual core, 18 ADC, AES hardware). Reservez l'ESP8266 aux deploiements massifs (50+ unites) avec budget critique, ou aux projets purement pedagogiques de premiere annee. Pour les projets specialises : ESP32-C3 (badge BLE economique), ESP32-S3 (vision/AI), ESP32-C6 (WiFi 6 + Matter), ESP32-H2 (Zigbee/Thread). ⚡ CHOISISSEZ VOTRE CARTE ## Cartes Programmables IoT Tout notre catalogue de cartes ESP32, ESP8266, ESP32-S3, ESP32-C3 et plus. Livraison 24-48h en Tunisie, support technique en arabe et francais, tarif etudiant ENIT/INSAT/ESPRIT/ISET. Voir toutes les cartes → ## 10. FAQ - ESP32 vs ESP8266 Le code Arduino est-il compatible entre ESP32 et ESP8266 ?A 80% oui, mais avec des differences. Les fonctions Arduino de base (digitalWrite, analogRead) sont identiques. Les libs WiFi sont differentes (ESP8266WiFi.h vs WiFi.h). Les broches ne sont pas mappees pareil. Compter 2-3h pour porter un code ESP8266 vers ESP32. L'ESP8266 est-il discontinue ?Non, Espressif continue de le produire et le supporte officiellement. Aucune date EOL annoncee. Mais les nouveaux modules grand public ne le ciblent plus, l'innovation est sur ESP32-S3/C3/C6. Lequel consomme moins en deep sleep ?ESP32 : 10 µA. ESP8266 : 20 µA. ESP32 gagne de peu. En sleep modem (WiFi off mais MCU on) : ESP32 850 µA, ESP8266 15 mA. ESP32 ecrase l'ESP8266. Peut-on faire de l'AI sur ESP32 ?Oui, avec TensorFlow Lite Micro. ESP32 classic : inference simple (keyword spotting). ESP32-S3 : avec vector accel, performance x3, demo de detection de visage faisable. Pour vraiment de l'AI, prefere ESP32-S3 ou un MCU dedie comme Kendryte K210. L'ESP32 est-il assez rapide pour servir un site web ?Oui largement. ESP32 peut servir 280 requetes/sec en HTTP, ou heberger une SPA React avec WebSocket pour 5-10 utilisateurs simultanes. Pour du e-commerce, prefere quand meme un VPS. Pour debuter en IoT, ESP8266 ou ESP32 ?En 2026, ESP32. La difference de prix (5 TND) ne justifie plus de partir sur l'architecture vieillissante de l'ESP8266. Vous apprenez sur la plateforme du futur. Y a-t-il un equivalent open-source du SDK Espressif ?Oui : ESP-IDF (Espressif IoT Development Framework) est open-source (Apache 2.0). C'est le framework professionnel, plus puissant qu'Arduino Core mais plus complexe. Recommande pour projets industriels. ## Conclusion : la decision finale En 2026, choisir entre ESP32 et ESP8266 c'est choisir entre economie immediate (5 TND) et peripheriques + futur. Pour 95% des projets makers, etudiants et professionnels en Tunisie, l'ESP32 est le choix evident. Pour quelques deploiements industriels massifs (200+ unites avec un capteur simple), l'ESP8266 reste un acteur economique pertinent. Quel que soit votre choix, Didactico Sfax stocke les deux familles avec livraison 24-48h partout en Tunisie. Pour approfondir, decouvrez nos guides ESP32 WiFi : envoyer vos donnees sur Internet, ESP32 LoRa pour l'Agriculture Tunisienne, et Module LoRa SX1276 communication longue distance. Tarif preferentiel pour les etudiants ENIT, INSAT, ESPRIT et ISET sur presentation de carte etudiante. --- # Comment Choisir le Bon Capteur Arduino pour votre Projet (Guide 2026) URL: https://didactico.tn/choisir-capteur-arduino/ Résumé: Bureau Didactico Sfax, lundi matin. Sami, étudiant en 3ème année à l'ENIT, débarque avec son cahier des charges : station agricole connectée pour la ferme ... Bureau Didactico Sfax, lundi matin. Sami, étudiant en 3ème année à l'ENIT, débarque avec son cahier des charges : station agricole connectée pour la ferme de son oncle à Kairouan. Il a sa liste : "il me faut un capteur d'humidité, un capteur de température et un capteur de soleil". Question piège : DHT11 ou DHT22 ? BH1750 ou simple LDR ? Humidité air ou humidité sol ? Communication I2C ou analogique ? Étanche ou non, sachant que ça vivra sous le soleil et la rosée matinale du Kairouanais ? Le choix du capteur, c'est la décision la plus stratégique d'un projet électronique. Un capteur mal choisi peut faire perdre une semaine de debug pour rien, ou pire — donner des mesures faussement plausibles que vous croirez fiables pendant des mois. À l'inverse, le bon capteur transforme un projet médiocre en système professionnel. Dans ce guide, on passe en revue les 40+ capteurs les plus utilisés en projet étudiant en Tunisie, organisés par grandeur physique, avec recommandations claires. ## 📋 Table des matières - La matrice de décision : 5 critères qui changent tout - Température et humidité - Distance et proximité - Lumière, UV, couleur - Mouvement, orientation, vibration - Gaz et qualité de l'air - Capteurs biomédicaux - Autres capteurs essentiels - Synthèse : les 5 critères de décision - FAQ ## La matrice de décision : 5 critères qui changent tout Avant de plonger dans les catalogues, ramenez votre besoin à 5 questions simples. C'est la méthode qu'on enseigne aux étudiants en atelier Didactico Sfax depuis 6 ans, et qui leur évite 90% des erreurs. - Quelle grandeur physique voulez-vous mesurer ? Température, distance, présence, accélération, lumière, qualité d'air, rythme cardiaque, humidité sol, force, pression... Soyez précis : "humidité" peut être humidité de l'air ou humidité du sol — capteurs totalement différents. - Quelle précision réelle vous faut-il ? Une station météo grand public se contente de ±2°C. Un incubateur d'œufs exige ±0.2°C. Plus on monte en précision, plus on monte en prix (×3 à ×10 entre amateur et pro). - Dans quel environnement ? Intérieur sec / outdoor / sol humide / immergé / haute température / présence de poussière / atmosphère explosive (Atex). Le HC-SR04 ne fonctionne pas sous la pluie, le DHT22 corrode si humidité > 95% prolongée. - Quelle interface électrique ? Analogique (le capteur sort une tension proportionnelle, lecture par analogRead), I2C (2 fils, plusieurs capteurs en parallèle, lecture par bibliothèque), SPI (4 fils, plus rapide), 1-Wire (1 fil + alim, génial pour multi-points), PWM, ou UART. Cela détermine combien de broches Arduino vous consommez et combien de capteurs vous pouvez accumuler. - Quel budget et quelle disponibilité locale ? En Tunisie, un capteur disponible chez Didactico Sfax avec livraison 24-48h vaut mieux qu'un capteur exotique commandé sur AliExpress qui arrive dans 3 semaines. Conseil d'atelier : Pour 80% des projets étudiants, partez du plus simple qui fait le travail. Un LDR à 200 millimes peut suffire là où un BH1750 à 8 DT n'apportera rien. Ne sur-spécifiez pas votre matériel. ## Température et humidité ## DHT11 — l'entrée de gamme indispensable 3 DT chez Didactico. Mesure température (0-50°C, précision ±2°C) et humidité relative (20-80%, précision ±5%). Communication 1-Wire propriétaire, bibliothèque "DHT sensor library" d'Adafruit. Limite : une mesure par seconde maximum. Acceptable pour démos pédagogiques, station météo de salon, projet TP de 1ère année. À éviter dès que la précision compte. ## DHT22 (AM2302) — le recommandé pour 90% des projets 8 DT. Successeur direct du DHT11, écart de prix dérisoire pour un gain énorme : température -40 à +80°C avec précision ±0.5°C, humidité 0-100% avec précision ±2%. Une mesure toutes les 2 secondes max. Compatible exactement la même bibliothèque (juste changer le type DHT11 → DHT22 dans le code). Si vous hésitez, prenez celui-ci. ## BMP280 — pression atmosphérique et altitude 5 DT. Capteur barométrique I2C, mesure pression 300-1100 hPa et température (mais pas humidité). Précision pression ±0.12 hPa = ±1 m d'altitude. Utilisations : altimètre pour drone ou montgolfière modèle, indicateur de tendance météo (pression qui chute = orage qui arrive), correction d'altitude pour station GPS. ## BME280 — le tout-en-un 15 DT. La référence absolue : température + humidité + pression en un seul capteur 5×5 mm. I2C, ultra précis (±0.5°C, ±3% humidité, ±1 hPa), faible consommation (3 µA en sommeil), bibliothèque Adafruit excellente. C'est le capteur des stations météo IoT sérieuses, des serres connectées. À 15 DT, il remplace 3 capteurs séparés. ## DS18B20 — la sonde étanche 1-Wire 4 DT (version puce TO-92), 8 DT (version sonde câblée étanche). Le seul capteur de température abordable qui se met dans l'eau, dans le sol, en milieu humide. Précision ±0.5°C entre -10 et +85°C, jusqu'à -55 et +125°C en mode dégradé. Protocole 1-Wire de Maxim : vous pouvez câbler jusqu'à 50 capteurs sur un seul fil (chaque puce a un ID unique 64 bits), incroyablement pratique pour monitorer un aquarium, un chauffe-eau solaire, ou les multiples zones d'une serre. Bibliothèque OneWire + DallasTemperature. // Exemple : lire 2 DS18B20 sur le même fil (broche D2) #include #include OneWire oneWire(2); DallasTemperature sensors(&oneWire); void setup() { Serial.begin(9600); sensors.begin(); Serial.print("Nombre de capteurs détectés : "); Serial.println(sensors.getDeviceCount()); } void loop() { sensors.requestTemperatures(); // commande globale for (int i = 0; i < sensors.getDeviceCount(); i++) { Serial.print("Capteur "); Serial.print(i); Serial.print(" : "); Serial.print(sensors.getTempCByIndex(i)); Serial.println(" °C"); } delay(2000); } ## Distance et proximité ## HC-SR04 — le grand classique 5 DT. Capteur ultrasonique 40 kHz, portée 2-400 cm dans l'air sec, précision ±3 mm. Deux broches (TRIG + ECHO), pas de bibliothèque obligatoire (juste pulseIn). Limites importantes : ne fonctionne pas sous l'eau, dégrade sa précision sur surfaces molles (rideaux, mousses, vêtements) qui absorbent les ultrasons, et angle de détection large de 30° (donc précision latérale faible). Idéal : robot d'évitement, parcmètre, mesureur de niveau d'eau dans une cuve de l'extérieur. Voir notre guide HC-SR04 complet. ## JSN-SR04T — version étanche pour outdoor 15 DT. HC-SR04 monté dans un boîtier IP67 avec capteur ultrasonique aluminium déporté par câble. Portée 25-450 cm. C'est le capteur pour mesurer le niveau d'une citerne d'eau, d'une fosse septique, ou la hauteur d'un véhicule à l'entrée d'un parking. Tient la pluie et la poussière sans problème. ## VL53L0X — laser ToF pour précision millimétrique 15 DT. Petit capteur 5×5 mm de STMicroelectronics qui mesure la distance par temps de vol d'un laser infrarouge. Portée 30-2000 mm, précision ±3 mm, angle ultra-étroit (~25° à plein, et beaucoup moins en mode "long range"). Avantages décisifs vs ultrasons : insensible aux matériaux (verre, tissu, eau, miroir — tous renvoient), insensible aux écho-perturbations, fonctionne en faible luminosité. Inconvénient : portée limitée à 2 m, et confusion possible en plein soleil (le bruit IR ambiant perturbe le récepteur). Existe aussi en VL53L1X (portée 4 m) et VL53L5CX (matrice 8×8 = mini-LiDAR à 35 DT). ## Sharp IR (GP2Y0A21 et variantes) 15 DT. Capteur infrarouge analogique japonais, mesure 10-80 cm (GP2Y0A21) ou 20-150 cm (GP2Y0A02YK). Sortie tension non-linéaire à interpoler ou table de correspondance. Avantages : très réactif (60 Hz contre 10 Hz pour HC-SR04), angle étroit, fonctionne sous l'eau pas trop trouble. Souvent utilisé en robotique de compétition (sumo, suiveur de ligne) pour sa rapidité. ## Lumière, UV, couleur ## LDR (photo-résistance) — le plus simple 0.2 DT. Résistance qui varie selon la luminosité (haute résistance dans le noir, basse en plein jour). Lecture analogRead avec un diviseur de tension. Pas de calibration absolue possible (les valeurs varient entre exemplaires), mais parfait pour détecter "jour vs nuit", déclencher un éclairage automatique, suiveur solaire. À 20 millimes, on en met 4 sur un projet pour faire un système d'orientation solaire. ## BH1750 — luxmètre I2C de précision 8 DT. Capteur de luminosité I2C de ROHM, sortie directe en lux (1 à 65 535 lux), précision ±20%. Bien meilleur qu'un LDR pour mesurer scientifiquement une luminosité : projets photométrie, mesure d'éclairage d'une serre pour vérifier conformité aux exigences végétales, dispositif de luminothérapie. La sortie en lux est directement exploitable sans calibration. ## VEML6075 — capteur UV-A et UV-B 15 DT. Mesure séparément les rayonnements UV-A (320-400 nm) et UV-B (280-320 nm), calcule l'index UV mondial (échelle OMS 0-11+). Indispensable pour station météo pro, suivi d'exposition solaire (sport, bébé, peau sensible), agriculture (UV trop élevés = stress végétal). En Tunisie où l'index UV monte régulièrement à 10-11 en été, c'est un capteur très pertinent. ## TCS34725 — capteur de couleur RGB 15 DT. Détecte les couleurs sous forme de canaux Rouge / Vert / Bleu / Clair. Applications : tri d'objets par couleur (robot, ligne de production), reconnaissance de Skittles ou de M&M's (TP rigolo classique), interface tactile à couleurs, détection de couleur de peau. Possède une LED blanche intégrée pour éclairer la cible. ## Mouvement, orientation, vibration ## HC-SR501 — détecteur PIR (présence humaine) 5 DT. Capteur infrarouge passif qui détecte les variations thermiques d'un corps humain dans un cône de ~7 m / 120°. Sortie digitale tout ou rien (HIGH pendant X secondes après détection). Ne distingue pas un humain d'un chien ou d'une voiture chaude, et ignore un humain immobile (il faut du mouvement). Idéal : éclairage automatique de couloir, alarme intrusion, allumage écran sur approche. ## MPU6050 — gyroscope + accéléromètre 6-DOF 10 DT. Référence absolue pour mesurer l'orientation d'un objet. 3 axes accéléromètre (±2 à ±16 g) + 3 axes gyroscope (±250 à ±2000 °/s), communication I2C. Applications : drone (stabilisation), planche de surf intelligente, anti-vol vélo, podomètre, robot équilibriste. La bibliothèque MPU6050_light ou I2Cdevlib permet d'obtenir directement pitch/roll/yaw filtrés. ## MPU9250 — la version 9-DOF avec magnétomètre 20 DT. MPU6050 + magnétomètre 3 axes. Le magnétomètre permet de connaître la direction nord (boussole numérique), donc d'avoir un yaw absolu (le gyroscope seul dérive avec le temps). Indispensable pour drone, AUV (sous-marin autonome), traqueur d'antenne satellite. À noter : InvenSense (le fabricant) a arrêté la production en 2022. Les stocks restants sont à acheter pendant qu'il y en a, sinon basculer sur ICM-20948. ## SW-420 — détecteur de vibration / choc 3 DT. Module simple avec une bille métallique dans un tube. Quand ça bouge, contact électrique → sortie digitale. Réglage de sensibilité par potentiomètre. Détection d'effraction, alarme vélo, surveillance machine, déclenchement enregistrement vidéo sur choc. ## Gaz et qualité de l'air Les capteurs MQ-xx sont une famille de capteurs résistifs chauffés à 300°C qui réagissent à différents gaz. Tous suivent la même architecture (4 broches : VCC 5V, GND, AOUT analogique, DOUT digital seuil) et nécessitent un préchauffage de 24-48h avant la première mesure fiable. Précision modeste (±15-30%) mais prix très bas. ## MQ-2 — fumée et GPL 5 DT. Détecte propane, butane (gaz de cuisine), méthane, fumée. Le capteur des détecteurs d'incendie amateurs et des alarmes fuite de gaz. Sensibilité 200-10 000 ppm. ## MQ-7 — monoxyde de carbone (CO) 6 DT. Mesure le CO (10-10 000 ppm), gaz toxique inodore résultant de combustions incomplètes (chauffage gaz défectueux, échappement voiture, brasero). Très utile en hiver tunisien où les intoxications au CO restent un fléau. ## MQ-135 — qualité d'air général 5 DT. Sensible à NH3, NOx, fumée, CO2, benzène, alcool... Permet de quantifier la "pollution générale" d'un espace, mais sans distinguer les gaz. À utiliser pour tendance plutôt que mesure absolue. ## MQ-3 — alcool 5 DT. Sensible à l'éthanol. Base des éthylotests amateurs (sans valeur légale, mais pédagogique). Aussi utile pour détecter fermentation involontaire en cave à vin. ## SDS011 — PM2.5 et PM10 de qualité pro 50 DT. Capteur laser de particules fines, mesure réelles concentrations PM2.5 et PM10 en µg/m³ avec précision ±15%. Sortie UART. C'est le capteur des stations de mesure qualité d'air semi-professionnelles, des projets de surveillance urbaine. La pollution aux particules est un sujet majeur dans le Grand Tunis et à Sfax (industries, trafic). Beaucoup d'étudiants ENIT et INSAT en font leur projet de fin d'études. ## Capteurs biomédicaux ## MAX30100 / MAX30102 — oxymètre de pouls (SpO2 et BPM) 15 DT (30100) ou 20 DT (30102, plus précis). Capteur optique I2C qui mesure rythme cardiaque et saturation en oxygène (SpO2) en plaçant le doigt sur la lentille. Projets : suivi sportif, télémédecine, traqueurs santé. La précision dépend énormément de la stabilité du doigt et de la qualité d'algorithme — Maxim/Adafruit fournit du code de référence, mais réplicabilité approximative en pratique. ## AD8232 — électrocardiogramme (ECG) 1 dérivation 20 DT. Module complet avec amplificateur d'instrumentation, filtrage passe-bande 0.5-40 Hz. 3 électrodes (RA, LA, RL) à placer sur le torse. Sortie analogique du signal ECG brut, visualisable sur moniteur série Arduino ou via SerialPlotter. Strictement pédagogique, pas de validation médicale. Sujet de projet PFE très courant en ISBS, ESPRIT et INSAT (filières biomédicales). ## Pulse Sensor — rythme cardiaque par doigt 12 DT. Module compact open-source, version simplifiée du MAX30100 mais sans SpO2. Détecte uniquement les battements (BPM) par photopléthysmographie. Excellente bibliothèque "PulseSensor Playground" pour démarrer immédiatement. ## Autres capteurs essentiels ## Sonde humidité de sol capacitive 10 DT (version capacitive v1.2). Préférez impérativement la version capacitive à la version résistive (deux clous) qui s'oxyde en 2-3 mois. La capacitive utilise une électrode noyée dans la résine, ne s'oxyde jamais, et dure 5+ ans. Sortie analogique : 3.0V à sec, 1.5V immergée. Pour serre connectée, jardin automatique, projet ferme intelligente. ## BME680 — qualité d'air et VOC 30 DT. Successeur "premium" du BME280 chez Bosch. Mesure T° + humidité + pression + résistance gaz (VOC composés organiques volatils). La librairie BSEC de Bosch calcule un "Indoor Air Quality Index" (IAQ) 0-500. Pour stations de qualité d'air intérieur de bureau, salles de classe (covid, ventilation), local technique. ## Capteurs à effet Hall A3144 ou KY-003 à 2 DT. Détecte la présence d'un aimant à courte distance (digital). Applications : compteur de tours moteur (1 aimant sur volant + capteur fixe), capteur de porte (aimant sur battant), capteur de débit d'eau (turbine avec aimant). Pour mesure linéaire d'intensité de champ magnétique, prendre un ACS712 (mesure courant continu jusqu'à ±30A). ## Encodeurs incrémentaux 5 DT (rotary KY-040), 12 DT (encodeur optique fourchu pour roues moteur). Comptent les rotations et leur sens. Indispensables en robotique (odométrie), interfaces utilisateur (potards numériques sans butée), positionnement servo-moteur. Voir notre guide robot 2WD upgrade 4. 🎯 CATALOGUE COMPLET ## Capteurs et prototypage Didactico Plus de 80 références de capteurs en stock : températures, distance, lumière, gaz, biomédicaux, mouvement. Livraison 24-48h dans toute la Tunisie depuis notre boutique Sfax. Conseil personnalisé en magasin pour étudiants ENIT, INSAT, ISET, ISBS. Voir tous les capteurs → ## Synthèse : les 5 critères de décision Pour choisir un capteur, voilà la checklist mentale à dérouler systématiquement. On la transmet à chaque étudiant qui débarque en boutique Didactico Sfax avec un cahier des charges. ## 1. Précision réellement nécessaire Pour une station météo de salon, ±2°C suffit (DHT11). Pour un projet pédagogique de comparaison de microclimats, ±0.5°C devient pertinent (DHT22). Pour un incubateur d'œufs, ±0.1°C est requis (DS18B20 calibré ou capteur Pt100). Ne payez pas pour de la précision dont vous ne ferez rien. ## 2. Vitesse d'échantillonnage Station météo : 1 mesure/min suffit. Système anti-collision robot : 10-30 Hz nécessaires. Mesure ECG : 250 Hz mini. Stabilisation drone : 500-1000 Hz. Le DHT22 plafonne à 0.5 Hz, le MPU6050 monte à 8000 Hz — choisissez en fonction. ## 3. Interface électrique Préférez I2C dès que vous avez plus de 2 capteurs : 2 broches partagées pour tous (SDA + SCL), idéal pour projets multi-capteurs. SPI si vous voulez du débit élevé (oscilloscope, écran). Analogique pour capteurs simples. 1-Wire pour réseau de capteurs DS18B20. ## 4. Tension d'alimentation et logique Arduino UNO travaille en 5V. ESP32 et Raspberry Pi en 3.3V. Beaucoup de capteurs modernes (BME280, MPU6050) sont 3.3V natif et grilleraient à 5V sans level-shifter. Vérifiez sur la datasheet. Si le module porte la mention "5V tolerant" ou possède un régulateur, OK. ## 5. Prix vs disponibilité locale Un capteur à 30 DT chez Didactico Sfax livré en 24h est économiquement supérieur à un capteur à 15 DT commandé via AliExpress et qui met 3 semaines à arriver, surtout si vous avez une deadline étudiante. Le temps perdu vaut plus que la différence de prix. ## FAQ — Questions fréquentes sur le choix des capteurs DHT11 ou DHT22 : lequel choisir si je débute ?DHT22 sans hésiter. Pour 5 DT de différence, vous gagnez 4× en précision température, 2.5× en précision humidité, et la plage utile s'étend de -40 à +80°C contre 0 à +50°C. Le DHT11 n'a de sens qu'en achat groupé pour TP de masse à 30 étudiants. Mon ultrasonique HC-SR04 donne des valeurs aléatoires en outdoor. Pourquoi ?Le HC-SR04 est sensible aux courants d'air (turbulences perturbent la propagation des ultrasons) et aux surfaces molles/absorbantes (gazon, vêtements, mousse). En outdoor, passez au VL53L0X (laser, insensible au vent) ou au JSN-SR04T qui est calibré pour conditions extérieures. Puis-je connecter 5 capteurs I2C différents sur un même Arduino ?Oui, c'est tout l'intérêt de l'I2C ! Tous partagent SDA (D4) et SCL (D5) en parallèle. Chaque capteur a une adresse différente (BME280 = 0x76, MPU6050 = 0x68, etc.). Conflit possible uniquement si deux capteurs partagent la même adresse — dans ce cas, soit changez l'adresse via un pont à souder, soit utilisez un multiplexeur I2C TCA9548A (8 DT). Mon module MQ-2 donne toujours la même valeur. Bug ?Non : les capteurs MQ-xx nécessitent un préchauffage de 24-48h avant la première mesure stable. C'est mentionné en petit dans la datasheet mais oublié de tous les tutos. Laissez-le branché en continu 2 jours, puis re-testez. Ensuite, calibration sur "air propre" pour définir la baseline. Quel capteur pour monitorer ma fosse septique sans descendre dedans ?JSN-SR04T étanche fixé au plafond de la fosse, pointé vers le niveau de liquide. Mesure de la distance plafond → liquide, soustraction de la hauteur totale = niveau. Alimenté en solaire 6V + 18650, transmission LoRa vers la maison, alerte SMS quand niveau critique. Projet typique de PFE en télécoms à l'ENSI. Le capteur AD8232 ECG est-il vraiment fiable pour un projet médical ?Pour démontrer un principe, oui, parfaitement. Pour un dispositif médical certifié, non, jamais. L'AD8232 n'est pas certifié IEC 60601, n'a pas de validation clinique. Tout projet bio-médical étudiant à l'ISBS, INSAT ou ESPRIT doit clairement spécifier "prototype pédagogique non destiné à un usage médical". Existe-t-il un capteur pour mesurer la radioactivité (Geiger) abordable ?Oui, modules avec tube SBM-20 ou J305 vers 80-120 DT (le tube est l'élément cher). Sortie pulse (chaque coup = 1 désintégration détectée). Utile pour mesurer la radioactivité naturelle, granit, anciennes lampes au radium. La Tunisie n'a pas de centrale nucléaire mais des sources médicales et minières existent. Stock limité, demander à Didactico. ## Conclusion : la bonne mesure, c'est 50% du projet Le choix d'un capteur n'est jamais anodin. Un mauvais capteur peut faire prendre des décisions erronées à votre algorithme pendant des mois sans que vous vous en rendiez compte. À l'inverse, le bon capteur transforme un projet amateur en système fiable, voire commercialisable. La méthode : partez du besoin physique, déclinez en 5 critères, choisissez le plus simple qui répond à tous les critères. Si vous hésitez encore après lecture de ce guide, passez à la boutique Didactico Sfax avec votre cahier des charges. Notre équipe accompagne chaque semaine des étudiants de l'ENIT, l'INSAT, l'ISBS, l'ISET Sfax, l'ESPRIT, l'IIT, l'ENSI dans leurs choix de matériel. Conseils gratuits, démos en magasin, et livraison 24-48h dans toute la Tunisie pour ne pas perdre une journée de TP. Pour aller plus loin, consultez nos guides complets sur le HC-SR04, le MAX30100 SpO2 et le AD8232 ECG. --- # Construire son Premier Robot Arduino : Guide Complet Châssis 2WD + Évitement d'Obstacles URL: https://didactico.tn/construire-robot-arduino/ Résumé: Mardi soir, atelier robotique ISET Sfax. Mariem, première année génie électrique, contemple les pièces de son premier châssis 2WD étalées devant elle : deu... Mardi soir, atelier robotique ISET Sfax. Mariem, première année génie électrique, contemple les pièces de son premier châssis 2WD étalées devant elle : deux plaques d'acrylique transparent, quatre vis interminables, deux moteurs jaunes "TT" avec leurs réducteurs en plastique, deux roues de 65 mm, une mystérieuse "roulette folle" qui ressemble à un patin à roulettes miniature. À côté, un Arduino UNO encore dans son emballage, un L298N noir avec ses dissipateurs, un capteur HC-SR04 qui ressemble à deux petits yeux, et un sachet de fils jumper colorés. Le défi : faire rouler ce tas de composants en évitant les murs, d'ici la fin de la semaine. C'est exactement le projet qui transforme un débutant en maker. Plus visuel qu'un blinky, plus motivant qu'un capteur de température, le robot d'évitement d'obstacles enseigne en une seule construction : l'assemblage mécanique, le câblage de puissance, le pilotage PWM, la lecture de capteurs, la logique conditionnelle, l'alimentation. Tout ce qu'un futur ingénieur embarqué doit maîtriser. Dans ce guide complet, on construit le robot ensemble, étape par étape, avec le code complet commenté en français, le câblage détaillé, le dépannage des 5 problèmes que tout débutant rencontre, et 5 upgrades pour le faire évoluer. ## 📋 Table des matières - La liste de matériel détaillée - Assemblage du châssis : 10 étapes - Câblage du L298N - Schéma de câblage complet - Code Arduino complet et commenté - Tests et calibration - Dépannage : 5 problèmes classiques - 5 upgrades pour aller plus loin - FAQ ## La liste de matériel détaillée Voici la BOM (Bill of Materials) qu'on recommande aux étudiants venant en boutique Didactico Sfax. Comptez 90-130 DT au total selon la qualité des composants. ## Châssis et mécanique - Châssis 2WD acrylique transparent (ou aluminium) : 2 plaques superposées, perçages standardisés, 25-40 DT - 2 moteurs DC "TT motor" jaunes avec réducteurs plastiques 1:48 : ~150 RPM à 6V, consommation 200 mA à vide, 400-600 mA en charge. 15 DT la paire - 2 roues caoutchouc de 65 mm compatibles axes plats 5.5 mm. Incluses souvent dans le kit châssis - 1 roulette folle (caster wheel) à l'avant ou à l'arrière pour stabiliser. Souvent en plastique avec une bille métallique - Visserie : vis M3 longues (×4 pour empiler les niveaux), entretoises hexagonales M3×20mm, écrous ## Électronique - 1 Arduino UNO R3 (officielle ~80 DT, compatible CH340 ~30 DT). Pour débuter, la compatible suffit largement - 1 driver moteur L298N avec dissipateur. Carte rouge classique, 6 DT - 1 capteur ultrasonique HC-SR04 : 5 DT. Portée 2-400 cm, précision ±3 mm - 1 servo SG90 (9g) pour orienter le HC-SR04 gauche/droite. 7 DT - 1 support orientable pour HC-SR04 compatible servo. 4 DT (ou imprimé 3D au FabLab Sfax pour 1 DT de filament) - 1 pack 4×AA NiMH 2000 mAh + boîtier avec interrupteur (recommandé débutant), 22 DT. Ou 2× Li-ion 18650 + porte-batterie 2S + BMS, 35 DT (autonomie 3-4× supérieure) - Fils jumper mâle-mâle et mâle-femelle, 20 cm. Un sachet de 65 fils mixtes à 6 DT couvre largement - 1 interrupteur à bascule miniature pour couper l'alim (4 DT), facultatif mais recommandé ## Outils nécessaires - Tournevis cruciforme PH0 et PH1 - Pince coupante fine - Multimètre (mode tension DC et continuité) - Ruban électrique ou gaine thermo (3 mm) - Optionnel mais utile : fer à souder + étain pour souder les fils sur les moteurs (sinon, ils se débranchent à la première vibration) Conseil : Si c'est votre tout premier projet, prenez un "kit robot 2WD" complet chez Didactico (~120 DT). Vous économisez 2h de tri de pièces et vous êtes sûr que tout est compatible mécaniquement. ## Assemblage du châssis : 10 étapes Les châssis acryliques arrivent avec un film de protection des deux côtés. Ne le retirez surtout pas avant la fin du montage : l'acrylique transparent se raye à la moindre vibration ou frottement contre une vis. - Déballer et identifier les deux plaques. La plaque "inférieure" reçoit les moteurs, la plaque "supérieure" l'électronique. Repérez-les par les perçages : la plaque moteurs a deux paires de trous oblongs sur les côtés. - Fixer les moteurs à la plaque inférieure. Utilisez les vis longues M3 fournies avec les supports moteurs métalliques (ou plastiques selon kit). Vissez fermement mais sans forcer (acrylique = fragile en serrage excessif). Vérifiez que les axes ressortent symétriquement de chaque côté. - Souder les fils d'alimentation sur les moteurs. Étape facultative mais qui change tout. Les bornes des TT motors sont des lamelles métalliques. Sans soudure, un fil glissé entre les lamelles tient 2 jours, puis bouge à la première vibration. Soudez deux fils de 15-20 cm (rouge et noir, repère utile) sur chaque moteur. Si vous n'avez pas de fer à souder, le FabLab Sfax met le sien à disposition gratuitement le samedi après-midi. - Monter les roues sur les axes. Les TT motors ont des axes plats (méplat) qui empêchent le glissement. Appuyez fermement, c'est censé être serré. Si vous devez forcer trop, vérifiez l'orientation du méplat. - Fixer la roulette folle. Elle se monte en général à l'arrière du châssis (côté opposé au capteur HC-SR04). Vis M3 + entretoises de 10-15 mm pour qu'elle touche bien le sol. - Installer les entretoises hexagonales M3×20mm aux 4 coins de la plaque inférieure. Elles serviront de supports pour la plaque supérieure. - Installer le boîtier de piles sous la plaque inférieure (ou entre les deux plaques), avec scotch double face fort ou ruban velcro. L'interrupteur du boîtier doit rester accessible. - Visser la plaque supérieure sur les entretoises. - Fixer l'Arduino UNO sur la plaque supérieure avec des vis M3 dans les trous de fixation de l'UNO. Si votre châssis n'a pas les bons perçages, scotch double face suffit largement. - Fixer le L298N à côté, et le support servo + HC-SR04 à l'avant (côté opposé à la roulette folle). Retirez maintenant le film de protection acrylique. Étape psychologiquement importante : votre robot existe. ## Câblage du L298N : pont en H, alimentation, broches Le L298N est le composant qui intimide le plus les débutants, à tort. Une fois compris, c'est une logique simple. Voici l'anatomie du module rouge classique. ## Les bornes "sortie moteurs" (OUT) - OUT1 et OUT2 : les deux fils du moteur A (peu importe lequel, on inversera dans le code si besoin) - OUT3 et OUT4 : les deux fils du moteur B ## Les bornes "alimentation" (côté gauche) - +12V (parfois noté VS ou VCC moteur) : entrée alimentation des moteurs, accepte 7 à 35V. On y branche le + de notre pack 4×AA (6V) ou 2× 18650 (7.4V) - GND : masse commune (à connecter à la fois au pack batterie ET à la GND de l'Arduino, sinon les signaux PWM ne sont pas référencés correctement) - +5V : sortie 5V régulée fournie par le L298N à partir de l'alim moteurs (si le jumper "5V_EN" est en place) Le jumper 5V_EN : Ce petit cavalier sur le module L298N décide si le régulateur interne 7805 est activé. Laissez-le en place si votre alim moteurs est entre 7 et 12V (vous récupérez 5V utilisable pour alimenter directement l'Arduino sur sa broche 5V, c'est très pratique). Retirez-le si votre alim dépasse 12V (sinon le 7805 surchauffe et lâche). Pour notre robot débutant avec 4×AA ou 2× 18650, on laisse en place. ## Les broches de contrôle (côté droit) - IN1, IN2 : commandent le sens de rotation du moteur A. Logique : IN1=HIGH/IN2=LOW = avant ; IN1=LOW/IN2=HIGH = arrière ; les deux LOW = stop ; les deux HIGH = stop (frein moteur) - IN3, IN4 : idem pour moteur B - ENA : enable moteur A. Si HIGH = moteur A actif à pleine vitesse. Si on envoie un PWM (analogWrite), on contrôle la vitesse - ENB : enable moteur B, idem ## Câblage Arduino ↔ L298N // Schéma de connexion broches Arduino UNO -> L298N // // L298N IN1 <- Arduino D2 (digital, sens moteur A) // L298N IN2 <- Arduino D3 (digital, sens moteur A) // L298N IN3 <- Arduino D4 (digital, sens moteur B) // L298N IN4 <- Arduino D5 (digital, sens moteur B) // L298N ENA <- Arduino D9 (PWM, vitesse moteur A) // L298N ENB <- Arduino D10 (PWM, vitesse moteur B) // L298N GND -> Arduino GND (masse commune, OBLIGATOIRE) // L298N +5V -> Arduino 5V (si jumper 5V_EN actif, sinon NE PAS connecter) // // HC-SR04 : // VCC -> Arduino 5V // GND -> Arduino GND // TRIG -> Arduino D7 // ECHO -> Arduino D8 // // Servo SG90 (orientation HC-SR04) : // Rouge -> +5V (idéalement via une alim séparée, sinon Arduino 5V acceptable) // Marron/Noir -> GND // Orange/Jaune (signal) -> Arduino D11 ## Schéma de câblage complet (ASCII) +--------+ | Pack | | 4x AA | | (6V) | +---+----+----+ | | [SW] GND + | | +---+--+ | | +12V| | | | | +-----+ L298N +------+--------------+ | | | | | OUT1 OUT2 OUT3 OUT4 +5V (sortie régulée) | | | | | [Moteur A] [Moteur B] | | IN1 IN2 IN3 IN4 ENA ENB | | | | | | | | D2 D3 D4 D5 D9 D10 | | | | | | | | +-------+-----+----+-----+----+ | | Arduino UNO |--+5V | |--GND +------+-----+----+------+----+ D7 D8 D11 USB (pour upload) | | | TRIG ECHO SIGNAL | | | +----------+ +--------+ | HC-SR04 | | Servo | +----------+ | SG90 | +--------+ ## Code Arduino complet et commenté Voici le firmware complet du robot. Il pilote les moteurs, mesure la distance, et prend une décision intelligente (regarder gauche, droite, comparer, tourner du côté le plus dégagé) quand un obstacle apparaît à moins de 20 cm. // ========================================================= // Robot Arduino 2WD - Évitement intelligent d'obstacles // Châssis 2 moteurs DC + L298N + HC-SR04 + Servo SG90 // Auteur : Didactico - guide pédagogique 2026 // ========================================================= #include // --- Broches L298N --- const int IN1 = 2; // Sens moteur A const int IN2 = 3; const int IN3 = 4; // Sens moteur B const int IN4 = 5; const int ENA = 9; // PWM vitesse A const int ENB = 10; // PWM vitesse B // --- Broches HC-SR04 --- const int TRIG = 7; const int ECHO = 8; // --- Servo orientation capteur --- Servo servoCapteur; const int PIN_SERVO = 11; // --- Paramètres comportement --- const int VITESSE_NORMALE = 180; // 0-255, 180 ≈ 70 % const int VITESSE_VIRAGE = 200; // un peu plus pour vaincre l'inertie const int SEUIL_OBSTACLE_CM = 20; // distance déclenchement évitement const int DUREE_VIRAGE_MS = 350; // ~90° selon tes moteurs (à calibrer) void setup() { Serial.begin(9600); // pour debug via moniteur série pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT); pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT); pinMode(ENA, OUTPUT); pinMode(ENB, OUTPUT); pinMode(TRIG, OUTPUT); pinMode(ECHO, INPUT); servoCapteur.attach(PIN_SERVO); servoCapteur.write(90); // 90° = capteur droit devant delay(500); Serial.println("Robot prêt - démarrage dans 3 secondes"); delay(3000); // pause pour poser le robot au sol } void loop() { long distance = mesurerDistance(); Serial.print("Distance : "); Serial.print(distance); Serial.println(" cm"); if (distance > SEUIL_OBSTACLE_CM || distance == 0) { // 0 = mesure invalide, on continue prudemment avancer(VITESSE_NORMALE); } else { // Obstacle détecté : on s'arrête et on évalue les options stopper(); delay(200); reculer(VITESSE_NORMALE); delay(300); stopper(); long distGauche = regarderCote(150); // capteur 60° à gauche long distDroite = regarderCote(30); // capteur 60° à droite servoCapteur.write(90); // remettre devant delay(200); Serial.print("Gauche="); Serial.print(distGauche); Serial.print(" / Droite="); Serial.println(distDroite); if (distGauche > distDroite) { tournerGauche(VITESSE_VIRAGE); } else { tournerDroite(VITESSE_VIRAGE); } delay(DUREE_VIRAGE_MS); stopper(); } } // ---------- Fonctions moteur ---------- void avancer(int vitesse) { digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); // moteur A avant digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW); // moteur B avant analogWrite(ENA, vitesse); analogWrite(ENB, vitesse); } void reculer(int vitesse) { digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH); digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH); analogWrite(ENA, vitesse); analogWrite(ENB, vitesse); } void tournerGauche(int vitesse) { // moteur droit avant, moteur gauche arrière => pivot sur place digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH); // A arrière digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW); // B avant analogWrite(ENA, vitesse); analogWrite(ENB, vitesse); } void tournerDroite(int vitesse) { digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); // A avant digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH); // B arrière analogWrite(ENA, vitesse); analogWrite(ENB, vitesse); } void stopper() { digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); digitalWrite(IN3, LOW); digitalWrite(IN4, LOW); analogWrite(ENA, 0); analogWrite(ENB, 0); } // ---------- Capteur ultrasonique ---------- long mesurerDistance() { digitalWrite(TRIG, LOW); delayMicroseconds(2); digitalWrite(TRIG, HIGH); delayMicroseconds(10); digitalWrite(TRIG, LOW); long duree = pulseIn(ECHO, HIGH, 30000UL); // timeout 30 ms ≈ 5 m if (duree == 0) return 0; // hors portée long distance = duree * 0.0343 / 2; // vitesse son ≈ 343 m/s return distance; } long regarderCote(int angle) { servoCapteur.write(angle); delay(400); // laisser le temps au servo de bouger long d = mesurerDistance(); return d; } Astuce code : Ouvrez le moniteur série (Outils → Moniteur série, 9600 baud) pendant que le robot fonctionne sur USB pour voir en direct les distances mesurées. C'est l'outil de debug n°1 pour la robotique débutante. ## Tests et calibration ## Test 1 — Sens de rotation des moteurs Levez le robot du sol et lancez le programme. Les deux roues doivent tourner dans le même sens (vers l'avant du robot) en phase "avancer". Si une roue tourne à l'envers : inversez les deux fils du moteur concerné sur OUT1/OUT2 (ou OUT3/OUT4) du L298N. C'est mécaniquement plus simple que de modifier le code. ## Test 2 — Vitesse égale entre les deux roues Posez le robot sur une surface plate, faites-le avancer. S'il dérive d'un côté, c'est normal : deux moteurs DC "identiques" varient de 10-20% en vitesse réelle. Compensez en réduisant le PWM du moteur le plus rapide : // Si le robot dérive vers la droite => le moteur gauche tourne trop vite // On baisse un peu son PWM : analogWrite(ENA, 180); // moteur droit analogWrite(ENB, 165); // moteur gauche, réduit de 15 ## Test 3 — Seuil distance HC-SR04 Placez le robot face à un mur et avancez la main. Vérifiez sur le moniteur série que la distance descend bien sous 20 cm avant que le robot ne réagisse. Si les mesures sont erratiques (0 puis 200 puis 5 puis 0), le HC-SR04 peut être face à une surface absorbante (rideau, mousse, vêtement) qui ne renvoie pas l'écho. C'est une limite physique. ## Test 4 — Durée du virage à 90° Réglez DUREE_VIRAGE_MS par essais successifs. Sur la plupart des kits Didactico, 300-400 ms donnent un virage proche de 90° avec un pack 6V chargé. Avec batterie qui se vide, la durée doit augmenter (les moteurs ralentissent). ## Dépannage : 5 problèmes classiques rencontrés en atelier ## Problème 1 — "L'Arduino redémarre dès que les moteurs démarrent" Cause à 90% : l'Arduino partage la même alimentation que les moteurs sans découplage. Le pic de courant moteur fait chuter la tension. Solution : ajoutez un condensateur électrolytique 470 µF entre +5V et GND, près de la broche d'alim Arduino. Et idéalement, alimentez l'Arduino par USB pendant les tests pour découpler. ## Problème 2 — "Le HC-SR04 retourne toujours 0 ou des valeurs aléatoires" Vérifications dans l'ordre : (a) TRIG sur D7, ECHO sur D8, pas inversés ; (b) VCC du HC-SR04 bien sur 5V (pas 3.3V — le HC-SR04 ne fonctionne pas en 3.3V); (c) GND commun avec Arduino ; (d) le capteur n'est pas trop proche d'une surface (zone morte 0-2 cm). ## Problème 3 — "Le servo trembletoujours, le robot avance par à-coups" Le servo SG90 tire 250 mA en mouvement, 50 mA en maintien. Si vous l'alimentez sur le 5V de l'Arduino directement, le régulateur AMS1117 sur la carte (capable de ~500 mA max) sature dès qu'un moteur tire en plus. Solution : alimentez le servo sur le 5V du L298N (qui sort directement de l'alim moteurs régulée), ou ajoutez un petit régulateur dédié. ## Problème 4 — "Les moteurs sont très lents même à PWM 255" Trois causes possibles : (a) tension batterie trop basse (4× AA déchargées = 4.4V au lieu de 6V), changez ou rechargez ; (b) le L298N perd 1.5-2V dans ses transistors internes (limitation physique des BJT), donc à 6V d'entrée, les moteurs voient 4V seulement — d'où l'intérêt de passer à 7.4V (2× 18650) ; (c) le moteur est mécaniquement bloqué (frottement entre roue et châssis). ## Problème 5 — "Le robot tourne, mais pas droit après le virage" Le robot a un "mémoire mécanique" très approximative. Sans encodeurs, impossible de garantir un virage exactement à 90°. Solutions : (a) calibrer DUREE_VIRAGE_MS à votre robot et alimentation précis ; (b) accepter l'imprécision et laisser l'évitement faire son travail à la prochaine collision ; (c) upgrade vers encodeurs (voir section suivante). ## 5 upgrades pour faire évoluer votre robot ## Upgrade 1 — Commande Bluetooth via HC-05 et app smartphone Ajoutez un module HC-05 (8 DT) sur les broches RX/TX de l'Arduino. Installez l'app gratuite "Arduino Bluetooth Controller" ou "Bluetooth RC Car" sur Android. Ajoutez quelques lignes pour lire les commandes 'F', 'B', 'L', 'R', 'S' depuis Serial.read() et déclencher les fonctions correspondantes. Vous transformez le robot autonome en voiture télécommandée pour 8 DT et 20 lignes de code. Très utile pour démos en cours à l'ENIT ou en projet de fin d'année à l'ISBS. ## Upgrade 2 — Suiveur de ligne 3 capteurs IR Fixez sous le châssis (à 1 cm du sol) un module "3-channel line follower TCRT5000" (10 DT). Trois capteurs IR détectent le contraste noir/blanc d'une bande adhésive au sol. Code : si capteur central voit la ligne = avancer ; si capteur gauche seul voit la ligne = corriger à gauche ; etc. Permet de programmer un robot suiveur de circuit, défi classique des compétitions FabLab Sfax et Maker Faire Tunis. ## Upgrade 3 — Vision avec ESP32-CAM streaming Wi-Fi Remplacez (ou complétez) l'Arduino UNO par un module ESP32-CAM (40 DT). Il diffuse une vidéo en direct sur Wi-Fi, accessible depuis un navigateur ou une app. Avec OpenCV côté serveur, vous pouvez faire de la détection d'objets, de la reconnaissance de couleurs, du suivi de cible — niveau projet de fin d'études INSAT ou ENSI. ## Upgrade 4 — Encodeurs incrémentaux pour odométrie Ajoutez des disques encodeurs sur les axes moteurs et deux capteurs optiques fourchus (15 DT la paire). Chaque trou détecté = X mm parcourus. Vous obtenez la distance réelle parcourue et la vitesse instantanée de chaque roue. Permet de programmer des trajets précis ("avancer de 50 cm puis tourner 90°") sans timing approximatif, et d'asservir la vitesse. ## Upgrade 5 — PID controller pour ligne droite parfaite Combinez encodeurs + algorithme PID (Proportional-Integral-Derivative). Vous mesurez en temps réel l'écart de vitesse entre les deux roues, et vous ajustez les PWM en permanence pour le ramener à zéro. Le robot avance alors absolument droit, même sur sol incliné, même avec des moteurs déséquilibrés. Sujet phare des cours d'automatique en 3ème année à l'ENIT et l'ENSI. 🤖 KITS PRÊTS À MONTER ## Robotique et drones Didactico Châssis 2WD complets, kits robots pédagogiques pour ENIT/INSAT/ISET, capteurs HC-SR04, drivers L298N, servos SG90, modules ESP32-CAM — livraison 24-48h dans toute la Tunisie depuis Sfax. Découvrir les kits → ## FAQ — Questions fréquentes Combien de temps faut-il pour assembler son premier robot quand on débute ?Comptez 4 à 8 heures réparties sur 2-3 séances : ~2h pour le châssis, 2h pour le câblage, 2-4h pour le code et la calibration. Au FabLab Sfax, on accompagne les étudiants ISET et IIT pour faire le tout en une après-midi. L'Arduino UNO compatible CH340 est-il aussi bon que l'officielle ?Pour ce projet, oui à 99%. Le micro-contrôleur ATmega328P est identique. Seules différences : la puce USB-série (CH340 au lieu de ATmega16U2) qui nécessite l'installation d'un pilote sur Windows (gratuit, 2 min), et la qualité de finition. Économie de 50 DT pour un débutant, on recommande. Puis-je remplacer le L298N par un L293D ou un TB6612FNG ?Oui. Le L293D est moins puissant (600 mA par canal vs 2A pour L298N), suffisant pour micro-moteurs mais limite pour TT motors sous charge. Le TB6612FNG est meilleur que le L298N : plus efficient (chute de tension de 0.5V au lieu de 2V), plus compact, plus économe en batterie. Si votre budget permet, prenez le TB6612FNG. Mon robot n'avance pas sur le tapis du salon, juste sur carrelage. Pourquoi ?Les roues caoutchouc des kits 2WD ont peu d'adhérence sur tapis épais ou moquette. Les TT motors n'ont pas le couple suffisant pour vaincre la résistance des fibres. Solutions : tester sur sol dur (carrelage, parquet), ou passer à des moteurs plus puissants (12V au lieu de 6V), ou changer les roues pour des modèles plus grands à crampons. Quelle batterie est la meilleure pour un robot autonome de 2-3h ?2× cellules Li-ion 18650 3500 mAh en série (7.4V, 3500 mAh) + BMS 2S. Capacité énergétique 26 Wh, soit 3-5h en utilisation continue selon vitesse et nombre de capteurs. Rechargeable des centaines de fois. Total ~45 DT et c'est la solution "professionnelle". Peut-on programmer le robot en Python au lieu d'Arduino C ?Pas directement avec Arduino UNO. Mais en remplaçant la carte par un ESP32 ou Raspberry Pi Pico, vous pouvez utiliser MicroPython. Code plus court, mais moins de bibliothèques disponibles pour la robotique. Pour débuter, restez en Arduino C/C++. Existe-t-il un Arduino spécifique pour la robotique en milieu universitaire ?Oui — l'Arduino Mega 2560 (54 entrées/sorties au lieu de 14) ou le SunFounder/PiCar-X. Mais pour 95% des projets pédagogiques jusqu'au niveau Master, l'UNO suffit largement. Les écoles ENIT, INSAT et ISBS l'utilisent en TP de base. ## Conclusion : votre premier pas dans la robotique embarquée Construire un robot d'évitement d'obstacles, c'est bien plus qu'un projet du dimanche : c'est apprendre par la pratique tous les fondamentaux de l'électronique embarquée. Une fois ce robot fonctionnel, vous avez les bases pour vous lancer dans des projets de drone, de voiture autonome, de bras robotique, ou de domotique. À Didactico Sfax, on voit chaque année des étudiants ENIT et INSAT démarrer ainsi, puis présenter trois ans plus tard des projets de fin d'études impressionnants — souvent dérivés directement de ce premier robot. Pour aller plus loin, lisez notre guide Comment Choisir le Bon Capteur Arduino qui détaille les capteurs alternatifs (LiDAR, infrarouge, lidar 360°) pour faire évoluer la perception de votre robot. Et notre guide Alimentations 2026 pour passer aux batteries Li-ion 18650 et gagner en autonomie. Bonne construction — et n'hésitez pas à venir présenter votre robot au comptoir Didactico Sfax, on adore voir vos créations ! --- # Guide Alimentations 2026 : Piles, Batteries Li-ion, Solaire pour vos Projets Arduino URL: https://didactico.tn/guide-alimentations-batteries/ Résumé: Sfax, 3h du matin, FabLab. Yassine, étudiant en 2ème année à l'ISET Sfax, fixe son robot Arduino qui vient de mourir pour la cinquième fois en moins de 20 ... Sfax, 3h du matin, FabLab. Yassine, étudiant en 2ème année à l'ISET Sfax, fixe son robot Arduino qui vient de mourir pour la cinquième fois en moins de 20 minutes. Le projet doit être présenté demain. Le code est parfait, les capteurs fonctionnent, mais dès que les deux moteurs DC tirent ensemble, l'Arduino UNO redémarre. Diagnostic ? Une pile 9V alcaline neuve, déjà à plat. Yassine a commis l'erreur classique : croire qu'une pile 9V "de qualité" peut alimenter un robot. Avec ses 500 mAh théoriques et ses 100 mA de courant de pic, c'est l'équivalent énergétique d'un café serré pour un marathonien. Cette histoire, on l'entend toutes les semaines à la boutique Didactico de Sfax. L'alimentation est le sujet le plus négligé en électronique amateur, alors qu'elle cause à elle seule 60% des échecs de projets. Dans ce guide complet, vous allez apprendre à choisir, dimensionner et sécuriser l'alimentation de n'importe quel projet Arduino, ESP32 ou Raspberry Pi, depuis le simple blinky de TP jusqu'au capteur IoT outdoor qui doit tenir 6 mois sur batterie. ## 📋 Table des matières - Les 7 types d'alimentation à connaître - Comparaison coût/mAh : qui gagne vraiment ? - Batteries Li-ion 18650 : la référence amateur - Modules TP4056 et BMS : charger sans danger - Solaire pour IoT en Tunisie : calcul énergétique - Convertisseurs DC-DC : MT3608, LM2596, XL6009 - 3 cas pratiques calculés - Sécurité Li-ion/LiPo : règles non-négociables - FAQ ## Les 7 types d'alimentation à connaître Avant de choisir, il faut comprendre l'offre. Voici les sources d'énergie qui passent par notre comptoir à Didactico Sfax chaque semaine, classées par usage. ## 1. Adaptateur mural 9V/12V à jack 5.5×2.1mm C'est l'alimentation "de bureau" par excellence. On la branche au mur, on connecte le jack à l'Arduino, c'est fini. L'Arduino UNO accepte 7 à 12V en entrée jack (théoriquement jusqu'à 20V mais le régulateur AMS1117 chauffe énormément au-delà de 9V). Pour un projet stationnaire — station météo de bureau, contrôleur d'aquarium, horloge OLED — c'est la solution la plus simple et la plus fiable. Comptez 12-20 DT pour un adaptateur 9V/2A de qualité chez Didactico. ## 2. Power bank USB 5V La solution mobile la plus sous-estimée. Une power bank de 10 000 mAh à 50 DT alimente un Arduino pendant 20-40 heures via le port USB. Avantages : protection intégrée, indicateur de charge, recharge USB-C, formats compacts. Inconvénient majeur : la plupart se coupent automatiquement si le courant tiré descend sous 50-100 mA (mode "économie de batterie"). Pour un Arduino en sommeil profond qui consomme 1 mA, votre power bank coupera après 30 secondes. Solution : utiliser une power bank "toujours allumée" (always-on) ou ajouter une résistance de charge fictive. ## 3. Pile 9V alcaline La pile que tout le monde achète d'instinct. Erreur 90% du temps. Une pile 9V alcaline contient seulement 500-600 mAh utilisables. À 50 mA de consommation (Arduino + un capteur), elle dure 10-12h. Sur un projet avec moteurs (200+ mA), elle est morte en 2h. Réservez-la aux multimètres et détecteurs de fumée. ## 4. Pack 4×AA ou 6×AA (NiMH ou alcaline) Beaucoup mieux. 4 piles AA NiMH 2000 mAh (1.2V chacune) en série donnent 4.8V à 2000 mAh, soit 3 à 4× plus d'énergie qu'une pile 9V, à coût comparable, et rechargeables. Idéal pour robots débutants : le pack 4×AA alimente directement L298N (qui accepte 5-12V) tout en restant transportable. Boîtier porte-piles avec interrupteur à 4 DT chez Didactico. ## 5. Batterie Li-ion 18650 rechargeable La superstar de l'électronique amateur depuis 10 ans. Cylindre 18 mm × 65 mm, 3.7V nominal, 1500-3500 mAh selon la qualité. Sa densité énergétique écrase tout : une seule 18650 de 3000 mAh contient autant d'énergie utile que 6 piles AA alcalines, dans 1/4 du volume. Section dédiée plus bas. ## 6. Batterie LiPo 3.7V (lithium polymère) Cousin de la Li-ion, format plat et souple. Utilisée dans drones, smartphones, projets ultra-compacts. Très puissante (10-50C de décharge), mais très dangereuse si maltraitée : gonfle, prend feu, voire explose. À réserver aux utilisateurs avertis avec chargeur balanceur dédié. ## 7. Supercondensateurs Énergie modeste mais charge/décharge en quelques secondes, durée de vie 500 000+ cycles. Niche : maintien d'horloge RTC pendant changement de batterie, pic de courant à l'allumage d'un moteur, récupération d'énergie. Coût élevé (15-30 DT pour 10F/2.7V) qui en limite l'usage. Conseil terrain : Pour 80% des projets étudiants à l'ENIT, INSAT ou ISET Sfax, le combo idéal est 1 ou 2 cellules Li-ion 18650 + module TP4056 + step-up MT3608. Comptez 20-30 DT pour un système complet, rechargeable des centaines de fois. ## Comparaison coût/mAh : qui gagne vraiment ? Voici un tableau comparatif réalisé sur des prix réels du marché tunisien (mai 2026), normalisé en millidinar par Wh utile (énergie réellement extractible). Le Wh = mAh × V / 1000. Source | Capacité | Tension | Wh utile | Prix DT | Coût/Wh ----------------------|-------------|---------|----------|---------|-------- Pile 9V alcaline | 500 mAh | 9V | 4.5 Wh | 4 DT | 889 mDT/Wh Pile AA alcaline (×4) | 2500 mAh | 6V | 15 Wh | 6 DT | 400 mDT/Wh AA NiMH rech. (×4) | 2000 mAh | 4.8V | 9.6 Wh | 25 DT* | 26 mDT/Wh** Li-ion 18650 (×1) | 2600 mAh | 3.7V | 9.6 Wh | 20 DT* | 21 mDT/Wh** LiPo 3.7V 1000 mAh | 1000 mAh | 3.7V | 3.7 Wh | 25 DT | 6757 mDT/Wh Power bank 10000 mAh | 6700 mAh utiles (5V) | 5V | 33.5 Wh | 50 DT* | 7 mDT/Wh** * Avec coût chargeur amorti sur durée de vie ** Amorti sur 500 cycles de charge Le constat est brutal : la pile 9V alcaline coûte 42× plus cher au Wh que la Li-ion 18650 rechargeable. C'est pour cela qu'aucun projet professionnel ne l'utilise. La power bank arrive en tête en coût/Wh, mais sa contrainte du 5V fixe limite les usages. ## Batteries Li-ion 18650 : la référence amateur Les 18650 méritent leur propre section parce qu'elles équipent 70% des projets sérieux qu'on voit passer à l'atelier. Voici tout ce qu'il faut savoir. ## Caractéristiques électriques fondamentales - Tension nominale : 3.7V (point milieu de la courbe de décharge) - Tension pleine charge : 4.20V ± 0.05V (au-delà = danger) - Tension de coupure (déchargée) : 2.5V à 3.0V selon le fabricant. Sous 2.5V, la cellule est endommagée définitivement - Capacité réelle : 1500 à 3500 mAh (méfiez-vous des annonces "9900 mAh", c'est physiquement impossible) - Courant de décharge continu : 5A à 30A selon le modèle (cellules "high drain" comme la Samsung 30Q ou Sony VTC6) - Durée de vie : 300 à 500 cycles avant que la capacité tombe à 80% ## Comment reconnaître une vraie cellule de qualité La contrefaçon est massive sur le marché mondial. Une vraie Samsung INR18650-30Q (la référence) pèse ~46 g, livre réellement 3000 mAh à 15A, et coûte 12-18 DT pièce. Si vous voyez une 18650 à 5 DT annoncée "6000 mAh", c'est une cellule recyclée d'ordinateur portable avec une étiquette mensongère, capacité réelle 800-1200 mAh, déjà à mi-vie. Chez Didactico nous ne distribuons que des cellules de marques tracées (Samsung, LG, Sony, Panasonic). Attention : Une 18650 nue n'a aucune protection. Un court-circuit accidentel (clé qui tombe dessus dans une trousse, par exemple) peut provoquer un emballement thermique et un incendie en moins de 60 secondes. Toujours transporter dans un étui plastique ou avec les terminaux isolés. ## Modules TP4056 et BMS : charger sans danger ## Le module TP4056 : votre meilleur ami pour 1 cellule Le TP4056 est un petit circuit (15 × 25 mm, 2 DT chez Didactico) qui transforme un port micro-USB ou USB-C en chargeur Li-ion 1 cellule, en respectant le protocole CC/CV (Constant Current / Constant Voltage) obligatoire pour les cellules lithium. Phases de charge orchestrées par le TP4056 : - Phase CC (Constant Current) : Tant que la cellule est sous 4.20V, le TP4056 injecte un courant constant (typiquement 1A, réglable par résistance Rprog). La tension monte progressivement. - Phase CV (Constant Voltage) : Une fois 4.20V atteint, le module maintient cette tension fixe et laisse le courant baisser naturellement. - Fin de charge : Quand le courant tombe sous 1/10 du courant initial (typiquement 100 mA), le TP4056 coupe et allume la LED bleue "chargé". Préférez la version TP4056 avec puce de protection DW01 (3 broches sur le module, contre 2 sur la version basique). Elle ajoute la protection contre la sur-décharge sous 2.5V, le court-circuit en sortie, et la surintensité de décharge. Pour 50 millimes de plus, ne vous en privez pas. ## Les BMS multi-cellules : 2S, 3S, 4S Dès qu'on monte plusieurs Li-ion en série pour obtenir 7.4V, 11.1V ou 14.8V, un BMS (Battery Management System) devient obligatoire — pas optionnel, obligatoire. Pourquoi ? Parce que deux cellules même neuves n'ont jamais exactement la même capacité. À chaque charge, l'une se remplit légèrement plus vite que l'autre. Sans équilibrage, après 20-30 cycles, l'une atteint 4.30V (danger d'explosion) pendant que l'autre stagne à 4.05V. Un BMS effectue trois protections critiques : - Équilibrage passif : Dérive vers une résistance le surplus de la cellule la plus chargée pour laisser les autres rattraper - Protection sur-charge : Coupe la charge si une cellule dépasse 4.25V - Protection sous-décharge et court-circuit : Coupe la sortie en cas de surintensité ou tension trop basse Un BMS 3S 25A pour pack 11.1V coûte 8-12 DT. Indispensable pour packs de drones, robots autonomes, vélos électriques bricolés. ## Solaire pour IoT en Tunisie : calcul énergétique La Tunisie est gâtée : 6 à 8 heures d'ensoleillement utile par jour en moyenne annuelle, plus de 3000h/an dans le sud (Tozeur, Gabès). Le solaire devient économiquement et techniquement viable même sur un mini-panneau de 1W. ## Les formats de panneaux qu'on utilise au FabLab Sfax - Mini-panneau 5V 0.5W (60×60 mm) : 8 DT. Charge une cellule Li-ion via TP4056 (lentement, 100 mA crête). Suffisant pour capteur basse consommation en deep sleep - Panneau standard 6V 3.5W (165×135 mm) : 25 DT. Le bon compromis pour station météo IoT, ruche connectée, capteur agricole. Charge 1 cellule Li-ion en 6-8h de plein soleil - Panneau flexible monocristallin 50W ou 100W : 180-350 DT. Pour systèmes plus ambitieux : caméra de surveillance, Raspberry Pi outdoor, station Wi-Fi de jardin ## Calcul énergétique : la règle des 4-5 Wh/jour/W Règle d'ingénieur valide pour la Tunisie : un panneau de 1W produit en moyenne 4 Wh par jour en hiver, 5 Wh par jour en été (en tenant compte des pertes de conversion, nuages, salissures, angle non optimal sans tracker). Procédure de dimensionnement en 4 étapes : - Mesurez votre consommation moyenne sur 24h. Exemple capteur LoRa : 50 mA pendant 5 secondes d'émission toutes les 10 minutes (= 144 émissions/jour) + 50 µA en sommeil. Énergie : (50 mA × 5 s × 144) / 3600 = 10 mAh + (0.05 mA × 23.8h) = 11.2 mAh/jour - Convertissez en Wh. 11.2 mAh × 3.7V = 41 mWh/jour - Ajoutez 50% de marge sécurité (pluie, ombre, vieillissement) : 62 mWh/jour - Divisez par 4 Wh/W/jour (hiver pire cas). Panneau nécessaire : 62 / 4000 = 0.016 W. Un mini-panneau de 0.5W est largement surdimensionné Astuce : Toujours dimensionner sur l'hiver, pas la moyenne annuelle. Sinon votre système tombera en panne en janvier-février, précisément quand l'accès au site distant est le plus pénible. ## Convertisseurs DC-DC : MT3608, LM2596, XL6009 Trois petits modules à 3-5 DT pièce qui résolvent 95% des problèmes de conversion de tension. À connaître par cœur. ## MT3608 — Step-up (boost) Élève la tension. Entrée 2-24V, sortie réglable 5-28V par potentiomètre multitours, courant max 2A (1A continu réaliste). Usage typique : faire monter une cellule Li-ion 3.7V à 5V pour alimenter un Arduino Nano via VIN, ou à 9V pour un servo de puissance. ## LM2596 — Step-down (buck) Abaisse la tension. Entrée 7-35V, sortie réglable 1.25-30V (toujours inférieure à l'entrée moins ~2V), courant 2A continu, 3A pic. Rendement 80-92%. Usage : abaisser 12V de batterie de moto à 5V stable pour Arduino. Existe aussi en version avec affichage voltmètre intégré pour 4 DT de plus, très pratique en prototypage. ## XL6009 — Buck-Boost Élève OU abaisse la tension selon la consigne. Plus polyvalent mais légèrement moins efficient. Idéal pour applications avec batterie qui se vide (Li-ion qui passe de 4.2V à 3.0V) tout en alimentant un consommateur 5V fixe. // Câblage type : Li-ion 1S + MT3608 + Arduino Nano // // Li-ion 18650 (3.0-4.2V) // | // [TP4056] <-- USB pour recharger // | // [MT3608] (réglé sortie 5.0V) // | // Arduino Nano (VIN) // // Toujours mesurer la sortie au multimètre AVANT // de connecter l'Arduino. Une erreur de potentiomètre // peut envoyer 12V dans une puce 5V = fumée garantie. 🔋 CATÉGORIE COMPLÈTE ## Alimentations, piles et batteries Didactico Cellules Li-ion authentiques, modules TP4056 et BMS, panneaux solaires, convertisseurs DC-DC, adaptateurs muraux — livraison 24-48h partout en Tunisie. Voir le catalogue → ## 3 cas pratiques calculés ## Cas 1 — Capteur IoT outdoor LoRa (autonomie 6 mois cible) Architecture : ESP32 + capteur BME280 + module LoRa SX1278. Mesure toutes les 15 minutes, envoi LoRa, puis deep sleep. - Consommation active (3 secondes) : ESP32 = 160 mA, LoRa TX = 120 mA, BME280 = 1 mA → ~280 mA - Consommation sommeil : ESP32 deep sleep = 10 µA, BME280 sleep = 0.1 µA → 10 µA - Énergie / 24h : (0.28 A × 3s × 96 cycles) / 3600 + (10 µA × 23.92h) ≈ 22.4 mAh + 0.24 mAh = 22.6 mAh/jour - Pour 6 mois (180 jours) : 22.6 × 180 = 4068 mAh théoriques. Avec marge 20% : 4882 mAh Solution : 2× cellules 18650 3500 mAh en parallèle (=7000 mAh, marge confortable) + TP4056 + mini-panneau solaire 1W. Coût total : 65 DT, durée de vie 3-5 ans. ## Cas 2 — Robot Arduino UNO avec 4 servos SG90 et 2 moteurs DC - Consommation moteurs DC sous charge : 2 × 400 mA = 800 mA - Consommation servos SG90 actifs (deux en mouvement simultané maxi en pratique) : 2 × 250 mA = 500 mA - Consommation Arduino + capteurs : 80 mA - Total pire cas : ~1380 mA. Cible autonomie : 1h de fonctionnement - Capacité requise : 1380 mAh + 30% marge = 1800 mAh à 6-9V Solution : 2× cellules 18650 en série (7.4V nominal) + BMS 2S + alim séparée 5V pour les servos via LM2596. Pourquoi alim séparée pour les servos ? Parce qu'un pic de servo qui démarre fait chuter la tension de 200-300 mV instantanément, ce qui fait redémarrer l'Arduino si tout partage la même alim. ## Cas 3 — Caméra Raspberry Pi Zero W + streaming Wi-Fi - Consommation moyenne Pi Zero W + caméra + Wi-Fi actif : 250-350 mA à 5V (~1.5W) - Cible : journée d'usage continu (10h) - Énergie : 1.5W × 10h = 15 Wh Solution : Power bank 10 000 mAh (33 Wh utiles) ou pack 3× 18650 en parallèle + step-up MT3608 réglé à 5.1V. Pour usage outdoor permanent, ajouter panneau 10W. Le Pi Zero étant gourmand, un mini-panneau ne suffit pas. ## Sécurité Li-ion/LiPo : règles non-négociables Chaque année, des dizaines d'incendies amateurs sont causés par une mauvaise manipulation de batteries lithium. Quelques règles absolues, transmises par les équipes du FabLab Sfax aux étudiants en première séance : - Jamais de LiPo nue sans BMS au-delà de 1 cellule. Toujours équilibrer. - Jamais charger sans surveillance la première fois d'une cellule neuve ou inconnue. Posez-la sur un sol non-inflammable (carrelage, plaque métallique), pas sur du bois ou un tapis. - Jamais court-circuiter les bornes. Stockez les 18650 dans des étuis plastiques individuels. - Ne dépassez jamais 4.20V/cellule en charge. Si votre chargeur n'est pas marqué "4.20V CC/CV", ne l'utilisez pas pour du lithium. - Surveillez la température. Une cellule qui dépasse 60°C en charge ou décharge est anormale. Stoppez immédiatement. - Une cellule qui gonfle, percée, fissurée = poubelle dédiée. Ne la rechargez plus jamais. À Sfax, les déchets électroniques se déposent à l'ANGED ou aux points de collecte des grandes surfaces. - Jamais en avion en soute, toujours en cabine, et déclarées. Cas réel : En 2024, un étudiant à l'INSAT a perdu son ordinateur portable et brûlé sa table de bureau parce qu'il avait laissé un pack LiPo 3S de drone en charge sur un chargeur "universel" pendant la nuit. Le chargeur ne faisait pas d'équilibrage, une cellule a dépassé 4.4V, emballement thermique, incendie. Ne jamais minimiser ce risque. ## FAQ — Questions fréquentes Puis-je alimenter un Arduino UNO directement avec une cellule Li-ion 18650 ?Non, pas directement. La cellule délivre 3.0-4.2V, sous le minimum de 5V requis sur la broche VIN (qui veut 7V minimum). Solutions : (1) connecter la cellule sur la broche 5V via un boost MT3608 réglé à 5V, OU (2) utiliser un Arduino Pro Mini 3.3V qui accepte directement 3.3-4.2V sur RAW. Une pile 9V peut-elle faire tourner un robot avec 2 moteurs DC ?Théoriquement oui, en pratique non. La pile 9V a une résistance interne élevée (~2-3 Ω) et ne peut pas fournir plus de 100-200 mA sans s'effondrer. Deux moteurs DC tirent facilement 400-800 mA. La tension chute à 4-5V, l'Arduino redémarre. Utilisez un pack 4×AA NiMH ou 2× 18650. Combien de temps mettent 4 piles AA à se recharger ?Sur un chargeur NiMH intelligent (15-30 DT chez Didactico), 4 à 8 heures pour des AA 2000-2500 mAh. Évitez les chargeurs "rapides" sans gestion de température, ils tuent les piles en 30-50 cycles au lieu de 500-1000. Quelle différence entre 18650 protégée et non protégée ?La cellule protégée intègre un petit circuit (DW01 + MOS) à l'extrémité positive qui ajoute 3-5 mm de longueur. Elle se déconnecte automatiquement en cas de sur-décharge, sur-charge, court-circuit. Pour usage en lampe torche ou pack mécanique sans BMS externe, prenez la protégée. Pour usage dans un montage avec TP4056 + DW01 ou un BMS dédié, la non protégée suffit et est moins chère. Mon panneau solaire est marqué 6V 3.5W mais je mesure seulement 4.2V à vide. Normal ?Non — 4.2V à vide indique une cellule défectueuse ou un panneau mal éclairé. Un panneau 6V correct donne 6.5-7.5V à vide en plein soleil, et descend à ~6V sous charge nominale. Si vous mesurez en intérieur ou par temps couvert, c'est normal. Faites le test en plein soleil tunisien à midi, perpendiculaire aux rayons. Puis-je mettre 2 cellules Li-ion en parallèle pour doubler la capacité ?Oui, à condition que les deux cellules soient strictement identiques : même modèle, même âge, même capacité résiduelle, et chargées au même niveau avant assemblage. Sinon, la cellule la plus chargée déchargera sa différence dans l'autre instantanément (courants destructeurs). En pratique, mesurez à 0.05V près avant d'associer. Faut-il une diode anti-retour entre panneau solaire et batterie ?Oui, sauf si le contrôleur de charge en intègre déjà une (cas des TP4056 récents). Sinon, la nuit, la batterie se déchargerait dans le panneau (parcours inverse). Une simple Schottky 1N5817 (10 millimes) suffit pour les petits panneaux. Pour les panneaux 10W+, utiliser un vrai contrôleur de charge PWM ou MPPT. ## Conclusion : choisissez bien dès le début L'alimentation, c'est 30% du temps de conception d'un projet réussi, et c'est aussi ce qui distingue un prototype amateur ("ça marche sur la table") d'un produit fini ("ça tient 6 mois en condition réelle"). En appliquant la règle simple Li-ion 18650 + TP4056 + step-up pour la majorité des projets, et en respectant les règles de sécurité, vous éviterez 90% des galères que rencontrent les étudiants de l'ENIT, INSAT, ISBS, ISET Sfax et ENSI. Pour aller plus loin, lisez aussi notre guide Construire son Premier Robot Arduino, où nous appliquons concrètement ces principes de dimensionnement énergétique. Et pour toute question, l'équipe Didactico Sfax est disponible en boutique du lundi au samedi — ou par WhatsApp pour les commandes en ligne avec livraison 24-48h dans toute la Tunisie. --- ## Univers du catalogue ### Appareils de mesures (32 produits) https://didactico.tn/categorie-produit/appareils-de-mesures/ Multimètres, oscilloscopes, testeurs de composants LCR, alimentations de laboratoire et instruments de mesure. Pour diagnostiquer, calibrer et valider vos montages avec précision, une sélection pensée pour les étudiants, techniciens et ateliers en Tunisie. ### Cartes Programmables (421 produits) https://didactico.tn/categorie-produit/carte-programmable/ Cartes de développement et microcontrôleurs pour l'apprentissage et l'embarqué : Arduino, ESP32, ESP8266, Raspberry Pi, STM32, micro:bit et NVIDIA Jetson. Idéales pour l'IoT, la robotique et les projets étudiants, ces cartes programmables sont disponibles en Tunisie avec documentation, exemples de projets et support technique local. ### Capteurs – Prototypage (302 produits) https://didactico.tn/categorie-produit/capteurs-prototypage/ Tous les capteurs pour donner des sens à vos projets : température et humidité, distance, mouvement, lumière, courant, gaz ou RFID. Compatibles Arduino, ESP32 et Raspberry Pi, ces modules de prototypage équipent vos montages de domotique, de mesure industrielle et vos travaux pratiques d'électronique partout en Tunisie. ### Connectique – câbles – Boitiers (210 produits) https://didactico.tn/categorie-produit/connectique-cables-boitiers/ Câbles, connecteurs, borniers, fils dupont et boîtiers pour des liaisons propres et durables. Connectique JST, cordons banane, RJ45, nappes et passe-fils : de quoi câbler proprement vos prototypes et vos installations avec les standards courants de l'électronique, disponibles en Tunisie. ### Energie solaire (45 produits) https://didactico.tn/categorie-produit/energie-solaire/ Panneaux solaires, régulateurs MPPT et PWM, convertisseurs et accessoires pour vos installations photovoltaïques autonomes. Idéal pour alimenter des projets IoT, l'éclairage ou des systèmes hors-réseau, avec du matériel solaire adapté à l'ensoleillement tunisien. ### Prototypage général (66 produits) https://didactico.tn/categorie-produit/prototypage-general/ Le matériel de base du prototypage : plaques d'essai (breadboards), plaques à pastilles, cartes relais, straps et supports de circuit. Pour monter, tester et valider un schéma avant la version finale, à petit prix et en stock en Tunisie. ### Composants électroniques (701 produits) https://didactico.tn/categorie-produit/composants-electroniques/ Le rayon composants électroniques de Didactico réunit tout ce qui constitue un circuit : résistances, condensateurs, semi-conducteurs, circuits intégrés et connectique. Que vous répariez une carte, montiez un prototype ou équipiez un laboratoire en Tunisie, vous trouvez ici des références fiables, vendues à l'unité, en stock à Sfax avec conseils techniques et livraison 24-48 h. ### Alimentations piles et batteries (352 produits) https://didactico.tn/categorie-produit/alimentations-piles-et-batteries/ Tout pour alimenter vos montages : alimentations à découpage, modules régulateurs, piles, accus Li-ion et LiPo, coupleurs et chargeurs. Du 3,3 V logique au 12/24 V de puissance, trouvez la source d'énergie stable adaptée à votre carte, votre robot ou votre installation, en stock en Tunisie. ### Fer a souder et Outillage (123 produits) https://didactico.tn/categorie-produit/fer-a-souder-outillage/ Fers et stations de soudage, étain, flux, tresse à dessouder, pinces, tournevis de précision et outillage électronique. L'équipement indispensable de l'atelier et du laboratoire, choisi pour sa fiabilité et son rapport qualité-prix, disponible en Tunisie. ### Imprimantes 3D / Machines CNC (75 produits) https://didactico.tn/categorie-produit/imprimantes-3d-machines-cnc/ Imprimantes 3D, machines CNC, filaments PLA/PETG et pièces détachées : buses, courroies, moteurs pas-à-pas, cartes de contrôle et plateaux. Pour le prototypage rapide, l'enseignement et la fabrication numérique, avec consommables et support technique disponibles en Tunisie. ### Robotique – Drones (270 produits) https://didactico.tn/categorie-produit/robotique-drones/ Le nécessaire pour construire robots mobiles et drones : châssis, moteurs, drivers, roues, hélices, contrôleurs de vol et accessoires. Pour la compétition, la formation ou le loisir, Didactico propose en Tunisie des pièces compatibles Arduino et ESP32 ainsi que des kits prêts à assembler. ### Kits éducatifs et Robotiques (44 produits) https://didactico.tn/categorie-produit/kits-educatifs-et-robotiques/ Kits clé en main pour apprendre l'électronique, la programmation et la robotique : kits de démarrage Arduino, robots à assembler, kits STEM et coffrets micro:bit. Conçus pour les écoles, ISET, centres de formation et autodidactes en Tunisie, avec tutoriels pas-à-pas. --- Dernière mise à jour: 2026-06-07 · © Didactico Tunisie