?>

Hard Copy World

HCW

ESP8266, ESP32

Home > Learning >

ESP8266, ESP32

ESP8266 활용 가이드 - 아두이노와 연동하기 1

페이지 정보

작성자 최고관리자 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 작성일14-10-14 17:29 조회16,343회 댓글14건

본문

 

 

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, 1x1 MIMO, 2x1 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 setESP8266 SpecificationsESP8266 Datasheet(영문)ESP8266 IoT SDK

 

그래서 해외에서 영어로 번역 작업이 꽤 진행되었습니다.

영어 번역자료 : AT command setAT command 추가자료ESP8266 Datasheet,  IoT SDKWiKi 페이지Seeed WiKi

아두이노용 라이브러리 프로젝트(bafeigum 유저, 작업중) : 프로젝트 페이지GitHub 소스 다운로드

 

 

2. 연결방법

 

주의!! : WiFi 모듈의 baud rate(전송속도)가 57600으로(혹은 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), PC 혹은 폰 등이 추가로 필요하다는 뜻이죠. 굳이 zigbee 모듈이 아니라 블루투스 모듈 등을 이용하셔도 되겠습니다. 전 Zigbee 대신 HC-06 블루투스 모듈을 연결하고 폰에 설치된 채팅 앱으로 Debug 메시지를 볼 수 있도록 구성했습니다.

모듈에는 3.3v 전원을 입력하세요.

600px-Wifi_connection

아두이노 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 핀을 추가로 연결하고 전송속도를 115200 으로 맞춰서 사용합니다. (제 경우는 이렇게 설정했을 때 성공함)

http://zeflo.com/2014/esp8266-weather-display/

weather-display1-569x390

 

주의 : 소스 코드 업로드 할 때 제대로 올라가지 않는 현상이 발생할겁니다. 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 

#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 을 사용합니다. (그리고 5선을 연결해서 사용)

http://zeflo.com/2014/esp8266-weather-display/

5선 연결 및 3.3v-5v 변환을 고려한 또 다른 예제.

http://feedsanywhere.com/feed/32221

아래 링크를 보시면 ESP8266 용 아두이노 라이브러리가 있습니다. 아직 테스트 해보지는 못했습니다.

https://github.com/itead/ITEADLIB_Arduino_ESP8266

 

주목!! ESP8266 활용편 에서는 ESP8266 모듈의 통신 속도를 9600으로 변경해서 SoftwareSerial로 편리하게 활용하는 방법을 설명하고 있습니다.

 

 

추가로 여러가지 테스트를 더 해보고 문서 업데이트 하도록 하겠습니다.

 

[이 게시물은 최고관리자님에 의해 2016-01-24 15:11:27 Communication module에서 복사 됨]

추천 0
  • 페이스북으로 보내기
  • 트위터로 보내기
  • 구글플러스로 보내기

댓글목록

redflag님의 댓글

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 도 있습니다.

 미력하지만 경험 공유 차원에서 살짝 올려 봅니다 ^^. (이상 여기는 redflag, 까페에서는 지운아빠 였습니다)

하드카피님의 댓글

하드카피 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 댓글의 댓글 작성일

좋은 자료 공유 감사합니다! 한동안 여행을 갔다 이제 돌아와서 봤네요. 저도 한번 테스트 해보고 자료 업데이트 더 해보겠습니다~

nice72님의 댓글

nice72 이름으로 검색 작성일

안녕하세요. 혹시 esp8266 모듈을 가지고 계신가요? 여분이 있으시다면 몇 개 구매하고 싶습니다. ebay에서 구매는 했는데, 20일이 넘도록 물건이 오지 않아서요. 부탁드립니다. 제 핸드폰 번호는 010-2557-일삼공이 입니다.

최고관리자님의 댓글

최고관리자 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 작성일

여차저차해서 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 전원선 뽑고 소스코드 업로드 후 다시 연결하세요.

# 본문에도 본 내용 업데이트 하겠습니다.

ESP어렵님의 댓글

ESP어렵 이름으로 검색 작성일

안녕하세요. 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. 아두이노 보드에 충분한 전원이 공급된다는 것은 어떤식으로 확인할 수 있나요? 시리얼 모니터를 통해서 성공하였는데 아두이노 보드에 충분한 전원이 공급되었다는 것을 증명해 주는 부분이 아닌가요?

최고관리자님의 댓글

최고관리자 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 댓글의 댓글 작성일

1. 조금 틀립니다. println() 함수는 끝에 줄넘김 문자가 추가로 붙어서 넘어갑니다. 줄넘김 문자 없이 보내려면 print() 함수를 사용하세요.
2. 매뉴얼대로라면 여기서 문제되진 않을 것 같습니다.
3. 시리얼로 데이터가 오고가도 실제 ESP8266 모듈이 wifi 통신을 할 때 급격히 전류 사용량이 증가하는 걸로 알고 있습니다. 그래서 외부 전원을 넣어주던지 아두이노에 9V 어댑터 등으로 충분히 전원을 넣어줘야 한다고 합니다. PC에서 오는 USB 전원으로는 wifi 통신이 제대로 안되는 것 같습니다.

강태평님의 댓글

강태평 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 작성일

안녕하세요 저도 위에 분이랑 비슷한 현상인데요. AT커맨드로는 성공했습니다.
그런데 아두이노로 코드 실행하면
AT+CIPSTART="TCP","220.181.111.85",80
AT+CIPSEND=18
GET / HTTP/1.0
이런 메시지만 반복적으로 나오고 Respons 데이터가 나오지 않고있습니다.
제가 몬가 잘못한걸까요?

최고관리자님의 댓글

최고관리자 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 댓글의 댓글 작성일

AP와의 연결이 좋지 않거나 AT 커맨드 파라미터를 확인해봐야 할 것 같습니다. 특히 HTTP 헤더 부분인
GET / HTTP/1.0
요 부분은 마지막에 \n\n 두 번의 줄 넘김이 필요한 것 같습니다. CIPSEND 의 값은 줄 넘김 포함한 문자열 길이를 정확히 적어주구요. 아래 내용을 참고하세요.
http://www.hardcopyworld.com/gnuboard5/bbs/board.php?bo_table=lecture_esp&wr_id=36

어리님의 댓글

어리 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 작성일

esp8266을 사용할 때 펌웨어 업데이트를 하는 이유는 뭔가요?
이 후에 쓰인 글 따라 esp8266 업데이트를 하고 있는데요, 그 이유가 뭔지가 궁금지네요.

그리고 제가 펌웨어 업데이트를 한 방법도 알려드리고 싶은데요.
구글링을 하다가 이 사이트를 따라서 업데이트를 하니 아무 문제 없지 업데이트가 되더라고요.
http://microcontrollerkits.blogspot.kr/2015/05/esp8266-firmware-update-with-arduino.html
여기에서 아두이노와 esp8266을 연결하고, 보여지는 소스를 아두이노에 업로드 한 후
이 페이지에서 설명해주는 펌웨어 업데이트 프로그램을 이용하니 됐어요.

최고관리자님의 댓글

최고관리자 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 댓글의 댓글 작성일

예전 펌웨어의 안전성 문제나 여러 버그가 수정된 걸 사용하기 위해서 펌웨어 업데이트를 합니다. 공유해주신 정보 감사합니다.

어리님의 댓글

어리 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 작성일

아두이노와 esp8266과 연동을 하고 휴대폰의 핫스팟과 연결해서 제어할 수 있을까요?
rc카를 만들고 싶은데, 아두이노-wifi-스마트폰 어플 이렇게 연동시켜서 스마트폰으로 rc카를 제어하고 싶거든요.
이렇게 하려면 어떤 wifi모듈을 사용하는게 좋을까요?

최고관리자님의 댓글

최고관리자 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 댓글의 댓글 작성일

제 경험상 가장 간단하게 WiFi 모듈과 안드로이드를 붙이는 방법은 WiFi232 모듈을 사용하는 것이었습니다. 인터넷 검색하면 샘플 안드로이드 앱 예제까지 제공해줍니다.
ESP8266 모듈을 사용할 수도 있는데... SoftAP 모드로 동작시킨 다음 TCP/IP 통신을 해야하는 걸로 압니다. 아직 직접 해본 경험이 없어 말씀드리기가 조심스럽네요.