3P by GN⁺ | ★ favorite | 댓글 1개
  • ESP32 RC Cars는 ESP32-CAM 기반 원격 조종 카메라 시스템으로, WebSocket을 통해 실시간 영상 스트리밍과 모터·서보 제어를 함께 구현함
  • Python 서버 애플리케이션이 WebSocket 통신을 관리하고, 브라우저에서 ESP32 장치의 영상을 보고 제어할 수 있는 웹 인터페이스를 제공함
  • 주요 기능은 ESP32-CAM의 라이브 비디오 스트리밍, WebSocket 명령 기반 모터·서보 제어, 제어 명령 미수신 시 기본 상태로 되돌리는 자동 타임아웃, 다중 클라이언트 영상 캔버스임
  • 하드웨어는 AI Thinker 또는 호환 ESP32-CAM, GPIO에 연결된 모터·서보, 안정적인 5V 전원, Wi-Fi 네트워크가 필요하며 SD 카드는 선택 사항임
  • 제어 명령은 MOTOR:<speed>, SERVO:<angle>, CONTROL:<speed>:<angle> 형식이며, 서버는 여러 ESP32 클라이언트의 영상 프레임을 격자로 배치해 웹 인터페이스로 스트리밍함

프로젝트 개요

  • ESP32 RC Cars는 ESP32 기반 원격 조종 카메라 시스템 예제임
  • ESP32-CAM이 실시간 영상을 WebSocket으로 전송하고, 모터와 서보는 WebSocket 명령으로 제어됨
  • Python 서버 애플리케이션은 WebSocket 통신을 관리하고, 웹 인터페이스에서 ESP32 장치를 보고 제어할 수 있게 함
  • 데모 영상: https://youtu.be/OubYFXmvA1E

주요 기능

  • ESP32-CAM에서 웹 서버로 라이브 비디오 스트리밍을 전송함
  • WebSocket 명령으로 모터와 서보를 원격 제어함
  • 일정 시간 동안 제어 명령이 없으면 모터와 서보가 기본 상태로 자동 복귀함
  • 서버는 여러 클라이언트의 영상 피드를 동적으로 캔버스에 배치함

하드웨어와 재료

  • 필요한 하드웨어
    • ESP32-CAM, AI Thinker 모듈 또는 호환 보드
    • 적절한 GPIO 핀에 연결된 모터와 서보
    • ESP32-CAM용 안정적인 5V 전원
    • 통신용 Wi-Fi 네트워크
    • 다른 기능에 필요한 경우 선택적으로 SD 카드
  • 사용 재료는 AliExpress에서 구매한 키트 구성품임
    • 차체 섀시
    • 전자 속도 제어기
      • 30A 버전을 사용했으며, BEC 출력이 5V 3A라 ESC와 서보를 구동하기에 충분한 전류로 보였음
    • 배터리 홀더
    • 2개의 18650 3.6V 셀 또는 7.4V 배터리 팩
      • 둘 다 사용했으며, 셀은 다른 프로젝트에 더 유연하게 쓸 수 있음
    • ESP32-CAM
      • 외부 안테나가 있는 모델이 매우 중요하며, 170도 어안 카메라를 사용함
    • Bluetooth Gamepad
      • PS4 컨트롤러를 사용함

배선 방식

  • 차체 섀시에 포함된 서보의 3핀 JST 어댑터를 제거하고, ESP32에 연결할 수 있도록 4핀 JST 플러그로 옮김
  • 서보의 양극·음극 리드를 이어 붙이고, 크림핑 도구로 3핀 암 JST 플러그를 추가함
  • ESC의 흰색 제어선을 4핀 JST 플러그와 3핀 암 플러그에 연결함

소프트웨어 구성

  • ESP32 코드에서 사용하는 라이브러리
    • WiFi.h: Wi-Fi 연결
    • ArduinoWebsockets.h: WebSocket 통신
    • esp_camera.h: ESP32-CAM 카메라 제어
    • ServoControl.h, Esc.h: 서보와 모터 제어
    • Arduino.h: 표준 Arduino 함수
  • Python 서버 의존성은 다음 명령으로 설치함
sudo apt install python3-aiohttp python3-opencv python3-numpy

설정과 실행

  • ESP32 펌웨어 설정
    • secrets.h에 Wi-Fi 자격 증명과 WebSocket 서버 URL을 설정함
#define WIFI_SSID "YourWiFiSSID"
#define WIFI_PASSWORD "YourWiFiPassword"
#define WS_SERVER_URL "ws://YourServerIP:Port"
  • 카메라 GPIO 핀은 AI Thinker ESP32-CAM 보드용으로 미리 설정되어 있음
  • 필요하면 모터와 서보 핀을 하드웨어 구성에 맞게 수정함
  • Python 서버 설정
    • 서버 스크립트를 웹 인터페이스용 index.html 파일과 같은 디렉터리에 둠
    • 다음 명령으로 서버를 실행함
python3 app.py

사용법과 WebSocket 명령

  • ESP32 사용 절차
    • Arduino IDE 또는 호환 플랫폼으로 제공된 스케치를 ESP32-CAM에 업로드함
    • 직렬 출력을 확인해 Wi-Fi와 WebSocket 서버 연결이 성공했는지 확인함
  • 서버 사용 절차
    • Python 서버 스크립트를 실행함
    • 브라우저에서 웹 인터페이스를 열어 라이브 영상 스트림을 봄
    • WebSocket 연결을 통해 제어 명령을 보냄
  • 지원 명령
    • MOTOR:<speed>: 모터 속도 설정, 범위는 -255부터 255
    • SERVO:<angle>: 서보 각도 설정, 범위는 0부터 180
    • CONTROL:<speed>:<angle>: 모터 속도와 서보 각도를 동시에 제어함

동작 세부사항과 문제 해결

  • ESP32 초기화 단계
    • 지정된 Wi-Fi 네트워크에 연결함
    • 영상 스트리밍에 맞게 ESP32-CAM을 설정함
    • 서버와 WebSocket 연결을 수립함
  • 타임아웃 처리는 일정 시간 동안 제어 명령이 없을 때 모터 속도를 0, 서보 각도를 90으로 되돌림
  • Python 서버는 여러 ESP32 클라이언트와 WebSocket으로 통신함
  • 서버는 들어오는 영상 프레임을 처리하고, 격자 형태로 동적으로 배치한 뒤 웹 인터페이스로 스트리밍함
  • 연결 문제가 있으면 secrets.h의 Wi-Fi 자격 증명을 확인하고, WebSocket 서버가 실행 중이며 접근 가능한지 확인함
  • 영상 스트림 문제가 있으면 ESP32-CAM 전원이 적절한지와 카메라 초기화 설정을 확인함
  • 프로젝트는 MIT License로 공개됨

댓글과 토론

Hacker News 의견들
  • Arduino는 있었지만 ESP32는 없던 12년 전에 비슷한 걸 만든 적 있음: https://newton-net-pl.translate.goog/2012/01/robot/?_x_tr_sl...
    오래된 HTC Magic 휴대폰을 카메라+와이파이 송신기로 쓰고, 직렬 포트와 레벨 시프터로 Arduino에 연결해 서보와 RGB LED를 제어했음
    연결이 아주 안정적이진 않았지만 꽤 재미있었고, 이제는 다음 세대 마이크로컨트롤러로 프로젝트를 되살려볼 때일지도 모르겠음
  • 프로젝트 피드백 고맙고, 계속 이어가고 싶으며 PR도 받아보고 싶음
    프로젝트가 마음에 든다면 원격 개발자를 찾는 사람에게 소개해주면 가장 큰 도움이 됨
    본업은 Ruby on Rails 개발자지만 로보틱스 일도 고려할 수 있음
  • ESP32 CAM을 사기 전에 외장 안테나가 있는 모델을 고려하는 게 좋음
    이 글을 읽어볼 만함: https://www.reddit.com/r/esp32/comments/r7kqtt/esp32cam_supe...
    몇 가지 조언을 적용하기 전까지는 프레임률이 꽤 나빴음
    • 라우터 관리자 페이지 기준으로, 저항을 다시 납땜하고 안테나를 연결하자마자 불안정한 1Mbps에서 안정적인 20Mbps로 바로 올라감
      0Ω 저항을 다시 납땜하는 건 거의 모험 같았지만 어쨌든 올바른 핀에 연결했고, 결과는 이렇게 생김: https://imgur.com/a/LJflZ80
    • 이 프로젝트를 해본 경험으로는 외장 안테나가 필수에 가까웠음
      사용한 안테나 링크를 README에 추가했음
    • 정확한 모델을 추천해줄 수 있음?
  • 멋짐. ESP32로 구동되는 무한궤도 RC 탱크를 만들었고, Bluetooth로 PlayStation 4 컨트롤러에 연결해 조종했음
    기본 소프트웨어는 Bluetooth 컨트롤러 라이브러리를 쓰면 C 코드 20줄 정도로 쉽게 시작 가능함
    이후 조작을 쉽게 하려고 기능을 추가했는데, 트랙 2개를 스틱 2개로 제어하는 방식은 저속에서는 괜찮지만 드론 모터 2개를 써서 거의 20km/h까지 나가다 보니 다른 제어 방식이 필요했음
    결국 DualShock 컨트롤러의 트리거로 회전수 제한이 걸린 직접 트랙 제어를 하고, 고속 주행에서는 왼쪽 스틱 위/아래를 가속, 오른쪽 스틱 좌/우를 조향으로 써서 일반 RC 자동차처럼 운전되게 만들었음
    기반으로 쓴 같은 3D 프린트 모델의 영상이고, 00:50부터 속도가 잘 보임: https://www.youtube.com/watch?v=3Mv_tDY89Zw
    • 정말 인상적임
      RC 제작은 잘 모르는데, 보통 어떻게 제어함? PS4 컨트롤러를 ESP에 직접 연결하는 방식인가?
  • FPV의 큰 문제이자 오랫동안 아날로그 기술에 머물렀던 이유는 지연시간임
    이 프로젝트의 지연시간은 어느 정도인지 궁금함
    • 요즘 FPV는 대체로 ExpressLRS[0]를 쓰는데, FPV 쿼드콥터의 제어 링크를 위한 공개 프로토콜이고 보통 ESP32도 사용함
      반면 FPV 쿼드콥터의 영상은 나뉘어 있음. 일부는 신호가 끊길 때 완전 단절 후 재연결이 아니라 점진적으로 나빠진다는 이유로 아날로그를 쓰고, 일부는 802.11 기반 통신을 쓰는데 실제로 꽤 경쟁력 있음
      예를 들어 Walksnail Goggles는 영상 링크에 802.11을 쓰며, 아주 공개적이거나 문서화가 잘 된 건 아니지만 Chris Rosser 작업처럼 내부를 파고드는 사람들도 있음
      이런 구성의 지연시간은 빠른 경쟁용 쿼드콥터 경주에도 충분한 수준으로 보임
      [0] https://www.expresslrs.org
    • 관련 프로젝트: https://github.com/wooky/esp32-analog-video-over-wifi
      그리고: https://github.com/gyrex/CrystalVideo
    • FPV 드론 경험처럼 비교할 기준은 없지만, 집 안 무선 네트워크에서는 다른 가정용 기기들이 모두 연결된 상태에서도 지연시간이 문제가 되지 않았음
      프레임률은 대체로 ESP32가 이미지를 얼마나 빨리 캡처할 수 있는지에 제한되는 것 같음
      Python 스크립트에서 FPS를 측정했을 때 ESP32들로부터 약 50fps를 받았고, 최근에는 집 밖에서 시험해보려고 여행용 라우터를 샀음
  • 비슷한 프로젝트를 해볼까 생각 중이라 지연시간 경험이 궁금함
    영상 피드를 보면서 원격 조종이 가능한가? 대부분의 속도에서 장애물 회피를 하기엔 너무 느릴 것 같다는 게 가장 큰 걱정임
  • 작년에 같은 키트를 샀고, 최근에는 작은 디스플레이가 달린 ESP32 게임 컨트롤러도 샀음: https://github.com/01studio-lab/pyController
    시간이 나면 둘을 합쳐서 자동차를 조종하면서 디스플레이로 카메라 피드도 보려고 함
  • 결과물이 더 중요하고 만드는 재미는 덜 중요하다면, 요즘 AliExpress에서 괜찮은 2.5인치 RC 자동차는 30달러, 독립형 5.8GHz 아날로그 카메라는 25달러면 살 수 있음
    • 독립형이라는 게 일체형 카메라를 말하는 거라면, 내장 VTX가 있는 카메라는 보통 일반 아날로그보다도 더 별로이고 여전히 아날로그 고글이 필요함
      도수 안경이 필요 없거나 콘택트렌즈를 쓰는 사람이라면 DJI O4 ‘lite’와 N3 고글 조합이 훨씬 나은 선택임
  • RC 자동차를 자동화하고 싶다면 재미있게 읽을 만함
    몇 년 전 글이라 지금은 비슷한 결과를 더 쉽거나 더 나은 방식으로 낼 수 있을지도 모름: https://hackaday.com/2021/10/25/fast-indoor-robot-watches-ce...
  • 전장에서 쓰이는 FPV 쿼드콥터는 모두 알지만, 지상 차량에도 관심이 점점 커지고 있음
    영화 속 Boston Dynamics 로봇개와 Terminator를 섞은 모습과는 전혀 다르지만, 지뢰 매설, 지뢰 폭파, 전선 어딘가에 숨어 있는 병사에게 소량의 보급품을 나르는 것처럼 눈에 덜 띄는 “지루한” 작업에서 매우 유용함