ESP8266을 위한 MQTT 및 Node-RED(node.js)개발환경

IBM MQTT 플랫폼 소개

http://comaby.blogspot.kr/2014/08/ibm-iot-cloud-bootcamp-1-overview_27.html

오로카- ESP8266-온도센서

http://cafe.naver.com/openrt/9792

ESP8266 SSID와 PW EEPROM에 저장하기

https://github.com/chriscook8/esp-arduino-apboot

IBM IoT전략

1. MQTT: MQ Telemetry Transport, http://mqtt.org/
http://webofthink.tistory.com/plugin/CallBack_bootstrapperSrc?nil_profile=tistory&nil_type=copied_post    (대략적인 기술 소개는  네이버 HelloWorld 포스팅 참조 )

2. Node-RED: MQTT 프로토콜 탑재 기기들을 연결하는 visual editor, http://nodered.org/

3. IBM bluemix: IBM의 Platform as a Service, http://www-01.ibm.com/software/bluemix/
(현재 무료로 사용가능)

아래 블로그 사이트를 통해서 IoT 사례 들을 공유한다고 하니 관심 있는 분들은 방문해 보시기 바랍니다.

Advertisements

Arduino IDE for ESP8266

출처 : arsviator.blogspot.kr

기술 여행자 (ArsViator): 3월 2015// <![CDATA[
(function() { var b=window,f="chrome",g="tick",k="jstiming";(function(){function d(a){this.t={};this.tick=function(a,d,c){var e=void 0!=c?c:(new Date).getTime();this.t[a]=[e,d];if(void 0==c)try{b.console.timeStamp("CSI/"+a)}catch(h){}};this[g]("start",null,a)}var a;b.performance&&(a=b.performance.timing);var n=a?new d(a.responseStart):new d;b.jstiming={Timer:d,load:n};if(a){var c=a.navigationStart,h=a.responseStart;0=c&&(b[k].srt=h-c)}if(a){var e=b[k].load;0=c&&(e[g](“_wtsrt”,void 0,c),e[g](“wtsrt_”,”_wtsrt”,h),e[g](“tbsd_”,”wtsrt_”))}try{a=null,
b[f]&&b[f].csi&&(a=Math.floor(b[f].csi().pageT),e&&0<c&&(e[g]("_tbnd",void 0,b[f].csi().startE),e[g]("tbnd_","_tbnd",c))),null==a&&b.gtbExternal&&(a=b.gtbExternal.pageT()),null==a&&b.external&&(a=b.external.pageT,e&&0=d&&b[k].load[g](“aft”)};var l=!1;function m(){l||(l=!0,b[k].load[g](“firstScrollTime”))}b.addEventListener?b.addEventListener(“scroll”,m,!1):b.attachEvent(“onscroll”,m);
})();
// ]]>// <![CDATA[
(function() { var html5 = ("abbr,article,aside,audio,canvas,datalist,details," + "figure,footer,header,hgroup,mark,menu,meter,nav,output," + "progress,section,time,video").split(','); for (var i = 0; i // <![CDATA[
var a="indexOf",b="&m=1",e="(^|&)m=",f="?",g="?m=1";function h(){var c=window.location.href,d=c.split(f);switch(d.length){case 1:return c+g;case 2:return 0//

최근 IoT쪽에서 가장 hot한 토픽중에 하나인 ESP8266용 Arduino IDE가 발표되었다.

물론 기존에 ESP8266용 gcc 개발환경이 이미 공개되어 있으나 프로그램을 작성하려면 API를 포함해 공부해야 할 것도 많고 개발환경을 설정하는것도 쉽지 않았다.
하지만 Arduino IDE를 ESP8266용으로 사용할 수 있게 되어 이제는 ESP8266용으로도 별도의 API를 공부할 필요 없이 아두이노 코드를 작성하는것과 동일하게 프로그래밍이 가능해졌다.
기본적으로 pinMode, digitalRead, digitalWrite는 아두이노와 동일하게 사용하면 된다. 단 핀 번호는 esp8266 GPIO 핀 번호를 사용하면 된다.
GPIO0~GPIO15는 핀 모드를 INPUT, OUTPUT, INPUT_PULLUP 및 OUTPUT_OPEN_DRAIN (이것만 추가됨)로 설정할 수 있고, GPIO16은 INPUT, OUTPUT으로만 설정이 가능하다.
ESP8266의 경우 ADC는 1 채널이기 때문에 analogRead(0)만 사용할 수 있다. 이 경우 TOUT 핀의 입력전압 값을 변환하게 된다. (주의: ESP8266의 ADC의 변환 레인지는 0~3.3V가 아니고 0~1V이다)
GPIO 핀 인터럽트도 아두이노와 동일하게 사용할 수 있다. GPIO16을 제외한 모든 GPIO핀에 인터럽트를 사용할 수 있고, 인터럽트 타입은 CHANGE, RISING, FALLING을 사용하면 된다.
현재 Wifi, Ticker, I2C, 1-wire, mDNS, MQTT, DHT-11, LCD, Stepper 라이브러리등을 사용할 수 있고 나머지 라이브러리들도 계속 추가되고 있다.
ESP8266 지원이 포함된 arduino는 https://github.com/esp8266/arduino 에서 다운받으면 된다.
스케치를 업로드 할 때는 Tools->Programmer 에서 esptool을 선택해주면 된다. 물론 업로드 하기 전에 ESP8266을 bootloader 모드(GPIO0를 LOW로 하고 전원을 연결)로 만들어 줘야만 한다.
기존에는 ESP8266을 아두이노에 연결해 저렴한 wifi 모듈로 많이 사용했지만, 이제는 별도의 아두이노 없이 ESP8266만으로 모든걸 쉽게(기존의 아두이노 코드와 유사하게) 처리할 수 있게 되었다.

nodemcu – Lua on ESP8266

출처 arsviator.blogspot.kr

기술 여행자 (ArsViator): nodemcu – Lua on ESP8266// <![CDATA[
(function() { var b=window,f="chrome",g="tick",k="jstiming";(function(){function d(a){this.t={};this.tick=function(a,d,c){var e=void 0!=c?c:(new Date).getTime();this.t[a]=[e,d];if(void 0==c)try{b.console.timeStamp("CSI/"+a)}catch(h){}};this[g]("start",null,a)}var a;b.performance&&(a=b.performance.timing);var n=a?new d(a.responseStart):new d;b.jstiming={Timer:d,load:n};if(a){var c=a.navigationStart,h=a.responseStart;0=c&&(b[k].srt=h-c)}if(a){var e=b[k].load;0=c&&(e[g](“_wtsrt”,void 0,c),e[g](“wtsrt_”,”_wtsrt”,h),e[g](“tbsd_”,”wtsrt_”))}try{a=null,
b[f]&&b[f].csi&&(a=Math.floor(b[f].csi().pageT),e&&0<c&&(e[g]("_tbnd",void 0,b[f].csi().startE),e[g]("tbnd_","_tbnd",c))),null==a&&b.gtbExternal&&(a=b.gtbExternal.pageT()),null==a&&b.external&&(a=b.external.pageT,e&&0=d&&b[k].load[g](“aft”)};var l=!1;function m(){l||(l=!0,b[k].load[g](“firstScrollTime”))}b.addEventListener?b.addEventListener(“scroll”,m,!1):b.attachEvent(“onscroll”,m);
})();
// ]]>// <![CDATA[
(function() { var html5 = ("abbr,article,aside,audio,canvas,datalist,details," + "figure,footer,header,hgroup,mark,menu,meter,nav,output," + "progress,section,time,video").split(','); for (var i = 0; i // <![CDATA[
var a="indexOf",b="&m=1",e="(^|&)m=",f="?",g="?m=1";function h(){var c=window.location.href,d=c.split(f);switch(d.length){case 1:return c+g;case 2:return 0//

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 index ESP8266 pin IO index ESP8266 pin
0 [*] GPIO16 8 GPIO15
1 GPIO5 9 GPIO3
2 GPIO4 10 GPIO1
3 GPIO0 11 GPIO9
4 GPIO2 12 GPIO10
5 GPIO14
6 GPIO12
7 GPIO13

즉 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 명령어는 더 이상 동작하지 않는다.

Hardware random number generator

설명자료

http://en.wikipedia.org/wiki/Hardware_random_number_generator

https://en.wikipedia.org/wiki/RANDU

아두이노 HW RND모듈

http://www.instructables.com/id/Arduino-True-Random-Number-Generator/?ALLSTEPS

라즈베리 파이에서의 RND문제

http://scruss.com/blog/2013/06/07/well-that-was-unexpected-the-raspberry-pis-hardware-random-number-generator/

reversed-TR bias를 이용한 난수발생기

http://scruss.com/blog/2013/06/08/artisanal-hardware-random-number-generator/