이 튜토리얼은 WiFi를 사용하여 스마트폰이나 PC의 웹 브라우저로 ESP8266을 사용하여 로봇 자동차를 무선으로 제어하는 방법을 안내합니다. 제어는 WebSocket이라는 것을 사용하는 그래픽 웹 사용자 인터페이스를 통해 이루어지며, 차량의 원활하고 동적인 제어를 가능하게 합니다.
공개: 이 포스팅 에 제공된 일부 링크는 아마존 제휴 링크입니다. 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
2WD RC 자동차와 웹소켓에 대하여
이제 왜 WebSocket을 선택해야 할까요? 여기 그 이유가 있습니다:
WebSocket 없이는 차의 방향을 바꾸기 위해 매번 페이지를 다시 로딩해야 합니다. 이상적이지 않죠!
하지만, WebSocket을 사용하면 웹페이지와 ESP8266 사이에 특별한 연결을 설정합니다. 이를 통해 페이지를 다시 로드할 필요 없이 ESP8266에 명령을 백그라운드에서 보낼 수 있습니다. 결과는? 로봇 자동차가 실시간으로 매끄럽게 움직입니다. 꽤 멋지죠?
한마디로, WebSocket 연결은 로봇의 원활하고 실시간 제어를 가능하게 합니다.
다음 링크에서 2WD RC 자동차와 WebSocket에 관한 구체적인 튜토리얼이 있습니다. 각 튜토리얼에는 하드웨어 핀 아웃, 작동 원리, ESP8266과의 배선 연결, ESP8266 코드 등에 대한 자세한 정보와 단계별 지침이 포함되어 있습니다. 다음 링크에서 더 자세히 알아보세요:
올바른 ESP8266 보드(예: NodeMCU 1.0 (ESP-12E Module))와 해당 COM 포트를 선택하세요.
Arduino IDE의 왼쪽 탐색 바에 있는 Library Manager 아이콘을 클릭하여 라이브러리 관리자를 엽니다.
“WebSockets”을 검색한 다음, Markus Sattler이 만든 WebSockets를 찾습니다.
Install 버튼을 클릭하여 WebSockets 라이브러리를 설치하세요.
Arduino IDE에서 새 스케치를 만들고 이름을 지정하세요. 예를 들어, newbiely.kr.ino
아래 코드를 복사하고 Arduino IDE로 열어보세요.
/* * 이 ESP8266 NodeMCU 코드는 newbiely.kr 에서 개발되었습니다 * 이 ESP8266 NodeMCU 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/esp8266/esp8266-controls-car-via-web */#include <ESP8266WiFi.h>#include <ESP8266WebServer.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 D2 // The ESP8266 pin connected to the A-IA pin of the L9110S (Motor A)#define MOTOR_A_IB_PIN D5 // The ESP8266 pin connected to the A-IB pin of the L9110S (Motor A)#define MOTOR_B_IA_PIN D6 // The ESP8266 pin connected to the B-IA pin of the L9110S (Motor B)#define MOTOR_B_IB_PIN D7 // The ESP8266 pin connected to the B-IB pin of the L9110S (Motor B)const char* ssid = "YOUR_WIFI_SSID"; // CHANGE ITconst char* password = "YOUR_WIFI_PASSWORD"; // CHANGE ITESP8266WebServer server(80); // Web server on port 80DIYables_ESP32_WebSocket* webSocket;void webSocketEvent(uint8_t num, WStype_t type, uint8_t* payload, size_t length) {switch (type) {case WStype_DISCONNECTED:Serial.printf("[%u] Disconnected!\n", num);break;case WStype_CONNECTED: {IPAddress ip = webSocket.remoteIP(num);Serial.printf("[%u] Connected from %d.%d.%d.%d\n", num, ip[0], ip[1], ip[2], ip[3]); }break;case WStype_TEXT://Serial.printf("[%u] Received text: %s\n", num, payload);String angle = String((char*)payload);intcommand = 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"); }break; }}voidsetup() {Serial.begin(9600);pinMode(MOTOR_A_IA_PIN, OUTPUT);pinMode(MOTOR_A_IB_PIN, OUTPUT);pinMode(MOTOR_B_IA_PIN, OUTPUT);pinMode(MOTOR_B_IB_PIN, OUTPUT);// Connect to Wi-FiWiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED) {delay(1000);Serial.println("Connecting to WiFi..."); }Serial.println("Connected to WiFi");// Initialize WebSocket server webSocket.begin(); webSocket.onEvent(webSocketEvent);// Serve a basic HTML page with JavaScript to create the WebSocket connection server.on("/", HTTP_GET, []() {Serial.println("Web Server: received a web page request");String html = HTML_CONTENT; // Use the HTML content from the servo_html.h file server.send(200, "text/html", html); }); server.begin(); Serial.print("ESP8266 Web Server's IP address: "); Serial.println(WiFi.localIP());}void loop() {// Handle client requests server.handleClient();// Handle WebSocket events webSocket.loop();// TO DO: Your code here}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);}
Arduino IDE에서 index.h 파일을 생성하는 방법:
시리얼 모니터 아이콘 바로 아래에 있는 버튼을 클릭하고 새 탭을 선택하거나, Ctrl+Shift+N 키를 사용하세요.