Serial WiFi 모듈 (ESP8266)
ESP8266/ESP32 모듈 관련 자료는 전용 게시판으로 모두 이동되었습니다. 아래 문서의 최신 업데이트는 ESP8266 전용 게시판에서 확인하세요.
ESP8266 활용 가이드 목차
1. Serial WiFi (ESP8266)
아두이노와 같은 8비트 프로세서로 만들기 좋아하는 분들을 위해 Serial 로 간단히 제어할 수 있게 만든 WiFi 모듈입니다. TI CC3000 SoC 칩처럼 TCP/IP 프로토콜 스택을 칩에 올린 ESP8266 칩을 사용하고 있습니다. 간단하게 말해서 WiFi Soft AP 동작, WiFi direct 연결, TCP/UDP 데이터 전송을 지원합니다. Serial 로 아두이노와 연결한 다음 아두이노에서 AT command를 전송해서 모듈을 제어할 수 있기 때문에 사용하기도 비교적 간단합니다. Ebay에서 serial wifi 로 검색하면 쉽게 찾을 수 있는 모듈입니다.
Characteristics
- 802.11 b / g / n
- Wi-Fi Direct (P2P), soft-AP
- Built-in TCP / IP protocol stack
- Built-in TR switch, balun, LNA, power amplifier and matching network
- Built-in PLL, voltage regulator and power management components
- 802.11b mode + 19.5dBm output power
- Built-in temperature sensor
- Support antenna diversity
- off leakage current is less than 10uA
- Built-in low-power 32-bit CPU: can double as an application processor
- SDIO 2.0, SPI, UART
- STBC, 1×1 MIMO, 2×1 MIMO
- A-MPDU, A-MSDU aggregation and the 0.4 Within wake
- 2ms, connect and transfer data packets
- standby power consumption of less than 1.0mW (DTIM3)
굉장히 작은 사이즈에다가 일반적인 아두이노 WiFi 쉴드의 1/10 가격인 5$ 내외로 구입할 수 있다는 점에서 매력 넘치는 넘입니다만.. 아쉽게도 인터넷에서 구할 수 있는 정보가 너무 제한적입니다. 사용방법도 굉장히 까다롭습니다. Ebay seller 가 제공하는 정보는 약간의 매뉴얼, datasheet, AT command 등이고 모두 중국어로만 제공(!!)되고 있어서 모듈을 원하는대로 사용하기 위해서는 굉장한 인내심을 필요로 합니다.
중국어 자료: AT command set, ESP8266 Specifications, ESP8266 Datasheet(영문), ESP8266 IoT SDK
그래서 해외에서 영어로 번역 작업이 꽤 진행되었습니다.
영어 번역자료 : AT command set, AT command 추가자료, ESP8266 Datasheet, IoT SDK, WiKi 페이지, Seeed WiKi
아두이노용 라이브러리 프로젝트(bafeigum 유저, 작업중) : 프로젝트 페이지, GitHub 소스 다운로드
2. 연결방법
주의!! : WiFi 모듈의 baud rate(전송속도)가 115200으로 설정되어 있습니다. SoftwareSerial 라이브러리가 지원하는 최대 baud rate 는 19200 이기 때문에 SoftwareSerial 로 제어할 경우 문제가 생깁니다. 따라서 아두이노 0번 1번 핀을 이용해서 Hardware serial로 제어해야 합니다. 문제는 일반적인 아두이노 보드(UNO 포함한 nano, pro, micro 등등)에는 Hardware serial 을 하나만 제공하기 때문에 0, 1번 핀을 사용하는 경우 PC로 Debug 데이터를 출력할 수가 없습니다.
그래서 아래 예제에서는 wifi 모듈을 아두이노 UNO의 hardware serial (0, 1번 핀) 로 연결하고 10, 11번 핀에 zigbee 모듈을 연결해서 SoftwareSerial로 debug 데이터를 전송하도록 했습니다. Debug 데이터를 받기 위해서 또 한 대의 아두이노(+zigbee)가 추가로 필요하다는 뜻이죠. 굳이 zigbee 모듈이 아니라 블루투스 모듈 등을 이용하셔도 되겠습니다. 전 Zigbee 대신 HC-06 블루투스 모듈을 연결하고 폰에 설치된 채팅 앱으로 Debug 메시지를 볼 수 있도록 구성했습니다.
아두이노 Mega 처럼 Hardware serial을 여러개 제공하는 보드를 이용하면 PC에서 손쉽게 Debug 데이터를 확인해보실 수 있어서 편리합니다.
주의 : 위와 같이 연결했는데 제 경우에는 AT 커맨드가 전혀 먹히질 않았습니다. 다시 관련내용들을 검색해보니 데이터 라인.. 특히 아두이노에서 wifi 모듈로 전송되는 데이터 라인도 3.3v 로 변환해줘야 한다고 합니다. 아래 링크 참고하시면 이 때의 회로 구성을 보실 수 있습니다.
http://feedsanywhere.com/feed/32221
이게 한눈에 들어오지 않으신다면 redflag 님이 알려주신 내용을 참고하세요. (전 3.3v – 5v 모듈 연결해주는 level shift 모듈을 사용했습니다.)
redflag 님:
일단 레벨쉬프트 없이도 기본적으로 저항 2개로도 구성 가능합니다.
ESP8266의 TX (Arduino의 RX)는 전혀 변환없이 사용해도 아두이노가 인식하고..
ESP8266의 RX (Arduino의 TX)는 변환이 필요합니다. 전압 분배 원리를 이용해서 200옴하나와 100옴 하나를 직렬연결해서 5V(VCC)와 GND에 연결하고, 그 가운데 부분에서 신호를 따서 쓰면 됩니다.
저도 아두이노 3.3V 짜리를 따로 구하기 전에는 이렇게 해서 사용했고요… AT+RST 이런거까지는 되긴 됩니다.
주의!! : 그리고 위와 같이 조치해도 AT 커맨드가 먹히지 않는 상황이면 아래 링크를 참고해서 연결하세요. 보시면 위 그림에서 사용한 4핀 외에 CH_PD 핀을 추가로 연결하고(아두이노 3.3v 핀으로) 전송속도를 115200 으로 맞춰서 사용합니다. (제 경우는 이렇게 설정했을 때 성공함)
http://zeflo.com/2014/esp8266-weather-display/
주의 : 소스 코드 업로드 할 때 제대로 올라가지 않는 현상이 발생할겁니다. WiFi 모듈이 하드웨어 시리얼을 사용하기 때문에 PC와의 USB 통신이 충돌이 나는 겁니다. WiFi 모듈의 3.3v 전원을 차단하고 소스코드를 업로드 하셔야 합니다. 소스코드 업로드가 끝나면 다시 Wifi 모듈 전원선을 연결해서 쓰세요.
이 과정이 귀찮으신 분은 펌웨어 업데이트를 통해 기본 baudrate 값을 9600이 되도록 해주면 됩니다. 최신 펌웨어에서 baudrate 값이 9600으로 설정되어 있다고 합니다. 그럼 굳이 하드웨어 시리얼을 쓸 필요도 없고 블루투스 모듈도 필요없죠. 그냥 PC에서 시리얼 모니터로 메시지 확인할 수 있습니다. 펌웨어 업데이트 및 상세정보는 redflag 님의 조언을 참고하세요.
이런저런 테스트를 계속 하고 있는데… 일단 말씀하신대로 CH_PD 핀은 pull up으로 연결되어야 하는 것 같습니다.
그리고 GPIO2, RST 핀도 Pull-up 되는것이 좋을 것 같고..
GPIO0번 핀은 평시 동작 때는 Pull-up, Firmware update 할때는 0으로 되어야 하네요.
이런저런 이유로 계속 지켜보고 있은 모듈인데… 가장 첫번째 할 일은 Firmware update 인것 같습니다.
바로 아래 2번째 링크 (electrodragon) 에 들어가서 firmware 부분을 클릭해 보시면, update 할 수 있는 software와 firmware를 다운받을 수 있는 링크가 있습니다.
대부분 중국에서 모듈로 사면 원래 들어 있는 펌웨어는 115200 baud rate 로 고정되어 있을텐데, update를 하면 9600을 기본으로 바꿔 줍니다. (참고로 저는 ESP8266_AT_V00180902_04 (0018000902-AI03)_unconfirm…. 어쩌고 하는 버전으로 받아서 업데이트 했습니다.)
현재 참고할만한 사이트는 많이 있지만… 그래도 esp8266 자체에 대한 고민을 주로 하는 곳은 이런곳이 있네요.
http://bbs.espressif.com/ – 나름 공식이라고 해야할까요? 주로 firmware 개발툴과 함께 수정된 소스코드를 배포하는 용도인것 같습니다. (다른정보도 있고요)
http://www.electrodragon.com/w/Wi07c – 정리된 모습을 보고 싶으면 여기가 가장 좋은 것 같습니다.
esp8266.com 이라는 사용자들이 만든 forum 도 있습니다.
위 과정이 너무 복잡하고 어려우시다면.. 주목!! ESP8266 활용편 에서는 ESP8266 모듈의 통신 속도를 9600으로 변경해서 SoftwareSerial로 편리하게 활용하는 방법을 설명하고 있습니다.
3. 소스코드 (스케치)
소스코드 최상단에 있는 SSID (WiFi 공유기 ID), PASS (패스워드), DST_IP(request를 전송할 URL), SoftwareSerial TX/RX 핀 번호를 자신에게 맞게 변경하고 실행하세요.
#include <SoftwareSerial.h> #define SSID "xxxxxxxx" #define PASS "xxxxxxxx" #define DST_IP "220.181.111.85" //baidu.com SoftwareSerial dbgSerial(10, 11); // RX, TX void setup() { // Open serial communications and wait for port to open: Serial.begin(57600); Serial.setTimeout(5000); dbgSerial.begin(9600); //can't be faster than 19200 for softserial dbgSerial.println("ESP8266 Demo"); //test if the module is ready Serial.println("AT+RST"); delay(200); if(Serial.find("ready")) { dbgSerial.println("Module is ready"); } else { dbgSerial.println("Module have 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); //print the ip addr /* Serial.println("AT+CIFSR"); dbgSerial.println("ip address:"); while (Serial.available()) dbgSerial.write(Serial.read()); */ //set the single connection mode Serial.println("AT+CIPMUX=0"); } void loop() { String cmd = "AT+CIPSTART=\"TCP\",\""; cmd += DST_IP; cmd += "\",80"; Serial.println(cmd); dbgSerial.println(cmd); if(Serial.find("Error")) return; cmd = "GET / HTTP/1.0\r\n\r\n"; Serial.print("AT+CIPSEND="); Serial.println(cmd.length()); if(Serial.find(">")) { dbgSerial.print(">"); }else { Serial.println("AT+CIPCLOSE"); dbgSerial.println("connect timeout"); delay(1000); return; } Serial.print(cmd); delay(2000); //Serial.find("+IPD"); while (Serial.available()) { char c = Serial.read(); dbgSerial.write(c); if(c=='\r') dbgSerial.print('\n'); } dbgSerial.println("===="); delay(1000); } boolean connectWiFi() { Serial.println("AT+CWMODE=1"); String cmd="AT+CWJAP=\""; cmd+=SSID; cmd+="\",\""; cmd+=PASS; cmd+="\""; dbgSerial.println(cmd); Serial.println(cmd); delay(2000); if(Serial.find("OK")) { dbgSerial.println("OK, Connected to WiFi."); return true; } else { dbgSerial.println("Can not connect to the WiFi."); return false; } }
예제코드는 setup() 함수에서 WiFi 모듈 초기화와 무선 공유기에 연결하는 작업을 수행하고, loop() 함수에서 지정한 URL로 접속합니다. 그리고 URL 접속해서 받아온 데이터를 SoftwareSerial( zigbee 모듈, 블루트스 등등)로 뿌려줍니다.
아래 링크에 있는 소스는 위 예제소스를 바탕으로 응용한 소스입니다. openweathermap 서비스에 접속해서 온도, 습도 등의 데이터를 받아온 다음 LCD에 표시해 주는 예제입니다. 약간 다른점은 baudrate 115200 을 사용합니다.
http://zeflo.com/2014/esp8266-weather-display/
참고 : 아래 링크에 있는 소스도 참고하세요. openweathermap 서비스에 접속해서 온도, 습도 등의 데이터를 받아온 다음 LCD에 표시해 주는 예제입니다. 약간 다른점은 baudrate 115200 을 사용합니다. (그리고 5선을 연결해서 사용)
http://zeflo.com/2014/esp8266-weather-display/
5선 연결 및 3.3v-5v 변환을 고려한 또 다른 예제.
http://feedsanywhere.com/feed/32221
아래 링크를 보시면 ESP8266 용 아두이노 라이브러리가 있습니다.(Baudrate 115200 사용) 아직 테스트 해보지는 못했습니다.
https://github.com/itead/ITEADLIB_Arduino_ESP8266
주목!! ESP8266 활용편 에서는 ESP8266 모듈의 통신 속도를 9600으로 변경해서 SoftwareSerial로 편리하게 활용하는 방법을 설명하고 있습니다.
추가로 여러가지 테스트를 더 해보고 문서 업데이트 하도록 하겠습니다.