이 튜토리얼에서는 스마트폰 또는 PC의 웹 브라우저에서 Arduino를 사용하여 서보 모터를 제어하는 방법을 보여드릴 것입니다. 그래픽 웹 사용자 인터페이스를 통해 서보 모터를 원활하고 동적으로 제어할 수 있게 해주는 WebSocket 기술을 활용할 것입니다.
이제, 왜 WebSocket을 사용해야 할까요? 다음과 같은 이유입니다:
WebSocket이 없다면, 서보의 각도를 조절할 때마다 웹페이지를 새로고침해야 합니다. 이는 이상적이지 않습니다.
그러나 WebSocket을 사용하면 웹페이지와 아두이노 사이에 전용 연결을 설정합니다. 이 설정은 페이지를 다시 로드할 필요 없이 배경에서 아두이노로 각도 값을 전송할 수 있게 해 줍니다. 결과적으로, 서보가 부드럽게 작동하고 실시간으로 반응합니다. 꽤 인상적이지 않나요?
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-servo-motor-via-web */#include <Servo.h>#include <WiFiS3.h>#include <WebSocketServer.h>#include"index.h"using namespace net;#define SERVO_PIN 9 // Arduino pin 9 connected to servo motorServo servo;constchar *ssid = "YOUR_WIFI_SSID"; // CHANGE ITconstchar *password = "YOUR_WIFI_PASSWORD"; // CHANGE ITWebSocketServer webSocket(81);WiFiServer server(80);intstatus = WL_IDLE_STATUS;voidsetup() {//Initialize serial and wait for port to open:Serial.begin(9600); servo.attach(SERVO_PIN); // attaches the servo on Arduino pinString 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(ssid);// 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) {switch (dataType) {caseWebSocket::DataType::TEXT: {String angle = String((char *)message);int angle_value = angle.toInt(); servo.write(angle_value);Serial.print(F("Rotate Servo Motor to "));Serial.println(angle_value); }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(50);// close the connection: client.stop(); }}
코드 내의 WiFi 정보(SSID와 비밀번호)를 자신의 네트워크 자격증명과 일치하도록 수정하십시오.
Arduino IDE에서 index.h 파일을 생성하려면:
시리얼 모니터 아이콘 바로 아래에 있는 버튼을 클릭하고 새 탭을 선택하거나, Ctrl+Shift+N 키를 사용하십시오.
이제 코드가 두 개의 파일에 있습니다: ArduinoGetStarted.com.ino 와 index.h
아두이노 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의 웹 브라우저 주소 창에 입력하세요.
아래와 같은 웹페이지가 표시됩니다:
웹페이지의 JavaScript 코드가 자동으로 아두이노에 WebSocket 연결을 생성합니다.
이제 웹 인터페이스에서 모터 핸들을 돌려서 서보 모터의 각도를 제어할 수 있습니다.
아두이노의 메모리를 절약하기 위해 서보 모터의 이미지는 아두이노에 저장되지 않습니다. 대신, 이미지들은 인터넷에 저장되어 있으므로, 웹 제어 페이지에서 이미지를 불러오기 위해 휴대전화나 PC가 인터넷 연결을 필요로 합니다.
※ 주의:
index.h 파일의 HTML 내용을 수정하고 ArduinoGetStarted.com.ino 파일은 건드리지 않는다면, 코드를 컴파일하고 Arduino에 업로드할 때 Arduino IDE는 HTML 내용을 업데이트하지 않습니다.
이 경우 Arduino IDE가 HTML 내용을 업데이트하도록 하려면, ArduinoGetStarted.com.ino 파일을 변경하세요(예: 빈 줄 추가, 주석 추가 등).