Voiture robotique pilotée par Node.js en temps réel : projet IoT sans fil
Composants et fournitures
| Arduino UNO | ×1 |
| Double pont en H L298 (SparkFun) | ×1 |
| Module Bluetooth HC-05 | ×1 |
| Fils de câblage (jumper wires) | ×1 |
| Batterie 9 V | ×2 |
| Moteur DC 12 V | ×2 |
À propos du projet
Idée du projet
Node.js est idéal pour les applications temps réel. Ayant déjà travaillé sur des apps temps réel avec WebSockets, j'ai voulu appliquer le même concept à l'IoT avec un serveur Node.js pour m'auto-former.
Ce rover communique avec mon serveur Node.js via Bluetooth, et l'interface web envoie les commandes au serveur via WebSockets.
Objectif
Étudier et implémenter la communication sans fil entre serveur Node et matériel (le rover), et contrôler le rover à distance via une page web mobile servie par le serveur Node utilisant WebSockets.
Prérequis
Connaissances de base en Node.js, programmation WebSockets, et fonctionnement du pilote moteur L298.
Matériel requis
- 1 Arduino Uno
- 1 Pilote moteur L298
- 1 Module Bluetooth HC-05
- Fils de câblage
- 2 Batteries 9 V
- 2 Moteurs à engrenages (6-9 V)
- 2 Roues compatibles
- Châssis
- Ordinateur avec Node.js installé pour le serveur
Étape 1 : Construction du rover

La construction n'est pas compliquée : achetez un « kit châssis 2 roues » disponible en ligne avec tous les éléments d'assemblage.
L'Arduino Uno et le L298 sont montés sur le rover, chacun alimenté par une batterie 9 V séparée. L'Arduino alimente le module HC-05 qui communique avec le serveur.
Schéma de câblage

Le L298 est alimenté par une batterie 9 V. Ses deux sorties de contrôle moteur sont connectées au Moteur A et B (polarité indifférente, mais vérifier que les deux tournent dans le même sens). Ne pas retirer le cavalier du régulateur 5V.
Attention : Si vous alimentez le L298 avec plus de 12 V, le régulateur 5 V intégré sera détruit.
L'Arduino Uno est aussi alimenté par une batterie 9 V (borne + sur broche Vin, - sur masse commune). L'Arduino alimente le module Bluetooth : Vcc du HC-05 sur 5V de l'Arduino, GND sur masse.
Pour la communication série HC-05 ↔ Arduino : TXD du HC-05 sur RX de l'Arduino, RXD du HC-05 sur TX de l'Arduino.
Pour contrôler le L298 : connecter EN1 et EN2 sur des broches PWM de l'Arduino. Connecter les entrées 1, 2, 3, 4 du L298 sur des broches numériques de l'Arduino.
Transmission des données

- L'utilisateur accède à la page web servie par le serveur Node (ex:
192.XXX.XXX.129:8080) - Un clic sur un bouton déclenche une fonction côté serveur via WebSockets
- Le serveur Node (connecté au HC-05 en Bluetooth) envoie la donnée au module
- Le HC-05 transmet à l'Arduino UNO par liaison série
- L'Arduino pilote le module L298
Étape 2 : Configuration du serveur
Installer Node.js (version stable, la mienne : 11.15). Installer les packages :
- node-gyp
- express
- node-bluetooth
- socket.io
- ejs
Note : l'installation de « node-gyp » peut être délicate car incompatible avec certaines versions récentes de Node. Mieux vaut utiliser Node 11.15.
Créer un serveur et une page web avec « express » et « EJS ». Concevoir la page avec les contrôles souhaités et configurer les connexions WebSocket via un serveur socket (voir documentation). Pour le Bluetooth, voir la documentation du package « node-bluetooth ». À chaque clic sur un bouton de contrôle, un message est envoyé au module HC-05.
Voici ma page web simple :

Étape 3 : Code Arduino
Le Bluetooth communique avec l'Arduino par liaison série. On envoie une chaîne de commande terminée par une lettre de fin (ex: « T »). Exemple : pour avancer, le Bluetooth envoie « forwardT » ; côté Arduino, on capture la chaîne jusqu'au « T ».
Selon la commande reçue, on configure le L298 pour avancer, reculer, tourner, ajuster la vitesse, etc. Code Arduino ci-joint.
Étape 4 : Résultat final
Améliorations et perspectives
- Contrôle par commandes vocales
- Évitement d'obstacles
- Base de données pour statistiques : distance parcourue, vitesse max, moyenne, etc.
- Capteurs supplémentaires : température, luminosité, humidité avec relevés réguliers stockés en base
Prochaine version
Voir mon prochain projet : « Rover à contrôle vocal par mobile »
Code
Code Arduino du rover Node
const int en1 = 9;
const int en2 = 3;
const int inp1 = 2;
const int inp2 = 4;
const int inp3 = 7;
const int inp4 = 8;
char charRead;
String inputString = "";
void setup() {
Serial.begin(9600);
pinMode(en1, OUTPUT);
pinMode(en2, OUTPUT);
pinMode(inp1, OUTPUT);
pinMode(inp2, OUTPUT);
pinMode(inp3, OUTPUT);
pinMode(inp4, OUTPUT);
}
void loop() {
if (Serial.available()) {
charRead = Serial.read();
if (charRead != 'T') {
inputString += charRead;
} else {
if (inputString == "forward") {
digitalWrite(inp1, HIGH);
digitalWrite(inp2, LOW);
digitalWrite(inp3, HIGH);
digitalWrite(inp4, LOW);
} else if (inputString == "backward") {
digitalWrite(inp1, LOW);
digitalWrite(inp2, HIGH);
digitalWrite(inp3, LOW);
digitalWrite(inp4, HIGH);
} else if (inputString == "fleft") {
digitalWrite(inp1, HIGH);
digitalWrite(inp2, LOW);
digitalWrite(inp3, LOW);
digitalWrite(inp4, LOW);
} else if (inputString == "fright") {
digitalWrite(inp1, LOW);
digitalWrite(inp2, LOW);
digitalWrite(inp3, HIGH);
digitalWrite(inp4, LOW);
} else if (inputString == "bleft") {
digitalWrite(inp1, LOW);
digitalWrite(inp2, LOW);
digitalWrite(inp3, LOW);
digitalWrite(inp4, HIGH);
} else if (inputString == "bright") {
digitalWrite(inp1, LOW);
digitalWrite(inp2, HIGH);
digitalWrite(inp3, LOW);
digitalWrite(inp4, LOW);
} else if (inputString == "break") {
analogWrite(en1, 50);
analogWrite(en2, 50);
delay(550);
digitalWrite(inp1, LOW);
digitalWrite(inp2, LOW);
digitalWrite(inp3, LOW);
digitalWrite(inp4, LOW);
analogWrite(en1, 150);
analogWrite(en2, 150);
} else if (inputString == "maxspeed") {
analogWrite(en1, 250);
analogWrite(en2, 250);
} else if (inputString == "medspeed") {
analogWrite(en1, 180);
analogWrite(en2, 180);
} else if (inputString == "lowspeed") {
analogWrite(en1, 90);
analogWrite(en2, 90);
} else {
digitalWrite(inp1, LOW);
digitalWrite(inp2, LOW);
digitalWrite(inp3, LOW);
digitalWrite(inp4, LOW);
}
inputString = "";
}
}
}
Schémas


Processus de fabrication
- Construire un véhicule robotique sans fil piloté par capteur IR
- Solutions de serveur web efficaces pour microcontrôleurs à ressources contraintes
- Déployer un serveur web TLS sur un ESP8266 à 3 $ en moins de 30 minutes
- Surveillance température et humidité en temps réel via Web sur Raspberry Pi 4
- Ventilateur à contrôle de température : système relais DIY pour refroidissement meuble multimédia
- D'une lampe solaire à 4 $ à un nœud capteur sans fil intelligent : MSP430 + nRF24L01+ pour surveillance jardin
- Transformez votre Raspberry Pi 4 en serveur web et créez votre propre site
- Transformez votre voiture RC en véhicule piloté par Bluetooth
- Transformez une vieille voiture RC en véhicule piloté au joystick avec Arduino