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로 편리하게 활용하는 방법을 설명하고 있습니다.
추가로 여러가지 테스트를 더 해보고 문서 업데이트 하도록 하겠습니다.
안녕하세요. 저도 오늘 모듈 받아서 테스트 해보고 있는데
도저히 serial 로 ready가 안넘어 옵니다.
Serial.println(“AT+RST”);
delay(1000);
if(Serial.find(“ready”)) <———–여기요
{
폰으로 wifi 검색하면 모듈은 뜨는거 보니 esp8266이 부트는 된거 같은데 말입니다. 혹시 얼만큼 진행하셨는지 메일로 알려주실수 있으신가요?
저도 모듈은 받았는데.. 개인적인 일들땜에 테스트를 못해보고 있습니다;;; 테스트 해보고 알려드릴께요. 아 그리고 여기 댓글은 확인이 느리니 새로 개편한 홈페이지 QnA 게시판으로 이용해주세요~
생각난김에 한번 테스트 해보니… 저도 정확하게 같은 증상이 나옵니다. 관련 자료를 뒤져보니 5V로 동작하는 보드와 연결할 때는 RX/TX 핀도 level shifter를 사용해서 3.3v로 맞춰줘야 하는 것 같습니다. 아래 링크 참고하셔서 회로 수정하세요.
http://zeflo.com/2014/esp8266-weather-display/
전 5v-3.3v shift 모듈이 있어서 그걸 사용했습니다. 그러니까 AT+RST 까지는 되네요. 문제는 AP에 접속이 안됩니다. ㅡㅡ;;
아래 테스트 소스도 참고하세요.
http://raysfiles.com/arduino/ESP8266_arduino.ino
아.. 이래서 wifi 모듈은 비싼거 써야하나 싶습니다;;;
AT+CIPMUX=1
아.. 그리고 하나 더요… TXD 오른쪽에 있는 NC 핀도 3.3V에 연결해서 High로 맞춰줘야 합니다. Baudrate는 115200 으로 설정했습니다. 아래 링크가 가장 정확하네요.
http://zeflo.com/2014/esp8266-weather-display/
AT+RST 이후에 있는 delay를 삭제하고 해보세요.
아니면 하드웨어 RESET을 이용해도 되고요. 좀더 확실히 실행됨..
/*
* Atmega328P
* ESP8266 – Version:0.9.2.4
* AP 설정에 필요한 AT Command 수행에 사용하세요.
*/
#include
#define DBG_SERIAL Serial
const int RX_PIN = 2;
const int TX_PIN = 3;
const int RESET_PIN = 10;
SoftwareSerial WIFI_SERIAL(RX_PIN, TX_PIN);
void setup()
{
DBG_SERIAL.begin(9600);
WIFI_SERIAL.begin(9600);
pinMode(RESET_PIN, OUTPUT);
digitalWrite(RESET_PIN, LOW);
delay(3);
digitalWrite(RESET_PIN, HIGH);
DBG_SERIAL.println(“Starting..”);
}
void loop()
{
if (WIFI_SERIAL.available())
DBG_SERIAL.write(WIFI_SERIAL.read());
if (DBG_SERIAL.available())
WIFI_SERIAL.write(DBG_SERIAL.read());
}
혹 모듈 스스로가 AP가 되어 다른 장비가 붙을수 있는 지 확인되신분 계신가요?
여차저차해서 HTTP request 날리는데까지 성공 했습니다!!! 여기까지 진행하면서 중요한 점들은 아래와 같습니다.
# 연결 및 주의사항
– 제 경우 아두이노 우노 보드를 사용했습니다. WiFi 모듈의 Baudrate 초기값이 115200으로 설정되어 있어서 Hardware serial D0, D1 (RX, TX) 을 이용하는데 8MHz 로 동작하는 보드의 경우 115200 을 지원하지 않습니다.
– 본문에 나와있듯이 5V 동작전압의 보드에서는 level shifting을 해주어야 합니다. 전 5v-3.3v level shift 모듈을 사용했지만 저항 2개를 이용해서 간단히 회로 만드셔도 됩니다. WiFi RX – 아두이노 TX 연결하는 선만 해주면 됩니다. 아래 링크 아래부분 댓글 참고.
http://www.esp8266.com/viewtopic.php?f=8&t=6&sid=49f5396903eb3e078ccd6a2132be50cb
– 제가 가져온 예제 소스에 잘못된 부분이 있었습니다. 아래 소스코드중 AT+RST (리셋 커맨드) 이후에 delay 시간이 너무 길게 잡혀 있어서 진행이 안되었습니다. delay 값을 200ms 로 조정하고 정상 진행되었습니다.
//test if the module is ready
Serial.println(“AT+RST”);
delay(200); // 이 부분에서 너무 길게 대기하면 fail 남…
– 이후 AP 잡는 부분과 HTTP request 정상 진행되었습니다.
– 아두이노 보드에 충분한 전원이 공급되어야 하는 것 같습니다. 계속 안되는 분은 이 부분도 체크해보세요.
– WiFi 모듈이 하드웨어 시리얼 (D0, D1)을 사용하고 있으므로 동작 상태에서는 소스코드 업로드가 안됩니다. 반드시 WiFi 전원선 뽑고 소스코드 업로드 후 다시 연결하세요.
# 본문에도 본 내용 업데이트 하겠습니다.
안녕하십니까? 초보자 입니다.
거실등을 휴대폰으로 ON,Off 하려고 합니다.
ESP 8266 Wifi module을 사용해서 구현하려고 하는데
1) ESP8266 wifi module 과 아두이노 보드 있어야 하는지요?
단지 On,Off 만 하려고 하면 ESP8266 wifi module과 여기서 나오는 gate신호로 트라이악을 스위칭 시키면 되지 않을까 해서요.
2) ESP 8266에 코딩작업하려면 UART 필요한가요?
1) 아두이노 없이 ESP8266 의 GPIO를 제어하고 트랜지스터 등으로 원하시는 작업을 하는 방법이 있습니다. 다만 제가 아직 테스트 해본것은 아닙니다. 관련된 내용이 인터넷 상에 공개되어 있을겁니다.
2) 이 부분은 저도 잘 모르겠습니다.
안녕하세요. Arduino와 ESP8266 모듈에 관해 질문이 있는데요
지금 비어있는 .ino 파일을 arduino uno r3에 업로드한 후 시리얼 모니터를 115200 baud rate로 맞춘 후 AT Command를 실행하는 데에는 성공하였습니다.
하지만 위의 코드 실행 시 Serial로 read, OK 등 값이 넘어오지 않는 것을 확인하였고,
현재 reference를 활용하여, 아두이노의 RX부분을 level shifting 해주는 회로 구성을 하였고, 다시 시도해 보았지만 정상적인 동작이 이뤄지지 않았습니다.
1. 시리얼 모니터를 통해 AT Command를 날리는 것과 아두이노 스케치에서 Serial.println()이 다른 것인가요?
2. 아두이노 RX level shifting 및 CH_PD 를 high로 setting 하는 것이 문제가 있나요?
3. 아두이노 보드에 충분한 전원이 공급된다는 것은 어떤식으로 확인할 수 있나요? 시리얼 모니터를 통해서 성공하였는데 아두이노 보드에 충분한 전원이 공급되었다는 것을 증명해 주는 부분이 아닌가요?
QnA 게시판으로 답 드렸습니다.