使って適当に工作したメモを残していきます。Piでルンバに掃除してもらう:【最終回】Node-REDからFlashAir/Arduino経由でルンバを動かす前回、Arduinoからルンバに赤外線コードを送れるようにしました。今回は、Node-REDからFlashAirを呼び出して、Arduinoの赤外線送信をキックします。API経由で制御する(おまけ)ArduinoからROI経由でルンバを動かすArduinoから赤外線経由でルンバを動かすNode-REDからFlashAir/Arduino経由でルンバを動かす【今回】FlashAirのGPIOFlashAirではSDカードの各ピンをGPIOとして使用できます。Developersで説明されています。準備として、FlashAirのSD_WLANフォルダにある「CONFIG」ファイルに「IFMODE=1」と書き足します。CONFIGは隠しフォルダになっているのですが、MacやLinuxの場合はTerminalで普通にアクセスできます。Windowsでも隠しフォルダにアクセスできるツールを使えばOKです。Developersで紹介されているものと同様に秋月電子通商の「SDカードスロットDIP化モジュール」を使いました。意外に盲点なのですが、このDIP化モジュールはFlashAirの全てのピンが引き出されている訳ではありません。そのため、FlashAirのGPIOピンを全て使えるわけではありません。具体的には、DIP化モジュールの取り扱い説明書の回路図を参照すると分かります。下図の通り、DAT1とDAT2はプルアップ抵抗で3.3Vに繋がっているだけなので、ピンが引き出されていません。FlashAirの0x04と0x08を使えません。(使うにはジャンパーを半田付けする必要があります。)半田付けなしで使用できるピンの対応付けは次のようになります。「Arduino」列は今回接続したArduino側のピン、「用途」列は今回の用途です。上の表の配線を使って、Arduinoには次のような動作をさせます。D2ピンのHIGH/LOWが変化するとソフトウェアリセットでスリープから復帰する。D5ピンがHIGHになっていたらルンバに赤外線送信する。D4ピンがHIGHになっていたらスリープする。ルンバの起動にしか使わないのであればD5ピン無しでも可能です。外部に引き出すと、WiFi経由で合計3ビット分のコマンドを表現できるので、8種類(2の3乗)の赤外線コードを出し分けられます。そのような将来的な拡張を考慮してD5ピンにFlashAirのCMDを割り当てました。Node-REDからFlashAirNode-REDからFlashAirへは次のようにHTTPリクエストを出すことでArduinoを動作させます。FlashAirの全てのピンをLOWにする。FlashAirに0x00を送信する。FlashAirに0x13を送信する。(http://〜/command.cgi?op=190&CTRL=0x1f&DATA=0x13)このリクエストによって、DAT3(0x10)がLOWからHIGHになります。ArduinoのリセットピンをLOWからHIGHに変えることで、Arduinoをスリープから復帰させます。スリープ復帰時にArduinoがCMD(0x01)を参照してルンバに赤外線コードを送信してくれれば、ルンバが起動します。その後、ArduinoがDAT0(0x02)を参照し、HIGHの時にスリープさせることで省電力化します。本当は、LOWでスリープさせた方が省電力になるのかもしれません。ところが、FlashAirは最初に電源が入った時点で全てのGPIOピンをHIGHにしてしまいます。DAT0=LOWでスリープに入るようにしてしまうと、電源投入時にスリープしなくなってしまいます。DAT0=HIGHをスリープに割り当てておけば電源投入直後にいきなりスリープしてくれます。Arduinoのコーディング以上の動作をArduinoに組み込むと次のようになります。赤外線の記憶と送信に関しては前回と同じなので省略します。テレビ、プロジェクター、ルンバを音声操作できました。紹介しませんでしたが、Node-REDを工夫すると1つの音声コマンドで複数機器を同時に動作させることも可能です。この動画の例ではプロジェクターを起動する際にアンプの音声出力をテレビからプロジェクターに切り替えています。