3 points par GN⁺ 2025-02-03 | 1 commentaires | Partager sur WhatsApp
  • ESP32 RC Cars est un système de caméra pour voiture télécommandée basé sur l’ESP32-CAM, qui combine streaming vidéo en temps réel et contrôle du moteur et du servo via WebSocket
  • Une application serveur Python gère la communication WebSocket et fournit une interface web permettant de voir le flux vidéo de l’appareil ESP32 et de le piloter depuis le navigateur
  • Les principales fonctionnalités incluent le streaming vidéo en direct de l’ESP32-CAM, le contrôle du moteur et du servo via des commandes WebSocket, un timeout automatique qui ramène le système à son état par défaut en l’absence de commandes, ainsi qu’un canvas vidéo multi-clients
  • Côté matériel, il faut un ESP32-CAM AI Thinker ou compatible, un moteur et un servo connectés aux GPIO, une alimentation 5V stable et un réseau Wi-Fi ; la carte SD est optionnelle
  • Les commandes de contrôle suivent les formats MOTOR:<speed>, SERVO:<angle>, CONTROL:<speed>:<angle>, et le serveur dispose les frames vidéo de plusieurs clients ESP32 en grille avant de les diffuser dans l’interface web

Vue d’ensemble du projet

  • ESP32 RC Cars est un exemple de système de caméra pour véhicule télécommandé basé sur ESP32
  • L’ESP32-CAM transmet la vidéo en temps réel via WebSocket, et le moteur comme le servo sont contrôlés par des commandes WebSocket
  • L’application serveur Python gère la communication WebSocket et permet de visualiser et piloter les appareils ESP32 depuis une interface web
  • Vidéo de démonstration : https://youtu.be/OubYFXmvA1E

Fonctionnalités principales

  • Envoi d’un streaming vidéo en direct depuis l’ESP32-CAM vers le serveur web
  • Contrôle à distance du moteur et du servo via des commandes WebSocket
  • Si aucune commande de contrôle n’est reçue pendant un certain temps, le moteur et le servo reviennent automatiquement à leur état par défaut
  • Le serveur place dynamiquement les flux vidéo de plusieurs clients sur un canvas

Matériel et composants

  • Matériel nécessaire
    • ESP32-CAM, module AI Thinker ou carte compatible
    • Moteur et servo connectés aux broches GPIO appropriées
    • Alimentation 5V stable pour l’ESP32-CAM
    • Réseau Wi-Fi pour la communication
    • Carte SD en option si nécessaire pour d’autres fonctions
  • Les composants utilisés proviennent d’un kit acheté sur AliExpress
    • Châssis de voiture
    • Contrôleur électronique de vitesse
      • La version 30A a été utilisée, avec une sortie BEC de 5V 3A, apparemment suffisante pour alimenter l’ESC et le servo
    • Support de batterie
    • 2 cellules 18650 de 3.6V ou un pack batterie 7.4V
      • Les deux ont été utilisés ; les cellules sont plus flexibles pour d’autres projets
    • ESP32-CAM
      • Un modèle avec antenne externe est très important, et une caméra fisheye à 170 degrés a été utilisée
    • Bluetooth Gamepad
      • Une manette PS4 a été utilisée

Schéma de câblage

  • L’adaptateur JST 3 broches du servo inclus sur le châssis a été retiré, puis remplacé par une prise JST 4 broches pour pouvoir être connecté à l’ESP32
  • Les fils positif et négatif du servo ont été raccordés, puis une prise JST femelle 3 broches a été ajoutée avec un outil de sertissage
  • Le fil de contrôle blanc de l’ESC a été connecté à la prise JST 4 broches et à la prise femelle 3 broches

Configuration logicielle

  • Bibliothèques utilisées dans le code ESP32
    • WiFi.h : connexion Wi-Fi
    • ArduinoWebsockets.h : communication WebSocket
    • esp_camera.h : contrôle de la caméra ESP32-CAM
    • ServoControl.h, Esc.h : contrôle du servo et du moteur
    • Arduino.h : fonctions Arduino standard
  • Les dépendances du serveur Python s’installent avec la commande suivante
sudo apt install python3-aiohttp python3-opencv python3-numpy

Configuration et exécution

  • Configuration du firmware ESP32
    • Définir dans secrets.h les identifiants Wi-Fi et l’URL du serveur WebSocket
#define WIFI_SSID "YourWiFiSSID"
#define WIFI_PASSWORD "YourWiFiPassword"
#define WS_SERVER_URL "ws://YourServerIP:Port"
  • Les broches GPIO de la caméra sont préconfigurées pour la carte AI Thinker ESP32-CAM
  • Si nécessaire, modifier les broches du moteur et du servo selon la configuration matérielle
  • Configuration du serveur Python
    • Placer le script serveur dans le même répertoire que le fichier index.html de l’interface web
    • Lancer le serveur avec la commande suivante
python3 app.py

Utilisation et commandes WebSocket

  • Procédure côté ESP32
    • Téléverser le sketch fourni sur l’ESP32-CAM avec l’Arduino IDE ou une plateforme compatible
    • Vérifier la sortie série pour confirmer que la connexion au Wi-Fi et au serveur WebSocket a bien réussi
  • Procédure côté serveur
    • Exécuter le script serveur Python
    • Ouvrir l’interface web dans le navigateur pour voir le flux vidéo en direct
    • Envoyer les commandes de contrôle via la connexion WebSocket
  • Commandes prises en charge
    • MOTOR:<speed> : définit la vitesse du moteur, dans la plage -255 à 255
    • SERVO:<angle> : définit l’angle du servo, dans la plage 0 à 180
    • CONTROL:<speed>:<angle> : contrôle simultanément la vitesse du moteur et l’angle du servo

Détails de fonctionnement et dépannage

  • Étapes d’initialisation de l’ESP32
    • Connexion au réseau Wi-Fi spécifié
    • Configuration de l’ESP32-CAM pour le streaming vidéo
    • Établissement de la connexion WebSocket avec le serveur
  • Le traitement du timeout remet la vitesse du moteur à 0 et l’angle du servo à 90 si aucune commande n’est reçue pendant une certaine durée
  • Le serveur Python communique avec plusieurs clients ESP32 via WebSocket
  • Le serveur traite les frames vidéo entrantes, les dispose dynamiquement en grille, puis les diffuse dans l’interface web
  • En cas de problème de connexion, vérifier les identifiants Wi-Fi dans secrets.h, et confirmer que le serveur WebSocket est en cours d’exécution et accessible
  • En cas de problème de flux vidéo, vérifier que l’ESP32-CAM est correctement alimenté et que les paramètres d’initialisation de la caméra sont corrects
  • Le projet est publié sous licence MIT

1 commentaires

 
GN⁺ 2025-02-03
Avis sur Hacker News
  • J’avais fait quelque chose de similaire il y a 12 ans, quand Arduino existait mais pas encore l’ESP32 : https://newton-net-pl.translate.goog/2012/01/robot/?_x_tr_sl...
    J’utilisais un vieux téléphone HTC Magic comme caméra + émetteur Wi-Fi, relié à un Arduino via un port série et un convertisseur de niveau pour piloter des servos et des LED RGB.
    La connexion n’était pas très stable, mais c’était assez amusant ; il est peut-être temps de ressusciter le projet avec une nouvelle génération de microcontrôleurs.
  • Merci pour les retours sur le projet ; j’aimerais continuer à le faire évoluer et je serais aussi preneur de PR.
    Si le projet vous plaît, le plus grand coup de pouce serait de le recommander à quelqu’un qui cherche un développeur à distance.
    Mon métier principal est développeur Ruby on Rails, mais je pourrais aussi envisager des missions en robotique.
  • Avant d’acheter une ESP32 CAM, mieux vaut envisager un modèle avec antenne externe.
    Cet article vaut la lecture : https://www.reddit.com/r/esp32/comments/r7kqtt/esp32cam_supe...
    Avant d’appliquer quelques-uns de ces conseils, le framerate était assez mauvais.
    • D’après la page d’administration du routeur, dès que j’ai ressoudé la résistance et branché l’antenne, je suis passé d’un 1 Mbps instable à 20 Mbps stables.
      Ressouder une résistance de 0 Ω avait presque des airs d’aventure, mais je l’ai finalement reliée à la bonne broche, et voici à quoi ressemble le résultat : https://imgur.com/a/LJflZ80
    • D’après mon expérience avec ce projet, une antenne externe était quasiment indispensable.
      J’ai ajouté dans le README le lien vers l’antenne que j’ai utilisée.
    • Tu peux recommander le modèle exact ?
  • Super. J’ai construit un char RC à chenilles piloté par ESP32, connecté en Bluetooth à une manette PlayStation 4 pour le contrôler.
    Le logiciel de base se lance facilement avec une bibliothèque de manette Bluetooth, en une vingtaine de lignes de C.
    Ensuite, j’ai ajouté des fonctions pour faciliter le pilotage : contrôler les deux chenilles avec deux sticks fonctionne bien à basse vitesse, mais comme j’utilisais deux moteurs de drone et que ça montait presque à 20 km/h, il me fallait un autre mode de contrôle.
    Au final, j’ai utilisé les gâchettes de la manette DualShock pour contrôler directement les chenilles avec une limitation du régime, et, à haute vitesse, le stick gauche haut/bas pour l’accélération et le stick droit gauche/droite pour la direction, afin que ça se conduise comme une voiture RC classique.
    Voici une vidéo du même modèle imprimé en 3D que j’ai utilisé comme base ; la vitesse se voit bien à partir de 00:50 : https://www.youtube.com/watch?v=3Mv_tDY89Zw
    • Vraiment impressionnant.
      Je ne connais pas bien la fabrication de RC ; en général, comment les contrôle-t-on ? La manette PS4 se connecte-t-elle directement à l’ESP ?
  • Le gros problème du FPV, et la raison pour laquelle il est longtemps resté sur des technologies analogiques, c’est la latence.
    Je me demande quelle est la latence de ce projet.
    • Aujourd’hui, en FPV, on utilise surtout ExpressLRS[0], un protocole ouvert pour le lien de contrôle des quadricoptères FPV, qui utilise souvent aussi l’ESP32.
      En revanche, la vidéo des quadricoptères FPV est un sujet à part. Certains utilisent l’analogique parce que, quand le signal se dégrade, il se détériore progressivement au lieu de couper complètement puis de se reconnecter ; d’autres utilisent des communications basées sur 802.11, qui sont en pratique assez compétitives.
      Par exemple, les Walksnail Goggles utilisent 802.11 pour le lien vidéo ; ce n’est pas vraiment ouvert ni très bien documenté, mais certaines personnes en explorent les entrailles, comme dans les travaux de Chris Rosser.
      La latence de ce type de configuration semble suffisante même pour des courses rapides de quadricoptères de compétition.
      [0] https://www.expresslrs.org
    • Projets liés : https://github.com/wooky/esp32-analog-video-over-wifi
      Et aussi : https://github.com/gyrex/CrystalVideo
    • Je n’ai pas de référence de comparaison comme avec les drones FPV, mais sur le réseau Wi-Fi de la maison, la latence n’a pas posé problème, même avec tous les autres appareils domestiques connectés.
      Le framerate semble surtout limité par la vitesse à laquelle l’ESP32 peut capturer les images.
      Quand j’ai mesuré le FPS avec un script Python, je recevais environ 50 fps depuis les ESP32, et j’ai récemment acheté un routeur de voyage pour faire des essais à l’extérieur.
  • Je pense tenter un projet similaire, donc je suis curieux de ton expérience en matière de latence.
    Peut-on piloter à distance en regardant le flux vidéo ? Ma principale crainte est que ce soit trop lent pour éviter les obstacles à la plupart des vitesses.
  • J’ai acheté le même kit l’an dernier, et récemment j’ai aussi acheté une manette de jeu ESP32 avec un petit écran : https://github.com/01studio-lab/pyController
    Quand j’aurai le temps, je compte combiner les deux pour piloter la voiture tout en affichant le flux de la caméra sur l’écran.
  • Si le résultat compte davantage que le plaisir de fabriquer, on trouve aujourd’hui sur AliExpress de bonnes voitures RC de 2,5 pouces pour 30 dollars, et des caméras analogiques 5,8 GHz autonomes pour 25 dollars.
    • Si par « autonome » tu veux dire une caméra tout-en-un, celles avec VTX intégré sont généralement encore moins bonnes que l’analogique standard, et il faut toujours des lunettes analogiques.
      Pour quelqu’un qui n’a pas besoin de lunettes de vue, ou qui porte des lentilles de contact, une DJI O4 « lite » avec des lunettes N3 est un bien meilleur choix.
  • Si vous voulez automatiser une voiture RC, c’est une lecture intéressante.
    L’article date de quelques années, donc il existe peut-être aujourd’hui des façons plus simples ou meilleures d’obtenir un résultat similaire : https://hackaday.com/2021/10/25/fast-indoor-robot-watches-ce...
  • Tout le monde connaît les quadricoptères FPV utilisés sur le champ de bataille, mais l’intérêt pour les véhicules terrestres augmente aussi.
    Ils n’ont rien du mélange entre chien robot de Boston Dynamics et Terminator qu’on voit au cinéma, mais ils sont très utiles pour des tâches « ennuyeuses » et moins visibles : poser des mines, faire exploser des mines, ou transporter une petite quantité de ravitaillement à un soldat caché quelque part sur la ligne de front.