Drahtloser Node.js-gesteuerter Roboterwagen – Echtzeit-IoT-Projekt
Komponenten und Zubehör
| Arduino UNO | × | 1 |
| SparkFun Dual H-Brücke L298 (Motortreiber) | × | 1 |
| HC-05 Bluetooth-Modul | × | 1 |
| Jumper-Kabel | × | 1 |
| 9 V Blockbatterie | × | 2 |
| 12 V DC-Getriebemotoren | × | 2 |
Über dieses Projekt
Projektidee
Node.js eignet sich hervorragend für Echtzeitanwendungen. Ich hatte bereits Erfahrung mit Socket-basierten Echtzeit-Apps und wollte das Konzept auf IoT-Hardware übertragen – einen Rover, der per Bluetooth mit einem Node.js-Server kommuniziert und über eine mobile Webseite (WebSockets) ferngesteuert wird.
Projektziel
Drahtlose Kommunikation zwischen Node-Server und Hardware (Rover) implementieren und den Rover über eine mobile Webseite fernsteuern.
Voraussetzungen
- Grundkenntnisse in Node.js, Socket-Programmierung und L298-Motortreiber
Anforderungen
- 1× Arduino Uno
- 1× L298 Motortreiber
- 1× HC-05 Bluetooth-Modul
- Jumper-Kabel
- 2× 9 V Blockbatterien
- 2× Getriebemotoren (6–9 V) + passende Räder
- Chassis (z. B. „2-wheel chassis kit“)
- Computer mit Node.js für den Server
Schritt 1: Rover bauen
Ein 2-Rad-Chassis-Set (online erhältlich) vereinfacht den mechanischen Aufbau. Arduino Uno und L298 werden auf dem Chassis montiert, jeweils mit eigener 9 V-Batterie versorgt. Der Arduino speist das HC-05-Modul über seinen 5V-Pin.
Schaltplan
- L298: 9 V-Batterie an Motorversorgung. Motorausgänge an Motor A/B. Wichtig: 5V-Regler-Jumper nicht entfernen. Bei >12 V Eingangsspannung wird der Onboard-5V-Regler zerstört!
- Arduino: 9 V-Batterie an Vin (Plus) und gemeinsamen GND (Minus).
- HC-05: VCC an Arduino 5V, GND an GND. TXD → Arduino RX (Pin 0), RXD → Arduino TX (Pin 1).
- L298 Steuerung: EN1, EN2 an PWM-Pins; IN1–IN4 an digitale Pins.
Datenübertragung
- Benutzer ruft Webseite auf (z. B.
192.168.x.x:8080) - Klick auf Buttons → Socket-Event an Node-Server
- Server sendet Kommando via Bluetooth an HC-05
- HC-05 → Serielle Übertragung an Arduino
- Arduino steuert L298
Schritt 2: Server einrichten
Node.js installieren (v11.15 empfohlen, da node-gyp mit neueren Versionen Probleme haben kann). Benötigte Pakete:
node-gypexpressnode-bluetoothsocket.ioejs
Webseite mit Express + EJS erstellen, Socket.io für Echtzeitkommunikation einrichten. Buttons auf der Webseite emittieren Events, Server lauscht und sendet Daten an HC-05.
Schritt 3: Arduino-Code
Bluetooth sendet Strings wie forwardT (T = Terminator). Arduino liest seriell bis 'T', dann Aktion ausführen (vorwärts, rückwärts, links, rechts, Geschwindigkeit, Stopp).
Schritt 4: Ergebnis & Ausblick
Der Rover lässt sich über die Webseite steuern. Geplante Erweiterungen:
- Sprachsteuerung
- Hindernisvermeidung
- Datenbank für Statistiken (Strecke, Geschwindigkeit)
- Zusätzliche Sensoren (Temperatur, Licht, Feuchte) mit Logging
Nächstes Projekt: „Voice Controlled Rover using Mobile“
Code
Node Rover Arduino Code
const int en1 = 9, en2 = 3;
const int inp1 = 2, inp2 = 4, inp3 = 7, 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 = "";
}
}
}
Schaltpläne

Herstellungsprozess
- Drahtloses IR-Sensor-gesteuertes Roboterfahrzeug bauen
- Effiziente Webserver-Lösungen für ressourcenbeschränkte Mikrocontroller
- TLS-fähigen Webserver auf 3$ ESP8266 in unter 30 Minuten deployen
- Echtzeit-Temperatur- & Feuchtigkeitsmonitoring via Web auf Raspberry Pi 4
- Temperaturgesteuerter Lüfter: DIY Relais-System für Medienmöbel-Kühlung
- Aus 4$ Solar-Licht wird smarter Wireless-Sensorknoten: MSP430 + nRF24L01+ für Garten-Monitoring
- Raspberry Pi 4 als Webserver nutzen und eigene Website erstellen
- RC-Auto in Bluetooth-gesteuertes Fahrzeug verwandeln
- Altes RC-Auto per Xbox-Controller & Arduino zum Joystick-Fahrzeug umbauen
- Qi-fähiges Wi-Fi RC-Auto: Kabelloses Laden per Wireless Charging