start:arduino:cours:vittascience
Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| start:arduino:cours:vittascience [2025/12/14 00:16] – admin | start:arduino:cours:vittascience [2025/12/14 14:30] (Version actuelle) – [Televerser dans le robot mBot1 à partir de l'interface Vittascience] admin | ||
|---|---|---|---|
| Ligne 99: | Ligne 99: | ||
| 3- cliquer sur " | 3- cliquer sur " | ||
| - | 4- choisir le port COM du mBot1 et faire connexion ( exemple: **" | + | 4- choisir le port COM du mBot1 et faire connexion ( exemple: **" |
| et c'est tout , dans la console série de vittascience tu dois voir : | et c'est tout , dans la console série de vittascience tu dois voir : | ||
| Ligne 111: | Ligne 111: | ||
| | | ||
| ===== Exemples Vittascience Robot mBot1 ===== | ===== Exemples Vittascience Robot mBot1 ===== | ||
| + | |||
| + | [[start: | ||
| + | |||
| + | {{ : | ||
| == Image fond ecran pour virtualisation mBot1 sur Vittascience == | == Image fond ecran pour virtualisation mBot1 sur Vittascience == | ||
| Ligne 429: | Ligne 433: | ||
| </ | </ | ||
| - | === 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, | + | |
| - | tourner à droite ou à gauche selon un angle 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, passer à l’instruction 1 ; | + | |
| - | + | ||
| - | 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**, | + | |
| - | + | ||
| - | --- | + | |
| - | + | ||
| - | ## 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 | + | |
| - | + | ||
| - | | + | |
| - | ↑ | + | |
| - | │ | + | |
| - | | + | |
| - | │ 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 | + | |
| - | + | ||
| - | 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 | + | |
| - | + | ||
| - | 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 | + | [[vittascience: |
| - | * **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/start/arduino/cours/vittascience.1765667779.txt.gz · Dernière modification : de admin
