3 pontos por GN⁺ 2025-02-03 | 1 comentários | Compartilhar no WhatsApp

ESP32 RC Cars

Vídeo de demonstração

  • Este projeto demonstra um sistema de câmera com controle remoto baseado em ESP32
  • Transmite stream de vídeo em tempo real via WebSockets e permite controlar o motor e o servo
  • Um aplicativo de servidor em Python gerencia a comunicação por WebSocket e fornece uma interface web para controlar o dispositivo ESP32

Recursos

  • Streaming de vídeo em tempo real do ESP32-CAM para o servidor web
  • Controle remoto do motor e do servo por comandos WebSocket
  • Função de timeout automático para redefinir motor e servo ao estado padrão
  • Canvas dinâmico no servidor para feed de vídeo de múltiplos clientes

Requisitos de hardware

  • ESP32-CAM (módulo AI Thinker ou placa compatível)
  • Motor e servo conectados aos pinos GPIO apropriados
  • Fonte de alimentação estável de 5V para o ESP32-CAM
  • Opcional: cartão SD para recursos adicionais
  • Rede Wi-Fi para comunicação

Materiais

  • Todos os kits podem ser comprados no aliexpress
  • Chassi do carro, controlador eletrônico de velocidade, suporte de bateria, células 18650 ou pack de bateria 7.4v, ESP32-CAM, gamepad Bluetooth (usando controle de PS4)

Requisitos de software

Código ESP32
Bibliotecas
  • WiFi.h: conexão Wi-Fi
  • ArduinoWebsockets.h: comunicação WebSocket
  • esp_camera.h: controle da câmera do ESP32-CAM
  • ServoControl.h e Esc.h: controle do servo e do motor
  • Arduino.h: funções padrão do Arduino
Servidor Python
Dependências
  • Instale as seguintes bibliotecas Python: aiohttp, opencv-python, numpy

Configuração

Firmware do ESP32
  1. Edite o arquivo secrets.h para incluir as credenciais de Wi-Fi e a URL do servidor WebSocket
  2. Verifique se os pinos GPIO do módulo de câmera, do motor e do servo correspondem à configuração do hardware
Servidor Python
  1. Coloque o script do servidor no diretório junto com o arquivo index.html para a interface web
  2. Inicie o servidor: python3 server.py

Como usar

ESP32
  1. Use a Arduino IDE ou uma plataforma compatível para enviar o sketch fornecido ao ESP32-CAM
  2. Monitore a saída serial para confirmar que a conexão com o Wi-Fi e com o servidor WebSocket foi estabelecida com sucesso
Servidor
  1. Execute o script do servidor Python
  2. Abra a interface web no navegador para ver o stream de vídeo em tempo real
  3. Envie comandos de controle pela conexão WebSocket

Comandos WebSocket

  • MOTOR:<speed>: define a velocidade do motor (-255 a 255)
  • SERVO:<angle>: define o ângulo do servo (0 a 180)
  • CONTROL:<speed>:<angle>: controla ao mesmo tempo a velocidade do motor e o ângulo do servo

Detalhes técnicos

Inicialização do ESP32
  • Wi-Fi: conecta à rede Wi-Fi especificada
  • Câmera: configura o ESP32-CAM com os ajustes adequados para streaming de vídeo
  • WebSocket: estabelece a conexão WebSocket com o servidor
Tratamento de timeout
  • Se nenhum comando de controle for recebido dentro do período de timeout predefinido, a velocidade do motor é redefinida para 0 e o ângulo do servo para 90
Servidor Python
  • Processa a comunicação WebSocket com vários clientes ESP32
  • Processa os frames de vídeo recebidos e os organiza dinamicamente em uma grade
  • Faz o streaming da grade de frames de vídeo para a interface web

Solução de problemas

Problemas de conexão
  • Verifique as credenciais de Wi-Fi em secrets.h
  • Confirme que o servidor WebSocket está em execução e acessível
Problemas com o stream de vídeo
  • Verifique se o ESP32-CAM está recebendo alimentação adequada
  • Confira as configurações de inicialização da câmera

Licença

  • Este projeto é oferecido como open source sob a licença MIT

Contribuição

  • Issues e pull requests para melhorar o aplicativo são bem-vindos

1 comentários

 
GN⁺ 2025-02-03
Comentários do Hacker News
  • Há 12 anos, numa época em que existia Arduino mas não ESP32, usei um celular HTC Magic como câmera e transmissor Wi‑Fi, conectando-o ao Arduino para controlar servos e LEDs RGB. A conexão não era estável, mas foi divertido.

    • Obrigado por compartilhar o projeto; quero revivê-lo com microcontroladores da próxima geração.
    • Obrigado pelo feedback sobre o projeto; quero continuar e adoraria ver PRs.
    • Se você gostou do projeto, seria legal me indicar para alguém que esteja procurando um desenvolvedor remoto. Sou desenvolvedor Ruby-on-Rails, mas também estou considerando trabalhar com robótica.
  • Se você tem interesse em automatização de carros RC, é uma leitura divertida. O material é de alguns anos atrás, mas hoje em dia pode haver maneiras mais fáceis.

  • Antes de comprar um ESP32 CAM, vale considerar um com antena externa. Vi conselhos no Reddit sobre problemas de taxa de quadros.

  • Recentemente fiz um projeto parecido usando Rust e um Steam Deck.

  • O grande problema do FPV é a latência, e fiquei curioso sobre a latência deste projeto.

  • Controlei um tanque RC movido por ESP32 com um controle de PlayStation 4 via Bluetooth.

    • O software básico começa com cerca de 20 linhas de código em C e usa uma biblioteca de controle Bluetooth.
    • Com os dois sticks, dá para controlar as duas esteiras em baixa velocidade, mas em alta velocidade é preciso outro método de controle.
    • Implementei controle direto das esteiras com limite de rpm usando os "gatilhos" do controle DualShock.
    • Em alta velocidade, o stick esquerdo serve para o acelerador e o direito para a direção, permitindo dirigir como um carro RC comum.
    • Compartilhei um vídeo do modelo impresso em 3D que usei.
  • No AliExpress, um bom carro RC de 2,5 polegadas custa US$ 30, e uma câmera analógica 5.8 GHz independente custa US$ 25.

    • Informação para quem está mais interessado no resultado do que em apenas um projeto divertido.
  • Estou pensando em um projeto parecido e queria saber como foi a experiência com a latência. Quero saber se dá para controlar remotamente olhando o feed de vídeo. Parece que a latência seria um problema para desviar de obstáculos.

  • Queria fazer um brinquedo para gato que evitasse obstáculos automaticamente. Este projeto talvez seja uma base melhor do que a que eu havia escolhido antes.