기본 콘텐츠로 건너뛰기

초저가 IoT WiFi 모듈 - ESP8266 사용기

알리가 춘절로 2달 걸릴 것 같아 두배정도 비싸게 주고 국내에서 구입
이틀만에 왔으니 위안을 삼아야지.
ESP-12를 사고 싶었으나 5배 비싸서 못삼.
나도 부품 장나사 할까 (.....는 아니지 -_-)

ESP8266은 그 자체로도 훌륭한 MCU를 가지고 있어서
굴러다니는 USB-Serial 케이블을 3.3v 전압으로 개조. (5v 넣었더니 엄청 뜨거워지더라;)
http://www.adafruit.com/products/954 (PL2303 계열. 500mA로 전류가 안정적이다)
이렇게 생긴 놈인데
힘줘서 USB 커넥터 쪽을 쪼개면

요렇게 생겨먹었다.
현재는 빨간선이 5v로 되어있다.

3.3V로 옮겨주고 다시 재조립

제품이랑 연결했는데 다시는 ESP-1 사지 말아야지 싶은 것이 핀 숫자도 적고 배열이 아주 별로여서 핀을 롱노즈로 휘고 쌩쇼를 함.

앞면을 기준으로 위에서 아래로 왼쪽에서 오른쪽으로 USB-Serial 케이블 연결을 보면

* ESP8266
1 2 3 4
5 6 7 8

1: GND (-)
2: GPIO2
3: GPIO0
4: RX
5: TX
6: CH_PD
7: RESET
8: VCC (+)

* USB-Serial
R G W B (빨 녹 흰 검)

R: VCC+
G: TX
W: RX
B: GND-
이라고 할때

1-B 2-x 3-x 4-G
5-W 6-x 7-x 8-R

순으로 대응을 하고 6번 CH_PD에도 VCC+를 넣어주면 된다.


얼기설기 엮어보자꾸나

펌웨어 개조를 하지 않은 상태에서 기본은 Arduino IDE 같은 곳에서 Tool>Serial Port>/dev/tty.usbserial을 선택하고 Tool>Serial Monitor에서 하단 Both NL & CR / 9600 baud를 체크하고 AT 명령을 테스트 해본다.

이상하다 싶을 땐 TX/RX가 반대로 껴져있는지 CH_PD가 VCC+를 못받는지를 확인해보자.
CH_PD를 뺐다꼈다 하면

[Vendor:www.ai-thinker.com Version:0.9.2.4]

ready

이런 식으로 ready를 알려주는데 이게 된다면 AT를 쳐보면 된다.
screen이나 일반 터미널에선 CR+LF가 안 먹는지 명령이 잘 되지 않았고 Arduino IDE의 Serial Monitor는 정상적으로 작동했다.

에 AT 명령어들을 잘 정리해 놓았다.

Basic

AT Test if AT startup

AT+RST Restart

AT+GMR View version info

AT+GSLP Enter deep-sleep mode

ATE AT commands echo

Wi-Fi

AT+CWMODE WIFI mode(station/softAP/station+softAP)

AT+CWJAP Connect to AP

AT+CWLAP Lists available APs

AT+CWQAP Disconnect from AP

AT+CWSAP Set parameters under AP mode

AT+CWLIF Get stations’ ip which are connected to ESP8266 

AT+CWDHCP Enable/Disable DHCP

AT+CIPSTAMAC Set mac address of ESP8266 station

AT+CIPAPMAC Set mac address of ESP8266 softAP

AT+CIPSTA Set ip address of ESP8266 station

AT+CIPAP Set ip address of ESP8266 softAP

TCP/IP

AT+CIPSTATUS Get connection status

AT+CIPSTART Establish TCP connection or register UDP port 

AT+CIPSEND Send data

AT+CIPCLOSE Close TCP/UDP connection

AT+CIFSR Get local IP address

AT+CIPMUX Set multiple connections mode

AT+CIPSERVER Configure as server

AT+CIPMODE Set transmission mode

AT+CIPSTO Set timeout when ESP8266 runs as TCP server

AT+CIUPDATE For OTA(upgrade through network)

Data RX

+IPD Data received from network

softAP

몇가지 확인을 해보면 버전은
AT+GMR 했을때

0018000902-AI03

OK

이와 같이 나온다.

AT+CWMODE? 로 현재 상태를 알아보자

+CWMODE:2

OK

2 즉. 기본은 AP-공유기 상태인 것을 알 수 있다.

AT+CWSAP? 로 공유기 정보를 알아보면

+CWSAP:"ESP_9D2CD8","",11,0

OK

이런 식으로 나온다. 접속명인 SSID는 ESP_9D2CD8에 암호는 없고, 채널ID는 11번, 오픈 모드인 것으로 보인다.

<ssid> string, ESP8266 softAP’ SSID

<pwd> string, MAX: 64 bytes

<chl> channel id

< ecn >0 OPEN

 2 WPA_PSK

 3 WPA2_PSK

 4 WPA_WPA2_PSK

공유기에 접근하려면

AT+CWMODE를 Station으로 바꾸자

AT+CWMODE=1

OK

그리고 
AT+CWLAP 로 공유기 목록을 보자

AT+CWLAP

+CWLAP:(4,"SSID_1",-61,"aa:bb:cc:dd:ee:ff",1)
+CWLAP:(4,"SSID_2",-85,"aa:bb:cc:dd:ee:ff",1)
+CWLAP:(4,"SSID_3",-93,"aa:bb:cc:dd:ee:ff",1)
+CWLAP:(2,"SSID_4",-65,"aa:bb:cc:dd:ee:ff",2)
+CWLAP:(3,"SSID_5",-89,"aa:bb:cc:dd:ee:ff",3)
+CWLAP:(0,"SSID_5",-88,"aa:bb:cc:dd:ee:ff",3)
+CWLAP:(1,"SSID_5",-88,"aa:bb:cc:dd:ee:ff",1)
.....

쭈욱 나온다.
접속은 간단하다.
AT+CWJAP="SSID","PASSWORD"

OK

따옴표를 꼭 쓰자.

http://nodemcu.com/index_en.html 여기를 보니까 별도의 Arduino등이 없어도 lua로 코딩해서 서버를 구성하거나 GPIO를 제어하는 펌웨어를 올릴 수 있더라.

가자! 플래싱!

파이썬이 없으면 brew install python 하든 어쩄든 해서 파이썬 먼저 설치하고
pyserial을 얹어주자

pip install pyserial

https://github.com/themadinventor/esptool 여기에서 esptool.py 받자. 귀찮아서 그냥 git clone https://github.com/themadinventor/esptool.git 으로 내림.

그리고 플래싱할 바이너리를 받아주자

여기 있는 것중 땡기는 걸로 받자.

자 esptool.py 와 nodemcu_XXXX.bin 을 받았으면 플래싱할 준비를 하자.
간단하다.

1. GPIO0 + GND 를 연결한다.
2. 리셋한다. RESET + GND를 연결한 뒤 제거한다. 연결을 제거하는 순간 적석 LED왼편에 청색 LED가 깜빡 하고 한번 점멸할 것이다.

그러면 이제 serial monitor가 먹통이 되었을거다.

./esptool.py --port /dev/tty.usbserial write_flash 0x000000 ../nodemcu_latest.bin 

이런식으로 플래싱하자.
첨엔 오류가 났는데
Connecting...
Erasing flash...
Traceback (most recent call last):
  File "./esptool.py", line 525, in <module>
    esp.flash_begin(blocks*esp.ESP_FLASH_BLOCK, address)
  File "./esptool.py", line 188, in flash_begin
    struct.pack('<IIII', size, num_blocks, ESPROM.ESP_FLASH_BLOCK, offset))[1] != "\0\0":
  File "./esptool.py", line 105, in command
    if self._port.read(1) != '\xc0':
  File "/usr/local/lib/python2.7/site-packages/serial/serialposix.py", line 475, in read
    raise SerialException('device reports readiness to read but returned no data (device disconnected or multiple access on port?)')
serial.serialutil.SerialException: device reports readiness to read but returned no data (device disconnected or multiple access on port?)

당황하지 않고 2차 시도.
./esptool.py --port /dev/tty.usbserial write_flash 0x000000 ../nodemcu_latest.bin 
Connecting...
Erasing flash...
Writing at 0x00062000... (100 %)

Leaving...

성공이다.

screen /dev/tty.usbserial 으로 들어가보자!
프롬프트가 달라졌다.
모르겠다면 또 리셋.

NodeMCU 0.9.5 build 20150213  powered by Lua 5.1.4
이런식으로 나온다면 대성공!

여기 보고 한땀 한땀 쳐보거나

API를 보면서 해보자.

node.js 하던 감각으로 하면 별 문제 없을 것이다.
서버, 파일시스템 모두 매우 잘 돌고 멋지다!
https://www.npmjs.com/package/esp8266 같은 걸로 업로드도 되고 아주 굿
폰에서 찍은 사진이 blogger에서 바로 뜨는게 아주 좋다.
lua용 websocket 라이브러리도 있으니 Meteor로 DDP 통신도 할 수 있겠다.



모두들 구..굿좝!

이 블로그의 인기 게시물

meteor로 nw.js 개발하기.

실제로 nw.js 어플리케이션을 개발하다보면 UI구현하기 막막하고 수동으로 리프레쉬 하는 것도 귀찮아서 Meteor 연동을 하려고 했더니 생각보다 간단했다.

디렉토리 구조는 먼저 이렇게 잡았다.
`- app
  `-client
  `-public
`- dist
  `- 배포용 html,css,js
  `- package.json
`- package.json 아이디어는 이렇다. nw.js의 시작페이지를 http://localhost:3000으로 두고 배포시엔 meteor client 배포툴인 meteor-build-client를 사용하여 html,css,js 로 분리하는 계획이다.

가장 중요한 nw.js 용 package.json 파일은 아래와 같이 구성한다.
{
  "main": "http://localhost:3000",
  "node-remote": "http://localhost:3000",
  "name": "<앱이름>"
} 이게 전부. 어떻게 보면 Web과 nw.js를 동시에 개발할 수도 있는 환경이기도 한 것이다.
meteor create app 을 해서 meteor용 앱을 만들고 meteor 를 시작한다.
그리고, 위의 package.json이 있는 경로로 돌아가서 nw . 으로 nwjs를 실행한다.

한번 번쩍하더니 잘 된다.
cordova 등에서 index.html 대신 http://localhost:3000을 하는 것도 비슷한 느낌이다.

즐겁게 개발을 일단 마구 하고 실제로 배포하기 위해서는 개발환경이 아니라 html,css,js로 구성된 배포본을 만들어야한다.
npm install -g 해도 되지만 어짜피 Meteor에서만 쓸거
meteor npm install -g meteor-build-client 해버릴거다.

개발은 문제 없어 보이고 배포판을 한번 만들어보자. meteor app 이 있는 경로(meteor run으로 …

RxJS - ReactiveX 인터뷰

A: 왜 RxJS입니까
B: javascript는 참 쉽고 친숙한 언어죠.
A: 별로 그렇게 생각 안합니다만.
B: 그래서 좀 어렵고 있어보이는게 뭘까 싶어서...
A: 네?
B: 함수형이라는게 유행하기도 하고
f(x) 좋쟎습니까? 미스테리~ 미스테리~ 정수정짱짱 으아아

이런 수학선생님이라면 수포자 따윈 A: ...
B: 그리고 반응형이라는 말 뭔가
A: 뭔가?
B: 대충대충해도 막 알아서 할거 같고...
A: 그럴리가요?
B: 안그렇겠죠?
A: 네
B: 네

(잠시만 기다려주세요)

A: 그래도 뭔가 매력이 있으니 이렇게 시간을 내셔서 이것저것 Rx에 대해 글도 쓰고 이야기도 하고 그러시는거 아닌가요?
B: 매력이라.
으음.
제가 팔꿈치 터널 증후근이 좀 있어요.
오른손 세끼손가락, 약지손가락이 저립니다.
A: 무슨 상관이?
B: 그래서 각종 괄호를 쓰는게 너무 힘듭니다.
소중대괄호 만든 사람 죽었으면.
Hello world (ASCII): https://esolangs.org/wiki/Parenthesis_Hell
A: 이미 옛날에 돌아가셨겠죠.
B: 그렇겠네요.
아무튼 그래서 소중대괄호 의존이 적은 커피스크립트를 쓰는데요.
A: 빨리 본론을 말씀해주시죠.
B: 커피스크립트에서 가로로 80자 이상쓰면 Line exceeds maximum allowed length 라고 경고해요.
A: 그래서요?
B: 근데 Rx를 쓰면 코드를 가늘게 쓸 수가 있더라구요.
A: 호오?
B: 그리고 = 쓰는 것도 너무 힘듭니다.
A: 네?
B: 오른손을 쓰쟎아요.
A: ...
그러니까 정리하면
1. 괄호가 힘들다
2. 커피를 쓴다
3. 커피는 길게 쓰면 경고
4. Rx를 쓰면 코드가 가늘다
5. 대입문을 줄이고 싶다.
B: 네
하지만 5번은 생각보다 별로...
A:
B:

B: 아!
A: ?
B: 코드가 가늘어서 좋은 점이.
A: 네.
B: 핸드폰에서 코드를 보기 좋습니다.
A: ... 왜 팔꿈치 터널 증후근이 안 낫는지 알겠습니다.
B: 도와주세요.
쇠고기 사묵으면 나을 것 같습니…

Troubleshooting - Meteor package가 적용이 되지 않을 때

버전 1.5 기준 package.js에서 Package.onUse 에 새 패키지를 추가했는데 인식하지 못하는 경우가 있다.
Package.onUse((api) => {
  api.use([
    'vulcan:core',
    'vulcan:forms',
    'vulcan:accounts' /* <-- 추가함! */
  ]);
...
} 내부패키지건 원격패키지건 안되는 안된다. 이럴 때 meteor add 후 meteor remove 해도 되지만 더 간단한 방법이 있다. meteor update vulcan:accounts 이렇게 update 해주는 방법이 있다. .meteor/package 파일을 건들지 않아서 좋다. 그래도 역시 좋지 않다. Meteor 스럽지 않다. https://github.com/meteor/meteor/issues/7721 현재 1.5.2에서도 해결이 안되었군요. 해결되어 적용되면 다시 글 올리겠습니다.