SJKのアイコン画像
SJK 2021年02月28日作成 (2022年05月18日更新)
製作品 製作品 閲覧数 2998
SJK 2021年02月28日作成 (2022年05月18日更新) 製作品 製作品 閲覧数 2998

M5Atom liteと赤外線送受信ユニットでAmazon Alexa対応リモコンを作る

M5Atom liteと赤外線送受信ユニットでAmazon Alexa対応リモコンを作る

概要

M5シリーズのgrove端子に接続することで、はんだ付なしに簡単に赤外線の送受信ができるユニットを用いて、部屋の照明を操作できるリモコン信号を解析し、それを用いてAmazon Alexaと連携するリモコンシステムを作りました。

使用したモジュール

開発環境

開発環境は、赤外線送受信ユニットのサンプルスケッチ及び連携するAmazon Alexa接続用のライブラリのあるArduino IDEで行いました。

ライブラリの追加

リモコン信号解析

リモコン信号解析のスケッチは IRremoteESP8266ライブラリを追加すると一緒に追加されるスケッチ例> IRremoteESP8266> IRrecDumpV2 を開きほぼそのまま使用します。M5Atomのライブラリを追加して#include <M5Atom.h>、赤外線受信のピンを32番に変更const uint16_t kRecvPin = 32します。

スケッチを書き込んでシリアルモニタを開きリモコンのボタンを赤外線送受信ユニットの受信部(黒いほう)に向けて押します。すると、以下のような結果が得られます。

リモコンの全灯ボタンを押したときの出力例

Timestamp : 000069.001 Library : v2.7.14 Protocol : UNKNOWN Code : 0xF6B92168 (42 Bits) uint16_t rawData[83] = {3506, 1714, 428, 440, 434, 434, 458, 1276, 432, 1308, 432, 436, 460, 1274, 428, 442, 456, 410, 426, 438, 430, 1308, 434, 434, 458, 410, 426, 1310, 434, 436, 428, 1308, 428, 438, 434, 1302, 426, 440, 428, 440, 432, 1300, 462, 410, 424, 440, 434, 458, 406, 438, 428, 1306, 462, 432, 426, 1284, 430, 1308, 462, 408, 422, 1312, 456, 410, 432, 432, 430, 462, 434, 408, 424, 1312, 430, 436, 434, 458, 436, 1274, 430, 442, 456, 410, 432}; // UNKNOWN F6B92168 Timestamp : 000069.128 Library : v2.7.14 Protocol : UNKNOWN Code : 0xF6B92168 (42 Bits) uint16_t rawData[83] = {3480, 1738, 430, 442, 452, 414, 436, 1302, 428, 1310, 400, 468, 436, 1304, 464, 428, 402, 440, 428, 438, 464, 1274, 398, 468, 432, 438, 458, 1278, 462, 406, 428, 1310, 426, 442, 436, 1302, 398, 468, 432, 438, 456, 1278, 460, 410, 396, 468, 434, 434, 458, 432, 400, 1310, 456, 414, 460, 1274, 400, 1338, 400, 468, 460, 1278, 464, 406, 428, 438, 400, 466, 436, 432, 460, 1278, 430, 462, 430, 414, 430, 1304, 400, 466, 434, 436, 456}; // UNKNOWN F6B92168

使用したリモコンはPanasonicのHK9494だったのですが、ProtocolはUNKNOWNでしたので、送信スケッチにはrawDataを書き込むことにしました。

スケッチ

シーリングライトのON・OFF信号を送るAlexa対応リモコンのスケッチ

#include <M5Atom.h> #include <IRremoteESP8266.h> #include <IRsend.h> #include <Espalexa.h> #include <WiFi.h> const char* SSID = "YOUR SSID"; //Amazon Echoが繋がっているwifiのSSID const char* PASSWORD = "YOUR PASSWORD"; const int IR_SEND_PIN = 26; //M5Atomのgroveコネクタの赤外線送信用ピンは26 // PanasonicHK9494_FULL(全灯) uint16_t rawDataFull[83] = {3484, 1736, 434, 460, 436, 406, 428, 1308, 460, 1276, 460, 408, 424, 1312, 456, 412, 430, 436, 428, 442, 456, 1276, 428, 440, 428, 438, 432, 1304, 430, 436, 428, 1308, 434, 434, 426, 1308, 432, 436, 456, 410, 424, 1310, 430, 438, 430, 436, 428, 440, 428, 438, 432, 432, 428, 440, 430, 1304, 434, 1304, 430, 464, 406, 1306, 460, 408, 398, 468, 430, 1308, 430, 436, 426, 1310, 434, 434, 430, 436, 426, 1310, 432, 436, 428, 436, 426}; // UNKNOWN CA21A230 // PanasonicHK9494_OFF(消灯) uint16_t rawDataOff[83] = {3480, 1738, 432, 436, 426, 440, 428, 1308, 432, 1308, 428, 438, 426, 1310, 434, 434, 428, 440, 424, 440, 434, 1304, 428, 438, 428, 440, 426, 1308, 426, 442, 398, 1338, 430, 438, 424, 1312, 400, 466, 432, 434, 398, 1338, 430, 464, 404, 438, 396, 468, 430, 462, 432, 1280, 426, 1312, 434, 1304, 432, 1306, 398, 468, 430, 1308, 430, 436, 426, 442, 454, 410, 398, 1338, 426, 1312, 456, 412, 426, 438, 426, 1308, 434, 436, 424, 442, 398}; // UNKNOWN 1B9C2A92 IRsend irsend(IR_SEND_PIN); void bedledChanged(EspalexaDevice* dev); Espalexa espalexa; void setup() { M5.begin(true, false, true); irsend.begin(); Serial.begin(115200); // wifi connection WiFi.begin(SSID, PASSWORD); while (WiFi.status() != WL_CONNECTED) { M5.dis.setBrightness(1); M5.dis.drawpix(0, CRGB::Red); // actually Green delay(500); Serial.print('.'); M5.dis.setBrightness(0); delay(500); } // espalexaでデバイスを認識させる espalexa.addDevice("BedLED", bedledChanged, EspalexaDeviceType::onoff); espalexa.begin(); } void loop() { espalexa.loop(); } void bedledChanged(EspalexaDevice *d) { if (d == nullptr) return; Serial.println(d->getValue()); bool request_flag = d->getValue() ? true : false; bedledPowerSwitch(request_flag); } void bedledPowerSwitch(bool request_flag) { if (request_flag) { Serial.println("bed ceiling on"); irsend.sendRaw(rawDataFull, 83, 38); M5.dis.setBrightness(1); M5.dis.drawpix(0, 0xf00000); } else { Serial.println("bed ceiling off"); irsend.sendRaw(rawDataOff, 83, 38); M5.dis.setBrightness(1); M5.dis.drawpix(0, 0x00ff00); } delay(500); M5.dis.setBrightness(0); }

実際に使ってみて

スマホのAlexaアプリで、デバイスの追加(デバイス画面の右上の "+" マークを押す)でデバイスの検出が始まります。うまくみつかれば「新しいデバイスが見つかりました」となります。(何回か繰り返さないと見つけられないときもありました)また、スケッチを書き換えたらAlexaアプリからデバイスを消去して、再登録が必要でした。
その後、Alexaアプリの "照明" に "BedLED" という名前のデバイスが追加されます。追加されたあとはAlexaアプリ側で好みの名前に変更可能(例えば "寝室")です。
ON/OFFだけでなく、定型アクションを登録することで、朝アラームと一緒に部屋の照明をつけるようなこともできるので、重宝してます。
キャプションを入力できます

後日談

赤外線送受信ユニットの送信用LEDは出力が弱かったので、出力を上げた送信モジュールを自作しました。
https://twitter.com/SJKoffee/status/1369632779508453378
キャプションを入力できます

  • SJK さんが 2021/02/28 に 編集 をしました。 (メッセージ: 初版)
  • SJK さんが 2022/05/18 に 編集 をしました。
ログインしてコメントを投稿する