반응형

예전 포스팅에서 ESP8266의 펌웨어를 업데이트 해봤고(http://deneb21.tistory.com/269) AT 커맨드를 이용하여 공유기에 연결해 보았다.(http://deneb21.tistory.com/272) 이번엔 웹페이지를 통해서 아두이노에 달린 LED를 컨트롤 해 보자


웹페이지의 버튼을 클릭하면 아두이노에 연결된 특정 LED가 켜지고 꺼지는 것을 구현해 보는 것이다.


연결은 다음과 같이 해 주었다. 그리고 위의 두 개의 글에서도 말을 했지만 ESP8266은 3.3V에서 동작하는데 아두이노 디지털핀의 출력은 5V이다. 저항 등을 연결하여 다운시켜야 고장이 없지만 저항이 없어서 직접 연결하였다. 이는 ESP8266 모듈의 고장이나 아두이노의 고장의 원인이 될 수가 있다고 한다. 하지만 나의 경우는 운이 좋아서 그런건지 몇 시간을 테스트 해도 이상이 없다;; 물론 LED도 저항과 함께 연결해야 한다.



■ Fritzing 파일: 

ESP8266_WEB_LED.fzz


아두이노측 소스


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include <SoftwareSerial.h>
#define DEBUG true
 
SoftwareSerial esp8266(2,3); // make RX Arduino line is pin 2, make TX Arduino line is pin 3.
                                        // This means that you need to connect the TX line from the esp to the Arduino's pin 2
                                        // and the RX line from the esp to the Arduino's pin 3
 
void setup() {
  Serial.begin(9600);
  esp8266.begin(9600); // your esp's baud rate might be different
  
  pinMode(11, OUTPUT);
  digitalWrite(11, LOW);
  
  pinMode(12, OUTPUT);
  digitalWrite(12, LOW);
  
  pinMode(13, OUTPUT);
  digitalWrite(13, LOW);
   
  sendData("AT+RST\r\n",2000,DEBUG); // reset module
  sendData("AT+CIOBAUD?\r\n",2000,DEBUG); // check baudrate (redundant)
  sendData("AT+CWMODE=3\r\n",1000,DEBUG); // configure as access point (working mode: AP+STA)
  sendData("AT+CWLAP\r\n",3000,DEBUG); // list available access points
  sendData("AT+CWJAP=\"AP NAME\",\"AP PASSWORD\"\r\n",5000,DEBUG); // join the access point
  sendData("AT+CIFSR\r\n",1000,DEBUG); // get ip address
  sendData("AT+CIPMUX=1\r\n",1000,DEBUG); // configure for multiple connections
  sendData("AT+CIPSERVER=1,80\r\n",1000,DEBUG); // turn on server on port 80
}
 
void loop() {
  if(esp8266.available()) { // check if the esp is sending a message
    if(esp8266.find("+IPD,")) {
      delay(1000); // wait for the serial buffer to fill up (read all the serial data)
      // get the connection id so that we can then disconnect
      int connectionId = esp8266.read()-48// subtract 48 because the read() function returns 
                                           // the ASCII decimal value and 0 (the first decimal number) starts at 48
      esp8266.find("pin="); // advance cursor to "pin="
      int pinNumber = (esp8266.read()-48)*10// get first number i.e. if the pin 13 then the 1st number is 1, then multiply to get 10
      pinNumber += (esp8266.read()-48); // get second number, i.e. if the pin number is 13 then the 2nd number is 3, then add to the first number
      digitalWrite(pinNumber, !digitalRead(pinNumber)); // toggle pin    
     
      // make close command
      String closeCommand = "AT+CIPCLOSE="
      closeCommand+=connectionId; // append connection id
      closeCommand+="\r\n";
      sendData(closeCommand,1000,DEBUG); // close connection
    }
  }
}
 
/*
* Name: sendData
* Description: Function used to send data to ESP8266.
* Params: command - the data/command to send; timeout - the time to wait for a response; debug - print to Serial window?(true = yes, false = no)
* Returns: The response from the esp8266 (if there is a reponse)
*/
String sendData(String command, const int timeout, boolean debug) {
    String response = "";
    esp8266.print(command); // send the read character to the esp8266
    long int time = millis();
    
    while( (time+timeout) > millis()) {
      while(esp8266.available()) {
        // The esp has data so display its output to the serial window 
        char c = esp8266.read(); // read the next character.
        response+=c;
      }
    }
    
    if(debug) {
      Serial.print(response);
    }
    return response;
}
cs


위에서 25행에 AP NAME, AP PASSWORD 부분에는 자신이 연결하려고 하는 공유기의 AP이름과 패스워드를 적어 주어야 한다.


나의 경우 전력부족으로 추정되는 에러로 위의 프로그램이 업로드가 되지 않는 현상이 있었다. 이런 경우 ESP8266의 전원케이블을 뽑고 프로그램을 업로드 하니 업로드가 잘 된다. 역시 ESP8266이 전력을 많이 먹는것 같다.


웹페이지 소스


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<html>
 <head>
  <title>ESP8266 LED Control</title>
 </head>
 <body>
 
 <!-- in the <button> tags below the ID attribute is the value sent to the arduino -->
 <h>ESP8266 LED Control</h></br></br>
 <button id="11" class="led">LED PIN 11</button<!-- button for pin 11 -->
 <button id="12" class="led">LED PIN 12</button<!-- button for pin 12 -->
 <button id="13" class="led">LED PIN 13</button<!-- button for pin 13 -->
  
 <script src="jquery.min.js"></script>
 <script type="text/javascript">
  $(document).ready(function(){
   $(".led").click(function(){
    var p = $(this).attr('id'); // get id value (i.e. pin13, pin12, or pin11)
    // send HTTP GET request to the IP address with the parameter "pin" and value "p", then execute the function
    $.get("http://192.168.1.102:80/", {pin:p}); // execute get request
   });
  });
 </script>
 </body>
</html>
cs


웹페이지 소스도 19행의 '192.168.1.102' 부분을 자신의 ESP8266 IP주소로 바꿔주어야 한다. 그리고 아래의 jquery.min.js 파일을 위의 html 파일과 같은 폴더에 넣어준다.

jquery.min.js


그리고 로컬 컴퓨터에서 테스트 하는 것은 그냥 html 파일을 브라우저로 불러와서 테스트해도 되지만 원격에서 테스트 하고자 하는 경우 당연한 얘기겠지만 자신의 PC에 웹서버를 설치하고 html 파일을 웹서버에 올려야 한다. 그리고 공유기 환경이라면 포트포워딩 등을 통해서 외부에서 접근 가능하도록 해야 한다. 나의 경우는 간단한 웹서버로 Mongoose 웹서버를 즐겨쓴다.


결과

각 버튼을 클릭하면 약간의 텀이 있지만 해당되는 LED가 잘 켜지고 잘 꺼진다. 더 응용하면 릴레이나 모터의 제어도 가능할 것 같다.




참고 사이트: 

http://allaboutee.com/2015/01/02/esp8266-arduino-led-control-from-webpage/

http://blog.naver.com/damtaja/220311479276

반응형
반응형

이전 포스팅 [아두이노] 와이파이 모듈 ESP8266 펌웨어 업데이트 에서 ESP8266 펌웨어를 아두이노와 연결하여 소프트웨어 시리얼을 통하여 펌웨어를 업데이트 하는 방법을 알아보았다. 이번엔 AT 커맨드를 이용하여 ESP8266을 와이파이 공유기에 연결하는 방법을 알아보겠다. ESP8266 AT Command에 대해서는 다음의 URL을 참고하면 자세히 할 수 있다.


http://room-15.github.io/blog/2015/03/26/esp8266-at-command-reference/#AT


아두이노와의 연결은 펌웨어 업데이트 시와 동일하지만 펌웨어 업데이트 모드로 진입하기 위해서 연결했던 GPIO0에 연결했던 선은 뽑아주어야 아래의 실습을 할 수 있다. 결선도를 다시 그리자면 아래과 같다. 만약 펌웨어 업데이트가 되어있지 않다면 [아두이노] 와이파이 모듈 ESP8266 펌웨어 업데이트 글을 참고하여 펌웨어를 먼저 업데이트 하여야 한다.


Fritzing 파일: 

ESP8266_AT_Command.fzz


연결


Arduino  /   ESP8266

Tx  ------- Tx

Rx  ------- Rx

3.3V ------ CH_PD & 3.3V (VCC)


위와 같이 연결하고 아두이노를 PC와 연결한다. 아두이노 IDE를 실행하고 시리얼모니터를 열어 Baud Rate를 9600으로 설정하고 표시방식을 'Both NL & CR'로 설정한다.


1. 동작확인과 펌웨어 버전의 확인

- 'AT' 를 입력하여 OK 메시지가 리턴되면 정상적으로 동작하고 있다는 뜻이다.

- 'AT+GMR' 을 입력하면 ESP8266 의 현재 펌웨어 버전을 알려준다.





2. 와이파이 연결

ESP8266은 아래와 같이 3가지 모드를 지정해 줄 수 있다.

1번 : Station(Client)

2번 : AP(Host)

3번 : Station / AP  Dual 모드


AP는 집에 있는 와이파이 신호를 제공해 주는 공유기(라우터)를 생각하면 되고 Station은 와이파이 신호를 연결해서 사용하는 스마트폰을 생각하면 된다.


모드의 변경은 다음의 명령어로 전환한다.

'AT+CWMODE=1'  --->  Station Mode

'AT+CWMODE=2'  --->  AP Mode

'AT+CWMODE=3'  --->  Dual Mode


현재 모드의 확인은 다음의 명령어로 한다.

'AT+CWMODE?'



우선, ESP8266을 Station 모드로 와이파이 공유기에 접속을 하기 위해 ESP8266을 Station 모드로 전환한다.


모드를 Station으로 변경했으면 연결 가능한 와이파이를 찾는다. 와이파이를 찾는 명령어는 'AT+CWLAP' 명령어로 찾을 수 있다.


위와 같이 연결 가능한 AP 리스트가 뜨게 된다. 괄호 안의 값의 의미는 좌측부터 다음과 같다.


검색된 AP 중에서 집에 있는 공유기인 deneb2.4g 에 연결을 하려고 한다.

연결 명령어는 AT+CWJAP="SSID of AP","Password" 이다. 현재 연결된 AP를 보려면 'AT+CWJAP?' 을 입력하면 된다.


공유기에 제대로 연결되었는지 IP 확인을 해보자. 연결된 IP의 확인은 'AT+CIFSR' 명령어를 이용하면 된다.



ESP8266에 Ping 을 해 보았다.


한 번 설정된 접속정보는 ESP8266 메모리에 저장되어 전원을 껏다 켜도 자동으로 접속하게 된다.


AT 커맨트 요약정리 - 출처: https://nurdspace.nl/ESP8266



위와 같이 공유기에 잘 연결이 되어 IP도 뜨고 ESP8266에 Ping 도 된다. 이제는 어떻게 서버 또는 클라이언트와 연결해서 활용하는냐만 남은 것이다. 유튜브나 인터넷을 검색해보면 많은 이들이 벌써 원격지에서 집의 전등을 ON/OFF 한다거나 릴레이를 컨트롤 하여 여러가지 전자제품을 컨트롤 하는데 활용하고 있다.


예전에 본 미드 빅뱅이론의 한 장면이 생각난다. 공학도인 주인공들이 미국에서 지구반대편에 있는 전등을 인터넷을 통해서 켜고 끄면서 즐거워 하던 장면이다.  ESP8266을 잘 활용하면 이런 것이 가능한 것이다. IoT로 들어가는 첫단계 라고나 할까?


이제 와이파이 모듈이 어떻게 동작하고 연결되는지 기본적인 것은 익혔으니 다음 부터는 작은 프로젝트들을 실행해 볼까 한다.

반응형
반응형

ESP8266 은 가장 저렴하게 사용할 수 있는 아두이노를 위한 와이파이 모듈(?)이다. 아니, 아두이노를 위한다고는 썼지만 자체적으로도 CPU(32비트), 메모리, 입출력핀을 내장하고 있어서 아두이노 없이도 독립적으로 프로그래밍하여 작동이 가능하다. 간단하게 와이파이 연결을 위한 SoC 칩 이라고 보면 될 것 같다. 



ESP8266 모듈은 많은 종류가 있다. 가장 기본적인 ESP-01이 있고 메모리, 프로세서, GPIO핀의 갯수 등에 따라 다양한 종류가 있다. 스펙을 살펴보고 자신이 필요로 하는 용도의 것을 선택하면 된다. 이 글에서는 ESP-01을 이용한다. GPIO 단자가 2개 이기 때문에 와이파이를 통하여 다양한 제어를 원한다면 ESP-12E를 이용하면 된다.


하지만 아두이노 연결을 위해서는 소프트웨어 시리얼로 연결을 하는데 이는 Baud Rate를 19200bps 까지만 지원을 한다. 반면 ESP8266은 기본 115000bps로 통신을 한다. 물론 그대로도 사용할 수 있지만 사용하기가 까다롭다. 아두이노 소프트웨어 시리얼과의 원활한 연결을 위하여 ESP8266의 Baud Rate를 낮추어야 한다. 이는 펌웨어의 업그레이드로 가능하다. 


펌웨어 업데이트는 두 가지의 방법이 있는데 첫번째는 USB to UART 보드를 이용해서 펌웨어를 업데이트 하는 방법이 있고 ESP8266 이외에도 컴퓨터의 USB 포트에 꼽아 쓰는 UART 보드가 하나 더 필요하다. 두번째 방법은 아두이노와 직접 연결하여 업데이트 하는 방법이다. 하지만 여기에는 하나의 위험사항이 따른다. ESP8266은 기본적으로 3.3V 로 동작하지만 아두이노의 Tx, Rx 출력은 5V 출력이기 때문이다. 아두이노 우노에서는 3.3V, 5V 두가지 전원을 제공하지만 Tx, Rx 출력은 5V 고정이기 때문이다. 이 때문에 업데이트를 하려다 ESP8266 모듈이나 아두이노가 고장이 날 수도 있기 때문에 권장하고 싶지는 않다. USB to UART 모듈이 없는데 할 수 없이 고장의 위험을 감수하고 업데이트 하고 싶을때 하는 방법인 것이다.


하지만 이 글에서는 고장나면 하나 더 산다는 대인배(?)의 마음가짐으로 두 번째 방법으로 업데이트를 시도해 보려고 한다.(사실 구글링 해보면 바로 연결해서 업데이트 성공한 사람도 꽤 있고... 레벨 쉬프팅 회로를 구성하여 5V --> 3.3V로 신호를 다운시켜 안전빵으로 성공한 케이스도 많이 있다. 사실 이걸 권장) 보다 안전하게 업데이트를 하고 싶은 사람은 USB to UART 보드를 통한 첫번째 방법을 이용하길 바란다.


ESP8266 데이터시트(Datasheet)

ESP8266_Specifications_English.pdf



ESP8266 모듈(ESP-01)의 뒤면모습, 8개의 핀이 있다.


앞모습, 8개 핀의 각각의 기능은 위의 그림과 같다. 위와 같이 3.3V로 동작하며 GPIO Pin 2개, 통신을 위한 Tx, Rx 핀, RST(Reset), CH_PD(Chip Power Down) 핀으로 구성이 되어 있다.


아두이노와 ESP8266 과의 연결은 아래와 같이 한다.


Fritzing 파일

ESP8266Frimware_Update.fzz


연결

Arduino  /   ESP8266

Tx  ------- Tx

Rx  ------- Rx

GND ------ GND & GPIO 0 (GPIO0은 펌웨어 업데이트 시에만 꼽는다. 와이파이 테스트 시에는 뽑음)

3.3V ------ CH_PD & 3.3V (VCC)



하드웨어의 연결이 끝났으면 펌웨어를 ESP8266에 올리기 위한 프로그램을 다운로드 받고 펌웨어도 다운로드 받는다. 다음의 URL에서 다운로드 받거나 이 블로그에 올린 파일을 다운로드 받으면 된다.

프로그램 준비

1. 펌웨어 업데이트 툴 다운로드, 별도의 설치는 없으며 나의 경우엔 C 드라이브 바로 밑에 압축을 풀어주었다. 다운로드 폴더에서 바로 실행하면 안될 수 있음.

https://docs.google.com/file/d/0B3dUKfqzZnlwVGc1YnFyUjgxelE/edit

ESP8266_flasher_V00170901_00_Cloud Update Ready.zip


2. 펌웨어 다운로드, 압축을 풀어나오는 bin 파일을 업데이트 툴 풀어놓은 폴더에 같이 복사해 놓으면 된다.

https://docs.google.com/file/d/0B3dUKfqzZnlwdUJUc2hkZDUyVjA/edit

ESP8266_AT_V00180902_02_baudrate watchdog added.zip


3. ESP8266 개발 라이브러리(9600bps 전용), 아두이노 IDE Library 폴더에 복사

https://github.com/Diaoul/arduino-ESP8266

arduino-ESP8266-master.zip



펌웨어 업데이트는 다음의 순서대로 진행하면 된다.

펌웨어 업데이트 순서

1. 아두이노를 PC에 연결한다. 연결하면 PC의 몇 번 시리얼 포트에 연결되었는지 알기위해 나 같은 경우 아두이노 IDE를 실행하여 포트번호를 확인 하고 IDE를 닫았다. 나의 경우 COM3에 연결된 것을 확인.




2. 펌웨어 업데이트 프로그램(esp8266_flasher.exe)을 실행하고 Bin 버튼을 눌러 위에서 다운 받았던 펌웨어 파일을 선택해준다. COM 포트 번호가 잘 못 되었으면 고쳐준다.



3. Download 버튼을 누르면 펌웨어 업데이트가 진행된다. 맨 마지막에 'Leaving...' 메시지가 나오면 업데이트가 정상적으로 종료된 것이다.



펌웨어 업데이트 시 ESP8266 모듈에 위와 같이 파란불이 깜빡이면서 업데이트가 진행이 된다. 업데이트가 끝나면 파란불이 꺼진다.


ESP8266 작동 확인

펌웨어 업데이트가 완료 되었으면 기본적인 통신체크를 해서 정상적으로 통신이 되는지 확인한다. 먼저 아두이노의 전원을 뽑아서 전원을 꺼준다. 펌웨어 업데이트(업데이트 모드 진입)를 위하여 임시로 연결했던 GPIO0을 빼준다. 안빼면 통신이 안된다. 다시 아두이노를 PC와 연결한다.



위와 같이 AT 커맨드를 보냈을 때 OK 메시지가 나오면 펌웨어가 제대로 업데이트 되고 모든 것이 정상적으로 동작한다는 것을 의미한다.

AT 커맨드가 잘 된다면 펌웨어의 버전을 확인하는 AT+GMR 명령을 입력하면 위와 같이 펌웨어 버전정보를 ESP8266 에서 보내주게 된다.


참고, ESP8266 AT 커맨드 정리 사이트

http://room-15.github.io/blog/2015/03/26/esp8266-at-command-reference/#AT

ESP8266 - AT Command Reference.pdf



이것으로 ESP8266을 아두이노에 연결해서 사용하기 위한 펌웨어 업데이트 방법에 대해서 알아보았다. 다음 포스팅에서는 실제로 와이파이에 연결하여 활용하는 것을 해 보려고 한다.



■ 추가사항 (2016.11.25) : 이 글에 나오는 펌웨어 업데이트 방법 보다 아래 링크의 USB Serial 모듈을 이용해서 펌웨어를 업데이트 하는 것을 권장한다. 그리고 기왕 사려면 FT232RL 칩을 이용한 모듈을 추천한다.

[사물인터넷(IoT)] - ESP8266 와이파이 모듈 펌웨어 업데이트 (USB To TTL 모듈 이용)

[사물인터넷(IoT)] - ESP8266 에 NodeMCU 펌웨어 및 Lua 개발환경 설치하기


■ 추가사항 (2018.09.05) : http://deneb21.tistory.com/591 에 아두이노 IDE에 개발환경 만드는 방법을 올렸다.

반응형

+ Recent posts