배선이 끝났지만 아직 Python을 배우지 않은 상태입니다. 차량이 실제로 움직이는지 빨리 확인하면 다음 두 가지 효과가 있습니다.
Auto_Car_01)를 만들고, 스마트폰만 그 Wi-Fi에 접속하면 됩니다.ESP32-CAM의 Wi-Fi는 두 가지 역할을 할 수 있습니다.
| 모드 | 의미 | 본 프로젝트에서 |
|---|---|---|
| AP (Access Point) | 자기가 직접 Wi-Fi를 만들어 다른 기기를 받음 | 단계 3 (이번) |
| STA (Station) | 다른 Wi-Fi에 손님으로 접속 | 단계 4 이후 |
Auto_Car_01 (ESP32가 만든 Wi-Fi)
↓
┌──────────┴──────────┐
│ │
ESP32-CAM 스마트폰
(192.168.4.1) (192.168.4.x)
스마트폰 ──[ http://192.168.4.1/drive ]──→ ESP32-CAM
←──── HTML 페이지 ─────────────
스마트폰 ──[ http://192.168.4.1/move?speed=100&steering=90 ]──→ ESP32
←──── {"speed":100,"steering":90} ─────────────
192.168.4.1로 고정. 외워두면 편합니다.HTTP GET: "페이지를 가져다 줘" 요청
쿼리 문자열: 주소 뒤에 ?key=value&key2=value2 형태로 추가 정보 전달
| URL | 포트 | 의미 |
|---|---|---|
/ 또는 /drive | 80 | 조종 페이지(HTML) 받기 |
/move?speed=100&steering=90 | 80 | 속도 100, 조향 90으로 명령 |
/stop | 80 | 즉시 정지 + 수동 모드로 복귀 |
/mode?m=manual|avoid|patrol|follow | 80 | 자율주행 모드 전환 |
/distance | 80 | 마지막 측정 거리(cm). 999면 측정 불가 |
/stream | 81 | MJPEG 영상 스트림 (별도 포트) |
/move, /distance 같은 짧은 명령이 끊기지 않습니다.esp32_cam_phone_drive.ino의 DRIVE_HTML[]를 펼쳐 보면 페이지 전체가 C 문자열로 들어있습니다.
펌웨어 (.ino) │ ├─ HTML 한 덩어리 ───→ 브라우저에 그대로 송신 ├─ JavaScript 한 덩어리 (페이지에 포함) └─ 모터 제어 함수
| 안전장치 | 동작 |
|---|---|
| 속도 상한 | 최대 ±200 (펌웨어에서 강제) |
| 조향 범위 제한 | 45° ~ 135° (벗어난 값은 잘라냄) |
| 통신 끊김 자동 정지 | 0.8초간 명령이 없으면 자동으로 정지 (워치독) |
| /stop 즉시 모드 복귀 | 자율주행 중에도 /stop 호출 시 수동 모드로 강제 전환 |
| 회피 K-턴 시퀀스 | 자율 모드에서 장애물 발견 시 정지 → 후진 → 정지 → 전진 단계로 안전 회피 |
자율주행 모드(회피·순찰·따라가기)와 화면의 거리 뱃지(📏 cm)는 HC-SR04가 있어야 동작합니다. 단계 2의 기본 배선에 다음 4선을 추가하세요.
| HC-SR04 | ESP32-CAM 핀 | 보드 표기 | 비고 |
|---|---|---|---|
| VCC | 3.3V | 3V3 | 5V가 모터·서보에 점유돼도 깔끔. 일부 모듈은 5V가 더 안정적 |
| GND | IO0 옆 GND | GND | ⚠️ ESP32-CAM은 GND 핀이 3개 있는데 IO0 바로 옆 GND를 권장. 다른 GND에 꽂으면 부팅 루프 발생 사례 있음 |
| TRIG | GPIO 4 | IO4 | 보드의 흰색 플래시 LED와 공유. 측정 펄스가 10µs로 매우 짧아 점등은 보이지 않음 |
| ECHO | GPIO 2 | IO2 | 부팅 strapping 핀이지만 입력 사용은 부팅 후라 무관 |
[ESP32-CAM 안테나 쪽 핀헤더] 3V3 ← HC-SR04 VCC IO16 ← (사용 안 함) IO0 ← (다운로드 모드용 / 사용 안 함) GND ← HC-SR04 GND ★ 이 GND를 사용 (IO0 옆) ★ 5V ← (배터리 +) IO13 ← 모터 IN1 IO12 ← 모터 PWM (ENA) IO14 ← 서보 신호선 IO15 ← 모터 IN2 IO2 ← HC-SR04 ECHO ⬇ 바로 옆! IO4 ← HC-SR04 TRIG ⬆
파일 → 환경설정 → 추가 보드 매니저 URL
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
스케치 → 라이브러리 포함 → 라이브러리 관리 → ESP32Servo 검색 → 설치const char *ap_ssid = "Auto_Car_01"; const char *ap_password = ""; // 개방형 (비밀번호 없음)
Auto_Car_01을 누르면 비밀번호 입력 없이 바로 접속됩니다."Auto_Car_07", "Auto_Car_12" 등.AP 활성 — SSID: Auto_Car_01
보안: 개방형 (비밀번호 없음)
채널: 1
AP IP: 192.168.4.1
[스마트폰 사용 절차]
1) 폰 Wi-Fi 설정 → "Auto_Car_01" 선택
2) 비밀번호 없음 — 바로 연결됨 (개방형)
3) 브라우저로 http://192.168.4.1/ 접속
Auto_Car_01 선택 — 비밀번호 입력 화면 없이 바로 연결됨http://192.168.4.1┌────────────────────────────────────┐ │ [ 영상 스트림 (포트 81) ] │ │ ●연결됨 📏 32 cm 3Hz │ ├────────────────────────────────────┤ │ 최대 속도 ─────●───── 100 │ │ 조향 폭 ──●──────── 30 │ │ 조향 중심 [−] 90 [+] [↺ 90] │ │ [🔘 버튼 조향] [🎯 기울기 조향] │ │ [🛑수동][🚧회피][👮순찰][🐕따라] │ │ ▲ │ │ ◀ 정지 ▶ │ │ ▼ │ └────────────────────────────────────┘
반드시 다음 순서로:
🛑 수동으로 (기본값)◀ ▶ 버튼을 짧게 눌러 서보가 좌·우로 도는지 확인최대 속도를 50으로 줄이고 ▲ 버튼을 살짝 눌러 바퀴가 도는지 확인▼(후진), 정지 버튼 → 즉시 정지 확인조향 중심의 −/+로 조정 (저장됨)브라우저 주소창에 IP를 입력해 페이지를 띄우고, 다음을 캡처해 제출:
바퀴 공중 띄움 상태에서 다음을 확인:
미션 — 바닥에 내려놓고 직선 1m → 좌회전 → 직선 1m → 정지 코스를 완주.
브라우저 주소창에 직접 입력해도 차량이 반응하는지 확인:
http://192.168.4.1/move?speed=80&steering=110 http://192.168.4.1/stop http://192.168.4.1/distance http://192.168.4.1/mode?m=avoid http://192.168.4.1/mode?m=manual
도전 질문
speed=300처럼 큰 값을 보내면? (펌웨어가 자른다)/move를 보내면? (무시 + 워치독만 갱신)| 조작 | 동작 |
|---|---|
− 짧게 탭 | -1° (좌측으로 중심 이동) |
+ 짧게 탭 | +1° (우측으로 중심 이동) |
| 버튼 길게 누름 | 0.4초 후 자동 반복 (100ms 간격) |
↺ 90 | 기본값(90°) 복귀 |
값은 localStorage에 저장 — 페이지 새로고침 후에도 유지됩니다. 범위: 70° ~ 110°로 자동 클램프.
🎯 기울기 조향 버튼 탭 → iOS는 권한 팝업 → "허용"γ-12° β3° ◀ 서보78° 같은 진단 라인이 뜨면 정상chrome://flags → "Insecure origins treated as secure" → Enabled → http://192.168.4.1 추가 → Relaunch| 모드 | 동작 |
|---|---|
| 🛑 수동 | 사용자가 D-pad·기울기로 모든 조작 (기본) |
| 🚧 회피 | 직진하다가 18cm 이하 장애물 → 정지 → 후진(서보 우) → 정지 → 전진(서보 좌)으로 우회. Ackermann K-턴 |
| 👮 순찰 | 회피와 동일하지만 회전 방향이 좌·우 교대 (지그재그 순찰) |
| 🐕 따라가기 | 18~35cm를 적정 거리로 보고, 가까우면 후진, 멀면 전진. 120cm 이상은 "대상 놓침" → 정지 |
정지 버튼은 모드와 무관하게 항상 즉시 수동 모드로 복귀됩니다.| 증상 | 점검 |
|---|---|
Wi-Fi 목록에 Auto_Car_01 없음 | ESP32 전원 확인, 시리얼에 "AP 활성" 메시지 떴는지 확인, 폰 Wi-Fi 새로고침 |
| 비밀번호 입력 화면이 뜸 | 펌웨어의 ap_password가 8자 이상으로 들어감 → 빈 문자열 ""로 변경 후 재업로드 |
| 접속은 되는데 페이지 안 뜸 | URL이 정확히 http://192.168.4.1/인지 (https 아님!) |
| 페이지는 뜨는데 영상 X | ESP32 발열·전원 부족 (5V 2A 권장), 전원선 다시 꽂아 보기 |
| 슬라이더 움직여도 차 반응 없음 | 시리얼 모니터에서 명령 수신 로그 확인, 모터 결선 점검 |
| 거리 뱃지가 항상 📏 ∞ | HC-SR04 미설치 / VCC·GND 배선 점검 / TRIG=GPIO4, ECHO=GPIO2 확인 |
| HC-SR04 연결 시 부팅 무한 루프 | GND 핀 위치 변경 — IO0 옆 GND를 사용 |
| 거리값이 들쭉날쭉 | 평평한 벽으로 테스트. VCC를 3.3V→5V로 바꾸면 안정될 때도 있음 |
| 직진이 한쪽으로 쏠림 | 활동 2.5-D의 조향 중심 트림으로 보정. localStorage에 저장되므로 한 번만 |
| 기울기 모드에서 "신호 없음" | 활동 2.5-E의 chrome flag 가이드 참고 (Android) / 설정 → Safari → 모션 액세스 ON (iOS) |
자세한 트러블슈팅은 문제해결.md 참고.
| 개념 | 설명 |
|---|---|
| 웹서버 | 주소 입력 시 페이지를 보내주는 프로그램. ESP32-CAM 자체가 두 개(80, 81)를 동시에 돌린다 |
| HTTP GET | "페이지를 가져다 줘" 요청 방식 |
| 쿼리 문자열 | URL 끝의 ?key=value — 추가 정보 전달 |
| MJPEG | 프레임을 JPEG로 압축해 연속 송신 |
| 워치독(Watchdog) | 통신이 끊기면 자동 안전 동작 |
| AP(접속점) | Wi-Fi 신호를 만들어주는 장치 (공유기/핫스팟) |
| HC-SR04 | 초음파 거리 센서. 음파 왕복 시간으로 cm 환산 (0.0343/2) |
| Ackermann K-턴 | 앞바퀴 조향 차량이 좁은 공간에서 후진·전진을 결합한 방향 전환 동작 |
| localStorage | 브라우저 안의 영구 저장소. 새로고침해도 값이 유지됨 |
| 항목 | esp32_cam_phone_drive.ino (이번 단계) | esp32_cam.ino (단계 4 이후) |
|---|---|---|
| Wi-Fi 역할 | AP (자체 송출) | STA (다른 Wi-Fi에 접속) |
| 조종 방법 | 스마트폰 웹페이지 | Python UDP |
| HTML UI | ✅ 펌웨어 안에 내장 | ❌ 없음 |
| UDP 수신 | ❌ 없음 | ✅ 포트 4210 |
| 안전 워치독 | ✅ 0.8초 | ❌ Python에 의존 |
| 자율주행 | ✅ 회피·순찰·따라가기 (펌웨어 내장) | ❌ Python이 담당 (단계 8~9) |
| 사용 시점 | 단계 3만 | 단계 4~9 |
노트북이 만든 핫스팟 "Auto_Car_01"
↓
┌───────────────┴───────────────┐
│ │
ESP32-CAM (STA) 노트북 자기 자신
(DHCP IP, 예: 192.168.137.74) (192.168.137.1)
│
Python 차선 인식
→ UDP 명령 송신
Auto_Car_01, 네트워크 대역 2.4 GHz (ESP32는 5GHz 미지원)const char *ssid = "Auto_Car_01";이 기본값으로 설정되어 있습니다. 노트북 핫스팟에 비밀번호가 있으면 password 자리에 같은 값을 넣고 재업로드하세요.| 항목 | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|
| 웹서버·HTTP의 의미를 한 줄로 설명할 수 있다 | |||||
| 펌웨어를 업로드하고 IP를 확인할 수 있다 | |||||
| 스마트폰으로 차량을 안전하게 조종했다 | |||||
| 첫 주행 안전 수칙을 모두 지켰다 | |||||
| URL 직접 입력으로도 차량을 조작해 보았다 | |||||
| 조향 중심 트림으로 직진을 보정해 보았다 | |||||
| 자율 모드(회피/순찰/따라가기) 중 하나를 시연했다 |
팀원이 운전할 때 안전을 도와준 경험을 적어 봅시다.