RoboLymix · INSAT — Plan Complet

0 / 43
0%

RoboLymix — Maze-Solver · RoboCup Tunisie

Tout ce que je dois faire, de zéro au robot terminé. Chaque étape cochée = un pas de plus vers le tournoi.

ESP32 WROOM-32D
JGB37-520
L298N Dual H-Bridge
VL53L0X ToF
MPU9250 9-axis
Flood Fill Algorithm
150×150mm Chassis
3 Étages
1

Acheter les composants

0/6
Achat Commander les composants principaux
ESP32 DevKitC 30-pin, L298N, 4× VL53L0X GY-530, 1× MPU9250 GY-91. Vérifie que chaque VL53L0X a le pin XSHUT accessible.
⏱ 1-2 jours (local) ou 15-30 jours (AliExpress)
▸ Cliquer pour plus de détails

Pourquoi ces composants ?

  • ESP32 DevKitC 30-pin : c'est le cerveau du robot. Il a le Wi-Fi, le Bluetooth, assez de GPIO pour tout connecter, et 2 cœurs pour gérer les encodeurs en temps réel. Le modèle 30-pin (pas 38-pin) car il rentre mieux dans notre châssis 150mm.
  • L298N : pont H double — il permet de contrôler 2 groupes de moteurs (gauche et droit) en vitesse et en direction. Il supporte jusqu'à 2A par canal, parfait pour nos JGB37-520.
  • VL53L0X (×4) : capteurs laser Time-of-Flight. Ils mesurent la distance aux murs avec une précision de ~3mm sur 0-120cm. On en met 4 : devant, gauche, droite, arrière.
  • MPU9250 GY-91 : 9 axes (gyroscope + accéléromètre + magnétomètre). Le gyroscope corrige les dérives de cap pendant les virages, et le magnétomètre donne un cap absolu.

Où acheter en Tunisie ?

  • Local (rapide, plus cher) : Sattari Electronics (Tunis Médina), ElectroPlanet, des boutiques à Sousse/Sfax. Prix ~40-60% plus cher qu'AliExpress.
  • AliExpress (lent, pas cher) : cherche "ESP32 DevKitC V2", "L298N module", "VL53L0X GY-530", "MPU9250 GY-91". Commande ASAP car 15-30 jours de livraison.
💡 Astuce : vérifie sur chaque VL53L0X que le pin XSHUT est bien accessible (petit header 6 pins). Certaines cartes chinoises ne le soudent pas — il faut alors souder un header soi-même.

Vérification à la réception

  • ESP32 : brancher en USB → doit apparaître comme port COM/serial
  • L298N : vérifier les 2 jumpers ENA/ENB sont présents (on les retirera plus tard)
  • VL53L0X : 6 pins visibles (VCC, GND, SDA, SCL, GPIO1, XSHUT)
  • MPU9250 : puce marquée "InvenSense MPU-9250" — attention aux faux MPU6500 vendus comme MPU9250
Achat Commander les moteurs + roues
4× JGB37-520 (12V, ratio 30:1, avec encodeur Hall intégré) + 4× roues Ø65mm (axe 6mm). Vérifie que chaque moteur a 6 fils (2 moteur + 4 encodeur).
⏱ 15-30 jours (AliExpress — commence par ça !)
▸ Cliquer pour plus de détails

Pourquoi le JGB37-520 ?

  • Ratio 30:1 : bon compromis vitesse/couple. ~300 RPM à vide → assez rapide pour le speed run, assez de couple pour démarrer/tourner sans patiner.
  • Encodeur Hall intégré : 11 impulsions par tour moteur × 30 (ratio) = 330 impulsions par tour de roue. Ça donne la précision nécessaire pour le PID et la navigation cellule par cellule.
  • 12V nominal : correspond à notre pack 3S (11.1-12.6V).

Ce qu'il faut vérifier à la commande

  • Commande exactement 30:1 ratio (pas 100:1 ni 10:1)
  • Version avec encodeur (6 fils : 2 rouges/noirs pour le moteur + 4 pour l'encodeur)
  • Axe de 6mm de diamètre (pour les roues)

Les roues

  • Ø65mm en caoutchouc, trou central 6mm
  • Assez petites pour rester sous la limite de hauteur du labyrinthe
  • Le caoutchouc donne une bonne adhérence sur MDF/bois (surface typique RoboCup)
⚠ Commande les moteurs EN PREMIER — c'est le composant avec le plus long délai de livraison (15-30j). Tu peux travailler sur le perfboard et le code en attendant.
Achat Alimentation : batteries + LM2596
3× 18650 flat-top 3400mAh + 1× LM2596 step-down + 1× chargeur individuel + 1× interrupteur 3A.
⚠ FLAT-TOP uniquement, pas button-top !
▸ Cliquer pour plus de détails

Pourquoi 3S (3 cellules en série) ?

  • 3 × 3.7V = 11.1V nominal (range 9.9V-12.6V)
  • Les moteurs JGB37-520 sont optimaux à 12V
  • Le L298N a besoin de 7-12V pour fonctionner
  • Le LM2596 step-down convertit 12V → 5V pour l'ESP32

Le LM2596

  • Module step-down (buck converter) réglable
  • Entrée : 12V du pack → Sortie : 5.0V exactement (réglable via vis)
  • L'ESP32 VIN accepte 5V — NE PAS envoyer 12V dessus !
  • Le module a une LED de fonctionnement et un potentiomètre bleu à tourner
⚠ FLAT-TOP = la face positive (+) est plate. Button-top = petit bouton qui dépasse. Les supports de batteries ne marchent qu'avec flat-top. Vérifie AVANT d'acheter.
💡 Achète un chargeur individuel de 18650 (pas un chargeur de pack). Ça permet de charger chaque cellule séparément et de vérifier leur tension.
Achat Composants passifs + perfboard
1× perfboard 9×7cm, 4× bornier à vis 2 pôles (5.08mm), 4× JST-XH 4-pin + 4× JST-XH 3-pin (headers PCB + câbles), 2× résistance 4.7kΩ, 1× condensateur 100µF 16V, 3× condensateur 100nF, kit soudure.
▸ Cliquer pour plus de détails

Perfboard vs Stripboard

  • Perfboard (pastilles individuelles) : chaque trou est isolé — TU choisis les connexions avec du fil/soudure. C'est ce qu'on utilise.
  • Stripboard (bandes de cuivre) : les trous sont connectés en lignes. Plus facile mais moins flexible. PAS adapté à notre layout.

Rôle de chaque composant passif

  • 2× résistances 4.7kΩ : pull-up pour le bus I2C (SDA et SCL). Sans elles, les capteurs ToF et le MPU9250 ne communiquent pas avec l'ESP32.
  • 1× condensateur 100µF 16V (électrolytique) : filtrage du rail 12V. Absorbe les pics de courant quand les moteurs démarrent/s'arrêtent.
  • 3× condensateur 100nF (céramique) : découplage haute fréquence sur chaque rail (3.3V, 5V, 12V). Élimine le bruit électrique qui perturbe les capteurs.

Connecteurs (rend le robot 10× plus facile)

  • 4× bornier à vis 2 pôles (5.08mm) : pour les entrées/sorties d'alimentation (12V IN, 12V OUT, 5V IN, 5V OUT). Tu visses les fils au lieu de les souder — beaucoup plus facile à modifier et debugger.
  • 5× JST-XH 4-pin (header PCB) : pour les 4 capteurs ToF + le MPU9250. Tu soudes le header au perfboard, puis tu branches/débranches les capteurs avec un câble JST. Plus besoin de souder les capteurs directement !
  • 4× JST-XH 3-pin (header PCB) : pour les 4 encodeurs moteur. Même principe plug-and-play.

Kit soudure minimum

  • Fer à souder 30-60W (pointe fine ~1mm)
  • Fil d'étain 0.6-0.8mm (avec flux intégré)
  • Éponge ou laine de laiton pour nettoyer la panne
  • Optionnel mais utile : troisième main / support, pompe à dessouder
💡 Si c'est ta première soudure : entraîne-toi sur un bout de perfboard vide. Fais des ponts de soudure entre 2 pastilles. Quand tu es à l'aise, passe au vrai circuit.
Achat Câblage + fixation
2m fil 22AWG (rouge+noir), jumper M-F 20cm ×30, jumper M-M 20cm ×10, serre-câbles, foam tape 3M, Velcro, Loctite bleu, vis/écrous/entretoises M3 nylon, câble micro-USB.
▸ Cliquer pour plus de détails

Pourquoi chaque item ?

  • Fil 22AWG : assez épais pour le courant moteur (~2A), assez fin pour passer dans les fentes du châssis. Rouge = VCC, Noir = GND.
  • Jumper M-F (mâle-femelle) : pour connecter l'ESP32 (broches mâles) au perfboard et aux capteurs. 30 pièces car on a beaucoup de connexions.
  • Jumper M-M : pour les connexions entre modules (L298N → perfboard, etc.)
  • Serre-câbles : organisation des câbles — un robot propre = moins de bugs et plus facile à debugger.
  • Foam tape 3M : fixation des composants légers (LM2596) qui n'ont pas de trous de vis.
  • Velcro : fixation de la batterie — permet de la retirer facilement pour la charger.
  • Loctite bleu (243) : frein-filet pour les vis moteur — empêche les vis de se desserrer avec les vibrations. BLEU pas rouge ! (Le rouge est permanent.)
  • Entretoises M3 nylon : séparent les étages du châssis. Nylon = isolant et léger.
💡 Achète des serre-câbles en excès — tu en utiliseras plus que prévu. Et garde le câble micro-USB pour programmer l'ESP32 depuis ton PC.
Achat Filament PLA pour le châssis
~250g de PLA 1.75mm pour imprimer les 3 plateaux. Si tu n'as pas d'imprimante 3D, trouve un fablab ou un service d'impression en Tunisie.
▸ Cliquer pour plus de détails

Paramètres d'impression recommandés

  • Matériau : PLA (facile à imprimer, rigide, pas cher)
  • Épaisseur de couche : 0.2mm (bon compromis vitesse/qualité)
  • Remplissage (infill) : 30% (assez solide sans être trop lourd)
  • Parois : 3 périmètres minimum (solidité des trous de vis)
  • Support : non nécessaire (les plateaux sont plats)
  • Temps estimé : F1 ~3-4h, F2 ~3h, F3 ~2h

Si tu n'as pas d'imprimante 3D

  • FabLab INSAT : vérifie si le fablab a une imprimante disponible
  • Alternative MDF/acrylique : tu peux découper les plateaux en MDF 3mm avec une scie à chantourner. Dessine les dimensions sur papier, colle sur le MDF, et découpe. Plus long mais ça marche.
  • Services en ligne : il y a des services d'impression 3D en Tunisie (cherche sur Facebook/Instagram)
💡 Imprime un petit morceau test (30×30mm) d'abord pour vérifier que les dimensions sont correctes et que les trous M3 s'alignent avec tes vis.
2

Imprimer et assembler le châssis

0/7
3D Imprimer Floor 1 (150×150mm)
Avec les 4 encoches moteur aux coins, les trous M3 pour entretoises, la fente câbles au centre, et le trou interrupteur au bord arrière.
⏱ 3-4h d'impression (PLA 30% infill, 0.2mm)
▸ Cliquer pour plus de détails

Le Floor 1 — l'étage puissance

  • C'est la base du robot — tout le poids repose dessus
  • Dimensions exactes : 150×150mm, épaisseur 3mm
  • 4 encoches de 42×25mm aux coins pour les moteurs JGB37-520
  • Les moteurs dépassent par les côtés — c'est normal, les arbres sortent pour les roues

Éléments à intégrer dans l'impression

  • 4 trous M3 pour les entretoises vers Floor 2 (positions : 20mm du bord, en rectangle)
  • Fente centrale (~10×30mm) pour passer les câbles vers Floor 2
  • Trou interrupteur au bord arrière (diamètre selon ton interrupteur, ~12mm typique)
  • 4 paires de trous M3 pour fixer les moteurs dans les encoches (2 vis par moteur)

Composants qui vont sur Floor 1

  • L298N : centre-avant (fixé par vis M3 sur rondelles nylon isolantes)
  • Batterie 3S : centre-arrière (fixée par Velcro pour retrait facile)
  • LM2596 : arrière centre-droit (fixé par foam tape)
  • Interrupteur : bord arrière (clipsé ou vissé)
💡 Ouvre le diagramme floor1_v4 pendant l'impression pour vérifier que chaque trou et encoche est au bon endroit. Imprime d'abord un test à 50% de taille pour valider l'alignement.
3D Imprimer Floor 2 (150×150mm)
Avec clips ToF intégrés aux 4 bords (avant/gauche/droit/arrière), 2 jeux de trous M3 (4 pour F1, 4 pour F3), fente câbles vers F1, trou LED arrière.
▸ Cliquer pour plus de détails

Le Floor 2 — l'étage cerveau

  • Même dimensions que F1 : 150×150mm, épaisseur 3mm
  • Suspendu à 30mm au-dessus de F1 par les entretoises M3×30mm
  • C'est ici que se trouve toute l'intelligence : ESP32 + perfboard + MPU9250

Deux jeux de trous

  • 4 trous M3 "bas" : s'alignent avec les entretoises de F1 (mêmes positions)
  • 4 trous M3 "haut" : pour les entretoises M3×20mm vers F3 (positions différentes, plus proches du centre-avant car F3 est plus petit)

Fente câbles

  • Fente vers le bas (vers F1) : passage des câbles moteurs, encodeurs, alimentation
  • Les capteurs ToF et la LED sont directement sur Floor 2 — pas besoin de fente vers F3

Composants sur Floor 2

  • ESP32 : côté avant, port USB accessible par le bord pour programmer
  • Perfboard 90×70mm : au centre, contient les rails d'alimentation, résistances I2C, condensateurs
  • MPU9250 : soudé au centre du perfboard (position idéale = centre de rotation du robot)
💡 Le MPU9250 doit être le plus près possible du centre de rotation du robot. Si tu le places excentré, les accélérations en virage créent des mesures parasites.
3D Imprimer Floor 3 (150×150mm)
Couvercle de protection. Avec 4 ouvertures rectangulaires pour les faisceaux ToF (avant, gauche, droite, arrière), trou LED Ø5mm, 4 trous M3.
▸ Cliquer pour plus de détails

Le Floor 3 — couvercle de protection

  • Même dimensions que F1 et F2 : 150×150mm, épaisseur 3mm
  • Suspendu à 20mm au-dessus de F2 par les entretoises M3×20mm
  • Hauteur totale du robot ~92mm — les capteurs ToF sur F2 sont à ~69mm du sol
  • Pas de composants électroniques — c'est une plaque de protection pure

Ouvertures pour les faisceaux ToF

  • Ouverture avant : 20×12mm au centre du bord avant — alignée avec le ToF Front sur F2
  • Ouverture gauche : 12×20mm au centre du bord gauche — alignée avec le ToF Left sur F2
  • Ouverture droite : 12×20mm au centre du bord droit — alignée avec le ToF Right sur F2
  • Les ouvertures doivent être parfaitement alignées avec les capteurs sur Floor 2 — pose F3 sur F2 avant d'assembler pour vérifier

Trou LED + trous M3

  • Trou LED Ø5mm : centre du bord arrière — laisse passer la lumière de la LED sur F2
  • 4 trous M3 : aux 4 coins intérieurs, pour les vis des entretoises F2→F3
Build Assembler Floor 1 : moteurs + puissance
Visser les 4 moteurs (M3×8 + Loctite) → L298N centre-avant (rondelles nylon !) → batterie (Velcro) → LM2596 (foam) → interrupteur → 4 entretoises M3×30mm.
⚠ Retirer les jumpers ENA/ENB sur le L298N avant montage !
▸ Cliquer pour plus de détails

Ordre de montage (important !)

  • 1. Moteurs en premier : vis M3×8 + une goutte de Loctite bleu sur chaque vis. Laisse sécher 10 min avant de manipuler.
  • 2. L298N : centre-avant. Utilise des rondelles nylon entre le L298N et le PLA — le radiateur du L298N peut chauffer et déformer le plastique.
  • 3. Batterie : centre-arrière sur Velcro. Le poids de la batterie au centre aide la stabilité.
  • 4. LM2596 : arrière centre-droit sur foam tape. NE PAS le connecter à l'ESP32 avant d'avoir réglé la tension !
  • 5. Interrupteur : bord arrière. En série sur le fil positif de la batterie.
  • 6. Entretoises : 4× M3×30mm dans les trous dédiés, serrées à la main (pas trop fort sur le PLA).
⚠ Les jumpers ENA/ENB du L298N : ce sont 2 petits cavaliers jaunes/noirs qui connectent les pins ENABLE aux 5V. Il FAUT les retirer car on contrôle la vitesse par PWM depuis l'ESP32 (GPIO14 = ENA, GPIO32 = ENB). Si tu les laisses, les moteurs tournent toujours à fond.
💡 Connecte les fils moteur M1+M3 (gauche) en parallèle sur OUT1/OUT2, et M2+M4 (droite) en parallèle sur OUT3/OUT4. Si un côté tourne à l'envers, inverse les 2 fils de ce côté sur les bornes du L298N.
Test Tester Floor 1 : tensions
Batterie chargée → interrupteur ON → multimètre : 12V sur bornes L298N ? 5.0V en sortie LM2596 ? Si le LM2596 n'est pas à 5.0V, tourne la vis de réglage AVANT de brancher l'ESP32.
⚠ Si le LM2596 sort plus de 5.5V, il grille l'ESP32 !
▸ Cliquer pour plus de détails

Procédure de test étape par étape

  • 1. Batterie chargée à fond (chaque cellule ~4.1-4.2V)
  • 2. Multimètre en mode tension DC (V=)
  • 3. Interrupteur ON
  • 4. Mesure aux bornes du L298N (12V / GND) : tu dois lire 11.1-12.6V
  • 5. Mesure en sortie du LM2596 (OUT+ / OUT-) : tu dois lire 5.0V ±0.1V

Régler le LM2596

  • Il y a un petit potentiomètre bleu sur le module
  • Tourne avec un tournevis cruciforme TOUT PETIT (2mm)
  • Sens horaire = tension monte, sens anti-horaire = tension baisse
  • Ajuste LENTEMENT en mesurant en continu avec le multimètre
  • Objectif : 5.00V exactement
⚠ CRITIQUE : si tu branches l'ESP32 avec plus de 5.5V sur VIN, la puce grille instantanément. Vérifie DEUX FOIS avant de connecter. Certains LM2596 sortent 12V par défaut !

Si quelque chose ne marche pas

  • 0V partout : interrupteur mal câblé ou batterie déchargée
  • 12V OK mais pas de 5V : LM2596 mal connecté (vérifie IN+ et IN-)
  • Tension instable : mauvais contact sur les fils — resserre les bornes
Build Assembler Floor 2 + Floor 3
Floor 2 sur entretoises → ESP32 + perfboard + MPU9250 → ToF clipsés sur F2 (avant/gauche/droit/arrière) → entretoises M3×20mm → Floor 3 (couvercle) aligné avec les ouvertures ToF.
▸ Cliquer pour plus de détails

Montage Floor 2

  • 1. Pose Floor 2 sur les 4 entretoises M3×30mm de Floor 1
  • 2. Fixe avec des écrous M3 nylon (serrage à la main, pas trop fort)
  • 3. Monte l'ESP32 côté avant — le port USB doit être accessible par le bord pour programmer sans démonter
  • 4. Fixe le perfboard au centre (foam tape ou vis M2 si tu as des trous prévus)
  • 5. Le MPU9250 est déjà soudé au centre du perfboard
  • 6. Clipse les 4 VL53L0X dans leurs clips sur Floor 2 : Front (centre bord avant), Left (centre bord gauche), Right (centre bord droit), Rear (centre bord arrière)
  • 7. Place la LED dans son trou au bord arrière de Floor 2

Montage Floor 3 (couvercle)

  • 8. Visse 4 entretoises M3×20mm sur Floor 2 (trous "haut")
  • 9. Pose Floor 3 (couvercle) et vérifie que les 4 ouvertures sont alignées avec les capteurs ToF sur Floor 2
  • 10. Fixe avec écrous M3 nylon
💡 Consulte le diagramme profil latéral pour voir la vue de côté de l'assemblage complet. La hauteur totale doit être ~92mm.
Build Monter les 4 roues Ø65mm
Enfiler sur les arbres moteur. Vérifier qu'elles tournent librement sans frotter le châssis.
▸ Cliquer pour plus de détails

Montage des roues

  • L'arbre moteur fait 6mm de diamètre avec un méplat (un côté est plat)
  • Les roues ont un trou hexagonal ou avec méplat qui s'emboîte sur l'arbre
  • Pousse fermement — elles doivent être bien ajustées (pas de jeu)
  • Si elles glissent : une goutte de colle cyanoacrylate (super glue) sur l'arbre

Vérifications

  • Rotation libre : tourne chaque roue à la main — elle doit tourner sans résistance excessive
  • Pas de frottement : les roues ne doivent pas toucher le châssis (Floor 1) en tournant
  • Alignement : les 4 roues doivent toucher le sol en même temps quand tu poses le robot. Si le robot "boite", un moteur est peut-être mal aligné.
  • Adhérence : pose le robot sur la surface prévue (bois/MDF). Les roues ne doivent pas patiner quand tu pousses le robot latéralement.
💡 Si le robot n'est pas parfaitement plat (une roue en l'air), tu peux ajouter une fine rondelle entre le moteur et l'encoche pour ajuster la hauteur.
3

Souder le perfboard

0/7
Soudure Souder les 4 rails de distribution
Fil de cuivre nu : R1 = 3.3V (toute la longueur), R2 gauche = 12V (cols 1-9), R2 droite = 5V (cols 11-18), R12 = GND (toute la longueur). LAISSER col 10 vide !
⚠ Le séparateur colonne 10 est CRITIQUE — 12V connecté au 5V = ESP32 mort
▸ Cliquer pour plus de détails

Layout des 4 rails

  • Rangée 1 (R1) — 3.3V : fil de cuivre nu soudé sur toute la longueur (cols 1-18). C'est la sortie 3.3V du régulateur interne de l'ESP32.
  • Rangée 2 gauche (R2, cols 1-9) — 12V : entrée directe de la batterie 3S via l'interrupteur. Alimente le L298N.
  • Rangée 2 droite (R2, cols 11-18) — 5V : sortie du LM2596. Alimente l'ESP32 VIN et les encodeurs.
  • Rangée 12 (R12) — GND : masse commune, toute la longueur. TOUT se rejoint ici.

Pourquoi la colonne 10 est vide ?

  • C'est le séparateur physique entre le 12V et le 5V sur le rail R2
  • Si tu poses de la soudure sur col 10 par accident, tu connectes 12V au 5V → l'ESP32 reçoit 12V et meurt instantanément
  • Vérifie visuellement au multimètre (mode continuité) qu'il n'y a PAS de contact entre col 9 et col 11 du rail R2

Technique de soudure des rails

  • Coupe un fil de cuivre nu de la bonne longueur
  • Plie les extrémités à 90° pour le maintenir en place dans les trous
  • Soude chaque pastille individuellement — le fil doit être bien en contact avec chaque pad
  • Vérifie la continuité après chaque rail avec le multimètre (bip entre col 1 et col 18)
⚠ Si c'est ta première soudure, commence par le rail GND (R12) — c'est le plus long et le moins critique en cas d'erreur. Entraîne-toi dessus.
Soudure Souder les borniers à vis et connecteurs JST-XH
4× borniers à vis 2 pôles (5.08mm) pour les entrées/sorties d'alimentation (12V IN, 5V IN, Moteurs). 4× JST-XH 4-pin pour les capteurs ToF et le MPU9250. 4× JST-XH 3-pin pour les encodeurs moteurs.
▸ Cliquer pour plus de détails

Borniers à vis (TB1-TB4)

  • TB1 (12V IN) : entrée 12V depuis l'interrupteur → connecté au rail 12V (R2 cols 1-9)
  • TB2 (5V IN) : entrée 5V depuis le LM2596 → connecté au rail 5V (R2 cols 11-18)
  • TB3 (Moteurs A) : sortie vers moteurs gauches depuis le L298N
  • TB4 (Moteurs B) : sortie vers moteurs droits depuis le L298N

Connecteurs JST-XH 4-pin (J1-J4)

  • J1 (ToF Front) : VCC, GND, SDA, XSHUT (GPIO15)
  • J2 (ToF Left) : VCC, GND, SDA, XSHUT (GPIO4)
  • J3 (ToF Right) : VCC, GND, SDA, XSHUT (GPIO5)
  • J4 (ToF Rear) : VCC, GND, SDA, XSHUT (GPIO16)
  • J4 (MPU9250) : VCC, GND, SDA, SCL — si le MPU9250 est sur un breakout séparé

Connecteurs JST-XH 3-pin (J5-J8)

  • J5-J8 (Encodeurs) : VCC (5V), GND, Signal — un par moteur

Ordre de soudure recommandé

  • 1. Borniers à vis en premier (plus grands, positionnement critique)
  • 2. JST-XH 4-pin ensuite
  • 3. JST-XH 3-pin en dernier

Pourquoi des connecteurs ?

  • Permet de débrancher/rebrancher les capteurs et moteurs sans dessouder
  • Les JST-XH sont détrompés — impossible de les brancher à l'envers
  • Les borniers à vis supportent les fils épais de puissance (moteurs, batterie)
  • Si un capteur est défectueux, tu le remplaces en 5 secondes
💡 Soude les connecteurs APRÈS les rails mais AVANT les résistances et condensateurs. Les connecteurs sont plus grands et plus faciles à positionner quand le perfboard n'est pas encombré.
Soudure Souder les 2 résistances pull-up 4.7kΩ
R1 (SDA) sur R4 cols 3-5, R2 (SCL) sur R4 cols 6-8. Chaque résistance connecte le rail 3.3V au signal I2C. Pas de polarité.
▸ Cliquer pour plus de détails

Pourquoi des pull-up I2C ?

  • Le bus I2C fonctionne en "open-drain" : les appareils tirent la ligne vers le bas (0V) pour envoyer un '0', et la relâchent pour envoyer un '1'
  • Sans résistance pull-up, quand la ligne est relâchée, elle "flotte" — ni 0V ni 3.3V → le signal est illisible
  • Les résistances 4.7kΩ tirent les lignes SDA et SCL vers 3.3V quand personne ne parle → signal propre
  • On met UNE paire pour tout le bus : les 3 ToF + le MPU9250 partagent les mêmes pull-ups

Valeur 4.7kΩ — pourquoi ?

  • Trop faible (1kΩ) : consomme trop de courant et les capteurs peinent à tirer vers le bas
  • Trop élevée (10kΩ) : le signal monte trop lentement, erreurs de communication à haute fréquence
  • 4.7kΩ : valeur standard recommandée pour I2C à 100-400kHz avec 4 appareils sur le bus
💡 Les résistances n'ont PAS de polarité — tu peux les souder dans n'importe quel sens. Identifie-les par les bandes de couleur : Jaune-Violet-Rouge = 4.7kΩ.
Soudure Souder les condensateurs
C1 (100µF) sur R6-R9 cols 1-2 : + vers 12V, − vers GND. C2 (100nF) sur R6-R7 cols 12-13 : 5V↔GND. C3 (100nF) sur R6-R7 cols 5-6 : 3.3V↔GND.
⚠ C1 a une POLARITÉ — bande marquée = côté négatif. Si inversé, il peut exploser !
▸ Cliquer pour plus de détails

Rôle de chaque condensateur

  • C1 (100µF électrolytique) : sur le rail 12V. Absorbe les pics de courant quand les moteurs démarrent/freinent. Sans lui, la tension chute brièvement et l'ESP32 peut redémarrer.
  • C2 (100nF céramique) : sur le rail 5V. Filtrage haute fréquence — élimine le bruit du LM2596 (convertisseur à découpage).
  • C3 (100nF céramique) : sur le rail 3.3V. Protège les capteurs I2C du bruit électrique des moteurs.

Polarité — ATTENTION

  • C1 (100µF) : cylindre métallique avec une bande blanche sur un côté. La bande = côté NÉGATIF (−). Le côté sans bande = POSITIF (+). Le + va vers le rail 12V, le − vers GND.
  • C2, C3 (100nF) : petits condensateurs céramiques (jaune/marron, plats). PAS de polarité — tu peux les souder dans n'importe quel sens.
⚠ Un condensateur électrolytique inversé peut EXPLOSER (petit pop + odeur). Si tu as un doute, vérifie avec la datasheet ou cherche la marque "−" sur le boîtier. En cas de doute, ne branche pas l'alimentation avant d'avoir vérifié au multimètre.
Soudure Souder le MPU9250 sur le perfboard
Au centre exact du perfboard. Broches : VCC→3.3V, GND→GND, SDA→GPIO21 (bus I2C commun), SCL→GPIO22 (bus I2C commun). Adresse 0x68.
▸ Cliquer pour plus de détails

Pourquoi au centre ?

  • Le MPU9250 mesure les accélérations et rotations. S'il est excentré, les virages créent des accélérations centrifuges parasites qui faussent les mesures.
  • Au centre du perfboard ≈ au centre de rotation du robot (quand le robot tourne sur lui-même).

Connexions du module GY-91

  • VCC → rail 3.3V (le module a son propre régulateur si tu le branches en 5V, mais 3.3V direct est plus propre)
  • GND → rail GND
  • SDA → GPIO21 de l'ESP32 (même bus I2C que les ToF)
  • SCL → GPIO22 de l'ESP32 (même bus I2C que les ToF)
  • AD0 → GND (fixe l'adresse I2C à 0x68). Si AD0 = 3.3V, l'adresse devient 0x69.

Vérification après soudure

  • Vérifie la continuité VCC↔rail 3.3V et GND↔rail GND
  • Vérifie qu'il n'y a PAS de court-circuit entre VCC et GND (résistance > 1kΩ)
  • Le module ne chauffe pas quand alimenté (sinon → court-circuit !)
Test Tester le perfboard au multimètre
Mode continuité : ✅ 3.3V bout à bout, ✅ GND bout à bout, ✅ 12V cols 1-9, ✅ 5V cols 11-18. ❌ PAS de contact entre 12V et 5V, ❌ PAS de contact entre 3.3V et GND.
▸ Cliquer pour plus de détails

Checklist de test (mode continuité = bip)

  • Rail 3.3V : touche col 1 et col 18 de R1 → doit bipper (circuit continu)
  • Rail GND : touche col 1 et col 18 de R12 → doit bipper
  • Rail 12V : touche col 1 et col 9 de R2 → doit bipper
  • Rail 5V : touche col 11 et col 18 de R2 → doit bipper
  • 12V vs 5V : touche col 9 et col 11 de R2 → NE DOIT PAS bipper
  • 3.3V vs GND : touche R1 et R12 → ne doit pas bipper (sauf si les résistances/condensateurs créent une résistance faible — dans ce cas, vérifie en mode résistance : doit être > 1kΩ)
  • 12V vs GND : ne doit pas bipper
  • 5V vs GND : ne doit pas bipper

Problèmes courants

  • Bip inattendu entre rails : pont de soudure (trop de soudure a débordé entre 2 pastilles adjacentes). Solution : dessouder avec une tresse à dessouder ou une pompe.
  • Pas de bip sur un rail : soudure froide (le fil n'est pas bien connecté à une pastille). Solution : rechauffe la jointure et ajoute un peu de soudure.
💡 Ce test prend 5 minutes mais peut te sauver des heures de debug. Fais-le AVANT de connecter quoi que ce soit au perfboard.
Test Monter le perfboard et tester les tensions réelles
Connecte le perfboard à l'alimentation. Multimètre : 3.3V ≈ 3.3V ? 5V ≈ 5.0V ? 12V ≈ 11.1V ? GND = 0V partout ?
▸ Cliquer pour plus de détails

Test sous tension — premier allumage

  • 1. Connecte les fils d'alimentation du perfboard : 12V IN, 5V IN, GND
  • 2. NE connecte PAS encore l'ESP32 ni les capteurs
  • 3. Allume l'interrupteur
  • 4. Mesure immédiatement chaque rail avec le multimètre

Valeurs attendues

  • Rail 12V : 11.1-12.6V (dépend de la charge de la batterie)
  • Rail 5V : 4.9-5.1V (ajusté par le LM2596)
  • Rail 3.3V : 0V pour l'instant (le 3.3V vient du régulateur de l'ESP32, qui n'est pas encore branché)
  • Rail GND : 0V partout (c'est la référence)

Après avoir branché l'ESP32

  • L'ESP32 reçoit le 5V sur VIN et génère du 3.3V sur sa pin 3V3
  • Ce 3.3V alimente le rail 3.3V du perfboard via un fil
  • Après branchement de l'ESP32 : le rail 3.3V doit lire ~3.3V
💡 Si tu vois des tensions incorrectes, ÉTEINS TOUT immédiatement. Vérifie les connexions avant de réessayer. Un court-circuit peut griller des composants en quelques secondes.
4

Câbler tous les composants

0/6
Câble Câbler l'alimentation
Batterie → interrupteur → bornier TB1 (12V IN). LM2596 IN← 12V, LM2596 OUT→ bornier TB2 (5V IN). ESP32 VIN ← 5V, ESP32 GND ← GND. Utilise les borniers à vis pour les connexions de puissance.
▸ Cliquer pour plus de détails

Schéma de la chaîne d'alimentation

  • Batterie 3S (3×18650) → Interrupteur (ON/OFF) → Rail 12V du perfboard
  • Du rail 12V → LM2596 IN+/IN− → LM2596 convertit → LM2596 OUT+/OUT−Rail 5V du perfboard
  • Du rail 5V → ESP32 VIN + ESP32 GND
  • L'ESP32 génère le 3.3V interne → fil de ESP32 3V3Rail 3.3V du perfboard

Fils recommandés

  • Batterie → interrupteur → 12V : fil 22AWG rouge (courant ~2A max)
  • GND : fil 22AWG noir
  • 5V et 3.3V : jumper wires suffisent (courant <500mA)
⚠ Rappel : règle le LM2596 à EXACTEMENT 5.0V AVANT de connecter l'ESP32. Mesure avec le multimètre à chaque étape.
Câble Câbler les moteurs → L298N
M1+M3 (gauche) en parallèle → OUT1/OUT2. M2+M4 (droite) en parallèle → OUT3/OUT4. L298N 12V ← rail 12V, L298N GND ← GND. ENA→GPIO14, ENB→GPIO32, IN1→GPIO26, IN2→GPIO27, IN3→GPIO25, IN4→GPIO33.
▸ Cliquer pour plus de détails

Pourquoi en parallèle ?

  • On a 4 moteurs mais seulement 2 canaux sur le L298N
  • Les 2 moteurs gauche (M1 avant + M3 arrière) sont câblés en parallèle sur OUT1/OUT2
  • Les 2 moteurs droite (M2 avant + M4 arrière) sont câblés en parallèle sur OUT3/OUT4
  • En parallèle = même tension, courant doublé. Le L298N supporte 2A par canal, et chaque moteur tire ~300mA → total ~600mA, largement OK.

Table des pins GPIO → L298N

  • GPIO14ENA (PWM vitesse gauche, 0-255)
  • GPIO32ENB (PWM vitesse droite, 0-255)
  • GPIO26IN1 (direction gauche +)
  • GPIO27IN2 (direction gauche −)
  • GPIO25IN3 (direction droite +)
  • GPIO33IN4 (direction droite −)

Comment savoir si un côté tourne à l'envers ?

  • Flashe un simple test qui fait tourner les 2 côtés "en avant"
  • Si un côté tourne à l'envers → inverse les 2 fils moteur de ce côté sur les bornes du L298N (par ex. échange OUT1 et OUT2)
  • Alternative logicielle : inverse IN1/IN2 dans config.h
Câble Câbler les encodeurs → ESP32
Chaque encodeur : VCC→5V, GND→GND, signal A→GPIO. M1=GPIO34, M3=GPIO35, M2=GPIO36, M4=GPIO39. Ce sont des pins input-only (pas de pull-up interne, mais les encodeurs ont les leurs).
▸ Cliquer pour plus de détails

Les 6 fils de chaque moteur JGB37-520

  • 2 fils moteur (rouge/noir ou sans couleur) → vont au L298N (étape précédente)
  • 4 fils encodeur : VCC (rouge), GND (noir), Signal A (jaune/vert), Signal B (blanc/bleu)
  • On utilise SEULEMENT le Signal A — pas besoin du Signal B pour notre application (on compte juste les impulsions, pas le sens de rotation)

Pourquoi GPIO34, 35, 36, 39 ?

  • Ces 4 pins sont "input-only" sur l'ESP32 — elles ne peuvent pas servir comme sorties
  • Parfait pour les encodeurs : on ne fait que LIRE les impulsions
  • Ces pins n'ont PAS de résistance pull-up interne, mais les encodeurs Hall ont leurs propres pull-ups → pas de problème
  • Le code utilise des interruptions (attachInterrupt) sur ces pins pour compter chaque impulsion

Alimentation des encodeurs

  • VCC encodeur → 5V (pas 3.3V ! Les encodeurs Hall du JGB37-520 fonctionnent en 5V)
  • GND encodeur → GND commun
  • Le signal de sortie est en 5V, mais l'ESP32 tolère 3.6V max... en pratique, ça marche car le signal Hall est souvent autour de 3.3V. Si problème : ajoute un diviseur de tension.
Câble Câbler les 4 capteurs ToF
Chaque ToF a 5 fils : VCC→3.3V, GND→GND, SDA→GPIO21, SCL→GPIO22, XSHUT→unique. Front XSHUT=GPIO15, Left XSHUT=GPIO4, Right XSHUT=GPIO5, Rear XSHUT=GPIO16.
⚠ Les ToF sont sur Floor 2 — câblage court directement vers le perfboard et l'ESP32
▸ Cliquer pour plus de détails

Pourquoi 5 fils par ToF ?

  • VCC → 3.3V (les VL53L0X fonctionnent en 2.8-3.3V)
  • GND → masse commune
  • SDA → GPIO21 (bus I2C partagé avec les 2 autres ToF et le MPU9250)
  • SCL → GPIO22 (bus I2C partagé)
  • XSHUT → pin unique par capteur (permet de les allumer un par un pour changer leur adresse I2C)

Le mécanisme XSHUT

  • Par défaut, tous les VL53L0X ont l'adresse I2C 0x29 → conflit si on les branche tous en même temps
  • Au démarrage, le code met tous les XSHUT à LOW (tous éteints)
  • Puis il allume le capteur Front (XSHUT HIGH), lui change l'adresse à 0x30
  • Puis allume Left, adresse → 0x31
  • Puis allume Right, adresse → 0x32
  • Puis allume Rear, adresse → 0x33
  • Maintenant les 4 capteurs ont des adresses différentes et fonctionnent sur le même bus

Table XSHUT

  • Front : XSHUT = GPIO15, adresse finale = 0x30
  • Left : XSHUT = GPIO4, adresse finale = 0x31
  • Right : XSHUT = GPIO5, adresse finale = 0x32
  • Rear : XSHUT = GPIO16, adresse finale = 0x33
💡 Les 3 ToF sont sur Floor 2, donc les câbles sont courts et directs vers le perfboard. Utilise des couleurs différentes par capteur (ex: rouge=Front, bleu=Left, vert=Right) pour faciliter le debug.
Câble Câbler la LED + organiser
LED sur Floor 2 → GPIO2 (+ résistance 220Ω en série). Organise tous les câbles avec des serre-câbles. Vérifie qu'aucun câble n'obstrue les ToF (cône de 25°).
▸ Cliquer pour plus de détails

Câblage de la LED

  • GPIO2 → résistance 220Ω → anode (+, patte longue) de la LED → cathode (−, patte courte) → GND
  • La résistance 220Ω limite le courant à ~10mA (suffisant pour être visible, sans griller la LED ni surcharger le GPIO)
  • GPIO2 est aussi la LED interne de l'ESP32 — quand tu allumes GPIO2, la LED du robot ET la LED de l'ESP32 s'allument en même temps

Organisation des câbles

  • Regroupe les câbles par fonction : alimentation (rouge/noir), I2C (jaune/blanc), encodeurs, etc.
  • Attache avec des serre-câbles tous les 3-4cm
  • Route les câbles le long des bords du châssis, pas au centre
  • Zone interdite : devant chaque capteur ToF, un cône de 25° doit être dégagé. Aucun câble ne doit passer dans ce cône, sinon le capteur lit le câble au lieu du mur !
💡 Prends une photo de ton câblage avant de fermer le robot. Si un câble se débranche plus tard, tu sauras où il allait.
Test Vérification complète du câblage
Multimètre : continuité de chaque fil, pas de court-circuit. Allume le robot et vérifie que l'ESP32 s'allume, le LED de l'ESP32 clignote.
▸ Cliquer pour plus de détails

Test AVANT d'allumer (robot éteint)

  • Mode continuité sur chaque fil : touche les 2 extrémités → doit bipper
  • Vérifie qu'aucun fil n'est en court-circuit avec un voisin
  • Vérifie que VCC (n'importe quel rail) n'est PAS en court avec GND
  • Secoue doucement le robot : aucun fil ne doit se débrancher

Premier allumage complet

  • 1. Interrupteur ON
  • 2. La LED du LM2596 s'allume (vert/rouge selon modèle)
  • 3. La LED bleue de l'ESP32 clignote brièvement (boot)
  • 4. Si rien ne se passe : vérifie l'interrupteur, puis le 5V, puis le câble VIN/GND de l'ESP32

Signes de problème

  • Odeur de brûlé : ÉTEINS IMMÉDIATEMENT. Court-circuit quelque part.
  • Un composant chauffe : court-circuit ou mauvais branchement. Les composants doivent rester tièdes au toucher, jamais chauds.
  • ESP32 redémarre en boucle : pas assez de courant (LM2596 mal réglé) ou court-circuit sur un GPIO.
💡 Si tout est OK à cette étape, félicitations — le hardware est prêt ! Le reste c'est du logiciel.
5

Installer et flasher le code

0/6
Code Installer Arduino IDE + librairies
Arduino IDE 2.x → Ajouter le board ESP32 (Espressif) dans le Board Manager. Installer les librairies : Adafruit_VL53L0X, Wire.h (incluse). Sélectionner "ESP32 Dev Module".
▸ Cliquer pour plus de détails

Installation étape par étape

  • 1. Télécharge Arduino IDE 2.x depuis arduino.cc/en/software
  • 2. File → Preferences → "Additional boards manager URLs" → ajoute : https://dl.espressif.com/dl/package_esp32_index.json
  • 3. Tools → Board → Boards Manager → cherche "esp32" → installe "ESP32 by Espressif Systems" (version 2.x)
  • 4. Tools → Board → sélectionne "ESP32 Dev Module"
  • 5. Tools → Port → sélectionne le port COM de ton ESP32 (branche-le en USB pour le voir apparaître)

Librairies à installer

  • Sketch → Include Library → Manage Libraries → cherche et installe :
    • Adafruit_VL53L0X (par Adafruit) — gestion des capteurs ToF
    • Wire — déjà incluse dans l'ESP32 core, pas besoin d'installer
    • MPU9250_WE (par Wolfgang Ewald) — pour le MPU9250 (étape 30)

Test rapide

  • File → Examples → WiFi → WiFiScan → Upload → Serial Monitor à 115200 → tu dois voir les réseaux WiFi autour de toi
  • Si ça marche = l'ESP32 est bien reconnu et tu peux flasher du code
💡 Si le port COM n'apparaît pas : installe le driver CP2102 ou CH340 (selon la puce USB de ton ESP32). Cherche "CP2102 driver" ou "CH340 driver" sur Google.
Code Copier les 6 fichiers du code v3
Dans un dossier "maze_robot_v3", copie : maze_robot_v3.ino, config.h, motors.h, sensors.h, flood_fill.h, movement.h. Ouvre le .ino dans Arduino IDE.
▸ Cliquer pour plus de détails

Structure du projet

  • Crée un dossier maze_robot_v3/ sur ton PC
  • TOUS les fichiers doivent être dans le MÊME dossier (Arduino IDE l'exige)
  • Le dossier DOIT avoir le même nom que le fichier .ino (maze_robot_v3)

Rôle de chaque fichier

  • maze_robot_v3.ino : fichier principal — machine à états (EXPLORE → RETURN → DONE), setup(), loop()
  • config.h : toutes les constantes : pins GPIO, vitesses, taille des cellules, seuils. C'est LE fichier à modifier pour calibrer.
  • motors.h : contrôle des moteurs, PID, ISR des encodeurs. Fonctions : driveForward(), turnLeft(), turnRight()
  • sensors.h : initialisation et lecture des 4 VL53L0X, séquençage XSHUT, retry en cas d'erreur
  • flood_fill.h : algorithme BFS, carte des murs, calcul du chemin optimal, gestion des impasses
  • movement.h : commandes de haut niveau — avancer d'une cellule, tourner de 90°, correction de trajectoire
💡 Ouvre d'abord config.h et lis les commentaires — tu comprendras comment tout est connecté. Ne modifie rien tant que tu n'as pas calibré (Phase 6).
Code Flasher un sketch de test I2C
Avant le code final, flashe un simple I2C scanner. Tu dois voir : 0x30 (ToF F), 0x31 (ToF L), 0x32 (ToF R), 0x33 (ToF Rear), 0x68 (MPU9250). Si un appareil manque, vérifie son câble.
▸ Cliquer pour plus de détails

Le sketch I2C Scanner

  • Cherche "I2C Scanner Arduino" sur Google — c'est un sketch standard de ~30 lignes
  • Il parcourt toutes les adresses I2C de 0x01 à 0x7F et affiche celles qui répondent
  • C'est le MEILLEUR outil de debug pour vérifier que tous tes capteurs sont bien câblés

Ce que tu dois voir dans le Serial Monitor

  • 0x29 → un VL53L0X (adresse par défaut — normal si tu n'as pas encore changé les adresses)
  • OU si le code d'init ToF a déjà tourné : 0x30, 0x31, 0x32, 0x33
  • 0x68 → MPU9250
  • Tu dois voir 5 adresses au total (4 ToF + 1 MPU9250)

Si un capteur manque

  • Vérifie le câble SDA (GPIO21) et SCL (GPIO22) du capteur absent
  • Vérifie VCC et GND
  • Pour les ToF : vérifie le câble XSHUT — si XSHUT est à LOW (déconnecté/flottant), le capteur est éteint
  • Essaie de connecter le capteur seul (déconnecte les autres) pour isoler le problème
⚠ Si tu vois 0 appareil : les pull-up I2C ne fonctionnent pas, ou SDA/SCL sont inversés, ou le câblage est mauvais. Reviens à l'étape 17 (test perfboard).
Code Flasher le code v3 complet
Compile et upload maze_robot_v3.ino. Ouvre le Serial Monitor (115200 baud). Tu dois voir les messages d'initialisation : ToF OK, encodeurs prêts, flood fill initialisé.
▸ Cliquer pour plus de détails

Procédure de flash

  • 1. Ouvre maze_robot_v3.ino dans Arduino IDE
  • 2. Vérifie : Board = "ESP32 Dev Module", Port = ton port COM
  • 3. Clique "Verify" (✓) — doit compiler sans erreur
  • 4. Clique "Upload" (→) — attend le transfert
  • 5. Ouvre le Serial Monitor (loupe en haut à droite), régle sur 115200 baud
  • 6. Appuie sur le bouton RESET de l'ESP32 (ou débranche/rebranche)

Messages attendus au boot

  • [INIT] Configuring ToF sensors...
  • [INIT] ToF Front OK at 0x30
  • [INIT] ToF Left OK at 0x31
  • [INIT] ToF Right OK at 0x32
  • [INIT] ToF Rear OK at 0x33
  • [INIT] Encoders ready
  • [INIT] Flood fill grid initialized (16x16)
  • [READY] Waiting for start...

Erreurs courantes

  • "Failed to connect to ESP32" : tiens le bouton BOOT enfoncé pendant l'upload
  • "Compilation error: sensors.h not found" : tous les fichiers .h doivent être dans le même dossier que le .ino
  • "ToF init failed" : problème I2C — reviens à l'étape 27
Code Comprendre l'algorithme Flood Fill
Avant de calibrer, comprends comment le robot navigue. Le Flood Fill est un BFS depuis le centre : chaque cellule a une valeur = distance au but. Le robot suit toujours la cellule voisine de valeur la plus basse.
▸ Cliquer pour plus de détails

Flood Fill en 4 phrases

  • 1. Le labyrinthe est une grille (16×16 cellules typiquement). Le but est au centre (cellules 7,7 / 7,8 / 8,7 / 8,8).
  • 2. On remplit la grille avec des "distances" : le centre = 0, ses voisins = 1, les voisins des voisins = 2, etc. C'est un BFS (Breadth-First Search).
  • 3. Le robot est dans une cellule. Il regarde ses voisins accessibles (pas de mur entre eux) et choisit celui avec la PLUS PETITE valeur.
  • 4. À chaque mouvement, le robot découvre de nouveaux murs → il met à jour la carte → il recalcule le flood fill → il choisit la prochaine cellule.

Deux phases du robot

  • EXPLORE : le robot explore le labyrinthe, cartographie les murs, et se dirige vers le centre. Vitesse lente (SPEED_EXPLORE = 160).
  • RETURN : une fois au centre, le robot connaît la carte. Il revient au départ en suivant le chemin optimal, à vitesse rapide (SPEED_RETURN = 220).

Gestion des impasses (deadlock)

  • Si le robot est entouré de cellules avec des valeurs ≥ sa propre valeur, il est dans une impasse
  • Le code détecte ça et force un demi-tour (180°)
  • Le flood fill est recalculé avec les nouveaux murs → le robot trouve un autre chemin
💡 Ouvre le simulateur interactif (flood_fill_explainer_v3.html) et joue avec : place des murs, observe comment les valeurs changent, et comment le "robot" virtuel choisit son chemin. C'est la meilleure façon de comprendre.
Code Ajouter le code MPU9250 (à faire)
Le code v3 actuel n'inclut pas encore le MPU9250. Il faut ajouter la lecture du gyroscope pour corriger le cap. Librairie recommandée : MPU9250_WE ou SparkFun_MPU-9250-DMP.
⚠ TODO : intégrer la correction de cap MPU9250 dans movement.h
▸ Cliquer pour plus de détails

Pourquoi le gyroscope est important ?

  • Les encodeurs comptent les tours de roue → ils mesurent la distance
  • Mais quand le robot tourne de 90°, les encodeurs ne sont pas très précis (le sol peut être glissant, les roues patinent légèrement)
  • Le gyroscope mesure la vitesse angulaire → il sait EXACTEMENT combien de degrés le robot a tourné
  • En combinant encodeurs + gyroscope, les virages sont beaucoup plus précis

Ce qu'il faut modifier dans le code

  • config.h : ajouter les constantes MPU9250 (adresse I2C, offsets de calibration)
  • sensors.h : ajouter l'initialisation du MPU9250 et la lecture gyro/magnéto
  • movement.h : dans turnLeft() et turnRight(), utiliser le gyroscope pour vérifier que le virage fait exactement 90°
  • Logique : au lieu de tourner "tant que les encodeurs n'ont pas compté 277 pulses", tourner "tant que le gyroscope n'a pas mesuré 90°"

Librairie recommandée

  • MPU9250_WE par Wolfgang Ewald — simple, bien documentée, fonctionne avec l'ESP32
  • Installation : Arduino IDE → Library Manager → "MPU9250_WE" → Install
  • Exemples inclus : MPU9250_acceleration, MPU9250_gyroscope, MPU9250_magnetometer
💡 Commence par un sketch séparé qui lit le gyroscope et affiche les angles en temps réel dans le Serial Monitor. Quand ça marche, intègre-le dans movement.h.
6

Calibrer le robot

0/6
Calibration Calibrer PULSES_PER_MM
Fait avancer le robot sur exactement 1000mm (1 mètre). Compte les pulses encodeur. La valeur correcte = pulses_comptés / 1000. config.h dit 2.94 mais calibre sur ton robot réel.
▸ Cliquer pour plus de détails

Méthode de calibration

  • 1. Marque un point de départ sur le sol (ruban adhésif)
  • 2. Marque un point à exactement 1000mm (1 mètre) — mesure avec un mètre ruban
  • 3. Écris un petit sketch qui fait avancer le robot tout droit et affiche le compteur d'encodeur dans le Serial Monitor
  • 4. Place le robot au départ, lance-le, arrête-le quand il atteint la marque des 1000mm
  • 5. Note le nombre de pulses affiché. Fais-le 3 fois et prends la moyenne.
  • 6. PULSES_PER_MM = moyenne_pulses / 1000

Calcul théorique vs réel

  • Théorie : roue Ø65mm → périmètre = π × 65 = 204.2mm → 330 pulses/tour → 330/204.2 = 1.62 pulses/mm
  • Mais config.h dit 2.94 — la différence vient du ratio exact du réducteur et de la taille réelle de la roue (les roues chinoises ne font pas exactement 65mm)
  • C'est pour ça qu'il FAUT mesurer sur le robot réel, pas se fier au calcul théorique
💡 Fais le test sur la même surface que le labyrinthe (bois/MDF). Sur du carrelage, les roues glissent plus → valeur différente.
Calibration Calibrer TURN_PULSES_90
Fait tourner le robot 4× à droite (devrait faire un tour complet de 360°). Si ça fait plus/moins que 360°, ajuste : new = old × 360 / actual_degrees. config.h dit 277.
▸ Cliquer pour plus de détails

Méthode de calibration des virages

  • 1. Place le robot sur une surface plane, marque la direction avec du ruban adhésif
  • 2. Écris un sketch qui fait 4 rotations de 90° à droite (avec la valeur actuelle de TURN_PULSES_90 = 277)
  • 3. Si après 4 virages le robot regarde dans la même direction qu'au départ → 277 est bon !
  • 4. S'il a fait PLUS que 360° (il pointe au-delà) : diminue la valeur
  • 5. S'il a fait MOINS que 360° : augmente la valeur

Formule d'ajustement

  • Mesure l'angle réel fait après 4 virages (avec un rapporteur ou une appli téléphone)
  • new_value = old_value × 360 / measured_angle
  • Exemple : 4 virages = 350° au lieu de 360° → new = 277 × 360/350 = 285
💡 Fais aussi le test avec des virages à gauche — la valeur devrait être la même. Si elle est différente, les roues ou les moteurs d'un côté ne sont pas symétriques.
💡 Quand le MPU9250 sera intégré (étape 30), les virages utiliseront le gyroscope au lieu des encodeurs — cette calibration deviendra moins critique.
Calibration Calibrer les capteurs ToF
Place un mur à 100mm, 200mm, 500mm devant chaque capteur. Vérifie que les lectures Serial correspondent. Ajuste WALL_THRESHOLD_MM si nécessaire (défaut 100mm).
▸ Cliquer pour plus de détails

Procédure de test

  • 1. Écris un sketch qui affiche les 3 distances ToF dans le Serial Monitor (toutes les 200ms)
  • 2. Place un livre/carton plat devant le capteur Front
  • 3. Mesure la distance avec un mètre ruban : 100mm, 200mm, 300mm, 500mm
  • 4. Compare avec la lecture du capteur — l'erreur doit être < 10mm
  • 5. Répète pour les capteurs Left et Right

WALL_THRESHOLD_MM

  • C'est la distance en dessous de laquelle le robot considère qu'il y a un mur
  • Valeur par défaut : 100mm
  • Si ton labyrinthe a des cellules de 180mm : le mur le plus proche est à ~90mm du centre de la cellule (180/2)
  • Mets le seuil à mi-chemin entre "mur" et "pas de mur" : ~120-150mm est souvent bon

Problèmes courants

  • Lecture 0mm en permanence : capteur pas initialisé (revois l'étape 27)
  • Lectures très variables (±50mm) : surface réfléchissante ou câble parasite dans le cône de détection
  • Erreur systématique (toujours +30mm par ex.) : le capteur mesure depuis la puce, pas depuis le bord du PCB → normal, tiens-en compte dans le seuil
Calibration Calibrer le PID pour lignes droites
Place le robot dans un long couloir. Lance-le en ligne droite. S'il dévie : augmente KP (défaut 2.5). S'il oscille : augmente KD (défaut 0.8). S'il dérive lentement : ajoute un peu de KI.
▸ Cliquer pour plus de détails

C'est quoi un PID ?

  • P (Proportionnel) : corrige l'erreur actuelle. Si le robot dévie à droite de 10mm → il tourne à gauche proportionnellement. KP = intensité de la correction.
  • I (Intégral) : corrige l'erreur accumulée. Si le robot dérive lentement dans un sens → l'erreur s'accumule → la correction augmente. KI = vitesse de correction de la dérive.
  • D (Dérivé) : freine la correction. Empêche le robot de sur-corriger et d'osciller. KD = amortissement.

Méthode de réglage (Ziegler-Nichols simplifiée)

  • 1. Mets KI=0, KD=0. Commence avec KP=1.0
  • 2. Lance le robot en ligne droite sur 2 mètres
  • 3. S'il dévie sans corriger → augmente KP (essaie 2.0, 3.0, etc.)
  • 4. S'il oscille (zigzag gauche-droite) → KP est trop fort, réduis-le
  • 5. Quand KP est bon (corrige sans trop osciller), ajoute KD=0.5
  • 6. Augmente KD jusqu'à ce que les oscillations disparaissent
  • 7. Si le robot dérive lentement d'un côté, ajoute un petit KI (0.01-0.1)
💡 Le PID dans notre code compare les encodeurs gauche et droit. Si un côté a compté plus de pulses que l'autre → le robot a dévié → le PID ajuste les vitesses moteur pour compenser.
Calibration Calibrer le MPU9250
Place le robot sur surface plane. Lance la calibration gyro (pose immobile 3s). Pour le magnétomètre : tourne le robot lentement sur 360° pour calibrer le compas. Stocke les offsets.
▸ Cliquer pour plus de détails

Calibration du gyroscope

  • Le gyroscope a un "drift" (dérive) — même immobile, il lit un petit angle qui n'est pas zéro
  • La calibration mesure ce drift pendant 3 secondes (robot immobile) et le soustrait des lectures futures
  • Procédure : pose le robot sur une surface PARFAITEMENT plane, ne le touche pas, lance la calibration
  • Les offsets sont stockés en mémoire (config.h ou EEPROM)

Calibration du magnétomètre

  • Le magnétomètre est perturbé par les moteurs, les fils, et les objets métalliques autour
  • La calibration "hard iron" corrige ce biais
  • Procédure : lance le mode calibration, puis tourne le robot LENTEMENT sur 360° (complet) dans les 2 sens
  • Le code enregistre les valeurs min/max du champ magnétique et calcule les offsets

Vérification

  • Après calibration, le gyroscope doit lire ~0°/s quand le robot est immobile
  • Le magnétomètre doit donner un cap stable (ex: 45° = nord-est) quand le robot est immobile
  • Tourne le robot de 90° → le cap doit changer de ~90° (ex: 45° → 135°)
⚠ Recalibre le magnétomètre si tu changes quoi que ce soit sur le robot (ajout/retrait de composants, réarrangement des câbles). Le champ magnétique local change.
Calibration Ajuster CELL_SIZE_MM
Mesure la taille réelle d'une cellule de ton labyrinthe (généralement 180mm pour RoboCup Junior). Mets la valeur exacte dans config.h.
▸ Cliquer pour plus de détails

Qu'est-ce que CELL_SIZE_MM ?

  • Le labyrinthe RoboCup est divisé en cellules carrées
  • Chaque cellule fait 180mm × 180mm (standard RoboCup Junior)
  • Quand le robot "avance d'une cellule", il doit parcourir exactement cette distance
  • Si CELL_SIZE_MM est trop grand : le robot dépasse la cellule → se retrouve dans la suivante → la carte est fausse
  • Si trop petit : le robot s'arrête trop tôt → il croit être dans une cellule alors qu'il est entre deux

Comment mesurer

  • Si tu as accès à un vrai labyrinthe RoboCup : mesure la distance entre 2 murs parallèles adjacents (distance intérieure)
  • Si tu construis ton propre labyrinthe en carton : choisis 180mm et construis en conséquence
  • Mets la valeur exacte dans config.h : #define CELL_SIZE_MM 180

Impact sur le code

  • Le nombre de pulses pour avancer d'une cellule = CELL_SIZE_MM × PULSES_PER_MM
  • Avec les valeurs par défaut : 180 × 2.94 = 529 pulses par cellule
  • C'est pour ça que la calibration de PULSES_PER_MM (étape 31) doit être faite AVANT
7

Tests finaux et tournoi

0/5
Test Test dans un mini-labyrinthe
Construis un petit labyrinthe 4×4 avec du carton. Le robot doit : détecter les murs, avancer d'une cellule, tourner correctement, et ne pas se coincer.
▸ Cliquer pour plus de détails

Construire un mini-labyrinthe de test

  • Matériau : carton épais (boîtes de pizza, carton d'emballage) ou MDF 3mm
  • Dimensions : 4×4 cellules = 720mm × 720mm (si cellules de 180mm)
  • Hauteur des murs : 50mm minimum (standard RoboCup)
  • Épaisseur des murs : ~12mm (collé sur le sol ou maintenu avec du ruban)
  • Sol : surface lisse et plate (table, panneau MDF)

Premier test — par étapes

  • Test 1 — Ligne droite : un couloir de 4 cellules sans virage. Le robot doit avancer de 4 cellules sans toucher les murs.
  • Test 2 — Un virage : un couloir avec un virage à droite. Le robot doit détecter le mur, tourner, et continuer.
  • Test 3 — Impasse : un cul-de-sac. Le robot doit faire demi-tour.
  • Test 4 — Labyrinthe complet : le labyrinthe 4×4 avec le centre à atteindre.

Quoi surveiller

  • Le robot se centre bien dans chaque cellule ?
  • Les virages sont bien à 90° (pas 85° ou 95°) ?
  • Il détecte les murs des 3 côtés correctement ?
  • Il ne se coince pas dans les coins ?
💡 Filme chaque test avec ton téléphone. En rejouant au ralenti, tu verras exactement où le robot dévie ou se trompe. C'est beaucoup plus utile que le Serial Monitor pour le debug mécanique.
Test Test de l'exploration complète
Dans le mini-labyrinthe : le robot doit explorer toutes les cellules accessibles, mapper les murs, calculer le chemin optimal vers le centre, et revenir au départ.
▸ Cliquer pour plus de détails

Ce que le robot doit faire

  • Phase EXPLORE : le robot part du coin (0,0), explore méthodiquement le labyrinthe en utilisant Flood Fill, et se dirige vers le centre (cellules 1,1 / 1,2 / 2,1 / 2,2 dans un 4×4)
  • À chaque cellule, il lit les 4 capteurs ToF, met à jour la carte des murs, recalcule le Flood Fill, et avance vers la cellule avec la valeur la plus basse
  • Phase RETURN : une fois au centre, le robot connaît le chemin optimal. Il revient au départ en suivant ce chemin à vitesse rapide.

Vérification via Serial Monitor

  • Le code affiche la carte du labyrinthe dans le Serial Monitor
  • Vérifie que les murs détectés correspondent à la réalité
  • Vérifie que les valeurs Flood Fill sont cohérentes (le centre = 0, les cellules éloignées = valeurs plus grandes)
  • Si le robot se trompe de mur : problème de seuil ToF (étape 33) ou capteur mal orienté

Problèmes courants

  • Le robot tourne en boucle : un mur n'est pas détecté → le Flood Fill envoie le robot dans une boucle. Baisse WALL_THRESHOLD_MM.
  • Le robot détecte des murs fantômes : un câble est dans le cône ToF, ou le seuil est trop haut.
  • Le robot se décale progressivement : PULSES_PER_MM ou CELL_SIZE_MM n'est pas bien calibré.
Test Test du speed run
Après l'exploration, le robot doit suivre le chemin optimal en vitesse rapide (SPEED_RETURN = 220). Chronomètre le temps. L'objectif au tournoi = le run le plus rapide.
▸ Cliquer pour plus de détails

Le speed run — comment ça marche

  • Pendant l'exploration, le robot a cartographié tout le labyrinthe
  • Il connaît maintenant le chemin le plus court du départ au centre
  • Le speed run = suivre ce chemin à vitesse maximale, sans explorer
  • SPEED_RETURN = 220 (sur 255 max) — c'est rapide mais stable

Optimisations possibles

  • Augmenter SPEED_RETURN : teste 230, 240, 250. Plus c'est rapide, plus le PID doit être bien calibré.
  • Réduire le temps de virage : un virage rapide gagne du temps mais risque de faire patiner les roues
  • Smooth turns : au lieu de s'arrêter → tourner → repartir, le robot peut tourner en roulant (arc de cercle). Plus complexe mais beaucoup plus rapide.

Scoring RoboCup

  • Au tournoi, tu as plusieurs essais (runs) dans un temps limité
  • Le premier run = exploration (lent, ~2-3 min pour un labyrinthe 16×16)
  • Les runs suivants = speed runs (rapide, ~20-40 secondes si bien calibré)
  • Le meilleur temps est gardé → optimise le speed run !
Test Test batterie : autonomie
Charge les 3 cellules à fond. Lance le robot en exploration continue. Note combien de temps il tient. Tu as besoin d'au moins 10 minutes pour un match RoboCup.
▸ Cliquer pour plus de détails

Estimation théorique

  • 3× 18650 3400mAh en série = 3400mAh à 11.1V
  • Consommation totale : 4 moteurs (~300mA) + ESP32 (~150mA) + capteurs (~50mA) = ~500mA en moyenne
  • Autonomie théorique : 3400 / 500 = ~6.8 heures
  • En pratique : les pics de courant (démarrages moteur), les pertes dans le LM2596, et la décharge non-linéaire réduisent à ~3-4 heures
  • C'est LARGEMENT assez pour un tournoi (10-15 min de runs au total)

Quand s'inquiéter

  • Si l'autonomie est < 30 min : vérifie qu'il n'y a pas de court-circuit ou de composant qui chauffe
  • Si l'ESP32 redémarre en boucle vers la fin : la tension batterie est trop basse pour le LM2596 → charge les batteries
  • Si les moteurs ralentissent progressivement : normal, la tension batterie baisse. Recharge quand la tension descend sous ~10V pour ne pas endommager les cellules.
💡 Au tournoi, charge les batteries entre chaque match. Même si l'autonomie est énorme, des batteries pleines = tensions stables = meilleure performance.
Test Checklist avant tournoi
✅ Batteries chargées à 100%. ✅ Code flashé (pas en mode debug). ✅ Vis serrées + Loctite. ✅ Câbles organisés et fixés. ✅ Roues propres. ✅ Multimètre et tournevis dans le sac. ✅ Câble USB de secours.
▸ Cliquer pour plus de détails

Checklist mécanique

  • ☐ Toutes les vis serrées (vérifie avec un tournevis, pas à la main)
  • ☐ Loctite bleu sur les vis moteur (vérifie qu'elles n'ont pas bougé)
  • ☐ Roues bien fixées, pas de jeu sur les arbres moteur
  • ☐ Câbles bien rangés et attachés (serre-câbles)
  • ☐ Aucun câble dans le cône des capteurs ToF
  • ☐ Entretoises bien serrées, aucun étage qui bouge

Checklist électrique

  • ☐ 3 batteries chargées à fond (4.2V chacune, 12.6V total)
  • ☐ LM2596 toujours réglé à 5.0V (peut dériver avec la chaleur)
  • ☐ Tous les capteurs répondent (I2C scan : 4 appareils)
  • ☐ LED fonctionne
  • ☐ Moteurs tournent dans le bon sens

Checklist logicielle

  • ☐ Code FINAL flashé (pas un sketch de test !)
  • ☐ Mode debug désactivé (sinon le robot est plus lent à cause des prints Serial)
  • ☐ Valeurs calibrées (PULSES_PER_MM, TURN_PULSES_90, CELL_SIZE_MM, PID, seuils ToF)
  • ☐ Un dernier test complet (exploration + speed run) la veille du tournoi

Dans le sac pour le tournoi

  • ☐ Le robot (évidemment)
  • ☐ Câble micro-USB (pour reprogrammer sur place)
  • ☐ PC portable avec Arduino IDE + le code
  • ☐ Chargeur de batteries 18650
  • ☐ Multimètre
  • ☐ Petit tournevis cruciforme + plat
  • ☐ Serre-câbles de rechange
  • ☐ Foam tape de rechange
  • ☐ Batterie externe (pour charger le PC)
💡 Arrive tôt au tournoi pour faire un test sur le labyrinthe officiel. La surface et l'éclairage peuvent être différents de chez toi → recalibre les ToF si nécessaire. Bonne chance RoboLymix ! 🏆