반응형

아두이노 우노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가 켜지게됩니다. 

 




몇가지 테스트를 더 해본 결과입니다.

 









반응형

문제 발생시 지나치지 마시고 댓글 남겨주시면 가능한 빨리 답장드립니다.

도움이 되셨다면 토스아이디로 후원해주세요.
https://toss.me/momo2024


제가 쓴 책도 한번 검토해보세요 ^^

+ Recent posts