2016年7月9日土曜日

ESP8266でLEGO Power Functions IR を動かしてみる

 今回のがらくたは 例のESP8266にUSBコネクタIFやブート(書き込み)スイッチ等を使いやすく実装した スイッチサイエンスさんの ESPr Developer 開発ボードと LEGO Power Function シリーズの赤外線リモコン受信モジュール LEGO 8884 Power Function IR Reciever です。

 今回は、ESP8266を使ってWebサーバを構成し、ブラウザ操作で LEGO Power Function IR Reciever を制御する赤外線信号を生成して LEGOを動かしてみたいと思います。

 LEGO Power Functions IR Reciever はLEGO Power Function シリーズの電池ボックスと各種モータの間に中継することで赤外線リモコンでモータの回転速度を制御できるユニットです。




使い方のイメージとしてはこんな感じです。


 このIR Reciever の赤外線受光部、上部の黒いドーム状の部分に上面から赤外線LEDを対向させるように次のようなパーツをLEGOブロックに赤外LEDをホットボンドで固定して作成しました。


 これをIR Reciever にかぶせて、確実に赤外線をIR Reciever が受信できるようにします。



 赤外線LEDは今回は ESP8266 の 13ピンから220Ωの抵抗を介して ESP 13ピン → 220Ω → 赤外線LED → GND のように配線しています。 


 ブラウザからの制御を実現するためのソフトウェアに関しては色々調べてみたんですが、スマホのゲームなんかでよく使われる画面上に仮想のアナログスティックのようなものを表示しているものがありますが、あんな感じのをJavaScriptのライブラリを使って簡単に実現できるようなのがないかと探して、結局「enchant.js」というゲーム用のライブラリに行き着きました。この「enchant.js」はゲーム用のライブラリですが、自分が使いたかった仮想ジョイスティックが簡単に実現できるのと、ドキュメントが日本語で用意されているのがありがたがったので、こちらを利用させてもらうことにしました。
 ブラウザ側JavaScriptプログラムとESP8266側Webサーバプログラム間の通信はWebSocketを使ってコネクションを張ることにします。WebSocketのライブラリはこちらを利用しました。
 ESP8266にはSPIFFSというフラッシュメモリの一部をファイルを格納する領域として使える機能があるので、このSPIFFSにHTMLやJavaScriptファイルを保存して、ESP8266でWebサーバを実装します。と、いってもサンプルプログラムにほぼそのままWebサーバのサンプルなどがありますので、このあたりは比較的簡単に実現できます。
 ※SPIFFSの使い方についてはこちらとかを参考にしてください。

 次にLEGOの赤外線リモコンですが、実はこの仕様は LEGO社が公開してくれていて、さらに 従来のArduinoでこのLEGOの赤外線リモコンを利用するためのライブラリをすでに作成してくれている方が何人かいます。そのなかで、今回はこちらのライブラリを利用させてもらうことにしました。従来のArduino用のライブラリですが、ライブラリ内で特殊なことは行っていないのでESP8266でも使えます。ただし、信号のタイミングをdelay()関数で作っているのでメインループで処理をぐるぐる回すとだんだん遅れというか処理が詰まってきます。他の処理(ループ)の何回に一回だけ呼ぶ、といった工夫をしてやる必要があります。


 以下、ESP8266 for Arduino のスケッチです。

 以下がHTML。適宜、enchant.jsのライブラリやイメージファイル、次のmain.jsプログラムを配置する必要があります。

 以下が JavaScript。