Espruino PicoでDS18B28で気温測ったのをESP-WROOM-2でMQTTしてみた

JavaScript for Robotics or Hardware Advent Calendar 2015 14日目です。
ロボットネタじゃねえけどJSBoardでもいいって書いてあったからEspruinoのネタにしました。

 

Espruino PicoはKickstarter発のマイコンボードでJavaScriptコンパイルして即実行するインタプリタを搭載しています。つーかインタプリタの名前がEspruinoでPicoはそのリファレンスボードのひとつって感じね。先輩のEspruino Boardに比べてめっちゃちっちゃいので本格的なデバイス実装にもいろいろ使えそうな感じです。最近ではAmazonで取扱もあって国内でも入手できるようになったのだけどめっちゃ高い。これならAdafruitとかで買ったほうがいいっすね。

 

EspruinoのいいところはなんといってもJavaScriptネイティブなマイコンボードであるということ。JSでマイコン制御を体験できる、センサー&デバイスの豊富な対応ライブラリがビルトインされているIDEで簡単に対話/書き込み実行が可能、STM32, Raspberry Piをはじめとする様々なデバイスでビルド可能といったところがメリットとして挙げられます。個人的には一番漢なJSBoardだと思っていてJSネイティブってだけで他のことはどうでもいいです。ですよね。

 

去年はEspruino Advent Calendar 2014をいっぱい書いて燃え尽きた感あったので今年は書かないつもりだったけどJavaScript for Robotics or Hardwareというキーワードに釣られて一個でも書こうかと思った次第。で、ネタとしてはPicoになってから新たに加わったMQTT機能といま絶賛ブレイク中のESP8266 Wifiチップを使ってなんかやることにします。送るデータはなんでも良かったのでとりあえずDS18B20デジタル温度計で気温取って送った。Espruino公式のチュートリアル的にはこれこれの合わせ技プラスアルファみたいな感じです。

 

配線

ブレッドボード上での配線はこんな感じです。

f:id:bathtimefish:20151206161958j:plain

上だとわかりづらいのでEspruino Picoとの話ワイアードを図にしたのがこちら。

f:id:bathtimefish:20151206164443p:plain

Fritzing使ったことないけど練習で描いてみたのがこちら。今回使ってるのはESP-WROOM-2だけどFritzingのオブジェクトになかったので違うESP8266チップになってます。そのためWROOM-2よりピン1列少なくて配線が異なったりしてますが、その辺は雰囲気です。上の写真が正しいので参考程度にしてください。

f:id:bathtimefish:20151206160136p:plain

CerevoのESP-WROOM-2ブレイクアウトボードを使用しました。他のブレイクアウトボードよりもピン出しが素直な感じで気に入ってます。ピンレイアウトはこちら。

http://tech-blog.cerevo.com/wp-content/uploads/2015/07/53f0389a5f6bf0a2dfde0073841dbd67.jpg

ネーブルとリセットを10kΩの抵抗でプルアップ、電源をEspruino Picoの3.3V、各GNDをPicoのGND、TXDをPicoのB7(UART1 RX), RXDをPicoのB6(UART1 TX)に接続します。DS18B20デジタル温度計はこちらを参考に。GND(左ピン)をPicoのGNDに、データ(真ん中ピン)をPicoのB1、電源(右ピン)をPicoの3.3Vに接続します。データ(真ん中ピン)と電源(右ピン)を4.7kΩの抵抗で接続します。

MQTT subscriberの準備

MQTT subscriberは去年のEspruino Advent Calenderのrockymanobiくんのものを使わせてもらいました。rockymanobi/espruino-mqtt-sample をcloneして以下を実行します。

node broker.js

別のウィンドウで

node subscriber.js

broker.jsの画面でIPアドレスが表示されるので後述のEspruinoのソースコード中の mqttHostにIPアドレスをセットします。

Espruinoのプログラミング

ソースコードは以下。

使用したESP8266のファームバージョンは0.25.0.0だったのでドキュメントにしたがってESP8266WiFi_0v25をrequireしました。ボーレートは115200です。configオブジェクトにはWifiSSID、パスワード、MQTT subscriberのホストIPをセットします。

Espruino IDEでプログラムを転送してしばらくすると、Wifiに接続されてpublisherのコンソールで温度が表示されるようになります。

f:id:bathtimefish:20151206160808j:plain

DS18B20の温度取得をsetIntervalで回して、それとは別にWifiをセットアップしてMQTT接続を確立、確立後2秒ごとにsubscriberに向かって温度データをpublishしています。こんな感じで非同期でセンサー毎にループが書けるのはJSのメリットが活かせて便利だと思う。

f:id:bathtimefish:20151205171420j:plain

まとめ

EspruinoはMQTTライブラリをビルトインでサポートしているので簡単にMQTT通信するデバイスをつくることができます。あとESP8266安くていいですね。Espruinoでも最近ESP8266対応のリファクタリングが積極的に行われています。さらにEspruinoをESP8266上に直接書き込んでビルドする方法も公開されていて激アツです。これは今度やってみたい。

MQTT対応側でもAWS IoT Message Broker向けと思われるライブラリがマージされたりと面白そうなことになってる。こんなマージもあったし今後も注目したいですね。

以上です。
Espruino日本でももっと流行んねぇかな。