ESP8266 모듈을 통해 몇 천원으로 WiFi를 아두이노에서 구현한다.
▶ 이 가이드를 따라하면
- 시리얼 통신을 통해 WiFi를 사용해볼 수 있다.
- 3.3V 기반의 ESP8266 모듈을 사용해볼 수 있다.
▶ 같이 읽으면 좋은 글
- CC3000 WiFi 쉴드(20$) 사용법 : http://bbangpan.tistory.com/20
▶ 부품 설명 및 회로 구성
ESP8266은 초저가의 WiFi 모듈이다. 다른 WiFi shield들이 최소 $20이상인데 반하여 이 모듈은 $2에도 판다. 물론 다른 고가의 shield처럼 DNS등을 지원 하지는 못하지만, TCP로 IP에 직접 연결하여 웹사이트의 내용을 가져오는 등의 간단한 역할은 훌륭히 할 수 있으며 간단히 웹서버로도 셋팅할 수 있다. 다만 초보자가 사용하기에는 몇가지 사전 지식이 필요하다.
- 3.3V기반으로 작동되고 전력소모도 크기 때문에(300ma), Arduino UNO의 3.3V(50mA수준)로는 전력이 부족하다.
- 그래서 여기서는 Arduino Due를 사용했다. Due는 3.3V out pin의 출력도 800mA이며 데이터 pin도 모두 3.3V로 작동한다.
- UNO의 5V를 변압해서 사용하는 경우도 있는데, 데이터 pin도 모두 같이 변환(레벨 컨버터 사용)해주어야 하므로 까다롭다.
- 부품 버전과 펌웨어가 제각각이다. 시리얼 통신으로 모듈을 제어하는데 이 초기 속도가 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 시리얼
'아두이노 통신' 카테고리의 다른 글
[통신모듈/HC-12] 저렴하고 긴 거리 통신이 가능한 HC-12 (4) | 2020.08.22 |
---|---|
[네트워크/이더넷쉴드] W5200, W5100 칩셋을 쓴 이더넷 쉴드(Ethernet Shield)로 유선랜을 써보자 (0) | 2015.10.18 |
[통신/GPS] 위도 경도 값을 불러와 활용하는 GPS(NEO-6M) 모듈을 구동해보자 (5) | 2015.06.15 |
[통신/근거리고속] 2.4Ghz 양방향 통신을 nRF24L01 모듈로 구현하자 (11) | 2015.05.22 |
[통신/중단거리] 중단거리 양방향 통신이 가능한 serial 기반의 손쉬운 네트워크 모듈 APC220 (4) | 2015.04.10 |
[통신/WiFi] WiFi 모든 것을 활용하는 Arduino WiFi Shield (CC3000) (17) | 2015.03.24 |
[통신/BLE] BLE / iBeacon을 아두이노에서 구현하게 해주는 HM-10 (18) | 2015.03.13 |
[통신/블루투스] Bluetooth 2.0을 구현하는 HC-06모듈, 스마트폰과 아두이노 연동 (7) | 2015.02.16 |
[통신/근거리] 433/315Mhz 근거리 무선 송수신 통신을 아두이노(Arduino)에서 구현해보자 (8) | 2015.02.08 |