본문 바로가기
아두이노 통신

[통신/WiFi] 저가로 WiFi를 구현할 수 있는 모듈(ESP8266)

by 작동미학 2015. 3. 22.
반응형

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 시리얼

반응형