- ESP32 RC Cars é um sistema de câmera para carro de controle remoto baseado em ESP32-CAM que implementa streaming de vídeo em tempo real e controle de motor e servo via WebSocket
- Um aplicativo de servidor em Python gerencia a comunicação WebSocket e fornece uma interface web para ver e controlar o dispositivo ESP32 pelo navegador
- Os principais recursos incluem streaming de vídeo ao vivo da ESP32-CAM, controle de motor e servo com comandos baseados em WebSocket, timeout automático que retorna ao estado padrão quando não há comandos de controle, e canvas de vídeo com múltiplos clientes
- O hardware necessário inclui uma AI Thinker ou ESP32-CAM compatível, motor e servo conectados aos GPIOs, fonte de 5V estável e rede Wi-Fi; cartão SD é opcional
- Os comandos de controle usam os formatos
MOTOR:<speed>, SERVO:<angle>, CONTROL:<speed>:<angle>, e o servidor organiza os frames de vídeo de vários clientes ESP32 em uma grade para streaming na interface web
Visão geral do projeto
- ESP32 RC Cars é um exemplo de sistema de câmera para controle remoto baseado em ESP32
- A ESP32-CAM transmite vídeo em tempo real via WebSocket, e o motor e o servo são controlados por comandos WebSocket
- Um aplicativo de servidor em Python gerencia a comunicação WebSocket e permite ver e controlar o dispositivo ESP32 por uma interface web
- Vídeo de demonstração: https://youtu.be/OubYFXmvA1E
Principais recursos
- Transmite streaming de vídeo ao vivo da ESP32-CAM para o servidor web
- Permite controle remoto de motor e servo por comandos WebSocket
- Se não houver comandos de controle por um determinado tempo, o motor e o servo retornam automaticamente ao estado padrão
- O servidor posiciona dinamicamente os feeds de vídeo de vários clientes em um canvas
Hardware e materiais
- Hardware necessário
- ESP32-CAM, módulo AI Thinker ou placa compatível
- Motor e servo conectados aos pinos GPIO apropriados
- Fonte de 5V estável para a ESP32-CAM
- Rede Wi-Fi para comunicação
- Cartão SD opcional, caso seja necessário para outros recursos
- Os materiais usados fazem parte de um kit comprado no AliExpress
- Chassi do carro
- Controlador eletrônico de velocidade
- Foi usada a versão de 30A, e a saída BEC de 5V 3A pareceu fornecer corrente suficiente para acionar o ESC e o servo
- Suporte de bateria
- 2 células 18650 de 3.6V ou pack de bateria de 7.4V
- Ambos foram usados, e as células podem ser mais flexíveis para uso em outros projetos
- ESP32-CAM
- O modelo com antena externa é muito importante, e foi usada uma câmera olho de peixe de 170 graus
- Gamepad Bluetooth
- Foi usado um controle de PS4
Esquema de ligação
- O adaptador JST de 3 pinos do servo incluído no chassi do carro foi removido e transferido para um plugue JST de 4 pinos para possibilitar a conexão ao ESP32
- Os fios positivo e negativo do servo foram emendados, e um plugue JST fêmea de 3 pinos foi adicionado com uma ferramenta de crimpagem
- O fio de controle branco do ESC foi conectado ao plugue JST de 4 pinos e ao plugue fêmea de 3 pinos
Configuração de software
- Bibliotecas usadas no código ESP32
WiFi.h: conexão Wi-Fi
ArduinoWebsockets.h: comunicação WebSocket
esp_camera.h: controle da câmera ESP32-CAM
ServoControl.h, Esc.h: controle de servo e motor
Arduino.h: funções padrão do Arduino
- As dependências do servidor Python são instaladas com o seguinte comando
sudo apt install python3-aiohttp python3-opencv python3-numpy
Configuração e execução
- Configuração do firmware ESP32
- Defina em
secrets.h as credenciais de Wi-Fi e a URL do servidor WebSocket
#define WIFI_SSID "YourWiFiSSID"
#define WIFI_PASSWORD "YourWiFiPassword"
#define WS_SERVER_URL "ws://YourServerIP:Port"
- Os pinos GPIO da câmera já estão pré-configurados para a placa AI Thinker ESP32-CAM
- Se necessário, ajuste os pinos do motor e do servo de acordo com a sua configuração de hardware
- Configuração do servidor Python
- Coloque o script do servidor no mesmo diretório do arquivo
index.html da interface web
- Execute o servidor com o seguinte comando
python3 app.py
Uso e comandos WebSocket
- Procedimento de uso da ESP32
- Faça upload do sketch fornecido para a ESP32-CAM usando a Arduino IDE ou uma plataforma compatível
- Verifique a saída serial para confirmar se a conexão com o Wi-Fi e com o servidor WebSocket foi bem-sucedida
- Procedimento de uso do servidor
- Execute o script do servidor Python
- Abra a interface web no navegador para ver o streaming de vídeo ao vivo
- Envie comandos de controle pela conexão WebSocket
- Comandos suportados
MOTOR:<speed>: define a velocidade do motor, no intervalo de -255 a 255
SERVO:<angle>: define o ângulo do servo, no intervalo de 0 a 180
CONTROL:<speed>:<angle>: controla simultaneamente a velocidade do motor e o ângulo do servo
Detalhes de funcionamento e solução de problemas
- Etapas de inicialização da ESP32
- Conecta-se à rede Wi-Fi especificada
- Configura a ESP32-CAM para streaming de vídeo
- Estabelece a conexão WebSocket com o servidor
- O tratamento de timeout redefine a velocidade do motor para
0 e o ângulo do servo para 90 quando não há comandos de controle por um período definido
- O servidor Python se comunica com vários clientes ESP32 via WebSocket
- O servidor processa os frames de vídeo recebidos, organiza-os dinamicamente em formato de grade e os transmite para a interface web
- Se houver problemas de conexão, verifique as credenciais de Wi-Fi em
secrets.h e confirme que o servidor WebSocket está em execução e acessível
- Se houver problemas com o stream de vídeo, verifique se a alimentação da ESP32-CAM está adequada e revise as configurações de inicialização da câmera
- O projeto é disponibilizado sob a Licença MIT
1 comentários
Comentários no Hacker News
Usei um celular HTC Magic antigo como câmera + transmissor Wi‑Fi, conectado a um Arduino pela porta serial e por um level shifter para controlar servos e LEDs RGB.
A conexão não era superestável, mas foi bem divertido; talvez agora seja hora de ressuscitar o projeto com a próxima geração de microcontroladores.
Se você gostou do projeto, a maior ajuda seria me indicar a alguém que esteja procurando desenvolvedores remotos.
Minha ocupação principal é como desenvolvedor Ruby on Rails, mas eu também consideraria trabalhos com robótica.
Vale ler este post: https://www.reddit.com/r/esp32/comments/r7kqtt/esp32cam_supe...
A taxa de quadros era bem ruim até eu aplicar algumas dicas.
Ressoldar o resistor de 0 Ω foi quase uma aventura, mas de qualquer forma acertei o pino correto, e o resultado ficou assim: https://imgur.com/a/LJflZ80
Adicionei ao README o link da antena que usei.
O software básico é fácil de começar, com umas 20 linhas de código C usando uma biblioteca de controle Bluetooth.
Depois acrescentei funções para facilitar a pilotagem: controlar duas esteiras com dois sticks funciona bem em baixa velocidade, mas como usei dois motores de drone e ele chegava a quase 20 km/h, precisei de outro esquema de controle.
No fim, fiz controle direto das esteiras, com limite de rotação, pelos gatilhos do DualShock; em alta velocidade, usei o stick esquerdo para cima/baixo como acelerador e o stick direito para esquerda/direita como direção, para dirigir como um carro RC comum.
Este é um vídeo do mesmo modelo 3D impresso que usei como base; a velocidade aparece bem a partir de 00:50: https://www.youtube.com/watch?v=3Mv_tDY89Zw
Não entendo muito de construção de RC; como normalmente se controla isso? O controle de PS4 se conecta diretamente ao ESP?
Fico curioso para saber qual é a latência deste projeto.
Já o vídeo de quadricópteros FPV é uma área separada. Alguns usam analógico porque, quando o sinal cai, ele degrada gradualmente em vez de cortar completamente e reconectar; outros usam comunicação baseada em 802.11, que na prática é bem competitiva.
Por exemplo, os Walksnail Goggles usam 802.11 no link de vídeo e, embora não sejam muito abertos nem bem documentados, há pessoas fuçando por dentro, como nos trabalhos do Chris Rosser.
A latência desse tipo de configuração parece ser baixa o bastante até para corridas rápidas e competitivas de quadricópteros.
[0] https://www.expresslrs.org
E também: https://github.com/gyrex/CrystalVideo
A taxa de quadros parece ser limitada principalmente pela velocidade com que o ESP32 consegue capturar imagens.
Quando medi o FPS em um script Python, recebi cerca de 50 fps dos ESP32; recentemente comprei um roteador de viagem para testar fora de casa.
Dá para pilotar remotamente olhando o feed de vídeo? Minha maior preocupação é que pareça lento demais para desviar de obstáculos na maior parte das velocidades.
Quando tiver tempo, quero juntar os dois para controlar o carro e ver o feed da câmera na tela.
Para quem não precisa de óculos de grau, ou usa lentes de contato, a combinação DJI O4 “lite” com os óculos N3 é uma escolha bem melhor.
O artigo é de alguns anos atrás, então talvez hoje seja possível obter resultados parecidos de forma mais fácil ou melhor: https://hackaday.com/2021/10/25/fast-indoor-robot-watches-ce...
Eles são bem diferentes daquela mistura cinematográfica de cão-robô da Boston Dynamics com Terminator, mas são muito úteis em tarefas “chatas” e menos chamativas, como instalar minas, detonar minas ou levar pequenas quantidades de suprimentos a soldados escondidos em algum ponto da linha de frente.