ChatdollKitベースで作成してみたAIアシスタントの改造、つづきです。
「うにちゃんAIアシスタント(仮)」に家電のコントローラ機能を付与してみるなどしたくて、
スイッチサイエンスのESPr IRという便利な赤外線リモコンボードを触ってみました。
お手軽にイメージ通りの機能を実装できたので、本記事ではESPr IRを使ってできたものと、実際に使ってみて思ったこと気づいたことなどをゆるくご紹介してみようかと思います。
という方の参考になりますと幸いです。
前提と今回やりたかったこと
「うにちゃんAIアシスタント(仮)」といっているのは、
という試みです。過去記事はこちら。
うにの部屋にはシーリング照明と、エアコンの2つの赤外線リモコンがあるので、
こちらの2つのリモコン信号発信を「うにちゃんAIアシスタント(仮)」に肩代わりしてもらいます。
完成イメージは以下の通り。
本当はルンバのお掃除開始も追加したかったのですが、こちらはアプリでのON操作になるのでひとまとめにできず。別系統で開発が必要です。
パケットを解析して改造している事例がたくさん出てくるので、今後試したいところ。
そんなこんなで出来たもの
出来上がりがこちら。(音声が出ます)
中古のSIMフリーAndroid端末を入手できたので、なんちゃってデジタルフィギュアボックスみたいな感じにしてみたくて、
外箱を100均の画用紙で心の赴くままに作ってみました。素人感あふれる味のある仕上がりです。
いままでは「聞く/話す」の聴覚的なアプローチで完結していたので、
現実へ干渉する動作が加わると「おお!」という感じがします。
ハードが無事にAndroidになったので、次はカメラかな。
「もう寝るの?」とか「リラックスしてね」とかなんやかんやと世話を焼いてくれるので、
かわいいメイドさん衣装なんかも追加したくなってきました。
老後はこんな感じでAIにお世話してもらう時代が来るんだろうなあ。
生成AIの進化でソフトの革命が先に来ましたが、これにハードが追い付いたら「Detroit: Become Human」の世界の到来もすぐそこですね。
赤外線リモコン操作機能の実装
実現したい処理のイメージ
ESP8266をWebサーバとして使用し、unityアプリケーションからこのWebサーバにリクエストを送って所定の動作を実行します。
処理の流れは以下の通り。
上記の1はChatdollKitという素晴らしいフレームワークの拡張性を活かすことで素人でも簡単にカスタマイズできるようになっていますので(過去記事参照)、
今回でいえばおもに2~4、
「Unityアプリケーションからのリクエスト時に赤外線LEDで所定の信号を発信する機構」について考えていけばよいわけです。
ちなみにこの構成で、末端のセンサやアクチュエータの種類を変えれば無限に応用がききます。
試しに温度センサとESP8266をI2Cでつないで、「今のお部屋の温度は?」に回答してくれるスキルも追加しておきました。
本題から逸れるので割愛!
ESPr IR赤外線リモコンボードで楽ができそう
さて、「Unityアプリケーションからのリクエスト時に赤外線LEDで所定の信号を発信する機構」について、
ゼロから真面目に回路を構築するとして、
というステップが必要です。
赤外線センサも赤外線LEDもすぐ使える状態のものが手元になく、
「ちょっと難しそうだな~回路組むなら抵抗とかもいるし…なるべく小型化もしたいし…」と思っていたらちょうどいいものがありました。
それがスイッチサイエンスの「ESPr® IR 赤外線リモコン」ボード。
わかりやすい手順書があって、ライブラリもサンプルコードもあって、必要な素子はボードに全部載ってる。
これ買えば勝ち確。「ミールキット」みたいなものです。
上記ボードESPr IRの注意点として、別途FW書き込み用の変換モジュールが要ります。
うには別件で使ったことがあり、既に所持していました。
2016年発売とのことで新しい情報が少なそうだったのと、使えるピンの少なさが気になりましたが、
ここまで都合のいいボードが存在するならそれに乗ろう!ということで、ESPr IRボードを購入してみました。
ESPr IRを実際に動かしてみる
勝ち確ボードを入手した時点でほぼ仕事は終わったようなもので、
あとはスイッチサイエンス公式の手順書とライブラリを使って気楽に動かしていきます。
変換モジュールからESPr IRボードに給電はできないので、別々に給電が必要なことに注意。
変換モジュールはPCから給電、ESPr IRボードはモバイルバッテリー等から給電するようにして、
デバッグ時は変換モジュール経由でシリアルモニタの値を読みだせるようにします。
また、ESPr IRボードのジャンパーソケットを
に切り替える必要があります。(100回忘れました)
その他、いくつか戸惑った点は以下の通りです。
フラッシュメモリ容量「4M→2M」問題
手順を進める中で
変更前: 4M(3M SPIFFS)
変更後: 2M(1M SPIFFS)
という記載があり、使用している開発環境と表記が若干違って戸惑いました。Arduino IDEのバージョンによるのかな?
Tools>Flash Sizeで
「Flash Size: “2MB (FS: 1MB, OTA: ~512KB)」を選んで問題なく動作しました。
これが正解なのかはあまり自信なしです。
IRrecvDump?V2?V3?問題
まずはサンプルコード「IRrecvDump」を使って赤外線パターンの読み取りを行うのですが、
「IRrecvDump」「IRrecvDumpV2」「IRrecvDumpV3」の3種類があります。
手順通り動くか確認するため、まずは「IRrecvDump」を書き込んで実行。
電気のスイッチをおしたときの信号が以下のように読みだせました。
Decoded NEC: 1768877 (32 bits)
Raw (68): {…中略…};
DEPRECATED: Please use IRrecvDumpV2.ino instead!
「DEPRECATED」が気になるけど良い感じ。
電灯はNEC製ではないので「ん?」と思いましたが、
NECとして登録されていたパターンと合致したというだけで、そこはあまり気にしなくてよさそうです。
エアコンの方は「UNKNOWN」で、登録されていたメーカーのパターンと合致しないようでした。
とうことで次に、推奨の「IRrecvDumpV2」も試してみます。
「IRrecvDumpV2」にするときは、const uint16_t kRecvPin = 5;にすればOKです。
エアコンのスイッチを押したときの信号は以下のように読みだせました。
Protocol : UNKNOWN
Code : 0xFDCF26B3 (188 Bits)
uint16_t rawData[375] = {…中略…}; // UNKNOWN FDCF26B3
どっちにしろUNKNOWNやないかい!ということで、rawDataの値を使って制御することにします。
V2で取得したパターンを採用して問題なく動作したので、V3は触ってません。
Protocol:UNKNOWNの場合
解析対象にしたいすべてのスイッチの赤外線パターンが取得出来たら、
こんどは「IRsend」のサンプルスケッチを参考に赤外線LEDを制御することで機器の制御ができます。
たとえば照明ONのスイッチを押したときのパターン読み出し結果が
Decoded NEC: 1768877 (32 bits)
Raw (68): {…中略…};
であれば、NEC用の関数が用意されているので、
irsend.sendNEC(0x1768877);
の一行を実行すれば照明がONになります。
一方でProtocolがUNKNOWNで、「sendNEC」などの関数が使えないときは「sendRaw」関数で代用ができます。
たとえばエアコンONのスイッチを押したときのパターン読み出し結果が
Protocol : UNKNOWN
Code : 0xFDCF26B3 (188 Bits)
uint16_t rawData[375] = {…中略…}; // UNKNOWN FDCF26B3
であれば、
uint16_t rawData[375] = {…中略…};
irsend.sendRaw(rawData, 375, 38);
の二行を実行すればエアコンがONになります。
UNKNOWNでも全然簡単だった。汎用性があって助かります。
これでESPr IRの動かし方が分かったので、あとはこれらを追加したいアプリケーションに組み込んでいけばOKです。
まとめ
本記事ではESPr IRを使ってできたものと、実際に使ってみて思ったこと気づいたことなどをまとめてみました。
リモコンで動く系の家電の制御を、このボード1個で集約できるので大変スマートですね!
今回は音声認識のアプリケーションと接続しましたが、普通にスマホで遠隔操作できるようにしておけば出先から制御とかもできて便利だと思います。
この記事がご興味のある方の参考になりますと幸いです!
最後までお読みいただき、ありがとうございました♪