概要
M5シリーズのgrove端子に接続することで、はんだ付なしに簡単に赤外線の送受信ができるユニットを用いて、部屋の照明を操作できるリモコン信号を解析し、それを用いてAmazon Alexaと連携するリモコンシステムを作りました。
使用したモジュール
-
M5Atom lite
https://www.marutsu.co.jp/pc/i/1634275/
-
M5Stack用赤外線送受信ユニット
https://www.marutsu.co.jp/pc/i/1556080/
-
接続
モジュールの接続はM5Atomliteのgrove端子と赤外線送受信ユニットのgrove端子を付属のgroveコネクタケーブルで接続するだけです。
開発環境
開発環境は、赤外線送受信ユニットのサンプルスケッチ及び連携するAmazon Alexa接続用のライブラリのあるArduino IDEで行いました。
ライブラリの追加
-
IRremoteESP8266ライブラリ
https://github.com/crankyoldgit/IRremoteESP8266
-
Espalexaライブラリ
https://github.com/Aircoookie/Espalexa
リモコン信号解析
リモコン信号解析のスケッチは 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
に
編集
をしました。
ログインしてコメントを投稿する