아두이노 우노에 ESP8266 WiFi 모듈을 연결하는 방법과 컴퓨터에 구성한 TCP 서버와 통신 테스트한 과정을 설명합니다.
2019. 1. 16
아두이노 우노에 연결한 핀을 D11, D10에서 D10, D9로 변경
2019. 1. 17
시리얼 버퍼 크기 조정
2020. 9. 28
동작 확인
ESP8266 WiFi 모듈을 Arduino Uno에서 사용하기 위해 필요한 WeeESP8266 라이브러리는 다음 링크에서 다운로드 가능합니다.
https://github.com/itead/ITEADLIB_Arduino_WeeESP8266
Code 초록색 버튼을 클릭 후, Download ZIP를 클릭하면 압축된 라이브러리가 다운로드됩니다.
압축을 풀어서 다음 경로에 복사해줍니다.
C:\Users\사용자이름\Documents\Arduino\libraries
Arduino Uno에는 시리얼이 하나라서 ESP8266에서 소프트웨어 시리얼을 사용하도록 해주어야 합니다.
ESP8266와 Arduino IDE의 시리얼 모니터에서 각각 시리얼을 사용해야 접속 상황을 볼 수 있기 때문입니다.
다음 경로에 있는 ESP8266.h 파일을 열어서 다음 줄에 있는 주석을 제거해줍니다.
C:\Users\사용자이름\Documents\Arduino\libraries\ITEADLIB_Arduino_WeeESP8266-master
변경전
//#define ESP8266_USE_SOFTWARE_SERIAL
변경후
#define ESP8266_USE_SOFTWARE_SERIAL
‘
시리얼 버퍼 크기를 조정하기 위해서 C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino에 있는 HardwareSerial.h 파일을 수정해야 합니다.
권한 문제로 수정후 저장이 안될 수 있습니다.
HardwareSerial.h 파일울 다른 폴더로 복사해서 아래 처럼 수정한 후 다시 원래 위치로 복사해야 합니다.
버퍼 크기를 64에서 256으로 변경합니다.
#define SERIAL_TX_BUFFER_SIZE 16 #else #define SERIAL_TX_BUFFER_SIZE 256 #endif #endif #if !defined(SERIAL_RX_BUFFER_SIZE) #if ((RAMEND - RAMSTART) < 1023) #define SERIAL_RX_BUFFER_SIZE 16 #else #define SERIAL_RX_BUFFER_SIZE 256 |
Arduino Uno와 ESP8266 Wifi 모듈을 다음처럼 연결해줍니다.
ESP8266_TX → Arduino_Uno_RX(D10) ESP8266_RX → Arduino_Uno_TX(D9) ESP8266_CH_PD → Arduino_Uno_3.3V ESP8266_VCC → Arduino_Uno_3.3V ESP8266_GND → Arduino_Uno_GND |
Hercules SETUP utility를 이용하여 TCP 서버를 구성하여 테스트를 진행하였습니다. 아래 링크에서 다운로드 할 수 있습니다.
http://new.hwg.cz/files/download/sw/version/hercules_3-2-8.exe
Hercules SETUP utility를 실행한 후, TCP Server 탭을 선택하고 Listen을 클릭합니다.
포트 번호를 변경하지 않고 23번으로 하고 진행했습니다.
Arduino Uno에서 접속할 서버 IP를 확인해야 합니다.
명령 프롬프트를 실행시켜 ipconfig 명령으로 컴퓨터에서 사용중인 IP를 확인합니다.
WeeESP8266 라이브러리에 포함되어 있는 TCPClientSingleUNO 예제 코드를 수정하여 사용했습니다.
원본 코드는 Arduino IDE 메뉴에서 파일 > 예제 > ITEADLIB_Arduino_WeeESP8266 > TCPClientSingleUNO를 선택하면 불러올 수 있습니다.
Arduino IDE의 메뉴에서 파일 > 새파일을 선택한 후 다음 코드를 복사해줍니다.
Hercules SETUP utility에서 한글이 깨져보이는 현상이 있어서 코드에선 영어 메시지를 사용합니다.
#include "ESP8266.h" #include <SoftwareSerial.h> #define SSID "공유기의 SSID" #define PASSWORD "공유기의 비밀번호" #define HOST_NAME "컴퓨터의 아이피" #define HOST_PORT (Hercules SETUP utility에서 설정한 TCP 서버 포트번호) SoftwareSerial mySerial(10, 9); /* RX:D10, TX:D9 */ ESP8266 wifi(mySerial); void printUsage() { uint8_t buf[]="Usage\n1 : Turn On LED\n2 : Turn Off LED\nS : LED status\n\n"; wifi.send(buf, strlen(buf)); } bool isConnected = false; void setup(void) { Serial.begin(9600); Serial.print("setup begin\r\n"); Serial.print("FW Version:"); Serial.println(wifi.getVersion().c_str()); if (wifi.setOprToStationSoftAP()) { Serial.print("to station + softap ok\r\n"); } else { Serial.print("to station + softap err\r\n"); } if (wifi.joinAP(SSID, PASSWORD)) { Serial.print("Join AP success\r\n"); Serial.print("IP:"); Serial.println( wifi.getLocalIP().c_str()); } else { Serial.print("Join AP failure\r\n"); } if (wifi.disableMUX()) { Serial.print("single ok\r\n"); } else { Serial.print("single err\r\n"); } Serial.print("setup end\r\n"); pinMode(LED_BUILTIN, OUTPUT); } void loop(void) { if ( isConnected == false){ while(1){ if (wifi.createTCP(HOST_NAME, HOST_PORT)) { Serial.print("create tcp ok\r\n"); isConnected = true; printUsage(); break; } else { Serial.print("create tcp err\r\n"); } } } uint8_t buffer[128] = {0}; uint32_t len = wifi.recv(buffer, sizeof(buffer), 10000); if (len > 0) { Serial.print("Received:["); for(uint32_t i = 0; i < len; i++) { Serial.print((char)buffer[i]); } Serial.print("]\r\n"); char command = buffer[0]; int ledStatus = digitalRead(LED_BUILTIN); switch (command){ case '1': if (ledStatus == LOW){ digitalWrite(LED_BUILTIN, HIGH); sprintf(buffer, "LED is on\n"); wifi.send(buffer, strlen(buffer)); } else{ sprintf(buffer, "LED is already on\n"); wifi.send(buffer, strlen(buffer)); } break; case '2': if (ledStatus == HIGH){ digitalWrite(LED_BUILTIN, LOW); sprintf(buffer, "LED is off.\n"); wifi.send(buffer, strlen(buffer)); } else{ sprintf(buffer, "LED is already off.\n"); wifi.send(buffer, strlen(buffer)); } break; case 'S': case 's': if (ledStatus == LOW){ sprintf(buffer, "LED status: off\n"); wifi.send(buffer, strlen(buffer)); } else { sprintf(buffer, "LED status: on\n"); wifi.send(buffer, strlen(buffer)); } break; default: break; } } } |
상단에 있는 다음 4줄을 환경에 맞게 수정한 후, Arduino Uno에 업로드시켜줍니다.
주의할 점은 컴퓨터가 연결된 공유기의 정보를 입력해줘야 합니다.
#define SSID "공유기의 SSID" #define PASSWORD "공유기의 비밀번호" #define HOST_NAME "컴퓨터의 아이피" #define HOST_PORT (Hercules SETUP utility에서 설정한 TCP 서버 포트번호) |
ESP8266 모듈의 접속 과정을 확인하기 위해 Arduino IDE의 메뉴에서 툴 > 시리얼 모니터를 선택합니다.
공유기로부터 IP를 할당 받았다면 Join AP success 문자열과 함께 할당받은 IP를 출력해줍니다.
컴퓨터에서 실행시킨 서버 프로그램에 접속했다면 create tcp ok 문자열을 보여줍니다.
create tcp err 문자열이 보이면, 컴퓨터의 방어벽 문제일 가능성이 있습니다.
Hercules SETUP utility의 TCP 서버에서 사용중인 포트를 차단중인지 확인해보세요.
해당 포트를 허용해주거나, 방어벽을 잠시 끄고 진행해보세요..
Hercules SETUP utility에서 Arduino Uno가 클라이언트로 접속했음을 확인할 수 있고
Arduino Uno가 전송한 문자열이 보입니다.
Send에 1을 입력하고 Send를 클릭하면 Hercules SETUP utility에서 Arduino Uno 보낸 문자열 “LED is on” 메시지를 확인할 수 있습니다.
시리얼 모니터에서 Arduino Uno가 1을 받았음을 볼 수 있고 Arduino Uno 13번핀에 연결되어 있는 내장 LED가 켜지게됩니다.
몇가지 테스트를 더 해본 결과입니다.
'Arduino Uno > WIFI(ESP8266)' 카테고리의 다른 글
Android 앱에서 ESP8266 WiFi 모듈을 연결한 Arduino Uno 제어하기 (0) | 2023.10.18 |
---|---|
Arduino Uno에서 ESP8266을 이용하여 MYSQL에 온도값(DB18B20) 넣기 (252) | 2018.10.17 |
시간날때마다 틈틈이 이것저것 해보며 블로그에 글을 남깁니다.
블로그의 문서는 종종 최신 버전으로 업데이트됩니다.
여유 시간이 날때 진행하는 거라 언제 진행될지는 알 수 없습니다.
영화,책, 생각등을 올리는 블로그도 운영하고 있습니다.
https://freewriting2024.tistory.com
제가 쓴 책도 한번 검토해보세요 ^^
그렇게 천천히 걸으면서도 그렇게 빨리 앞으로 나갈 수 있다는 건.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!