- ESP32 RC Cars ist ein ferngesteuertes Kamerasystem auf Basis der ESP32-CAM, das Echtzeit-Videostreaming sowie Motor- und Servosteuerung über WebSocket kombiniert
- Eine Python-Serveranwendung verwaltet die WebSocket-Kommunikation und stellt ein Web-Interface bereit, über das man das Video des ESP32-Geräts ansehen und es steuern kann
- Zu den wichtigsten Funktionen gehören Live-Videostreaming der ESP32-CAM, Motor- und Servosteuerung per WebSocket-Befehl, ein automatischer Timeout, der bei ausbleibenden Steuerbefehlen in den Grundzustand zurückkehrt, sowie ein Video-Canvas für mehrere Clients
- Benötigt werden als Hardware eine AI-Thinker- oder kompatible ESP32-CAM, an GPIO angeschlossene Motoren und Servos, eine stabile 5V-Stromversorgung sowie ein Wi-Fi-Netzwerk; eine SD-Karte ist optional
- Steuerbefehle haben die Formate
MOTOR:<speed>, SERVO:<angle> und CONTROL:<speed>:<angle>; der Server ordnet Videoframes mehrerer ESP32-Clients in einem Raster an und streamt sie an das Web-Interface
Projektüberblick
- ESP32 RC Cars ist ein Beispiel für ein ferngesteuertes Kamerasystem auf ESP32-Basis
- Die ESP32-CAM sendet Echtzeitvideo per WebSocket, Motor und Servo werden über WebSocket-Befehle gesteuert
- Eine Python-Serveranwendung verwaltet die WebSocket-Kommunikation und ermöglicht es, ESP32-Geräte über ein Web-Interface anzusehen und zu steuern
- Demo-Video: https://youtu.be/OubYFXmvA1E
Hauptfunktionen
- Überträgt Live-Videostreaming von der ESP32-CAM an den Webserver
- Steuert Motor und Servo aus der Ferne per WebSocket-Befehl
- Wenn für eine bestimmte Zeit kein Steuerbefehl eingeht, kehren Motor und Servo automatisch in den Grundzustand zurück
- Der Server platziert die Video-Feeds mehrerer Clients dynamisch auf einem Canvas
Hardware und Materialien
- Erforderliche Hardware
- ESP32-CAM, AI-Thinker-Modul oder kompatibles Board
- Motor und Servo, angeschlossen an geeignete GPIO-Pins
- Stabile 5V-Stromversorgung für die ESP32-CAM
- Wi-Fi-Netzwerk für die Kommunikation
- Optional eine SD-Karte, falls für weitere Funktionen benötigt
- Die verwendeten Materialien stammen aus Kit-Komponenten, die bei AliExpress gekauft wurden
- Fahrzeug-Chassis
- Elektronischer Drehzahlregler
- Verwendet wurde die 30A-Version; der BEC-Ausgang liefert 5V 3A, was ausreichend Strom zum Betreiben von ESC und Servo zu bieten schien
- Batteriehalter
- Zwei 18650-Zellen mit 3,6V oder ein 7,4V-Akkupack
- Beides wurde verwendet; die Zellen lassen sich flexibler für andere Projekte einsetzen
- ESP32-CAM
- Ein Modell mit externer Antenne ist sehr wichtig; verwendet wurde eine 170-Grad-Fisheye-Kamera
- Bluetooth-Gamepad
- Verwendet wurde ein PS4-Controller
Verdrahtung
- Der 3-polige JST-Adapter des im Fahrzeug-Chassis enthaltenen Servos wurde entfernt und auf einen 4-poligen JST-Stecker umgelegt, damit er mit dem ESP32 verbunden werden kann
- Die Plus- und Minusleitungen des Servos wurden zusammengeführt, und mit einem Crimpwerkzeug wurde ein 3-poliger JST-Buchsenstecker ergänzt
- Die weiße Steuerleitung des ESC wurde mit dem 4-poligen JST-Stecker und dem 3-poligen Buchsenstecker verbunden
Software-Konfiguration
- Im ESP32-Code verwendete Bibliotheken
WiFi.h: Wi-Fi-Verbindung
ArduinoWebsockets.h: WebSocket-Kommunikation
esp_camera.h: Kamerasteuerung der ESP32-CAM
ServoControl.h, Esc.h: Servo- und Motorsteuerung
Arduino.h: Standard-Arduino-Funktionen
- Die Abhängigkeiten des Python-Servers werden mit folgendem Befehl installiert
sudo apt install python3-aiohttp python3-opencv python3-numpy
Einrichtung und Ausführung
- ESP32-Firmware konfigurieren
- In
secrets.h die Wi-Fi-Zugangsdaten und die WebSocket-Server-URL festlegen
#define WIFI_SSID "YourWiFiSSID"
#define WIFI_PASSWORD "YourWiFiPassword"
#define WS_SERVER_URL "ws://YourServerIP:Port"
- Die Kamera-GPIO-Pins sind für das AI-Thinker-ESP32-CAM-Board vorkonfiguriert
- Bei Bedarf die Pins für Motor und Servo an die eigene Hardware-Konfiguration anpassen
- Python-Server einrichten
- Das Server-Skript im selben Verzeichnis wie die Datei
index.html für das Web-Interface ablegen
- Den Server mit folgendem Befehl starten
python3 app.py
Verwendung und WebSocket-Befehle
- Vorgehen für den ESP32
- Den bereitgestellten Sketch mit der Arduino IDE oder einer kompatiblen Plattform auf die ESP32-CAM hochladen
- Die serielle Ausgabe prüfen, um zu bestätigen, dass die Verbindung zu Wi-Fi und WebSocket-Server erfolgreich war
- Vorgehen für den Server
- Das Python-Server-Skript ausführen
- Das Web-Interface im Browser öffnen, um den Live-Videostream anzusehen
- Steuerbefehle über die WebSocket-Verbindung senden
- Unterstützte Befehle
MOTOR:<speed>: Motorgeschwindigkeit setzen, Bereich von -255 bis 255
SERVO:<angle>: Servowinkel setzen, Bereich von 0 bis 180
CONTROL:<speed>:<angle>: Motorgeschwindigkeit und Servowinkel gleichzeitig steuern
Betriebsdetails und Fehlerbehebung
- Initialisierungsschritte des ESP32
- Verbindung zum angegebenen Wi-Fi-Netzwerk herstellen
- ESP32-CAM für Videostreaming konfigurieren
- WebSocket-Verbindung zum Server aufbauen
- Die Timeout-Behandlung setzt die Motorgeschwindigkeit auf
0 und den Servowinkel auf 90 zurück, wenn für eine bestimmte Zeit kein Steuerbefehl eingeht
- Der Python-Server kommuniziert per WebSocket mit mehreren ESP32-Clients
- Der Server verarbeitet eingehende Videoframes, ordnet sie dynamisch in Rasterform an und streamt sie an das Web-Interface
- Bei Verbindungsproblemen die Wi-Fi-Zugangsdaten in
secrets.h prüfen und sicherstellen, dass der WebSocket-Server läuft und erreichbar ist
- Bei Problemen mit dem Videostream prüfen, ob die ESP32-CAM ausreichend mit Strom versorgt wird und ob die Kamera-Initialisierung korrekt eingestellt ist
- Das Projekt ist unter der MIT License veröffentlicht
1 Kommentare
Hacker-News-Kommentare
Ich habe ein altes HTC-Magic-Handy als Kamera- und WLAN-Sender verwendet und es über die serielle Schnittstelle und einen Level-Shifter mit einem Arduino verbunden, um Servos und eine RGB-LED zu steuern.
Die Verbindung war nicht besonders stabil, aber es hat ziemlich viel Spaß gemacht; vielleicht ist jetzt die Zeit, das Projekt mit der nächsten Generation von Mikrocontrollern wiederzubeleben.
Wenn euch das Projekt gefällt, wäre es die größte Hilfe, mich jemandem zu empfehlen, der Remote-Entwickler sucht.
Hauptberuflich bin ich Ruby-on-Rails-Entwickler, könnte mir aber auch Robotik-Arbeit vorstellen.
Dieser Beitrag ist lesenswert: https://www.reddit.com/r/esp32/comments/r7kqtt/esp32cam_supe...
Die Framerate war ziemlich schlecht, bis ich ein paar der Tipps umgesetzt hatte.
Einen 0-Ω-Widerstand umzulöten war fast ein Abenteuer, aber irgendwie habe ich ihn an den richtigen Pin bekommen; das Ergebnis sieht so aus: https://imgur.com/a/LJflZ80
Ich habe den Link zur verwendeten Antenne ins README aufgenommen.
Die Basissoftware lässt sich mit einer Bluetooth-Controller-Bibliothek recht einfach mit etwa 20 Zeilen C-Code starten.
Später habe ich Funktionen ergänzt, um die Bedienung zu erleichtern: Zwei Ketten mit zwei Sticks zu steuern ist bei niedriger Geschwindigkeit okay, aber da er mit zwei Drohnenmotoren fast 20 km/h erreicht, brauchte ich eine andere Steuerung.
Am Ende habe ich eine direkte Kettensteuerung mit Drehzahlbegrenzung über die Trigger des DualShock-Controllers umgesetzt; für schnelle Fahrten nutzte ich den linken Stick hoch/runter zum Beschleunigen und den rechten Stick links/rechts zum Lenken, sodass er sich wie ein normales RC-Auto fährt.
Hier ist ein Video desselben 3D-gedruckten Modells, das ich als Basis verwendet habe; ab 00:50 sieht man die Geschwindigkeit gut: https://www.youtube.com/watch?v=3Mv_tDY89Zw
Ich kenne mich mit RC-Bauten nicht gut aus: Wie steuert man so etwas normalerweise? Verbindet man den PS4-Controller direkt mit dem ESP?
Ich frage mich, wie hoch die Latenz bei diesem Projekt ist.
Das Videosystem von FPV-Quadcoptern ist dagegen aufgeteilt: Manche verwenden Analogvideo, weil das Signal beim Abreißen allmählich schlechter wird statt komplett wegzubrechen und sich neu verbinden zu müssen; andere nutzen 802.11-basierte Kommunikation, die in der Praxis ziemlich konkurrenzfähig ist.
Walksnail Goggles verwenden zum Beispiel 802.11 für den Videolink; sie sind zwar nicht besonders offen oder gut dokumentiert, aber es gibt Leute, die wie Chris Rosser ins Innere vordringen.
Die Latenz solcher Setups scheint selbst für schnelle Wettbewerbsrennen mit Quadcoptern ausreichend zu sein.
[0] https://www.expresslrs.org
Und: https://github.com/gyrex/CrystalVideo
Die Framerate scheint im Wesentlichen dadurch begrenzt zu sein, wie schnell der ESP32 Bilder erfassen kann.
Als ich die FPS in einem Python-Skript gemessen habe, bekam ich von den ESP32s etwa 50 fps; kürzlich habe ich einen Reiserouter gekauft, um es auch draußen zu testen.
Kann man anhand des Videofeeds fernsteuern? Meine größte Sorge ist, dass es für das Ausweichen vor Hindernissen bei den meisten Geschwindigkeiten zu langsam wäre.
Wenn ich Zeit finde, will ich beides kombinieren, um das Auto zu steuern und gleichzeitig den Kamerafeed auf dem Display zu sehen.
Für Leute, die keine Brille mit Sehstärke brauchen oder Kontaktlinsen tragen, ist DJI O4 „lite“ zusammen mit der N3-Brille die deutlich bessere Wahl.
Der Artikel ist ein paar Jahre alt; heute bekommt man ähnliche Ergebnisse vielleicht einfacher oder besser hin: https://hackaday.com/2021/10/25/fast-indoor-robot-watches-ce...
Das hat zwar überhaupt nichts mit der Mischung aus Boston-Dynamics-Roboterhund und Terminator zu tun, die man aus Filmen kennt, ist aber sehr nützlich für weniger auffällige, „langweilige“ Aufgaben wie das Legen von Minen, das Sprengen von Minen oder den Transport kleiner Mengen Nachschub zu einem Soldaten, der irgendwo an der Frontlinie versteckt ist.