아두이노 통신2015. 3. 22. 01:24

ESP8266 모듈을 통해 몇 천원으로 WiFi를 아두이노에서 구현한다.

 

▶ 이 가이드를 따라하면

- 시리얼 통신을 통해 WiFi를 사용해볼 수 있다.

- 3.3V 기반의 ESP8266 모듈을 사용해볼 수 있다.

 

▶ 같이 읽으면 좋은 글

- CC3000 WiFi 쉴드(20$) 사용법 : http://bbangpan.tistory.com/20

 

▶ 부품 설명 및 회로 구성

ESP8266은 초저가의 WiFi 모듈이다. 다른 WiFi shield들이 최소 $20이상인데 반하여 이 모듈은 $2에도 판다. 물론 다른 고가의 shield처럼 DNS등을 지원 하지는 못하지만, TCP로 IP에 직접 연결하여 웹사이트의 내용을 가져오는 등의 간단한 역할은 훌륭히 할 수 있으며 간단히 웹서버로도 셋팅할 수 있다. 다만 초보자가 사용하기에는 몇가지 사전 지식이 필요하다.

  1. 3.3V기반으로 작동되고 전력소모도 크기 때문에(300ma), Arduino UNO의 3.3V(50mA수준)로는 전력이 부족하다.
  2. 그래서 여기서는 Arduino Due를 사용했다. Due는 3.3V out pin의 출력도 800mA이며 데이터 pin도 모두 3.3V로 작동한다.
  3. UNO의 5V를 변압해서 사용하는 경우도 있는데, 데이터 pin도 모두 같이 변환(레벨 컨버터 사용)해주어야 하므로 까다롭다.
  4. 부품 버전과 펌웨어가 제각각이다. 시리얼 통신으로 모듈을 제어하는데 이 초기 속도가 115,200bps로 셋팅된 버전이 있다. 다행히 최근 모듈들은 9,600bps를 지원하긴 하는데, 115,200bps 속도로 셋팅된 녀석들은 일반 데이터 핀을 통한 SoftwareSerial로 통신할 수 없어, 디버깅을 위해서는 하드웨어 시리얼 여러개(Arduino Mega나 Due같은 중형보드가 필요)가 필요하다. UNO는 하드웨어 시리얼이 하나뿐이므로 이 하드웨어 시리얼(그렇다. USB통신용 그 하드웨어 시리얼)을 써버리면, 디버그 정보를 창에 띄워 볼 수가 없다. 무슨 말인지 헷갈리면 일단 불편하다는 것을 기억해두자.

그럼에도 불구하고 무언가 저가에 만들기 위한 모듈임에는 틀림없다. Arduino Due에 붙여보자.

<ESP8266을 3.3V로 연결, 정상 연결되면 빨간 불이 들어온다>

<ESP8266 최근 버전, 옛날 버전은 빨간색 박스 영역이 비어있다.>

기본적인 배선은 VCC->3.3V, GND->GND, TX->RX2, RX->TX2, CH_PD->3.3V에 연결한다. 특정 버전은 CH_PD->3.3V를 생략해도 작동한다고 하지만 그런 모듈은 만난 적이 없다. Tx/Rx를 통해 시리얼 통신을 하는 순간이면, Comm LED에 파란색 불이 들어오므로 작동 확인이 가능하다. 이 불이 들어오지 않으면 Tx/Rx를 바꿔서 꼽아보자.

 

▶ 소스 코드 입력 및 구동

아래 소스 코드는 http://www.seeedstudio.com/blog/2014/09/11/getting-started-with-esp8266/ 를 응용한 버전이다. Arduino Due를 사용하기 위해서는 Arduino IDE 1.6.0이상이 필요하므로 주의한다. 보드는 Arduino Due (Programming Port)를 선택해서 업로드하게 된다.

소스 코드 내부의 SSID(사용할 WiFi AP 이름)와 PASS(사용할 WiFi 암호), DST_IP(테스트 접속할 웹서버 주소)는 적절히 변경해서 업로드한다.

GitHub 소스링크 : https://github.com/bbangpan/bbangpan.com/blob/master/neibc_esp8266_due/neibc_esp8266_due.ino

 

소스 :

/* Originally posted on www.bbangpan.com

 

Program Description: ESP8266 WiFi Module testing code

Needed library : None

Tested on : Arduino 1.6.1, Arduino Due

 

reference : http://www.seeedstudio.com/blog/2014/09/11/getting-started-with-esp8266/

 

Copyright (c) 2015 www.bbangpan.com. All rights reserved.

This program can be used for any non-commercial purpose freely. */

 

#define SSID "xxxx" // wifi name

#define PASS "xxxx" // wifi password

#define DST_IP "143.248.5.153" //www.kaist.ac.kr

 

void setup()

{

// Open Serial1 communications and wait for port to open:

Serial2.begin(9600);

Serial2.setTimeout(5000);

Serial.begin(9600); //can't be faster than 19200 for softSerial1

Serial.println("ESP8266 Demo");

//test if the module is ready

Serial2.println("AT+RST");

delay(2000);

if(Serial2.find("eady")) {

Serial.println("Module is ready");

} else {

Serial.println("Module has no response.");

while(1);

}

delay(1000);

//connect to the wifi

boolean connected=false;

for(int i=0;i<5;i++) {

if(connectWiFi()) {

connected = true;

break;

}

}

 

if (!connected) {

while(1);

}

delay(5000);

//set the single connection mode

Serial2.println("AT+CIPMUX=0");

}

 

void loop()

{

String cmd = "AT+CIPSTART=\"TCP\",\"";

cmd += DST_IP;

cmd += "\",80";

Serial2.println(cmd);

Serial.println(cmd);

if(Serial2.find("Error")) return;

cmd = "GET / HTTP/1.0\r\n\r\n";

Serial2.print("AT+CIPSEND=");

Serial2.println(cmd.length());

if(Serial2.find(">")) {

Serial.print(">");

} else {

Serial2.println("AT+CIPCLOSE");

Serial.println("connect timeout");

delay(1000);

return;

}

Serial2.print(cmd);

delay(2000);

//Serial1.find("+IPD");

while (Serial2.available()) {

char c = Serial2.read();

Serial.write(c);

if(c=='\r') Serial.print('\n');

}

delay(1000);

while (Serial2.available()) {

char c = Serial2.read();

Serial.write(c);

if(c=='\r') Serial2.print('\n');

}

Serial.println("====");

delay(1000);

}

 

boolean connectWiFi() {

Serial2.println("AT+CWMODE=1");

String cmd="AT+CWJAP=\"";

cmd+=SSID;

cmd+="\",\"";

cmd+=PASS;

cmd+="\"";

Serial.println(cmd);

Serial2.println(cmd);

delay(2000);

if(Serial2.find("OK")) {

Serial.println("OK, Connected to WiFi.");

return true;

} else {

Serial.println("Can not connect to the WiFi.");

return false;

}

}

 

업로드 후 실행하면, 해당 웹페이지의 처음 영역을 잘 가져와서 표시하는 것을 볼 수 있다. 잘 작동하지 않으면 AP로 좀더 접근해보자. ESP8266에 내장된 안테나 성능은 일반 스마트폰보다는 약간 성능이 떨어질 수 있다(하지만 그렇게 많이 떨어지지도 않는다. AP까지 벽 하나 정도는 통과하여 작동한다).

<웹사이트 정보를 가져와 볼 수 있다>

세부적인 활용을 위해서는 AT명령을 이해하고 parsing해야 하는데, 이는 향후에 다루어보자.

▶ 구매 가이드

ESP8266 : http://www.aliexpress.com/item/Free-shipping-ESP8266-serial-WIFI-wireless-module-wireless-transceiver/2031529724.html ($3)

 

강의 키워드

아두이노 와이파이, Arduino WiFi, WiFi Shield, ESP8266, ESP-8266, ESP8266 Due, ESP8266 속도, ESP8266 시리얼

Posted by 작동미학

댓글을 달아 주세요

  1. 아두기초

    컴파일해보면,
    Serial2가 없다고 하는데, 헤더에 뭔가를 더 해야하는 건가요?

    2015.06.26 11:38 [ ADDR : EDIT/ DEL : REPLY ]
  2. 작동미학

    Serial2는 Arduino Due나 Mega에 있는 HW Serial을 의미합니.
    아마 Arduino UNO나 그 이하를 사용하시는 것 같고요. (이것들은 SW serial을 쓰죠..)

    3.3V 특성 때문에 Arduino Due를 사용하시기를 추천드립니다.
    Aliexpress에서 구매하시면 $20 안쪽으로 구매하실 수 있을겁니다.

    UNO에서 보조 전원 연결 및 level converting을 하는 방법, 커패시터를 연결해 power를 보충해주는 방법이 있는데,
    이게 제 경우에는 쉽지 않더군요.

    2015.06.27 23:00 [ ADDR : EDIT/ DEL : REPLY ]
  3. 마인두링크

    안녕하세요 아두이노 공부하고있는 대학생입니다. ㅎㅎ 다름이아니라 esp8266 와이파이 모듈을 테스트 해보고싶은데.. 펌웨어 업데이트도 완료 하고 코드도 똑같이 복사해서 붙여 넣기 했는데.. test부터 Timeout이 뜨네요 ㅠㅠ.. 왜 이런걸까요??.. SSID에 제와이파이 이름쓰고 PASS에다가 와이파이 비밀번호 썼고요 DST_IP는 건들지 않았습니다.. 무엇이 문제일지 알려주실수 있나요???

    2015.07.27 22:59 [ ADDR : EDIT/ DEL : REPLY ]
  4. 작동미학

    앞서 밝혔던 바와 같이 ESP8266은 좀 까다롭습니다.

    1. Arduino DUE를 사용해서 충분한 3.3V 전원을 공급하셨나요?
    - 일반 Arduino로는 전원 부족으로 작동되지 않을 수 있습니다.
    - Power LED에 불이 희미하게 들어오거나 하지요.(좀 약하게 껌뻑껌뻑합니다 전원이 부족하면)

    2. 시리얼 통신시(ESP8266에 명령 전송시), comm LED에 불이 들어왔나요?
    - TX/RX를 바꿔꼽았거나 할 수 있습니다.

    대부분 위 두가지 문제입니다. 혹시 WiFi가 좀 멀리 있다면 좀더 가까이 두고 해보세요 signal이 약해서 그럴 수도 있을것 같습니다.

    최악의 방법으로는 다른 모듈을 사용해보시는 방법이 있는데, 그래서 저렴한 모듈은 구매시 2~3개정도 구매하셨다가 예비로 쓰시는 방법이 있습니다. 다만 지금까지 부품 교체로 성공한 적은 저도 사실 매우 드뭅니다(뭔가 잘못된 구성을 해서 잘못된 경우가 더 많았음)

    참고가 되셨으면 좋겠습니다. 흠..저도 여러가지 시도해보고 성공한 모듈이라..답답함이 어떤지 조금 압니다. 아..

    2015.07.29 01:08 [ ADDR : EDIT/ DEL : REPLY ]
  5. ill_july

    안녕하세요, 포스팅 잘봤습니다. 전자쪽에 지식이 없는 학생인대요.
    제가 esp8266 과 dht11 센서를 인터넷에 떠도는 회로를 참고해서
    직접 만능기판 상에서 납땜하고 연결해 보았습니다. 헌데 모듈에 전원은 들어오는데 (8266의 빨간불)
    스마트폰 와이파이 상에서 그 이름이 잡히지 않습니다.
    왜그런 것일까요???

    2015.09.07 01:14 [ ADDR : EDIT/ DEL : REPLY ]
    • connection이 되지 않은것 같습니다.
      esp8266은 생각보다 전압 이슈가 까다로워서 정상작동하지 않는 경우가 많습니다. 일단 serial통신을 하면서 통신시에 Comm LED가 깜빡이는지도 확인하세요.

      저도 딱 저 위에 셋팅으로만 성공했습니다(Arduino DUE/3.3V기반)

      그리고 혹시 ESP8266이 AP로서(WiFi AP) 작동하시길 바랬다면 특별한 명령이 더 필요합니다. 먼저 client로 접속이 되는지 확인해보시면 어떨까 싶습니다.

      2015.09.22 01:32 신고 [ ADDR : EDIT/ DEL ]
  6. 3.3LDO 는 따로 사용하지않았고 1.5 V 전지 2개를 연결하면 2.7~3.6 선에서 전압이 된다해서 배터리 케이스에 1.5V 짜리 2개로 사용하고 있습니다.
    아두이노 프로그램 시리얼 모니터 상에서 AT 명령어에 OK 가 나온다면 CONNECTION 은 제대로 된것이 맞는건가요???

    2015.09.13 20:50 [ ADDR : EDIT/ DEL : REPLY ]
    • AT명령에 OK가 나온다면 connection이 된것입니다.
      이후에는 위에서 가이드된 명령만 serial로 전송하면 serial로 다시 답을 받을 수 있습니다.

      다만 말씀드렸듯이 전압관리가 까다로워서 공급 전압이나 GND관리(건전지와 Arduino에 인가된 전원을 어떻게 연결하셨는지 모르지만..)
      , 심하면 데이터 핀(RX/TX)에 대한 level converting(Arduino Due가 아닌 경우는, 3.3V->5V)이 필요할 수 있습니다.

      (ESP8266 AT commands 라고 검색하시면 시험해볼만한 더 많은 명령어 종류를 아실 수 있습니다)

      2015.09.14 01:02 신고 [ ADDR : EDIT/ DEL ]
  7. due

    안녕하세요. 이 가이드를 따라 해보았는데
    말씀하신 파란 불빛이 들어오지 않고 시리얼 모니터에도 반응이 없다고 뜹니다.
    VCC 점퍼를 3.3V에 가져다 대면 파란불빛이 순간적으로 들어오는데, 깊게 꽂으면 꺼지고 아무 값도 받지 않습니다.
    due를 사용하고 usb를 이용해 컴퓨터로 전원을 공급받는데, 무슨 문제인지 조언 부탁드립니다.

    2015.12.22 01:26 [ ADDR : EDIT/ DEL : REPLY ]
    • 빨간 불빛이 들어온다면 최소한의 전원이 들어온다는 이야기이고,
      파란 불빛이 들어오지 않는다면 통신이 되지 않는다는 뜻입니다. 속도를 맞게 측정했는지, Rx/Tx가 바뀌지 않았는지 한번 조절해보시고요.

      due에 USB를 이용해 전원 입력 받으면 아무 문제 없습니다.

      모듈의 버전이 다를 수 있으므로 Serial속도를 115,200이나 9,600 으로 변경해서 시도해보시는 것도 추천드립니다.

      2015.12.25 01:17 신고 [ ADDR : EDIT/ DEL ]