Insérez le premier support moteur dans les encoches prévues sur le côté droit du châssis. Vérifiez qu’il est bien perpendiculaire à la base.
Un robot pédagogique complet
EDU BOT 1.0 est conçu pour apprendre la mécanique, l’électronique et la programmation à travers un projet concret et évolutif.
Ce que le robot sait faire
- Suivre une ligne noire sur un sol clair.
- Détecter un obstacle et choisir une direction libre.
- Contrôler deux moteurs DC avec le driver L298N.
- Orienter le capteur ultrason avec un servomoteur.
- Afficher son état sur un écran LCD 16×2 I2C.
Informations produit
| Produit | EDU BOT 1.0 — EB-01 |
|---|---|
| Conception | ESS Technologies |
| Usage | Pédagogique, formation, initiation à la robotique |
| Niveau | Débutant à intermédiaire |
| Âge recommandé | 12 ans et plus |
Composants du kit EDU BOT
Vérifiez le contenu du kit avant de commencer. Les couleurs ou la forme de certaines petites pièces peuvent varier selon la série.
| Désignation | Quantité |
|---|---|
| Carte Arduino UNO R3 + câble | 1 |
| LED 5 mm rouge | 10 |
| LED 5 mm verte | 10 |
| LED 5 mm jaune | 10 |
| Résistance 220 Ω | 10 |
| Résistance 1 kΩ | 5 |
| Résistance 10 kΩ | 5 |
| Bouton poussoir 4 broches | 5 |
| Potentiomètre B10K | 1 |
| Photorésistance LDR | 1 |
| Buzzer actif 5V | 1 |
| Lot 10 fils Dupont M-M 20 cm | 1 |
| Lot 10 fils Dupont M-F 20 cm | 1 |
| Lot 10 fils Dupont F-F 20 cm | 1 |
| Connecteur Jack DC mâle 5.5×2.1 | 1 |
| Connecteur Jack DC femelle 5.5×2.1 | 1 |
| Moteur DC TT | 2 |
| Roue 65 mm | 2 |
| Servomoteur SG90 (180°) | 1 |
| Driver L298N | 1 |
| Capteur ultrason HC-SR04 | 1 |
| Capteur de ligne TCRT5000 | 2 |
| Écran LCD 16×2 + I2C | 1 |
| Châssis principal EB-1 | 1 |
| Support ultrason mini | 1 |
| Visserie / entretoises diverses | 1 lot |
| Porte-batteries 18650 | 1 |
| Batterie Li-ion 18650 | 2 |
| Breadboard 400 points | 1 |
Montage mécanique en 45 étapes
Les étapes sont regroupées par phase. Ouvrez uniquement la phase sur laquelle vous travaillez pour garder la page claire.
Phase 1 Structure et supports moteurs 6 étapes
Répétez l’opération avec le deuxième support moteur du côté gauche. Les deux supports doivent être parfaitement alignés face à face.
Prenez la platine de fixation rectangulaire et placez-la horizontalement entre les deux supports moteurs, à l’avant du robot.
Emboîtez la platine de fixation dans les fentes horizontales des supports moteurs afin de rigidifier l’ensemble.
Insérez les deux vis par le haut, à travers la platine de fixation et le châssis.
Retournez délicatement le robot, placez les écrous sous le châssis puis serrez fermement.
Phase 2 Moteurs et pont H 12 étapes
Approchez le premier moteur TT du support latéral déjà monté.
Alignez les deux trous de montage du moteur avec les perçages du support moteur vertical.
Vérifiez que le moteur est bien plaqué contre la paroi. Les têtes de vis doivent être du côté du corps jaune du moteur.
Placez les deux écrous sur les vis dépassant à l’intérieur de la structure.
Serrez les écrous afin de fixer solidement le moteur.
Installez le second moteur de la même manière puis vérifiez que les deux roues tournent librement.
Positionnez le support du pont H au-dessus des supports moteurs, à l’emplacement prévu.
Préparez le module de contrôle L298N pour sa fixation sur le support vertical.
Placez le module L298N contre son support puis insérez la première vis de fixation par l’avant.
Insérez les trois autres vis afin que le module soit parfaitement stable.
Retournez l’ensemble et fixez les petits écrous à l’arrière du support.
Emboîtez le support complet, avec le L298N fixé, dans les encoches prévues sur la structure du robot.
Phase 3 Roue folle et Arduino 8 étapes
Retournez le châssis pour accéder à sa face inférieure et placez la roue folle sur la partie avant.
Insérez une première vis à travers la platine métallique de la roue et le châssis en plexiglas.
Insérez la seconde vis pour stabiliser la roue folle.
Serrez les écrous par le dessus du châssis. Le robot possède maintenant ses trois points d’appui.
Posez le robot sur une surface plane et vérifiez qu’il repose correctement sur ses trois roues.
Placez la carte Arduino Uno sur le châssis, à l’arrière du pont H, avec les ports USB et d’alimentation orientés vers la gauche.
Insérez les vis de fixation dans les trous prévus sur la carte Arduino.
Retournez délicatement le châssis puis placez et serrez les écrous sur les vis de l’Arduino.
Phase 4 Servomoteur et capteur ultrason 7 étapes
Placez le servomoteur SG90 dans l’ouverture rectangulaire située à l’avant du châssis.
Insérez les vis de fixation dans les oreilles du servomoteur afin de le solidariser avec le châssis.
Fixez le servomoteur avec ses deux vis latérales sans bloquer son axe.
Insérez le capteur HC-SR04 dans son support en plexiglas en alignant les deux transducteurs avec les ouvertures.
Insérez les petites vis à travers le circuit du capteur et son support.
Placez puis serrez les petits écrous à l’arrière afin de maintenir le capteur.
Emboîtez le support du capteur ultrason sur le palonnier du servomoteur, à l’avant du robot.
Phase 5 Alimentation et écran LCD 7 étapes
Placez le porte-batteries sur le châssis et alignez ses trous avec les perçages prévus.
Insérez les vis de fixation depuis l’intérieur du porte-batteries.
Serrez les vis dans les écrous afin d’immobiliser correctement le porte-batteries.
Présentez l’écran LCD face à son support en plexiglas dédié.
Alignez les quatre trous de l’écran avec ceux du support puis insérez les vis par l’avant.
Placez les écrous à l’arrière du circuit de l’écran et serrez-les sans forcer.
Emboîtez le support LCD dans les encoches prévues en haut de la structure centrale, au-dessus du pont H.
Phase 6 Capteurs de ligne 2 étapes
Fixez les vis servant au réglage de hauteur des supports des capteurs infrarouges sous le châssis.
Utilisez les écrous pour maintenir chaque carte TCRT5000 entre ses deux points de fixation.
Phase 7 Supports de LED et vérification finale 3 étapes
Insérez les petites équerres en plexiglas en forme de T dans les fentes latérales arrière du châssis.
Insérez les supports de LED ou les LED dans les perçages arrière prévus à cet effet.
Insérez les LED destinées à l’avant dans les emplacements proches du servomoteur. Les couleurs peuvent varier selon la version du kit.
Câblage commun aux deux programmes
Le même câblage est utilisé pour les deux modes. Seul le programme téléversé dans l’Arduino change.
Table d’affectation des broches
| Élément | Broche Arduino | Remarque |
|---|---|---|
| L298N — ENA | D5 | PWM, vitesse moteur gauche |
| L298N — IN1 | D7 | Sens moteur gauche |
| L298N — IN2 | D8 | Sens moteur gauche |
| L298N — ENB | D6 | PWM, vitesse moteur droit |
| L298N — IN3 | D9 | Sens moteur droit |
| L298N — IN4 | D10 | Sens moteur droit |
| TCRT5000 gauche — DO | A0 | Entrée numérique |
| TCRT5000 droit — DO | A1 | Entrée numérique |
| SG90 — signal | D3 | Commande du servomoteur |
| HC-SR04 — TRIG | D12 | Impulsion ultrason |
| HC-SR04 — ECHO | D11 | Lecture de l’écho |
| LCD I2C — SDA | A4 | Bus I2C |
| LCD I2C — SCL | A5 | Bus I2C |
Driver L298N
| ENA | D5 |
| IN1 | D7 |
| IN2 | D8 |
| ENB | D6 |
| IN3 | D9 |
| IN4 | D10 |
| OUT1 / OUT2 | Moteur gauche |
| OUT3 / OUT4 | Moteur droit |
Capteurs TCRT5000
| VCC gauche | 5V |
| GND gauche | GND |
| DO gauche | A0 |
| VCC droit | 5V |
| GND droit | GND |
| DO droit | A1 |
HC-SR04 et SG90
| HC-SR04 VCC | 5V |
| HC-SR04 GND | GND |
| TRIG | D12 |
| ECHO | D11 |
| SG90 rouge | 5V |
| SG90 marron/noir | GND |
| SG90 orange/jaune | D3 |
Écran LCD 16×2 I2C
| VCC | 5V |
| GND | GND |
| SDA | A4 |
| SCL | A5 |
Alimentation et mise sous tension
Commencez par une alimentation séparée pour simplifier les tests et éviter les redémarrages de l’Arduino.
Configuration recommandée pour les premiers essais
- Reliez le GND de l’Arduino au GND du L298N.
- Reliez le positif du porte-batteries à l’entrée VIN/12V du L298N.
- Reliez le négatif du porte-batteries au GND du L298N.
- Ne branchez jamais directement les batteries sur la broche 5V de l’Arduino.
- Utilisez un chargeur adapté aux cellules Li-ion 18650.
Deux programmes prêts à utiliser
Installez la bibliothèque LiquidCrystal_I2C dans Arduino IDE. La bibliothèque Servo est incluse par défaut.
Mode suiveur de ligne
La ligne noire passe entre les deux capteurs lorsque le robot est centré.
- Aucun capteur sur la ligne : avance.
- Capteur gauche : corrige à gauche.
- Capteur droit : corrige à droite.
- Deux capteurs : arrêt.
Mode éviteur d’obstacles
Le HC-SR04 surveille la distance devant le robot.
- Obstacle à moins de 25 cm : arrêt.
- Le robot recule brièvement.
- Le servo regarde à gauche puis à droite.
- Le robot choisit le côté le plus dégagé.
/*
EDU BOT 1.0 - ESS Technologies
Mode : Suiveur de ligne
Matériel : Arduino UNO, L298N, 2 moteurs TT,
2 capteurs TCRT5000 et LCD 16x2 I2C.
*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
// L298N
const byte PIN_ENA = 5;
const byte PIN_IN1 = 7;
const byte PIN_IN2 = 8;
const byte PIN_ENB = 6;
const byte PIN_IN3 = 9;
const byte PIN_IN4 = 10;
// Capteurs de ligne
const byte PIN_CAPTEUR_GAUCHE = A0;
const byte PIN_CAPTEUR_DROIT = A1;
// LOW sur la majorité des modules. Remplacer par HIGH si nécessaire.
const byte ETAT_LIGNE_DETECTEE = LOW;
// Réglages de vitesse : 0 à 255
const int VITESSE_AVANT = 150;
const int VITESSE_RAPIDE = 180;
const int VITESSE_LENTE = 65;
unsigned long dernierAffichage = 0;
void commanderMoteur(byte pinEnable, byte pin1, byte pin2, int vitesse) {
vitesse = constrain(vitesse, -255, 255);
if (vitesse > 0) {
digitalWrite(pin1, HIGH);
digitalWrite(pin2, LOW);
analogWrite(pinEnable, vitesse);
} else if (vitesse < 0) {
digitalWrite(pin1, LOW);
digitalWrite(pin2, HIGH);
analogWrite(pinEnable, -vitesse);
} else {
digitalWrite(pin1, LOW);
digitalWrite(pin2, LOW);
analogWrite(pinEnable, 0);
}
}
void commanderRobot(int vitesseGauche, int vitesseDroite) {
commanderMoteur(PIN_ENA, PIN_IN1, PIN_IN2, vitesseGauche);
commanderMoteur(PIN_ENB, PIN_IN3, PIN_IN4, vitesseDroite);
}
void avancer() { commanderRobot(VITESSE_AVANT, VITESSE_AVANT); }
void corrigerAGauche() { commanderRobot(VITESSE_LENTE, VITESSE_RAPIDE); }
void corrigerADroite() { commanderRobot(VITESSE_RAPIDE, VITESSE_LENTE); }
void arreterRobot() { commanderRobot(0, 0); }
void afficherEtat(const char* action, bool gauche, bool droite) {
if (millis() - dernierAffichage < 120) return;
dernierAffichage = millis();
lcd.setCursor(0, 0);
lcd.print("MODE: LIGNE ");
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print(action);
lcd.print(" G");
lcd.print(gauche ? 1 : 0);
lcd.print(" D");
lcd.print(droite ? 1 : 0);
}
void setup() {
pinMode(PIN_ENA, OUTPUT);
pinMode(PIN_IN1, OUTPUT);
pinMode(PIN_IN2, OUTPUT);
pinMode(PIN_ENB, OUTPUT);
pinMode(PIN_IN3, OUTPUT);
pinMode(PIN_IN4, OUTPUT);
pinMode(PIN_CAPTEUR_GAUCHE, INPUT);
pinMode(PIN_CAPTEUR_DROIT, INPUT);
arreterRobot();
Serial.begin(9600);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("EDU BOT 1.0");
lcd.setCursor(0, 1);
lcd.print("Suiveur ligne");
delay(2000);
lcd.clear();
}
void loop() {
const bool ligneGauche =
digitalRead(PIN_CAPTEUR_GAUCHE) == ETAT_LIGNE_DETECTEE;
const bool ligneDroite =
digitalRead(PIN_CAPTEUR_DROIT) == ETAT_LIGNE_DETECTEE;
Serial.print("Gauche: ");
Serial.print(ligneGauche);
Serial.print(" | Droite: ");
Serial.println(ligneDroite);
/*
Configuration : la ligne passe entre les deux capteurs
lorsque le robot est correctement centré.
*/
if (!ligneGauche && !ligneDroite) {
avancer();
afficherEtat("AVANCE", ligneGauche, ligneDroite);
} else if (ligneGauche && !ligneDroite) {
corrigerAGauche();
afficherEtat("GAUCHE", ligneGauche, ligneDroite);
} else if (!ligneGauche && ligneDroite) {
corrigerADroite();
afficherEtat("DROITE", ligneGauche, ligneDroite);
} else {
arreterRobot();
afficherEtat("ARRET", ligneGauche, ligneDroite);
}
delay(10);
}
LOW par HIGH dans ETAT_LIGNE_DETECTEE./*
EDU BOT 1.0 - ESS Technologies
Mode : Éviteur d'obstacles
Matériel : Arduino UNO, L298N, 2 moteurs TT,
HC-SR04, SG90 et LCD 16x2 I2C.
*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
Servo servoUltrason;
// L298N
const byte PIN_ENA = 5;
const byte PIN_IN1 = 7;
const byte PIN_IN2 = 8;
const byte PIN_ENB = 6;
const byte PIN_IN3 = 9;
const byte PIN_IN4 = 10;
// HC-SR04
const byte PIN_TRIG = 12;
const byte PIN_ECHO = 11;
// SG90
const byte PIN_SERVO = 3;
const int ANGLE_CENTRE = 90;
const int ANGLE_GAUCHE = 150;
const int ANGLE_DROITE = 30;
// Réglages
const int VITESSE_AVANT = 145;
const int VITESSE_RECUL = 130;
const int VITESSE_ROTATION = 150;
const int DISTANCE_OBSTACLE_CM = 25;
const unsigned long DUREE_RECUL_MS = 300;
const unsigned long DUREE_ROTATION_MS = 500;
unsigned long dernierAffichage = 0;
void commanderMoteur(byte pinEnable, byte pin1, byte pin2, int vitesse) {
vitesse = constrain(vitesse, -255, 255);
if (vitesse > 0) {
digitalWrite(pin1, HIGH);
digitalWrite(pin2, LOW);
analogWrite(pinEnable, vitesse);
} else if (vitesse < 0) {
digitalWrite(pin1, LOW);
digitalWrite(pin2, HIGH);
analogWrite(pinEnable, -vitesse);
} else {
digitalWrite(pin1, LOW);
digitalWrite(pin2, LOW);
analogWrite(pinEnable, 0);
}
}
void commanderRobot(int vitesseGauche, int vitesseDroite) {
commanderMoteur(PIN_ENA, PIN_IN1, PIN_IN2, vitesseGauche);
commanderMoteur(PIN_ENB, PIN_IN3, PIN_IN4, vitesseDroite);
}
void avancer() { commanderRobot(VITESSE_AVANT, VITESSE_AVANT); }
void reculer() { commanderRobot(-VITESSE_RECUL, -VITESSE_RECUL); }
void tournerAGauche() { commanderRobot(-VITESSE_ROTATION, VITESSE_ROTATION); }
void tournerADroite() { commanderRobot(VITESSE_ROTATION, -VITESSE_ROTATION); }
void arreterRobot() { commanderRobot(0, 0); }
long mesurerDistanceCm() {
digitalWrite(PIN_TRIG, LOW);
delayMicroseconds(3);
digitalWrite(PIN_TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(PIN_TRIG, LOW);
const unsigned long duree = pulseIn(PIN_ECHO, HIGH, 30000UL);
if (duree == 0) return 400;
return (long)(duree * 0.0343 / 2.0);
}
long mesurerDistanceMoyenne() {
long total = 0;
byte mesuresValides = 0;
for (byte i = 0; i < 3; i++) {
const long distance = mesurerDistanceCm();
if (distance > 1 && distance < 400) {
total += distance;
mesuresValides++;
}
delay(35);
}
return mesuresValides == 0 ? 400 : total / mesuresValides;
}
long regarderDirection(int angle) {
servoUltrason.write(angle);
delay(450);
return mesurerDistanceMoyenne();
}
void afficherEtat(const char* action, long distance) {
if (millis() - dernierAffichage < 120) return;
dernierAffichage = millis();
lcd.setCursor(0, 0);
lcd.print("MODE: EVITEUR ");
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print(action);
lcd.print(" ");
if (distance >= 400) lcd.print("---");
else lcd.print(distance);
lcd.print("cm");
}
void eviterObstacle() {
arreterRobot();
afficherEtat("OBSTACLE", mesurerDistanceCm());
delay(200);
reculer();
afficherEtat("RECULE", 0);
delay(DUREE_RECUL_MS);
arreterRobot();
delay(150);
const long distanceGauche = regarderDirection(ANGLE_GAUCHE);
afficherEtat("GAUCHE", distanceGauche);
delay(150);
const long distanceDroite = regarderDirection(ANGLE_DROITE);
afficherEtat("DROITE", distanceDroite);
delay(150);
servoUltrason.write(ANGLE_CENTRE);
delay(300);
Serial.print("Gauche: ");
Serial.print(distanceGauche);
Serial.print(" cm | Droite: ");
Serial.print(distanceDroite);
Serial.println(" cm");
if (distanceGauche >= distanceDroite) {
tournerAGauche();
afficherEtat("TOURNE G", distanceGauche);
} else {
tournerADroite();
afficherEtat("TOURNE D", distanceDroite);
}
delay(DUREE_ROTATION_MS);
arreterRobot();
delay(100);
}
void setup() {
pinMode(PIN_ENA, OUTPUT);
pinMode(PIN_IN1, OUTPUT);
pinMode(PIN_IN2, OUTPUT);
pinMode(PIN_ENB, OUTPUT);
pinMode(PIN_IN3, OUTPUT);
pinMode(PIN_IN4, OUTPUT);
pinMode(PIN_TRIG, OUTPUT);
pinMode(PIN_ECHO, INPUT);
arreterRobot();
Serial.begin(9600);
lcd.init();
lcd.backlight();
servoUltrason.attach(PIN_SERVO);
servoUltrason.write(ANGLE_CENTRE);
lcd.setCursor(0, 0);
lcd.print("EDU BOT 1.0");
lcd.setCursor(0, 1);
lcd.print("Mode eviteur");
delay(2000);
lcd.clear();
}
void loop() {
servoUltrason.write(ANGLE_CENTRE);
const long distanceAvant = mesurerDistanceMoyenne();
Serial.print("Distance avant: ");
Serial.print(distanceAvant);
Serial.println(" cm");
if (distanceAvant > DISTANCE_OBSTACLE_CM || distanceAvant >= 400) {
avancer();
afficherEtat("AVANCE", distanceAvant);
} else {
eviterObstacle();
}
delay(50);
}
ANGLE_GAUCHE et ANGLE_DROITE.Tests avant le premier départ
Faites les vérifications dans cet ordre, roues soulevées du sol, avant de lancer le robot.
1. Vérifier les moteurs
- Placez le robot sur un support.
- Téléversez un programme.
- Vérifiez que les deux roues avancent.
- Inversez les fils d’un moteur si son sens est incorrect.
2. Calibrer les TCRT5000
- Placez chaque capteur sur le blanc puis sur le noir.
- Tournez doucement son potentiomètre.
- Observez le changement de sa LED.
- Vérifiez les valeurs dans le moniteur série.
3. Tester le HC-SR04
- Ouvrez le moniteur série à 9600 bauds.
- Placez un objet devant le robot.
- Vérifiez que la distance diminue.
- Contrôlez les fils TRIG et ECHO si la valeur reste à 400 cm.
4. Vérifier l’écran LCD
- Contrôlez VCC, GND, SDA et SCL.
- Réglez le petit potentiomètre de contraste du module I2C.
- Si l’écran reste vide, testez l’adresse
0x3Fà la place de0x27.
Dépannage rapide
Les problèmes les plus fréquents sont généralement liés au sens des moteurs, à une masse non commune ou à une calibration insuffisante.
Le robot avance en tournant sur lui-même
Un moteur tourne probablement dans le sens opposé. Inversez les deux fils de ce moteur sur les sorties du L298N.
Le robot redémarre lorsque le servo bouge
L’alimentation 5V chute pendant le pic de courant du servo. Utilisez une alimentation 5V régulée séparée pour le servo et conservez une masse commune.
Le LCD s’allume mais aucun texte n’apparaît
Réglez le potentiomètre de contraste puis testez l’adresse I2C 0x3F si 0x27 ne fonctionne pas.
Le robot suit le blanc au lieu de la ligne noire
Inversez la constante ETAT_LIGNE_DETECTEE de LOW vers HIGH, ou inversement.
Le robot tourne trop peu pour éviter l’obstacle
Augmentez progressivement DUREE_ROTATION_MS, par exemple de 500 à 650 ms.