ESP32 C3 Super Mini 웹으로 자동차 제어하기

ESP32 C3 Super Mini를 사용하여 웹 브라우저로 로봇 자동차를 운전하는 방법을 배워 봅니다. ESP32 C3 Super Mini에는 WiFi가 이미 내장되어 있으므로 별도의 WiFi 모듈이 필요하지 않습니다. 웹 페이지는 WebSocket으로 보드와 통신하므로 자동차가 즉시 반응합니다.

이 튜토리얼에서 배울 내용:

ESP32 C3 Super Mini - 웹으로 자동차 제어하기

필요한 하드웨어

1×ESP32 C3 Super Mini 아마존
1×USB 케이블 타입-A to 타입-C (USB-A PC용) 쿠팡 | 아마존
1×USB 케이블 타입-C to 타입-C (USB-C PC용) 아마존
1×2WD RC Car 쿠팡 | 아마존
1×L9110S 모터 드라이버 모듈 쿠팡 | 아마존
1×IR 리모컨 키트 아마존
1×CR2025 배터리 (IR 리모컨용) 아마존
1×1.5V AA Battery (for ESP32 C3 Super Mini and Car) 아마존
1×점퍼케이블 쿠팡 | 아마존
1×브레드보드 쿠팡 | 아마존
공개: 이 포스팅 에 제공된 일부 링크는 아마존 제휴 링크입니다. 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

2WD RC카와 WebSocket 소개

2WD RC카는 DC 모터 2개가 달린 작은 로봇 자동차이고, WebSocket은 자동차를 실시간으로 움직이게 하는 연결 방식입니다.

2WD RC카의 주요 특징:

  • DC 모터 2개: 왼쪽 바퀴용 모터 하나, 오른쪽 바퀴용 모터 하나
  • 간단한 조향: 모터 하나만 돌려서 자동차가 방향을 바꿉니다
  • 모터 드라이버 필요: 모터는 반드시 L9110S 모듈로 구동해야 하며, GPIO 핀에 직접 연결하면 안 됩니다
  • 배터리 전원: 1.5V AA 배터리 4개가 모터와 보드에 6V를 공급합니다

일반 웹 페이지가 아닌 WebSocket을 사용하는 이유:

  • 페이지 새로 고침 없음: WebSocket이 없으면 움직일 때마다 페이지를 새로 고쳐야 합니다. 불편하죠!
  • 항상 열려 있는 연결: WebSocket은 웹 페이지와 ESP32 C3 Super Mini 사이에 하나의 연결을 계속 열어 둡니다
  • 백그라운드 명령: 페이지가 새로 고침 없이 조용히 명령을 보냅니다
  • 실시간 반응: 버튼을 누르는 즉시 로봇 자동차가 반응합니다
  • 양방향: ESP32 C3 Super Mini도 페이지로 데이터를 보낼 수 있습니다

요컨대, WebSocket 연결 덕분에 ESP32 C3 Super Mini 자동차가 부드럽고 즉각적으로 움직입니다.

작동 원리

ESP32 C3 Super Mini 코드는 웹 서버와 WebSocket 서버를 함께 시작합니다. 흐름은 다음과 같습니다:

  • 웹 브라우저에 ESP32 C3 Super Mini의 IP 주소를 입력합니다
  • 웹 서버가 페이지 내용(HTML, CSS, JavaScript)을 보내 줍니다
  • 브라우저에 화살표 버튼이 있는 제어 페이지가 표시됩니다
  • 페이지의 JavaScript가 ESP32 C3 Super Mini에 WebSocket 연결을 엽니다
  • 버튼을 누르거나 놓으면 JavaScript가 작은 명령 번호를 보냅니다
  • WebSocket 서버가 명령을 읽고 L9110S 모듈을 통해 자동차를 구동합니다

아래 표는 사용자의 동작에 따라 웹 페이지가 ESP32 C3 Super Mini로 보내는 명령 목록을 보여줍니다:

사용자 동작 버튼 명령 자동차 동작
누름 UP 1 앞으로 이동
누름 DOWN 2 뒤로 이동
누름 LEFT 4 왼쪽으로 회전
누름 RIGHT 8 오른쪽으로 회전
누름 STOP 0 정지
놓음 UP 0 정지
놓음 DOWN 0 정지
놓음 LEFT 0 정지
놓음 RIGHT 0 정지
놓음 STOP 0 정지

2WD RC카와 ESP32 C3 Super Mini 간의 배선도

GPIO 핀 4개가 L9110S 모터 드라이버에 연결되며, 모터당 2개의 핀을 사용합니다.

ESP32 C3 Super Mini 2wd rc카 배선도

이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.

L9110S 핀 ESP32 C3 Super Mini 핀
A-IA GPIO5
A-IB GPIO6
B-IA GPIO7
B-IB GPIO10
GND GND
  • 참고: ESP32 C3 Super Mini는 3.3V에서만 동작합니다. 5V 또는 6V 선을 GPIO 핀에 절대 연결하지 마세요.
  • 참고: L9110S의 신호 핀은 ESP32 C3 Super Mini의 3.3V 레벨로도 문제없이 동작합니다.
  • 참고: 모터를 GPIO 핀에 직접 연결하지 마세요. 모터는 핀이 공급할 수 있는 것보다 훨씬 많은 전류가 필요합니다.
  • 참고: GPIO8과 GPIO9는 부트 핀이고, GPIO20/GPIO21은 시리얼 모니터용 UART입니다. 이 핀들은 비워 두세요.

L9110S 모듈(모터 드라이버 역할)은 VCC와 GND 핀으로 모터에 직접 전원을 공급하며, 온보드 5V 레귤레이터가 없습니다. 따라서 하나의 전원, 즉 1.5V 배터리 4개로 만든 총 6V로 모든 것에 전원을 공급할 수 있습니다. 방법은 다음과 같습니다:

  • 6V 배터리를 L9110S 모듈의 VCC와 GND 핀에 연결하여 모터에 전원을 공급합니다.
  • 같은 6V 배터리를 ESP32 C3 Super Mini의 5V와 GND 핀에 연결하여 온보드 레귤레이터를 통해 보드에 전원을 공급합니다.
  • L9110S 모듈과 ESP32 C3 Super Mini가 GND를 공유하도록 합니다.

L298N과 달리 L9110S에는 ENA/ENB 활성화 점퍼나 12V 스크류 터미널이 없으므로 배선이 더 간단합니다.

WARNING

  • ESP32 C3 Super Mini에 배터리와 USB Type-C 케이블로 동시에 전원을 공급하지 마세요.
  • 3.3V 핀에 6V를 넣지 마세요. 이 핀은 레귤레이터의 출력이며 입력이 아닙니다.

2WD RC카에는 전원 스위치가 있으므로, 원한다면 스위치를 통해 배터리를 연결하여 자동차의 전원을 켜고 끌 수 있습니다. 간단하게 만들고 싶다면 스위치는 무시해도 됩니다.

ESP32 C3 Super Mini 코드

웹 페이지의 내용(HTML, CSS, JavaScript)은 index.h 파일에 따로 저장됩니다. 따라서 Arduino IDE에는 두 개의 코드 파일이 있습니다:

  • 웹 서버와 WebSocket 서버를 만들고 자동차를 제어하는 ESP32 C3 Super Mini 코드인 .ino 파일
  • 웹 페이지의 내용이 들어 있는 .h 파일

이 코드가 하는 일:

  • WiFi 연결: ESP32 C3 Super Mini가 집의 WiFi 네트워크에 연결됩니다
  • 페이지 제공: 요청하는 모든 브라우저에 제어 페이지를 보냅니다
  • WebSocket 열기: WebSocket 서버가 81번 포트에서 버튼 명령을 기다립니다
  • 모터 구동: 각 명령에 따라 L9110S의 4개 핀을 HIGH 또는 LOW로 설정합니다
  • IP 출력: 시리얼 모니터에 브라우저에서 열어야 할 주소가 표시됩니다

빠른 단계

다음의 짧은 단계를 따라 자동차를 움직여 보세요.

  • ESP32 C3 Super Mini가 처음이신가요? 먼저 ESP32 C3 슈퍼 미니 - 시작하기 튜토리얼을 완료하여 개발 환경을 설정하세요.
  • 배선하기: 위의 배선도에 표시된 대로 부품을 연결합니다.
  • 연결하기: USB Type-C 케이블로 ESP32 C3 Super Mini를 컴퓨터에 연결합니다.
  • IDE 열기: 컴퓨터에서 Arduino IDE를 실행합니다.
  • 보드 선택: Tools > Board에서 ESP32 C3 Super Mini가 선택되어 있는지 확인하고, 올바른 COM 포트를 선택합니다.
  • 라이브러리 매니저 열기: Arduino IDE 왼쪽 탐색 바의 Library Manager 아이콘을 클릭합니다.
  • 라이브러리 찾기: “DIYables ESP32 WebServer”를 검색한 다음, DIYables가 만든 Web Server 라이브러리를 찾습니다.
  • 설치하기: Install 버튼을 클릭하여 Web Server 라이브러리를 설치합니다.
  • Search for DIYables ESP32 WebServer created by DIYables.io and click the Install button.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
ESP32C3 Dev Module
Library Manager
Type:
All
Topic:
All
DIYables ESP32 WebServer by DIYables.io
DIYables ESP32 WebServer library designed for ESP32 boards. It includes multi-page web server capabilities and WebSocket support for real-time communication, perfect for IoT projects and DIYables ESP32 boards. More info
1.0.1
INSTALL
Newbiely.ino
···
1 void setup() {
Output
Serial Monitor
Ln 1, Col 1
ESP32C3 Dev Module on COM15
1
  • 새 스케치: 새 스케치를 만들고 이름을 지정합니다. 예: newbiely.com.ino
  • 코드 붙여넣기: 아래 코드를 복사하여 Arduino IDE로 엽니다.
/* * 이 ESP32 C3 Super Mini 코드는 newbiely.kr 에서 개발되었습니다 * 이 ESP32 C3 Super Mini 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/esp32-c3/esp32-c3-super-mini-controls-car-via-web */ #include <DIYables_ESP32_WebServer.h> #include "index.h" #define CMD_STOP 0 #define CMD_FORWARD 1 #define CMD_BACKWARD 2 #define CMD_LEFT 4 #define CMD_RIGHT 8 #define MOTOR_A_IA_PIN 5 // The ESP32 C3 SuperMini pin connected to the A-IA pin of the L9110S (Motor A) #define MOTOR_A_IB_PIN 6 // The ESP32 C3 SuperMini pin connected to the A-IB pin of the L9110S (Motor A) #define MOTOR_B_IA_PIN 7 // The ESP32 C3 SuperMini pin connected to the B-IA pin of the L9110S (Motor B) #define MOTOR_B_IB_PIN 10 // The ESP32 C3 SuperMini pin connected to the B-IB pin of the L9110S (Motor B) // WiFi credentials const char WIFI_SSID[] = "YOUR_WIFI_SSID"; const char WIFI_PASSWORD[] = "YOUR_WIFI_PASSWORD"; // Create web server instance DIYables_ESP32_WebServer server; DIYables_ESP32_WebSocket* webSocket; // Web Page handlers void handleHome(WiFiClient& client, const String& method, const String& request, const QueryParams& params, const String& jsonData) { server.sendResponse(client, HTML_CONTENT); // HTML_CONTENT is from index.h } // WebSocket event handlers void onWebSocketOpen(net::WebSocket& ws) { Serial.println("New WebSocket connection"); // Send welcome message const char welcome[] = "Connected to ESP32 WebSocket Server!"; } void onWebSocketMessage(net::WebSocket& ws, const net::WebSocket::DataType dataType, const char* message, uint16_t length) { String angle = String(message); int command = angle.toInt(); Serial.print("command: "); Serial.println(command); switch (command) { case CMD_STOP: Serial.println("Stop"); CAR_stop(); break; case CMD_FORWARD: Serial.println("Move Forward"); CAR_moveForward(); break; case CMD_BACKWARD: Serial.println("Move Backward"); CAR_moveBackward(); break; case CMD_LEFT: Serial.println("Turn Left"); CAR_turnLeft(); break; case CMD_RIGHT: Serial.println("Turn Right"); CAR_turnRight(); break; default: Serial.println("Unknown command"); } } void onWebSocketClose(net::WebSocket& ws, const net::WebSocket::CloseCode code, const char* reason, uint16_t length) { Serial.println("WebSocket client disconnected"); } void setup() { Serial.begin(115200); delay(1000); pinMode(MOTOR_A_IA_PIN, OUTPUT); pinMode(MOTOR_A_IB_PIN, OUTPUT); pinMode(MOTOR_B_IA_PIN, OUTPUT); pinMode(MOTOR_B_IB_PIN, OUTPUT); Serial.println("ESP32 C3 SuperMini Web Server and WebSocket Server"); // Configure web server routes server.addRoute("/", handleHome); // Start web server with WiFi connection server.begin(WIFI_SSID, WIFI_PASSWORD); // Enable WebSocket functionality webSocket = server.enableWebSocket(81); if (webSocket != nullptr) { // Set up WebSocket event handlers webSocket->onOpen(onWebSocketOpen); webSocket->onMessage(onWebSocketMessage); webSocket->onClose(onWebSocketClose); } else { Serial.println("Failed to start WebSocket server"); } } void loop() { // Then handle HTTP requests server.handleClient(); // Handle WebSocket server.handleWebSocket(); } void CAR_moveForward() { digitalWrite(MOTOR_A_IA_PIN, HIGH); digitalWrite(MOTOR_A_IB_PIN, LOW); digitalWrite(MOTOR_B_IA_PIN, HIGH); digitalWrite(MOTOR_B_IB_PIN, LOW); } void CAR_moveBackward() { digitalWrite(MOTOR_A_IA_PIN, LOW); digitalWrite(MOTOR_A_IB_PIN, HIGH); digitalWrite(MOTOR_B_IA_PIN, LOW); digitalWrite(MOTOR_B_IB_PIN, HIGH); } void CAR_turnLeft() { digitalWrite(MOTOR_A_IA_PIN, HIGH); digitalWrite(MOTOR_A_IB_PIN, LOW); digitalWrite(MOTOR_B_IA_PIN, LOW); digitalWrite(MOTOR_B_IB_PIN, LOW); } void CAR_turnRight() { digitalWrite(MOTOR_A_IA_PIN, LOW); digitalWrite(MOTOR_A_IB_PIN, LOW); digitalWrite(MOTOR_B_IA_PIN, HIGH); digitalWrite(MOTOR_B_IB_PIN, LOW); } void CAR_stop() { digitalWrite(MOTOR_A_IA_PIN, LOW); digitalWrite(MOTOR_A_IB_PIN, LOW); digitalWrite(MOTOR_B_IA_PIN, LOW); digitalWrite(MOTOR_B_IB_PIN, LOW); }
  • WiFi 설정: YOUR_WIFI_SSID와 YOUR_WIFI_PASSWORD를 자신의 WiFi 이름과 비밀번호로 변경합니다.
  • 두 번째 파일 추가: 다음과 같이 Arduino IDE에서 index.h 파일을 만듭니다:
    • 시리얼 모니터 아이콘 바로 아래에 있는 버튼을 클릭하고 New Tab을 선택하거나, Ctrl+Shift+N 키를 사용합니다.
    아두이노 ide 2 파일 추가
    • 파일 이름을 index.h로 지정하고 OK 버튼을 클릭합니다
    아두이노 ide 2 index.h 파일 추가
    • 아래 코드를 복사하여 index.h에 붙여넣습니다.
    /* * 이 ESP32 C3 Super Mini 코드는 newbiely.kr 에서 개발되었습니다 * 이 ESP32 C3 Super Mini 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/esp32-c3/esp32-c3-super-mini-controls-car-via-web */ const char *HTML_CONTENT = R"=====( <!DOCTYPE html> <html> <head> <title>ESP32 C3 Super Mini Control Car via Web</title> <meta name="viewport" content="width=device-width, initial-scale=0.7, maximum-scale=1, user-scalable=no"> <style type="text/css"> body { text-align: center; font-size: 24px;} button { text-align: center; font-size: 24px;} #container { margin-right: auto; margin-left: auto; width: 400px; height: 400px; position: relative; margin-bottom: 10px; } div[class^='button'] { position: absolute; } .button_up, .button_down { width:214px; height:104px;} .button_left, .button_right { width:104px; height:214px;} .button_stop { width:178px; height:178px;} .button_up { background: url('https://esp32io.com/images/tutorial/up_inactive.png') no-repeat; background-size: contain; left: 200px; top: 0px; transform: translateX(-50%); } .button_down { background: url('https://esp32io.com/images/tutorial/down_inactive.png') no-repeat; background-size: contain; left:200px; bottom: 0px; transform: translateX(-50%); } .button_right { background: url('https://esp32io.com/images/tutorial/right_inactive.png') no-repeat; background-size: contain; right: 0px; top: 200px; transform: translateY(-50%); } .button_left { background: url('https://esp32io.com/images/tutorial/left_inactive.png') no-repeat; background-size: contain; left:0px; top: 200px; transform: translateY(-50%); } .button_stop { background: url('https://esp32io.com/images/tutorial/stop_inactive.png') no-repeat; background-size: contain; left:200px; top: 200px; transform: translate(-50%, -50%); } </style> <script> var CMD_STOP = 0; var CMD_FORWARD = 1; var CMD_BACKWARD = 2; var CMD_LEFT = 4; var CMD_RIGHT = 8; var img_name_lookup = { [CMD_STOP]: "stop", [CMD_FORWARD]: "up", [CMD_BACKWARD]: "down", [CMD_LEFT]: "left", [CMD_RIGHT]: "right" } var ws = null; function init() { var container = document.querySelector("#container"); container.addEventListener("touchstart", mouse_down); container.addEventListener("touchend", mouse_up); container.addEventListener("touchcancel", mouse_up); container.addEventListener("mousedown", mouse_down); container.addEventListener("mouseup", mouse_up); container.addEventListener("mouseout", mouse_up); } function ws_onmessage(e_msg) { e_msg = e_msg || window.event; // MessageEvent //alert("msg : " + e_msg.data); } function ws_onopen() { document.getElementById("ws_state").innerHTML = "OPEN"; document.getElementById("wc_conn").innerHTML = "Disconnect"; } function ws_onclose() { document.getElementById("ws_state").innerHTML = "CLOSED"; document.getElementById("wc_conn").innerHTML = "Connect"; console.log("socket was closed"); ws.onopen = null; ws.onclose = null; ws.onmessage = null; ws = null; } function wc_onclick() { if(ws == null) { ws = new WebSocket("ws://" + window.location.host + ":81"); document.getElementById("ws_state").innerHTML = "CONNECTING"; ws.onopen = ws_onopen; ws.onclose = ws_onclose; ws.onmessage = ws_onmessage; } else ws.close(); } function mouse_down(event) { if (event.target !== event.currentTarget) { var id = event.target.id; send_command(id); event.target.style.backgroundImage = "url('https://esp32io.com/images/tutorial/" + img_name_lookup[id] + "_active.png')"; } event.stopPropagation(); event.preventDefault(); } function mouse_up(event) { if (event.target !== event.currentTarget) { var id = event.target.id; send_command(CMD_STOP); event.target.style.backgroundImage = "url('https://esp32io.com/images/tutorial/" + img_name_lookup[id] + "_inactive.png')"; } event.stopPropagation(); event.preventDefault(); } function send_command(cmd) { if(ws != null) if(ws.readyState == 1) ws.send(cmd + "\r\n"); } window.onload = init; </script> </head> <body> <h2>ESP32 C3 Super Mini - RC Car via Web</h2> <div id="container"> <div id="0" class="button_stop"></div> <div id="1" class="button_up"></div> <div id="2" class="button_down"></div> <div id="8" class="button_right"></div> <div id="4" class="button_left"></div> </div> <p> WebSocket : <span id="ws_state" style="color:blue">closed</span><br> </p> <button id="wc_conn" type="button" onclick="wc_onclick();">Connect</button> <br> <br> <div class="sponsor">Sponsored by <a href="https://amazon.com/diyables">DIYables</a></div> </body> </html> )=====";
    • 파일 확인: 이제 코드가 두 파일 newbiely.com.ino와 index.h에 들어 있습니다.
    • 업로드: Upload 버튼을 클릭하여 코드를 ESP32 C3 Super Mini에 업로드합니다.
    • 시리얼 모니터 열기: 보드레이트를 115200으로 설정합니다.
    • 결과 읽기: 시리얼 모니터에서 결과를 확인합니다.
    ∞
    Newbiely | Arduino IDE 2.3.8
    ──
    ☐
    ✕
    File
    Edit
    Sketch
    Tools
    Help
    ESP32C3 Dev Module
    Newbiely.ino
    ···
    8 Serial.println("Hello World!");
    Output
    Serial Monitor
    Message (Enter to send message to 'ESP32C3 Dev Module' on 'COM15')
    New Line
    9600 baud
    Connecting to WiFi... Connected to WiFi ESP32 C3 Super Mini Web Server's IP address: 192.168.0.2 New WebSocket connection command: 1 Move Forward command: 0 Stop command: 8 Turn Right command: 0 Stop
    Ln 11, Col 1
    ESP32C3 Dev Module on COM15
    2
    • 페이지 열기: 표시된 IP 주소를 기록해 두고, 스마트폰이나 PC의 웹 브라우저 주소창에 이 주소를 입력합니다.
    • 버튼 확인: 아래와 같은 웹 페이지가 표시됩니다:
    웹 브라우저로 자동차를 제어하는 ESP32 C3 Super Mini
    • 연결: 웹 페이지의 JavaScript 코드가 자동으로 ESP32 C3 Super Mini와 WebSocket 연결을 만듭니다.
    • 운전하기: 이제 웹 인터페이스로 자동차를 왼쪽/오른쪽으로 회전시키고, 앞/뒤로 움직일 수 있습니다.
    • 전문가 팁: 공유기 설정에서 ESP32 C3 Super Mini에 고정 IP 주소를 지정하면, 자동차의 웹 주소가 항상 같게 유지됩니다.

    ESP32 C3 Super Mini의 메모리를 절약하기 위해 제어 버튼 이미지는 보드에 저장되지 않습니다. 대신 인터넷에 저장되어 있으므로, 웹 제어 페이지의 이미지를 불러오려면 휴대폰이나 PC가 인터넷에 연결되어 있어야 합니다.

    ※ 주의:

    • index.h의 HTML 내용만 수정하고 newbiely.com.ino 파일은 전혀 건드리지 않은 경우, 코드를 컴파일하여 ESP32 C3 Super Mini에 업로드해도 Arduino IDE가 HTML 내용을 업데이트하지 않습니다.
    • 이 경우 Arduino IDE가 HTML 내용을 업데이트하도록 하려면 newbiely.com.ino 파일을 조금 수정하세요. (예: 빈 줄 추가, 주석 추가 등)

    라인별 코드 설명

    위의 ESP32 C3 Super Mini 코드에는 라인별 설명이 포함되어 있습니다. 코드의 주석을 읽어 보세요!

문제 해결

자동차가 움직이지 않을 때의 간단한 해결 방법입니다.

  • IP 주소가 출력되지 않음: WiFi 이름과 비밀번호를 확인하세요. ESP32 C3 Super Mini는 5GHz가 아닌 2.4GHz 네트워크에만 연결됩니다.
  • 페이지가 열리지 않음: 휴대폰과 ESP32 C3 Super Mini가 같은 WiFi 네트워크에 있어야 합니다.
  • 버튼 이미지가 없음: 휴대폰이나 PC가 인터넷에 연결되어 있지 않습니다. 버튼 이미지는 웹에서 불러옵니다.
  • 자동차가 반대 방향으로 움직임: L9110S 출력 스크류 터미널에서 두 모터 선을 서로 바꾸세요.
  • 모터가 돌기 시작하면 자동차가 멈춤: 배터리가 약합니다. 새 AA 배터리로 교체하세요.

응용

ESP32 C3 Super Mini 웹 제어 자동차로 만들 수 있는 재미있는 프로젝트입니다.

  • WiFi RC카: 휴대폰 브라우저로 집 안에서 로봇 자동차를 운전합니다
  • 카메라 로버: 작은 카메라를 달아 자동차가 가는 곳을 봅니다
  • 수동 전환이 가능한 라인 트레이서: 자동차가 선을 따라가게 하고, 필요할 때 웹에서 제어권을 가져옵니다
  • 장애물 회피 자동차: 초음파 센서를 추가하여 벽에 부딪히기 전에 자동차를 멈춥니다
  • 창고용 미니 로봇: 작은 물건을 테이블의 한 곳에서 다른 곳으로 옮깁니다
  • 반려동물 장난감 자동차: 방 안에서 장난감 자동차를 몰며 고양이나 강아지와 놀아 줍니다

도전해 보기

다음 아이디어로 ESP32 C3 Super Mini 로봇 자동차 실력을 키워 보세요.

  • 쉬움: 시리얼 모니터 메시지를 자신만의 문구로 바꿔 보세요
  • 쉬움: 자동차를 제자리에서 회전시키는 "spin" 버튼을 추가해 보세요
  • 보통: analogWrite()와 웹 페이지의 슬라이더로 속도 제어 기능을 추가해 보세요
  • 보통: GPIO4의 아날로그 읽기를 사용하여 자동차 배터리 전압을 웹 페이지에 표시해 보세요
  • 어려움: 초음파 센서를 추가하여 장애물 근처에서 자동차가 자동으로 멈추게 해 보세요
  • 어려움: 게임패드 방식의 키보드 제어를 추가하여 화살표 키로 자동차를 운전해 보세요

댓글

관련 튜토리얼