vittascience:labyrinthe
Différences
Ci-dessous, les différences entre deux révisions de la page.
| Prochaine révision | Révision précédente | ||
| vittascience:labyrinthe [2025/12/14 09:50] – créée admin | vittascience:labyrinthe [2025/12/14 10:10] (Version actuelle) – [Sortie d un Labyrinthe avec un mBot] admin | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| ======== Sortie d un Labyrinthe avec un mBot ======== | ======== Sortie d un Labyrinthe avec un mBot ======== | ||
| + | |||
| + | === Sortie d un Labyrinthe avec un mBot === | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | **Exemples ** | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | |||
| + | |||
| + | {{ : | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | |||
| + | == idées d' | ||
| + | |||
| + | <code txt algolaby001.txt> | ||
| + | Initialisation : | ||
| + | *1 Démarrage du robot MBot. | ||
| + | *2 Activation des capteurs de distance (Yeux). | ||
| + | *3 Configuration des paramètres de vitesse et de détection. | ||
| + | | ||
| + | *4 Si la distance est supérieure à 20 cm, le robot accélère. | ||
| + | *5 Si la distance est entre 20 cm et 10 cm, le robot maintient une vitesse constante. | ||
| + | *6 Si la distance est inférieure à 10 cm mais supérieure à 5 cm, le robot ralentit. | ||
| + | *7 Si la distance est inférieure à 5 cm, le robot s' | ||
| + | | ||
| + | *8 Si le robot est arrêté à cause d'un obstacle à 5 cm, il effectue une séquence d' | ||
| + | *9 Si après un virage à droite de 90°, il n'y a pas d' | ||
| + | *10 Sinon, s'il effectue un demi-tour (180°) et ne détecte pas d' | ||
| + | *11 Sinon, après un virage à gauche de 90°, le robot avance (car il aura effectué un demi-tour). | ||
| + | | ||
| + | *12 Le robot continue à avancer tout en détectant les obstacles et ajustant sa vitesse en conséquence. | ||
| + | *13 En cas d' | ||
| + | *Fin : | ||
| + | *14 Arrêt du robot lorsque la sortie du labyrinthe est détectée. | ||
| + | </ | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | <code txt algolaby00.txt> | ||
| + | il ne suffit pas de marcher en ligne droite. Il faut compter les changements de | ||
| + | direction. | ||
| + | |||
| + | Supposons que, comme dans les exemples précédents, | ||
| + | On n’a alors que deux possibilités, | ||
| + | de 90°. On compte les changements de direction en augmentant d’un point lorsque | ||
| + | l’on tourne à gauche et en diminuant d’un point lorsque l’on tourne à droite | ||
| + | (y compris la première fois que l’on tourne à droite quand on atteint un mur). | ||
| + | Au début, le décompte est à zéro. Les deux instructions sont alors les suivantes : | ||
| + | |||
| + | *1 Aller tout droit jusqu’au mur, passer à l’instruction 2 ; | ||
| + | *2 Longer le mur par la droite (ou par la gauche, mais toujours dans le même | ||
| + | sens) jusqu’à ce que le décompte des changements de direction atteigne zéro, | ||
| + | | ||
| + | |||
| + | Il faut répéter ces actions jusqu’à ce que l’on revienne à la lumière du jour. | ||
| + | |||
| + | </ | ||
| + | |||
| + | |||
| + | ======= Algorithmes de sortie d un labyrinthe ======= | ||
| + | |||
| + | |||
| + | |||
| + | < | ||
| + | |||
| + | Voici une **présentation claire des principaux algorithmes de résolution de labyrinthe pour un robot**, du plus simple au plus avancé. J’indique à chaque fois **le principe**, **les avantages** et **les limites**, avec un peu de pseudo-code quand c’est utile. | ||
| + | |||
| + | --- | ||
| + | |||
| + | ## 1. Algorithme de la **main droite** (ou main gauche) | ||
| + | |||
| + | ### Principe | ||
| + | |||
| + | Le robot garde **toujours la main droite en contact avec un mur**. | ||
| + | Tant que le labyrinthe est **simplement connexe**, il finira par trouver la sortie. | ||
| + | |||
| + | ### Avantages | ||
| + | |||
| + | * Très simple à implémenter | ||
| + | * Peu de mémoire | ||
| + | * Adapté aux robots simples (Arduino, capteurs IR) | ||
| + | |||
| + | ### Limites | ||
| + | |||
| + | * Ne fonctionne pas si le labyrinthe a des îlots (murs isolés) | ||
| + | * Pas forcément le chemin le plus court | ||
| + | |||
| + | ### Pseudo-code | ||
| + | |||
| + | ```text | ||
| + | tant que sortie non trouvée : | ||
| + | si mur à droite absent : | ||
| + | tourner à droite | ||
| + | avancer | ||
| + | sinon si devant libre : | ||
| + | avancer | ||
| + | sinon : | ||
| + | tourner à gauche | ||
| + | ``` | ||
| + | |||
| + | --- | ||
| + | |||
| + | ## 2. Algorithme de **Trémaux** (marquage des chemins) | ||
| + | |||
| + | ### Principe | ||
| + | |||
| + | Le robot **marque les passages déjà visités** : | ||
| + | |||
| + | * 1 marque → déjà visité | ||
| + | * 2 marques → cul-de-sac | ||
| + | |||
| + | Il évite de repasser inutilement au même endroit. | ||
| + | |||
| + | ### Avantages | ||
| + | |||
| + | * Fonctionne dans tous les labyrinthes | ||
| + | * Garantit de trouver la sortie | ||
| + | |||
| + | ### Limites | ||
| + | |||
| + | * Besoin de mémoire (ou marquage physique) | ||
| + | * Plus complexe que la main droite | ||
| + | |||
| + | --- | ||
| + | |||
| + | ## 3. **Parcours en profondeur (DFS – Depth First Search)** | ||
| + | |||
| + | ### Principe | ||
| + | |||
| + | Le robot explore un chemin **jusqu’au bout**, puis revient en arrière quand il est bloqué. | ||
| + | |||
| + | ### Avantages | ||
| + | |||
| + | * Simple conceptuellement | ||
| + | * Garantie de trouver la sortie | ||
| + | |||
| + | ### Limites | ||
| + | |||
| + | * Peut être très long | ||
| + | * Pas le plus court chemin | ||
| + | |||
| + | ### Pseudo-code simplifié | ||
| + | |||
| + | ```text | ||
| + | fonction DFS(case): | ||
| + | marquer case visitée | ||
| + | si case = sortie : | ||
| + | fin | ||
| + | pour chaque voisin libre : | ||
| + | si non visité : | ||
| + | DFS(voisin) | ||
| + | ``` | ||
| + | |||
| + | --- | ||
| + | |||
| + | ## 4. **Recherche en largeur (BFS – Breadth First Search)** | ||
| + | |||
| + | ### Principe | ||
| + | |||
| + | Le robot explore **niveau par niveau** toutes les possibilités. | ||
| + | |||
| + | ### Avantages | ||
| + | |||
| + | * Trouve **le plus court chemin** | ||
| + | * Très fiable | ||
| + | |||
| + | ### Limites | ||
| + | |||
| + | * Utilise beaucoup de mémoire | ||
| + | * Moins adapté aux petits robots | ||
| + | |||
| + | --- | ||
| + | |||
| + | ## 5. **Algorithme A*** (A-star) | ||
| + | |||
| + | ### Principe | ||
| + | |||
| + | Algorithme intelligent utilisant : | ||
| + | |||
| + | * le coût déjà parcouru | ||
| + | * une estimation de la distance jusqu’à la sortie | ||
| + | |||
| + | ### Avantages | ||
| + | |||
| + | * Très rapide | ||
| + | * Chemin optimal | ||
| + | * Utilisé en robotique avancée | ||
| + | |||
| + | ### Limites | ||
| + | |||
| + | * Nécessite une carte du labyrinthe | ||
| + | * Plus complexe à programmer | ||
| + | |||
| + | --- | ||
| + | |||
| + | ## 6. Comparatif rapide | ||
| + | |||
| + | | Algorithme | ||
| + | | ----------- | ----------- | -------------- | ----------- | | ||
| + | | Main droite | Très faible | ❌ | Très simple | | ||
| + | | Trémaux | ||
| + | | DFS | Moyenne | ||
| + | | BFS | Élevée | ||
| + | | A* | Élevée | ||
| + | |||
| + | --- | ||
| + | |||
| + | ## Recommandation selon ton robot | ||
| + | |||
| + | * 🤖 **Robot simple (capteurs, pas de carte)** → Main droite ou Trémaux | ||
| + | * 🤖 **Robot avec mémoire et carte** → BFS ou A* | ||
| + | * 🤖 **Projet scolaire** → DFS ou Trémaux | ||
| + | |||
| + | --- | ||
| + | |||
| + | Voici **l’ajout de la gestion des angles et des virages précis** pour un robot de labyrinthe avec **capteurs IR / ultrasons**, | ||
| + | |||
| + | --- | ||
| + | |||
| + | ## ⚙️ Principe de base | ||
| + | |||
| + | Pour tourner **proprement à 90°**, le robot ne se contente pas d’un délai (`delay`) : | ||
| + | il utilise soit : | ||
| + | |||
| + | * ⏱️ **le temps** (solution simple) | ||
| + | * 🔄 **les encodeurs de roues** (précis) | ||
| + | * 🧭 **un gyroscope (IMU)** (très précis) | ||
| + | |||
| + | Je te montre les **3 niveaux**, du plus simple au plus avancé. | ||
| + | |||
| + | --- | ||
| + | |||
| + | ## 🧩 Schéma de rotation du robot | ||
| + | |||
| + | ### Virage à 90° à droite | ||
| + | |||
| + | ``` | ||
| + | Vue de dessus | ||
| + | |||
| + | AVANT | ||
| + | ↑ | ||
| + | │ | ||
| + | | ||
| + | │ ROBOT │ → rotation | ||
| + | | ||
| + | │ | ||
| + | ↓ | ||
| + | |||
| + | Roue gauche : AVANCE | ||
| + | Roue droite : RECULE (ou arrêt) | ||
| + | ``` | ||
| + | |||
| + | --- | ||
| + | |||
| + | ## 🟢 NIVEAU 1 – Rotation par le TEMPS (simple) | ||
| + | |||
| + | ### Schéma logique | ||
| + | |||
| + | ``` | ||
| + | Tourner à droite : | ||
| + | - Moteur gauche : ON | ||
| + | - Moteur droit : OFF | ||
| + | - Temps ≈ 400 ms → 90° | ||
| + | ``` | ||
| + | |||
| + | ### Pseudo-code | ||
| + | |||
| + | ```c | ||
| + | void tournerDroite90() { | ||
| + | moteurGauche(AVANCE); | ||
| + | moteurDroit(ARRET); | ||
| + | delay(400); | ||
| + | arret(); | ||
| + | } | ||
| + | ``` | ||
| + | |||
| + | ### ✅ Avantages | ||
| + | |||
| + | * Très simple | ||
| + | * Suffisant pour projets scolaires | ||
| + | |||
| + | ### ❌ Limites | ||
| + | |||
| + | * Dépend de la batterie et du sol | ||
| + | |||
| + | --- | ||
| + | |||
| + | ## 🟡 NIVEAU 2 – Rotation avec ENCODEURS (précis) | ||
| + | |||
| + | ### Principe | ||
| + | |||
| + | Chaque roue a un encodeur → nombre de ticks = angle. | ||
| + | |||
| + | ### Schéma | ||
| + | |||
| + | ``` | ||
| + | Angle = (ticks mesurés / ticks par tour) × 360° | ||
| + | ``` | ||
| + | |||
| + | ### Pseudo-code | ||
| + | |||
| + | ```c | ||
| + | void tournerDroite90() { | ||
| + | resetEncodeurs(); | ||
| + | moteurGauche(AVANCE); | ||
| + | moteurDroit(RECULE); | ||
| + | |||
| + | while (encodeurGauche < TICKS_90) { | ||
| + | // attendre | ||
| + | } | ||
| + | arret(); | ||
| + | } | ||
| + | ``` | ||
| + | |||
| + | ### ✅ Avantages | ||
| + | |||
| + | * Bonne précision | ||
| + | * Indépendant du sol | ||
| + | |||
| + | --- | ||
| + | |||
| + | ## 🔵 NIVEAU 3 – Rotation avec GYROSCOPE (IMU) | ||
| + | |||
| + | ### Principe | ||
| + | |||
| + | Le robot mesure directement l’angle de rotation (yaw). | ||
| + | |||
| + | ### Schéma | ||
| + | |||
| + | ``` | ||
| + | Angle cible = angle actuel ± 90° | ||
| + | ``` | ||
| + | |||
| + | ### Pseudo-code | ||
| + | |||
| + | ```c | ||
| + | void tournerDroite90() { | ||
| + | float angleInitial = lireYaw(); | ||
| + | |||
| + | moteurGauche(AVANCE); | ||
| + | moteurDroit(RECULE); | ||
| + | |||
| + | while (lireYaw() < angleInitial + 90) { | ||
| + | // rotation | ||
| + | } | ||
| + | arret(); | ||
| + | } | ||
| + | ``` | ||
| + | |||
| + | ### ✅ Avantages | ||
| + | |||
| + | * Très grande précision | ||
| + | * Utilisé en robotique avancée | ||
| + | |||
| + | --- | ||
| + | |||
| + | ## 🧭 Correction de trajectoire (ligne droite) | ||
| + | |||
| + | ### Schéma | ||
| + | |||
| + | ``` | ||
| + | Mur à droite trop proche → corriger à gauche | ||
| + | Mur à droite trop loin → corriger à droite | ||
| + | ``` | ||
| + | |||
| + | ### Pseudo-code | ||
| + | |||
| + | ```c | ||
| + | erreur = distanceD - distanceConsigne; | ||
| + | |||
| + | vG = vBase - Kp * erreur; | ||
| + | vD = vBase + Kp * erreur; | ||
| + | ``` | ||
| + | |||
| + | 👉 C’est un **contrôle proportionnel (P)**. | ||
| + | |||
| + | --- | ||
| + | |||
| + | ## 🔄 Schéma global mis à jour | ||
| + | |||
| + | ``` | ||
| + | Lire capteurs | ||
| + | ↓ | ||
| + | Décision (droite / avant / gauche) | ||
| + | ↓ | ||
| + | Si virage : | ||
| + | → rotation 90° précise | ||
| + | Sinon : | ||
| + | → avance + correction mur | ||
| + | ↓ | ||
| + | Répéter | ||
| + | ``` | ||
| + | |||
| + | --- | ||
| + | |||
| + | ## 🧪 Conseils pratiques | ||
| + | |||
| + | * Calibrer les **90°** une seule fois | ||
| + | * Utiliser **encodeurs OU gyroscope** si possible | ||
| + | * Toujours arrêter les moteurs après rotation | ||
| + | * Ajouter un petit délai de stabilisation (50 ms) | ||
| + | |||
| + | --- | ||
| + | |||
| + | ## 🎯 Résumé | ||
| + | |||
| + | | Méthode | ||
| + | | --------- | --------- | ---------- | | ||
| + | | Temps | ⭐⭐ | ||
| + | | Encodeurs | ⭐⭐⭐⭐ | ||
| + | | Gyroscope | ⭐⭐⭐⭐⭐ | ||
| + | |||
| + | --- | ||
| + | |||
| + | Voici un **code Arduino COMPLET** pour un **robot résolveur de labyrinthe** utilisant : | ||
| + | |||
| + | * 🧠 **Algorithme : main droite** | ||
| + | * 📏 **Capteurs : ultrasons (HC-SR04) ou IR** | ||
| + | * ⚙️ **Virages précis à 90° par encodeurs** | ||
| + | *(je t’indique aussi où adapter si tu n’as PAS d’encodeurs)* | ||
| + | |||
| + | --- | ||
| + | |||
| + | # 🧩 Matériel supposé | ||
| + | |||
| + | * Arduino UNO | ||
| + | * 2 moteurs DC + **pont en H L298N** | ||
| + | * 2 capteurs ultrasons (avant + droit) | ||
| + | * 2 encodeurs de roues | ||
| + | * Robot à **2 roues motrices** | ||
| + | |||
| + | --- | ||
| + | |||
| + | # 🔌 Connexions (exemple) | ||
| + | |||
| + | ### Moteurs (L298N) | ||
| + | |||
| + | ```text | ||
| + | ENA → pin 5 (PWM) | ||
| + | IN1 → pin 6 | ||
| + | IN2 → pin 7 | ||
| + | ENB → pin 9 (PWM) | ||
| + | IN3 → pin 10 | ||
| + | IN4 → pin 11 | ||
| + | ``` | ||
| + | |||
| + | ### Capteurs ultrasons | ||
| + | |||
| + | ```text | ||
| + | Avant : TRIG → 2 ECHO → 3 | ||
| + | Droit : TRIG → 4 ECHO → 8 | ||
| + | ``` | ||
| + | |||
| + | ### Encodeurs | ||
| + | |||
| + | ```text | ||
| + | Encodeur gauche → pin 18 (INT) | ||
| + | Encodeur droit → pin 19 (INT) | ||
| + | ``` | ||
| + | |||
| + | --- | ||
| + | |||
| + | # ⚙️ Constantes importantes | ||
| + | |||
| + | ```cpp | ||
| + | #define DIST_MUR 15 // cm | ||
| + | #define VITESSE 150 | ||
| + | #define TICKS_90 120 // À CALIBRER | ||
| + | ``` | ||
| + | |||
| + | --- | ||
| + | |||
| + | # 🧠 CODE ARDUINO COMPLET | ||
| + | |||
| + | ```cpp | ||
| + | // ===== MOTEURS ===== | ||
| + | #define ENA 5 | ||
| + | #define IN1 6 | ||
| + | #define IN2 7 | ||
| + | #define ENB 9 | ||
| + | #define IN3 10 | ||
| + | #define IN4 11 | ||
| + | |||
| + | // ===== ULTRASONS ===== | ||
| + | #define TRIG_AV 2 | ||
| + | #define ECHO_AV 3 | ||
| + | #define TRIG_D | ||
| + | #define ECHO_D | ||
| + | |||
| + | // ===== ENCODEURS ===== | ||
| + | volatile long ticksG = 0; | ||
| + | volatile long ticksD = 0; | ||
| + | |||
| + | #define DIST_MUR 15 | ||
| + | #define VITESSE 150 | ||
| + | #define TICKS_90 120 | ||
| + | |||
| + | // ===== FONCTIONS ENCODEURS ===== | ||
| + | void isrG() { ticksG++; } | ||
| + | void isrD() { ticksD++; } | ||
| + | |||
| + | // ===== SETUP ===== | ||
| + | void setup() { | ||
| + | pinMode(ENA, | ||
| + | pinMode(IN1, | ||
| + | pinMode(IN2, | ||
| + | pinMode(ENB, | ||
| + | pinMode(IN3, | ||
| + | pinMode(IN4, | ||
| + | |||
| + | pinMode(TRIG_AV, | ||
| + | pinMode(ECHO_AV, | ||
| + | pinMode(TRIG_D, | ||
| + | pinMode(ECHO_D, | ||
| + | |||
| + | attachInterrupt(digitalPinToInterrupt(18), | ||
| + | attachInterrupt(digitalPinToInterrupt(19), | ||
| + | } | ||
| + | |||
| + | // ===== ULTRASON ===== | ||
| + | long distanceCM(int trig, int echo) { | ||
| + | digitalWrite(trig, | ||
| + | delayMicroseconds(2); | ||
| + | digitalWrite(trig, | ||
| + | delayMicroseconds(10); | ||
| + | digitalWrite(trig, | ||
| + | |||
| + | long duree = pulseIn(echo, | ||
| + | return duree * 0.034 / 2; | ||
| + | } | ||
| + | |||
| + | // ===== MOTEURS ===== | ||
| + | void avance(int v) { | ||
| + | digitalWrite(IN1, | ||
| + | digitalWrite(IN2, | ||
| + | digitalWrite(IN3, | ||
| + | digitalWrite(IN4, | ||
| + | analogWrite(ENA, | ||
| + | analogWrite(ENB, | ||
| + | } | ||
| + | |||
| + | void recule(int v) { | ||
| + | digitalWrite(IN1, | ||
| + | digitalWrite(IN2, | ||
| + | digitalWrite(IN3, | ||
| + | digitalWrite(IN4, | ||
| + | analogWrite(ENA, | ||
| + | analogWrite(ENB, | ||
| + | } | ||
| + | |||
| + | void stopMot() { | ||
| + | analogWrite(ENA, | ||
| + | analogWrite(ENB, | ||
| + | } | ||
| + | |||
| + | // ===== ROTATION PRECISE ===== | ||
| + | void tournerDroite90() { | ||
| + | ticksG = 0; | ||
| + | ticksD = 0; | ||
| + | |||
| + | digitalWrite(IN1, | ||
| + | digitalWrite(IN2, | ||
| + | digitalWrite(IN3, | ||
| + | digitalWrite(IN4, | ||
| + | |||
| + | analogWrite(ENA, | ||
| + | analogWrite(ENB, | ||
| + | |||
| + | while (ticksG < TICKS_90) {} | ||
| + | |||
| + | stopMot(); | ||
| + | delay(50); | ||
| + | } | ||
| + | |||
| + | void tournerGauche90() { | ||
| + | ticksG = 0; | ||
| + | ticksD = 0; | ||
| + | |||
| + | digitalWrite(IN1, | ||
| + | digitalWrite(IN2, | ||
| + | digitalWrite(IN3, | ||
| + | digitalWrite(IN4, | ||
| + | |||
| + | analogWrite(ENA, | ||
| + | analogWrite(ENB, | ||
| + | |||
| + | while (ticksD < TICKS_90) {} | ||
| + | |||
| + | stopMot(); | ||
| + | delay(50); | ||
| + | } | ||
| + | |||
| + | // ===== BOUCLE PRINCIPALE ===== | ||
| + | void loop() { | ||
| + | long dAvant = distanceCM(TRIG_AV, | ||
| + | long dDroit = distanceCM(TRIG_D, | ||
| + | |||
| + | if (dDroit > DIST_MUR) { | ||
| + | tournerDroite90(); | ||
| + | avance(VITESSE); | ||
| + | } | ||
| + | else if (dAvant > DIST_MUR) { | ||
| + | avance(VITESSE); | ||
| + | } | ||
| + | else { | ||
| + | tournerGauche90(); | ||
| + | } | ||
| + | |||
| + | delay(20); | ||
| + | } | ||
| + | ``` | ||
| + | |||
| + | --- | ||
| + | |||
| + | # 🔧 SI TU N’AS PAS D’ENCODEURS | ||
| + | |||
| + | Remplace les fonctions `tournerDroite90()` et `tournerGauche90()` par : | ||
| + | |||
| + | ```cpp | ||
| + | delay(400); // à calibrer | ||
| + | ``` | ||
| + | |||
| + | --- | ||
| + | |||
| + | # 🧪 Calibration indispensable | ||
| + | |||
| + | 1. Tester un virage à 90° | ||
| + | 2. Ajuster `TICKS_90` | ||
| + | 3. Ajuster `DIST_MUR` (12–20 cm) | ||
| + | 4. Ajuster `VITESSE` | ||
| + | |||
| + | --- | ||
| + | |||
| + | ## 🎓 Résultat | ||
| + | |||
| + | ✅ Le robot : | ||
| + | |||
| + | * suit le mur droit | ||
| + | * prend des virages précis | ||
| + | * sort du labyrinthe automatiquement | ||
| + | |||
| + | --- | ||
| + | |||
| + | Parfait 👍 | ||
| + | Voici un **schéma électrique détaillé (texte + explications claires)** pour ton **robot résolveur de labyrinthe Arduino** avec : | ||
| + | |||
| + | * Arduino UNO | ||
| + | * Pont en H **L298N** | ||
| + | * 2 moteurs DC | ||
| + | * 2 capteurs ultrasons **HC-SR04** | ||
| + | * 2 encodeurs de roues | ||
| + | * Alimentation batterie | ||
| + | |||
| + | --- | ||
| + | |||
| + | # 🔋 1. Alimentation (TRÈS IMPORTANT) | ||
| + | |||
| + | ``` | ||
| + | Batterie 7–12V | ||
| + | + -----------+ | ||
| + | | | | ||
| + | | +--+--> L298N +12V | ||
| + | | | | ||
| + | | +--------> | ||
| + | | | ||
| + | +------------------> | ||
| + | ``` | ||
| + | |||
| + | ⚠️ **Toutes les masses (GND) DOIVENT être communes** | ||
| + | |||
| + | --- | ||
| + | |||
| + | # ⚙️ 2. Pont en H L298N (moteurs) | ||
| + | |||
| + | ### Schéma logique | ||
| + | |||
| + | ``` | ||
| + | L298N | ||
| + | | ||
| + | | ||
| + | ENA──┤5 | ||
| + | IN1──┤6 | ||
| + | IN2──┤7 | ||
| + | │ | ||
| + | ENB──┤9 | ||
| + | IN3──┤10 | ||
| + | IN4──┤11 | ||
| + | │ | ||
| + | GND──┤GND | ||
| + | +12V─┤+12V | ||
| + | | ||
| + | ``` | ||
| + | |||
| + | ### Connexions Arduino → L298N | ||
| + | |||
| + | | Arduino | L298N | | ||
| + | | ------- | ----- | | ||
| + | | 5 (PWM) | ENA | | ||
| + | | 6 | IN1 | | ||
| + | | 7 | IN2 | | ||
| + | | 9 (PWM) | ENB | | ||
| + | | 10 | IN3 | | ||
| + | | 11 | IN4 | | ||
| + | | GND | GND | | ||
| + | |||
| + | --- | ||
| + | |||
| + | # 📏 3. Capteurs ultrasons HC-SR04 | ||
| + | |||
| + | ### Schéma capteur | ||
| + | |||
| + | ``` | ||
| + | HC-SR04 | ||
| + | ┌──────────┐ | ||
| + | │ VCC → 5V│ | ||
| + | │ TRIG → Dx│ | ||
| + | │ ECHO → Dx│ | ||
| + | │ GND → GND│ | ||
| + | └──────────┘ | ||
| + | ``` | ||
| + | |||
| + | ### Connexions | ||
| + | |||
| + | #### Capteur AVANT | ||
| + | |||
| + | | HC-SR04 | Arduino | | ||
| + | | ------- | ------- | | ||
| + | | VCC | 5V | | ||
| + | | TRIG | D2 | | ||
| + | | ECHO | D3 | | ||
| + | | GND | GND | | ||
| + | |||
| + | #### Capteur DROIT | ||
| + | |||
| + | | HC-SR04 | Arduino | | ||
| + | | ------- | ------- | | ||
| + | | VCC | 5V | | ||
| + | | TRIG | D4 | | ||
| + | | ECHO | D8 | | ||
| + | | GND | GND | | ||
| + | |||
| + | --- | ||
| + | |||
| + | # 🔄 4. Encodeurs de roues | ||
| + | |||
| + | ### Schéma simplifié | ||
| + | |||
| + | ``` | ||
| + | Encodeur | ||
| + | ┌──────────┐ | ||
| + | │ VCC → 5V │ | ||
| + | │ GND → GND│ | ||
| + | │ OUT → INT│ | ||
| + | └──────────┘ | ||
| + | ``` | ||
| + | |||
| + | ### Connexions | ||
| + | |||
| + | | Encodeur | ||
| + | | ---------- | ----------- | | ||
| + | | Gauche OUT | D18 (INT) | | ||
| + | | Droit OUT | D19 (INT) | | ||
| + | | VCC | 5V | | ||
| + | | GND | GND | | ||
| + | |||
| + | ⚠️ D18 et D19 = **Arduino MEGA** | ||
| + | 👉 Si tu as **UNO**, utilise D2 et D3 (changer le code). | ||
| + | |||
| + | --- | ||
| + | |||
| + | # 🧠 5. Schéma global (vue d’ensemble) | ||
| + | |||
| + | ``` | ||
| + | +--------------------+ | ||
| + | | | ||
| + | | | | ||
| + | | D2 <--- TRIG AV | | ||
| + | | D3 <--- ECHO AV | | ||
| + | | D4 <--- TRIG D | | ||
| + | | D8 <--- ECHO D | | ||
| + | | | | ||
| + | | D5 ---> ENA L298N | | ||
| + | | D6 ---> IN1 | | ||
| + | | D7 ---> IN2 | | ||
| + | | D9 ---> ENB | | ||
| + | | D10 ---> IN3 | | ||
| + | | D11 ---> IN4 | | ||
| + | | | | ||
| + | | 5V ---> Capteurs | ||
| + | | GND ---> GND COMMUN| | ||
| + | +--------------------+ | ||
| + | | | ||
| + | | | ||
| + | +----+----+ | ||
| + | | L298N | | ||
| + | +----+----+ | ||
| + | | | ||
| + | | ||
| + | ``` | ||
| + | |||
| + | --- | ||
| + | |||
| + | # ⚠️ Points critiques à respecter | ||
| + | |||
| + | ✔ Masse commune partout | ||
| + | ✔ Ne pas alimenter moteurs depuis le 5V Arduino | ||
| + | ✔ Mettre le jumper **ENA/ENB** (ou PWM Arduino) | ||
| + | ✔ Batterie assez puissante (≥ 1500 mAh) | ||
| + | |||
| + | --- | ||
| + | |||
| + | # 🎓 Pour un rendu PRO (optionnel) | ||
| + | |||
| + | * Interrupteur général sur la batterie | ||
| + | * Condensateurs 100 nF sur moteurs | ||
| + | * Régulateur 5V externe (LM2596) | ||
| + | |||
| + | --- | ||
| + | |||
| + | ## ✅ Résumé | ||
| + | |||
| + | Ce schéma permet : | ||
| + | |||
| + | * contrôle précis des moteurs | ||
| + | * lecture fiable des capteurs | ||
| + | * virages à 90° propres | ||
| + | * robot stable et robuste | ||
| + | |||
| + | --- | ||
| + | |||
| + | la **version texte simulée des blocs mBlock** | ||
| + | |||
| + | --- | ||
| + | |||
| + | ## 🟦 Programme principal – Capture simulée | ||
| + | |||
| + | ``` | ||
| + | +-----------------------------------------------------+ | ||
| + | | [quand Arduino démarre] | ||
| + | | | ||
| + | | | [répéter indéfiniment] | ||
| + | | | ||
| + | | | ||
| + | | | ||
| + | | | ||
| + | | | ||
| + | | | ||
| + | | | ||
| + | | | ||
| + | | | ||
| + | | | ||
| + | | | ||
| + | | | ||
| + | | | ||
| + | | | ||
| + | | | ||
| + | | | ||
| + | | | ||
| + | | | ||
| + | +-----------------------------------------------------+ | ||
| + | ``` | ||
| + | |||
| + | --- | ||
| + | |||
| + | ### ✅ Correspondance logique | ||
| + | |||
| + | 1. Priorité à **la droite** | ||
| + | 2. Sinon, **tout droit** | ||
| + | 3. Sinon, **tourner à gauche** | ||
| + | 4. Boucle infinie, avec un petit délai pour stabilité | ||
| + | |||
| + | --- | ||
| + | |||
| + | |||
| + | Pour ton robot suiveur de mur et résolveur de labyrinthe, la **variable `SEUIL`** représente la **distance minimale (en cm) à laquelle le robot considère qu’il y a un mur**. Elle dépend de : | ||
| + | |||
| + | * La portée de tes capteurs (IR ou ultrasons HC-SR04) | ||
| + | * La largeur du robot | ||
| + | * La vitesse et précision du robot | ||
| + | |||
| + | --- | ||
| + | |||
| + | ## 🔹 Valeurs typiques | ||
| + | |||
| + | | Capteur | ||
| + | | ------------------- | --------------------- | ----------------------------------------------------------- | | ||
| + | | HC-SR04 (ultrasons) | 12 – 20 | 15 cm est un bon point de départ | ||
| + | | Capteurs IR | 5 – 12 | IR détecte de plus près, car moins précis à longue distance | | ||
| + | |||
| + | --- | ||
| + | |||
| + | ## 🔹 Comment choisir la valeur exacte | ||
| + | |||
| + | 1. Commence par **15 cm** si tu utilises des ultrasons. | ||
| + | 2. Teste le robot dans ton labyrinthe : | ||
| + | |||
| + | * Si le robot percute les murs → augmenter le SEUIL | ||
| + | * Si le robot s’éloigne trop du mur → diminuer le SEUIL | ||
| + | 3. Ajuste petit à petit par **pas de 1 ou 2 cm** jusqu’à obtenir un suivi stable du mur. | ||
| + | |||
| + | --- | ||
| + | |||
| + | ### 🔹 Exemple pour mBlock | ||
| + | |||
| + | ```text | ||
| + | SEUIL = 15 | ||
| + | ``` | ||
| + | |||
| + | * `distance_avant > SEUIL` → voie libre devant | ||
| + | * `distance_droite > SEUIL` → mur droit libre | ||
| + | |||
| + | --- | ||
| + | |||
| + | Voici un **mini guide visuel explicatif** pour comprendre comment le robot utilise la variable **`SEUIL`** pour suivre les murs et décider de ses mouvements dans le labyrinthe. | ||
| + | |||
| + | --- | ||
| + | |||
| + | ## 🔹 Schéma explicatif : SEUIL et décisions | ||
| + | |||
| + | ``` | ||
| + | Mur avant | ||
| + | | | ||
| + | | | ||
| + | +------+------+ | ||
| + | | | | ||
| + | | | ||
| + | | | | ||
| + | +------+------+ | ||
| + | | | ||
| + | distance_avant | ||
| + | | | ||
| + | SEUIL ? | ||
| + | ``` | ||
| + | |||
| + | ### 1️⃣ Lecture des distances | ||
| + | |||
| + | * `distance_avant` → mesure devant le robot | ||
| + | * `distance_droite` → mesure sur le côté droit | ||
| + | |||
| + | --- | ||
| + | |||
| + | ### 2️⃣ Comparaison avec SEUIL | ||
| + | |||
| + | | Capteur | Lecture < SEUIL | Lecture > SEUIL | Action du robot | | ||
| + | | ------- | --------------- | --------------- | ------------------------- | | ||
| + | | Droite | ||
| + | | Avant | Mur proche | ||
| + | |||
| + | --- | ||
| + | |||
| + | ### 3️⃣ Exemple de décision | ||
| + | |||
| + | ``` | ||
| + | Si distance_droite > SEUIL → tourner à droite puis avancer | ||
| + | Sinon si distance_avant > SEUIL → avancer | ||
| + | Sinon → tourner à gauche | ||
| + | ``` | ||
| + | |||
| + | --- | ||
| + | |||
| + | ### 4️⃣ Visualisation de l’espace autour du robot | ||
| + | |||
| + | ``` | ||
| + | Avant (distance_avant) | ||
| + | 15 cm SEUIL | ||
| + | ┌─────────────┐ | ||
| + | | ||
| + | │ | ||
| + | │ │ | ||
| + | └─────────────┘ | ||
| + | | ||
| + | 15 cm SEUIL | ||
| + | ``` | ||
| + | |||
| + | * Si **droite > SEUIL** → espace libre → priorité à droite | ||
| + | * Si **avant > SEUIL** → espace libre devant → avancer | ||
| + | * Sinon → mur devant et droite bloquée → tourner à gauche | ||
| + | |||
| + | --- | ||
| + | |||
| + | ### ✅ Résumé | ||
| + | |||
| + | * **SEUIL = distance critique** pour détecter un mur | ||
| + | * **Plus le robot est rapide**, plus SEUIL doit être grand | ||
| + | * Ce système simple permet au robot de **sortir automatiquement du labyrinthe** avec l’algorithme “main droite” | ||
| + | |||
| + | --- | ||
| + | |||
| + | </ | ||
/home/chanteri/www/fablab37110/data/attic/vittascience/labyrinthe.1765702259.txt.gz · Dernière modification : de admin
