이 튜토리얼은 WiFi를 통해 스마트폰이나 PC의 웹 브라우저에서 Arduino를 사용하여 로봇 자동차를 무선으로 제어하는 방법을 안내합니다. 제어는 WebSocket 기술을 활용하는 그래픽 웹 사용자 인터페이스를 통해 관리되어 자동차의 원활하고 동적인 작동을 가능하게 합니다.
아두이노 IDE의 왼쪽 탐색 바에 있는 Library Manager 아이콘을 클릭하여 라이브러리 관리자를 엽니다.
Web Server for Arduino Uno R4 WiFi를 검색하고, DIYables이 만든 Web Server를 찾습니다.
Install 버튼을 클릭하여 Web Server 라이브러리를 설치하세요.
Arduino IDE에서 새 스케치를 생성하고, 이름을 지정하세요. 예를 들어, ArduinoGetStarted.com.ino로 지정합니다.
아래 코드를 복사한 후 Arduino IDE로 열어주세요.
/* * 이 아두이노 코드는 newbiely.kr 에서 개발되었습니다 * 이 아두이노 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino/arduino-controls-car-via-web */#include <WiFiS3.h>#include <WebSocketServer.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 ENA_PIN 7 // The Arduino pin connected to the ENA pin L298N#define IN1_PIN 6 // The Arduino pin connected to the IN1 pin L298N#define IN2_PIN 5 // The Arduino pin connected to the IN2 pin L298N#define IN3_PIN 4 // The Arduino pin connected to the IN3 pin L298N#define IN4_PIN 3 // The Arduino pin connected to the IN4 pin L298N#define ENB_PIN 2 // The Arduino pin connected to the ENB pin L298Nconstchar *ssid = "YOUR_WIFI_SSID"; // CHANGE ITconstchar *password = "YOUR_WIFI_PASSWORD"; // CHANGE ITusing namespace net;WebSocketServer webSocket(81);WiFiServer server(80);intstatus = WL_IDLE_STATUS;voidsetup() {Serial.begin(9600);pinMode(ENA_PIN, OUTPUT);pinMode(IN1_PIN, OUTPUT);pinMode(IN2_PIN, OUTPUT);pinMode(IN3_PIN, OUTPUT);pinMode(IN4_PIN, OUTPUT);pinMode(ENB_PIN, OUTPUT);digitalWrite(ENA_PIN, HIGH); // set full speeddigitalWrite(ENB_PIN, HIGH); // set full speed//Initialize serial and wait for port to open:Serial.begin(9600);String fv = WiFi.firmwareVersion();if (fv < WIFI_FIRMWARE_LATEST_VERSION)Serial.println("Please upgrade the firmware");// attempt to connect to WiFi network:while (status != WL_CONNECTED) {Serial.print("Attempting to connect to SSID: ");Serial.println(password);// Connect to WPA/WPA2 network. Change this line if using open or WEP network:status = WiFi.begin(ssid, password);// wait 4 seconds for connection:delay(4000); }// print your board's IP address:Serial.print("IP Address: ");Serial.println(WiFi.localIP()); server.begin(); webSocket.onConnection([](WebSocket &ws) {constauto protocol = ws.getProtocol();if (protocol) {Serial.print(F("Client protocol: "));Serial.println(protocol); } ws.onMessage([](WebSocket &ws, constWebSocket::DataType dataType,constchar *message, uint16_tlength) {String cmd_str = String((char *)message);intcommand = cmd_str.toInt();Serial.print("command: ");Serial.println(command);switch (dataType) {caseWebSocket::DataType::TEXT: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;caseWebSocket::DataType::BINARY:Serial.println(F("Received binary data"));break; } }); ws.onClose([](WebSocket &, constWebSocket::CloseCode, constchar *,uint16_t) {Serial.println(F("Disconnected")); });Serial.print(F("New WebSocket Connnection from client: "));Serial.println(ws.getRemoteIP()); }); webSocket.begin();}voidloop() { webSocket.listen();// listen for incoming clientsWiFiClient client = server.available();if (client) {// read the HTTP request header line by linewhile (client.connected()) {if (client.available()) {String HTTP_header = client.readStringUntil('\n'); // read the header line of HTTP requestif (HTTP_header.equals("\r")) // the end of HTTP requestbreak;Serial.print("<< ");Serial.println(HTTP_header); // print HTTP request to Serial Monitor } }// send the HTTP response header client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println("Connection: close"); // the connection will be closed after completion of the response client.println(); // the separator between HTTP header and bodyString html = String(HTML_CONTENT); client.println(html); client.flush();// give the web browser time to receive the datadelay(100);// close the connection: client.stop(); }}void CAR_moveForward() {digitalWrite(IN1_PIN, HIGH);digitalWrite(IN2_PIN, LOW);digitalWrite(IN3_PIN, HIGH);digitalWrite(IN4_PIN, LOW);}void CAR_moveBackward() {digitalWrite(IN1_PIN, LOW);digitalWrite(IN2_PIN, HIGH);digitalWrite(IN3_PIN, LOW);digitalWrite(IN4_PIN, HIGH);}void CAR_turnLeft() {digitalWrite(IN1_PIN, HIGH);digitalWrite(IN2_PIN, LOW);digitalWrite(IN3_PIN, LOW);digitalWrite(IN4_PIN, LOW);}void CAR_turnRight() {digitalWrite(IN1_PIN, LOW);digitalWrite(IN2_PIN, LOW);digitalWrite(IN3_PIN, HIGH);digitalWrite(IN4_PIN, LOW);}void CAR_stop() {digitalWrite(IN1_PIN, LOW);digitalWrite(IN2_PIN, LOW);digitalWrite(IN3_PIN, LOW);digitalWrite(IN4_PIN, LOW);}
코드에서 WiFi 정보(SSID 및 비밀번호)를 자신의 네트워크 자격 증명과 일치하도록 수정하세요.
아두이노 IDE에서 index.h 파일을 생성하려면:
직렬 모니터 아이콘 바로 아래에 있는 버튼을 클릭하고 새 탭을 선택하거나, Ctrl+Shift+N 키를 사용하세요.
이제 코드가 두 파일에 있습니다: ArduinoGetStarted.com.ino 및 index.h
Arduino IDE에서 Upload 버튼을 클릭하여 아두이노에 코드를 업로드하세요.
시리얼 모니터를 엽니다.
시리얼 모니터에서 결과를 확인하세요.
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno
Newbiely.ino
···
8Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno' on 'COM15')
New Line
9600 baud
Arduino Uno R4 WiFi - WebSocket Server
Connected! IP Address: 192.168.0.254
SSID: YOUR_WIFI_SSID
IP Address: 192.168.0.254
Signal strength (RSSI): -44 dBm
WebSocket server started on port 81
WebSocket URL: ws://192.168.0.254:81
WebSocket server enabled successfully
Ln 11, Col 1
Arduino Uno on COM15
2
표시된 IP 주소를 기록하고, 이 주소를 스마트폰이나 PC의 웹 브라우저 주소 창에 입력하세요.
아래와 같은 웹페이지가 표시될 것입니다:
웹소켓을 통해 웹페이지를 아두이노에 연결하려면 CONNECT 버튼을 클릭하세요.
이제 웹 인터페이스를 통해 자동차를 좌/우로 회전시키거나 전진/후진하도록 제어할 수 있습니다.
아두이노의 메모리를 절약하기 위해, 컨트롤 버튼의 이미지는 아두이노에 저장되지 않습니다. 대신, 그것들은 인터넷에 저장되어 있으므로, 웹 컨트롤 페이지의 이미지를 로드하려면 귀하의 휴대폰이나 PC가 인터넷 연결을 필요로 합니다.
※ 주의:
만약 index.h 파일에서 HTML 내용을 수정하고 ArduinoGetStarted.com.ino 파일은 건드리지 않는다면, 코드를 컴파일하고 Arduino에 업로드할 때 Arduino IDE는 HTML 내용을 업데이트하지 않습니다.
이 경우에 Arduino IDE가 HTML 내용을 업데이트하게 하려면, ArduinoGetStarted.com.ino 파일에서 변경을 하세요 (예를 들어, 빈 줄을 추가하거나 주석을 추가하는 등).