2015년 2월 13일 금요일

nodemcu - Lua on ESP8266

ESP8266은 단순히 아두이노에 붙여 Wifi-to-serial 모듈로 사용하기에는 아까울 정도로 더 많은 기능을 가지고 있다. 80MHz로 동작하는 Tensilica Xtensa LX3 라는 32-bit 프로세서가 들어있고, 이 코어용 펌웨어를 개발하는데 필요한 개발용 툴체인이 모두 오픈소스로 공개되어 있다.
크로스 컴파일 툴체인을 빌드하는 방법부터 예제 코드까지 인터넷을 찾아보면 꽤 많은 자료가 이미 공개되어 있다.



하지만 새로운 프로세서를 사용한다는건 즉 '공부해야 할 내용이 엄청 많다'와 동의어이다. 그리고 디버깅을 해서 새로 컴파일 할 때 마다 펌웨어를 다시 굽는것도 귀찮은 일이 된다.
그래서 이런 문제들을 대부분 해결할 수 있게 lua라는 언어의 인터프리터가 nodemcu라는 이름으로 ESP8266에 올라갔다.



Lua 5.1.4 기반 (단 io, math, debug, os 모듈은 제외)이고 인터프리터 방식이기 때문에 시리얼 터미널에서 직접 코드를 입력해서 별도 컴파일 과정 없이 바로 실행을 해 볼 수 있다.
JavaScript와 유사하게 event-driven 방식의 프로그래밍 모델을 사용해서 쉽게 프로그램을 만들 수 있다. (물론 기존에 C를 사용해 임베디드 프로그래밍을 하던 프로그래머 입장에선 처음에 좀 생소할 수 있긴 하다)
추가적인 장점으로는 file, timer, pwm, i2c, spi, 1 wire, net, mqtt, gpio, wifi, adc, uart 드라이버가 기본적으로 built-in 되어 있어 하드웨어를 제어하기 위해 복잡한 레지스터들을 따로 공부할 필요 없이 아두이노에서처럼 쉽게 사용할 수 있다.
GPIO핀은 아래와 같이 매핑되어 있다.

IO indexESP8266 pinIO indexESP8266 pin
0 [*]GPIO168GPIO15
1GPIO59GPIO3
2GPIO410GPIO1
3GPIO011GPIO9
4GPIO212GPIO10
5GPIO14
6GPIO12
7GPIO13
즉 GPIO0에 연결된 LED를 켜 주려면 다음과 같이 하면 된다.

gpio.mode(3, gpio.OUTPUT)      
gpio.write(3, gpio.HIGH)            

nodemcu 역시 오픈소스로 전부 공개되어 있지만 빌드하려면 크로스 툴체인부터 빌드해야 하기 때문에 C로 직접 코딩을 할 생각이 없으면 간단하게 pre-built binary를 받아 ESP8266에 써 주면 바로 lua를 사용할 수 있다.

https://github.com/nodemcu/nodemcu-firmware

위의 주소에서 소스코드와 바이너리를 모두 구할 수 있다. 하지만 저 사이트에 있는 바이너리 파일의 경우 디폴트 시리얼 통신속도가 9600bps로 되어 있다.

이 주소(http://dangerousprototypes.com/forum/download/file.php?id=11403&sid=dd89b3a2ef2524b5739e17e2f46d35d8)에 있는 파일을 받으면 시리얼 통신속도가 115200bps로 되어있는 펌웨어 바이너리 파일을 구할 수 있다.

위의 zip 파일을 받아 압축을 풀어보면 firmware 디렉토리에 0x00000.bin, 0x10000.bin 이렇게 2개의 bin 파일이 들어있다. 이 두 파일을 ESP8266에 써 줘야 한다.

펌웨어를 구울때는 nodemcu-flasher를 사용한다. 차기 버젼은 Qt를 사용해 크로스 플랫폼에서 동작할거라고 하는데 아직까지는 아쉽게도 윈도우용밖에 없다.

펌웨어를 업데이트 하려면 ESP8266에 전원을 넣기 전에 GPIO0가 LOW로 (즉 GND에 연결) 되어 있어야 한다. GPIO0가 LOW인 상태에서 모듈에 전원이 들어오면 UART BOOT 모드로 동작하게 되어 펌웨어 업데이트가 가능해진다.



위의 사진처럼 daughter board를 만들고 점퍼를 사용해 GPIO0를 Vcc(3.3V)에 연결할지 GND에 연결할지 선택할 수 있게 해 놓았다. 여기서는 펌웨어 업데이트를 할 것이므로 점퍼를 오른쪽으로 옮겨놓으면 된다.

그리고 USB-to-Serial adapter (여기서는 FTDI 232R을 사용)를 사용해 PC와 연결해준다. 시리얼포트가 정상적으로 보이면 자신의 OS에 맞는 ESP8266Flasher.exe를 실행시킨다.


먼저 COM Port를 설정해준다. 그리고 나서 Config를 눌러 플래쉬에 기록할 파일을 지정한다.


동시에 여러 파일을 라이팅 할 수 있지만 여기서는 두개의 파일만 기록하면 되기 때문에 위와 같이 두개의 파일만 X로 체크해주고 파일 위치를 선택한 후 각 파일을 기록할 주소를 지정해 준다. 0x00000.bin은 0x00000에, 0x10000.bin은 0x10000으로 해 주면 된다. 설정이 끝났으면 다시 이전 화면으로 돌아가 Flash(F) 버튼을 눌러준다.


그러면 AP MAC과 STA MAC에 값이 표시되며 라이팅이 진행된다. 만일 MAC 값들이 표시되지 않는다면 PC가 ESP8266과 정상적으로 통신이 되고 있지 않다는 것이고 그러면 라이팅도 진행되지 못한다. 그 경우 일단 멈춘 후 초기 화면에서 Advanced로 가서 설정을 변경해 본다.


Baudrate이 맞지 않는 경우가 가장 많다.

정상적으로 진행되면 프로그레스바가 진행되고 라이팅이 끝나면 화면 아래쪽에 녹색 표시가 나타나게 된다.


이제 펌웨어 업데이트가 끝난 것이다. 프로그램을 종료하고 ESP8266 보드에 연결된 케이블을 분리하면 된다. 그리고 점퍼를 다시 왼쪽으로 돌려놓고 전원을 연결하면 이제 방금 업데이트한 펌웨어가 실행된다.

시리얼 터미널을 실행해 연결시키면 프롬프트가 바뀌게 되고 이제부터는 AT 명령어는 더 이상 동작하지 않는다.

 다음 포스트에서는 lua를 이용해 ESP8266에서 여러가지 예제를 실행시켜 보겠다.

댓글 2개:

  1. 글 잘보았습니다. 감사 합니다.
    nodemcu 0.9.6 버젼 115200bps 바이너리는 어디에서 구할수 있을까요?

    답글삭제