Robot Évitement d'Obstacles Contrôlé Bluetooth : Véhicule Télécommandé Intelligent
Composants et fournitures
| Composant | Quantité |
|---|---|
| Arduino Nano R3 | 1 |
| Driver moteur double H-bridge L298 (SparkFun) | 1 |
| Capteur ultrason HC-SR04 | 1 |
| Module Bluetooth HC-05 | 1 |
| LED RGB anode commune diffusante | 1 |
| Convertisseur niveau logique bidirectionnel (SparkFun) | 1 |
| Résistance 330 Ω | 1 |
| Plaque d'essai (breadboard) | 1 |
| Alimentation breadboard 5V/3.3V (SparkFun) | 1 |
| Moteur DC 12 V | 2 |
| Fils de liaison mâle/femelle | 1 lot |
Applications et services en ligne
- Arduino IDE
- Application Arduino BlueControl (Play Store)
À propos du projet
Ce projet utilise un smartphone pour piloter un robot via Bluetooth. Après 12 ans d'interruption, j'ai repris l'électronique/robotique pendant le confinement Covid-19. C'est mon premier projet sur Arduino Project Hub.
Le robot reçoit les commandes Bluetooth via le module HC-05 et l'application ArduinoBlueControl. Le cœur est l'Arduino Nano : il reçoit les commandes série du HC-05 et pilote les moteurs via le L298N (avant, arrière, gauche, droite).
Attention : Les pins TX/RX du HC-05 doivent être croisées avec l'Arduino Nano. Un convertisseur de niveau logique est utilisé (HC-05 = 3,3V, Nano = 5V).
Le capteur HC-SR04 détecte les obstacles en marche avant : le robot s'arrête si distance < 20 cm. Une LED RGB indique l'état du robot.
Châssis 2 roues motrices (moteurs réducteurs). Circuit sur breadboard avec alimentation 3,3V/5V. L'Arduino ne peut pas piloter directement les moteurs (courant trop fort) → L298N nécessaire. Les signaux PWM de l'Arduino (pins ENA/ENB du L298N) contrôlent la vitesse.
Vidéo de démonstration disponible sur le projet original.
Ce robot peut être étendu : domotique, véhicules évitement d'obstacles pour ateliers, etc.
Code
/* Robot évitement d'obstacles contrôlé Bluetooth
Auteur : Alok Talukdar - 09.05.2020 */
#include <SoftwareSerial.h>
// Pins L298N
#define IN1 5 // Moteur droit
#define IN2 4
#define IN3 3 // Moteur gauche
#define IN4 2
#define ENA 9 // PWM droit
#define ENB 10 // PWM gauche
// LED RGB (anode commune)
#define redLED 8
#define greenLED A0
#define blueLED 11
// HC-SR04
const int trigPin = 6;
const int echoPin = 7;
float duration, distance;
// HC-05 Bluetooth
SoftwareSerial mySerial(12, 13); // RX, TX
String data;
int btVal;
void setup() {
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
mySerial.begin(9600);
pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT);
pinMode(ENA, OUTPUT); pinMode(ENB, OUTPUT);
pinMode(redLED, OUTPUT); pinMode(blueLED, OUTPUT); pinMode(greenLED, OUTPUT);
digitalWrite(IN1, LOW); digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW); digitalWrite(IN4, LOW);
analogWrite(redLED, 255); // LED éteintes (anode commune)
digitalWrite(blueLED, HIGH);
digitalWrite(greenLED, HIGH);
}
void loop() {
while (mySerial.available()) {
data = mySerial.readStringUntil('\n');
}
btVal = data.toInt();
switch (btVal) {
case 1: forward(); ledVert(); dist(); break; // Avant
case 2: reverse(); ledRouge(); break; // Arrière
case 3: left(); break; // Gauche
case 4: right(); break; // Droite
case 5: stoprobot(); ledBleu(); break; // Stop
default: ledBlanc(); break;
}
}
// --- Contrôle moteurs ---
void forward() {
for (int i = 0; i <= 100; i++) {
analogWrite(ENA, i); analogWrite(ENB, i);
digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH);
}
}
void reverse() {
for (int j = 0; j <= 100; j++) {
analogWrite(ENA, j); analogWrite(ENB, j);
digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH);
digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW);
}
}
void left() {
analogWrite(ENA, 127); analogWrite(ENB, 0);
digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH); digitalWrite(IN4, HIGH);
}
void right() {
analogWrite(ENA, 0); analogWrite(ENB, 127);
digitalWrite(IN1, HIGH); digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH);
}
void stoprobot() {
analogWrite(ENA, 0); analogWrite(ENB, 0);
digitalWrite(IN1, LOW); digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW); digitalWrite(IN4, LOW);
}
// --- LED RGB (anode commune : LOW = allumé) ---
void ledVert() { digitalWrite(greenLED, LOW); analogWrite(redLED, 255); digitalWrite(blueLED, HIGH); }
void ledRouge() { digitalWrite(greenLED, HIGH); analogWrite(redLED, 255); digitalWrite(blueLED, LOW); }
void ledBleu() { digitalWrite(greenLED, HIGH); analogWrite(redLED, 0); digitalWrite(blueLED, HIGH); }
void ledBlanc() { digitalWrite(greenLED, HIGH); analogWrite(redLED, 255); digitalWrite(blueLED, HIGH); }
// --- Mesure distance + arrêt urgence ---
void dist() {
digitalWrite(trigPin, LOW); delayMicroseconds(2);
digitalWrite(trigPin, HIGH); delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = (duration * 0.0343) / 2; // cm
if (distance < 20) {
stoprobot();
ledBleu();
}
delay(1000);
}
Schémas
Schéma de câblage complet du robot.
Processus de fabrication
- Robot mobile évitant les obstacles par vision sur Raspberry Pi
- Construire un robot Raspberry Pi piloté par Bluetooth avec retour audio
- Construire un robot piloté par Internet avec streaming vidéo Arduino & Raspberry Pi
- Robot à commande gestuelle piloté par Raspberry Pi
- Construire un robot piloté Wi‑Fi avec Raspberry Pi & Smartphone Android
- Construire un robot piloté par la parole avec Windows 10 IoT Core sur Raspberry Pi 2
- Construire un robot Raspberry Pi piloté Wi-Fi avec Python – Guide pas à pas
- ROObockey : Robot de hockey sur rue télécommandé à visée assistée de précision
- Système d'Évitement d'Obstacles par Intelligence Artificielle (Q-Learning) sur Arduino