3 Punkte von GN⁺ 2025-02-03 | 1 Kommentare | Auf WhatsApp teilen
  • 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>: Motor­geschwindigkeit setzen, Bereich von -255 bis 255
    • SERVO:<angle>: Servowinkel setzen, Bereich von 0 bis 180
    • CONTROL:<speed>:<angle>: Motor­geschwindigkeit 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

 
GN⁺ 2025-02-03
Hacker-News-Kommentare
  • Ich habe vor 12 Jahren, als es Arduino gab, aber noch keinen ESP32, etwas Ähnliches gebaut: https://newton-net-pl.translate.goog/2012/01/robot/?_x_tr_sl...
    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.
  • Danke für das Feedback zum Projekt; ich möchte es weiterführen und würde auch gern PRs annehmen.
    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.
  • Bevor ihr eine ESP32 CAM kauft, solltet ihr ein Modell mit externer Antenne in Betracht ziehen.
    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.
    • Laut Admin-Seite des Routers ging es sofort von instabilen 1 Mbps auf stabile 20 Mbps hoch, sobald ich den Widerstand umgelötet und die Antenne angeschlossen 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
    • Nach meiner Erfahrung mit diesem Projekt war eine externe Antenne nahezu unverzichtbar.
      Ich habe den Link zur verwendeten Antenne ins README aufgenommen.
    • Kannst du ein konkretes Modell empfehlen?
  • Cool. Ich habe einen RC-Kettenpanzer mit ESP32-Antrieb gebaut und ihn per Bluetooth mit einem PlayStation-4-Controller gesteuert.
    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
    • Wirklich beeindruckend.
      Ich kenne mich mit RC-Bauten nicht gut aus: Wie steuert man so etwas normalerweise? Verbindet man den PS4-Controller direkt mit dem ESP?
  • Das große Problem bei FPV und der Grund, warum man so lange bei analoger Technik geblieben ist, ist die Latenz.
    Ich frage mich, wie hoch die Latenz bei diesem Projekt ist.
    • FPV nutzt heutzutage meist ExpressLRS[0], ein offenes Protokoll für die Steuerverbindung von FPV-Quadcoptern, das häufig ebenfalls ESP32 verwendet.
      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
    • Verwandtes Projekt: https://github.com/wooky/esp32-analog-video-over-wifi
      Und: https://github.com/gyrex/CrystalVideo
    • Ich habe keinen Vergleichsmaßstab wie Erfahrung mit FPV-Drohnen, aber in meinem WLAN zu Hause war die Latenz kein Problem, selbst wenn alle anderen Haushaltsgeräte verbunden waren.
      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.
  • Da ich überlege, ein ähnliches Projekt auszuprobieren, interessieren mich deine Erfahrungen mit der Latenz.
    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.
  • Ich habe letztes Jahr dasselbe Kit gekauft und mir kürzlich auch einen ESP32-Gamecontroller mit kleinem Display geholt: https://github.com/01studio-lab/pyController
    Wenn ich Zeit finde, will ich beides kombinieren, um das Auto zu steuern und gleichzeitig den Kamerafeed auf dem Display zu sehen.
  • Wenn euch das Ergebnis wichtiger ist als der Bastelspaß, bekommt man heutzutage bei AliExpress ein brauchbares 2,5-Zoll-RC-Auto für 30 Dollar und eine eigenständige analoge 5,8-GHz-Kamera für 25 Dollar.
    • Falls mit eigenständig eine All-in-one-Kamera gemeint ist: Kameras mit integriertem VTX sind meistens sogar schlechter als normales Analogvideo, und man braucht trotzdem eine analoge Brille.
      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.
  • Wenn du ein RC-Auto automatisieren möchtest, ist das eine interessante Lektüre.
    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...
  • FPV-Quadcopter auf dem Schlachtfeld kennt inzwischen jeder, aber auch das Interesse an Bodenfahrzeugen wächst.
    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.