今回の記事は母がメインで行った製作ブログ。息子くんはやや手伝ってくれました。
赤外線リモコンが作りたい
M5StickC、赤外線送信機能がついてるんです。
これはもうリモコン作るしかないですよね!
過去の挫折
でも実は以前も赤外線リモコン作ろうとして挫折した経験があるんです・・。
↓ irMagicianという学習機能のある赤外線モジュールを使いました。
当時Arduinoなんて触ったこともなかった私、こちらはWindowsから操作ができるということでこれならいけそうと思ったんですがどうにもこうにもうまくできなかったんですよね。その後何度かトライしたものの断念。
M5Stack / M5StickCでつくるために準備
赤外線送信するために、まずは受信して家にある色々なリモコンの赤外線送信値をハックしたい!
ですがM5StickCには赤外線受信機能はないため、GROVE接続できるIRユニットを買いました。
これがあれば赤外線送受信ができます。
M5StickCに接続できるのはもちろん、持っているM5Stack Fireにもつけられます。ヤッタネ
家にあるリモコンの赤外線値を受信してみる
息子くんがやってくれました。
IRremoteESP8266というのが必要で、それをライブラリに含めた後、
スケッチ例 → IRremoteESP8266 → IRrecvDumpV2
で開くプログラムを少しだけ修正して実行します。
//const uint16_t kRecvPin = 14; const uint16_t kRecvPin = 33; // M5StickCにIRユニットをGrove接続したときの赤外線受信
↑ 赤外線受信するピンが違うのでこれを書き換えればOK。
ちなみに、M5StickCではなくM5Stackでは当然値が異なり、36になります。
(「当然」とか偉そうに書きましたが、この辺りごく最近まで説明きいてもいまいちピンときてなかった私)
このプログラムを動かしつつIRユニットに向かってリモコンを操作します。
ここではテレビ(ソニー製)の電源ボタンを押しました。
リモコンからちゃんと赤外線が出てるかどうか、は、まぁテレビが付くかどうか確認すればわかるのですが、スマホのカメラを向けてみてもわかります。赤外線が出てるのがカメラにうつります。
きちんと赤外線が受信されると、シリアルモニタに結果が表示されます。
IRrecvDumpV2 is now running and waiting for IR input on Pin 33
Timestamp : 000098.667
Library : v2.7.5Protocol : SONY
Code : 0xA90 (12 Bits)
uint16_t rawData[181] = {2324, 660, 1130, 660, 534, 660, 1132, 658, 532, 662, 1130, 656, 536, 658, 530, 656, 1132, 662, 530, 660, 530, 660, 532, 656, 532, 25878, 2356, 636, 1132, 660, 532, 658, 1156, 636, 532, 660, 1154, 636, 556, 634, 532, 658, 1134, 658, 554, 634, 550, 644, 528, 656, 534, 25888, 2322, 660, 1132, 658, 534, 682, 1110, 636, 556, 662, 1130, 660, 532, 662, 528, 660, 1132, 654, 538, 656, 532, 662, 528, 656, 534, 25876, 2336, 658, 1132, 658, 534, 658, 1134, 660, 532, 658, 1134, 662, 530, 658, 534, 662, 1130, 656, 536, 660, 530, 656, 532, 662, 528, 25876, 2332, 660, 1130, 660, 532, 660, 1132, 660, 530, 662, 1130, 662, 532, 658, 532, 662, 1130, 660, 532, 660, 530, 656, 532, 660, 530, 25858, 2348, 658, 1130, 662, 528, 662, 1130, 660, 532, 662, 1128, 664, 528, 662, 530, 662, 1152, 638, 554, 640, 526, 660, 530, 660, 530, 25882, 2330, 656, 1134, 658, 534, 660, 1130, 660, 532, 660, 1130, 664, 528, 658, 534, 658, 1132, 658, 534, 662, 526, 656, 534, 658, 530}; // SONY A90
uint32_t address = 0x1;
uint32_t command = 0x15;
uint64_t data = 0xA90;
こういう値が受信されました。これをメモっておきます。
ちゃんとSONYってなってますね。
おかしな値を受信することもあるので、何度かやってみると良いです。
これで赤外線受信OK。
こんどはこれをつかってテレビリモコンになりきるべく、M5StickCまたはM5Stack側から赤外線送信できるようにします。
テレビ電源ONをM5StickC/M5Stack Fireから行う
//*-----------------------------------* // M5StickC用の赤外線<送信>専用 //*-----------------------------------* #include <M5StickC.h> #include <IRremoteESP8266.h> #include <IRsend.h> //【M5StickC用】 int ir_recv_pin = 33; int ir_send_pin = 9; // M5StickC自体に内蔵されている赤外線送信 // int ir_send_pin = 32; // M5StickCへGrove接続したIRユニットから赤外線送信するパターン // sendSonyせずにsendRawする場合はこのrawDataを利用する // uint16_t rawData[181] = {2324, 660, 1130, 660, 534, 660, 1132, 658, 532, 662, 1130, 656, 536, 658, 530, 656, 1132, 662, 530, 660, 530, 660, 532, 656, 532, 25878, 2356, 636, 1132, 660, 532, 658, 1156, 636, 532, 660, 1154, 636, 556, 634, 532, 658, 1134, 658, 554, 634, 550, 644, 528, 656, 534, 25888, 2322, 660, 1132, 658, 534, 682, 1110, 636, 556, 662, 1130, 660, 532, 662, 528, 660, 1132, 654, 538, 656, 532, 662, 528, 656, 534, 25876, 2336, 658, 1132, 658, 534, 658, 1134, 660, 532, 658, 1134, 662, 530, 658, 534, 662, 1130, 656, 536, 660, 530, 656, 532, 662, 528, 25876, 2332, 660, 1130, 660, 532, 660, 1132, 660, 530, 662, 1130, 662, 532, 658, 532, 662, 1130, 660, 532, 660, 530, 656, 532, 660, 530, 25858, 2348, 658, 1130, 662, 528, 662, 1130, 660, 532, 662, 1128, 664, 528, 662, 530, 662, 1152, 638, 554, 640, 526, 660, 530, 660, 530, 25882, 2330, 656, 1134, 658, 534, 660, 1130, 660, 532, 660, 1130, 664, 528, 658, 534, 658, 1132, 658, 534, 662, 526, 656, 534, 658, 530}; // SONY A90 IRsend irsend(ir_send_pin); void setup() { M5.begin(); pinMode(ir_recv_pin, INPUT); pinMode(ir_send_pin, OUTPUT); M5.Lcd.setTextSize(2); M5.Lcd.setCursor(0, 0); M5.Lcd.print("IR SENDER: "); } void loop() { M5.update(); if ( M5.BtnA.wasPressed() ) { for (int i = 0; i < 3; i++) { // sendSonyで電源ON/OFF信号を送信 irsend.sendSony(0xa90,12); // sendRaw … データ長(rawDataのサイズ)=181、周波数=38kHz // irsend.sendRaw(rawData, 181, 38); } M5.Lcd.setCursor(0, 25); M5.Lcd.fillScreen(BLACK); M5.Lcd.println("send!"); delay(5000); // どれだけ待つべき?とりあえず5秒 } if ( M5.BtnB.wasPressed() ) { M5.Lcd.fillScreen(BLACK); } delay(100); }
上記はM5StickC用のArduinoコードです。Aボタンを押すと赤外線送信するように書きました。
赤外線送信ピン
int ir_send_pin = 9; // M5StickC自体に内蔵されている赤外線送信
// int ir_send_pin = 32; // M5StickCへGrove接続したIRユニットから赤外線送信するパターン
M5StickC自体に内蔵された赤外線送信機能を使う場合は9、IRユニットから送信する場合は32となります。
またM5StackへGrove接続したIRユニットから送信する場合は、
int ir_send_pin = 26;
となります。
※M5Stack Fire自体にはIR送信機能ありません
赤外線送信部分
方法1:
ソニー専用の送信メソッドが用意されているのでそれを使うことが出来ます。
// sendSonyで電源ON/OFF信号を送信
irsend.sendSony(0xa90,12); // 0xa90は、さきほどの受信結果「Code : 0xA90 (12 Bits)」の値です。
方法2:
rawDataの先ほど受信した値を使って送信することもできます。
// sendRow … データ長(rawDataのサイズ)=181、周波数=38kHz
irsend.sendRaw(rawData, 181, 38);
パワー不足!!
結果からは非常にシンプルな形で大丈夫だったのですが、ここに至るまで、もう具体的にどこをどう変えていったのかわからないんですけどネット調べ倒してあの手この手でコードを書き換えて試してみても一向にうまくいきませんでした。
M5StickC本体の赤外線送信や、IRユニットの赤外線送信はだいたい1m以内でしか認識しないそうです。
というのをネットで見たので、PCからプログラムを書き込んだ後ケーブルをはずしてM5StickCをテレビの1m以内に近づけてポチポチしてたんですがどうやってもうまくできない・・(そのときプログラムをいろいろ変えていた)
あるとき一番シンプルな形に戻してみて実行したら1回だけうまくいったんです。でもその後からいくらやってもうまくいかない。
初回だけうまくいったということは後続のプログラムに問題があるのか?などと考えて再起動して試してもやっぱりだめ。
もしやと思い、延長ケーブルをコンセントからひっぱってきてそこにM5StickCを電源接続したまま、操作すると大成功!
(↑ ポチっとするとテレビがついた!・・・肩こり体操の番組?)
原因はパワー不足でした・・・(;^ω^)
一部の方には「しょーもな!」って思われそうですが・・
長い道のりでした・・・
あきらめなくてよかった。
↑ モバイルバッテリーでも動作しました。
今後の展開
GoogleHomeからIFTTTで連携させていろいろな家電を操作出来たら!
と思っていたのですが、約1m以内でしか操作できないので、1家電につき1つのM5Stackが必要。まとめて操作は不可能でした。
また、私の生活の中で一番スマート操作したいのはリビングの照明。音声でつけたり消したりしたいんですが、照明の1M以内に電源接続させたM5Stackを配置させるのは至難の業。ぐぬぬ。
でも試行錯誤したおかげでまたいろいろな知識をえることができて良かったです^^
いまだったら挫折したirMagicianによる実装もいけるのかなぁ?息子くんは「あれたぶん壊れてるよ」って言ってたけど・・・
スター・はてブとても嬉しいです!