赤外線通信はやりかけては中途半端のままで、これまでおわってきました。
解析結果をもとに受信した信号を送信しようと試みましたが、部品の違いや信号の正確性の問題なのかなかなかうまくいかず放置していましたが、M5Stackを使うとスムーズにできたので、記録に残しておこうと思います。
使用したのはM5GOとGROOVE端子につながる赤外線送受信ユニットです。やはり送信と受信がペアになっているのは強いです。
参考にしたのは上記サイトで、コードをそのまま使わせていただきました。
受信したタイミングのデータを配列に格納するのかと思っていたら、コード自体を出力するなど随分と至れり尽くせりのライブラリになっていることに驚きました。
受信プログラムでは、送信に必要なデータのみ出力しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#include <M5Stack.h> #include <IRrecv.h> #include <IRremoteESP8266.h> #include <IRac.h> #include <IRtext.h> #include <IRutils.h> IRrecv irrecv(36, 1024, 50, true); //pin:36 capture bufsize:1024 timeout:50 decode_results results; void setup() { M5.begin(); M5.Power.begin(); Serial.begin(115200); irrecv.setTolerance(kTolerance); irrecv.enableIRIn(); } void loop() { if (irrecv.decode(&results)) { Serial.println(resultToSourceCode(&results)); } } |
送信プログラムのデータ部分は、上記プログラムのシリアル出力をコピペして使いました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
#include <M5Stack.h> #include <IRremoteESP8266.h> #include <IRsend.h> template <typename T, size_t N> size_t arraySize(T (&arr)[N]) { return N; } const uint16_t kIrSendPin = 26; // for M5GO IR unit const uint16_t kSendFrequencyKhz = 38; IRsend irsend(kIrSendPin); uint16_t rawData[71] = {9012, 4450, 598, 550, 572, 548, 572, 550, 572, 548, 572, 548, 572, 548, 570, 1674, 574, 548, 574, 1672, 572, 1650, 598, 1672, 574, 1674, 574, 1672, 576, 1672, 572, 550, 570, 1674, 574, 548, 572, 1674, 574, 546, 572, 550, 570, 1674, 574, 546, 574, 546, 574, 548, 570, 1674, 574, 546, 572, 1676, 574, 1672, 574, 548, 572, 1674, 574, 1672, 574, 1672, 574, 39800, 9016, 2194, 598}; void setup() { M5.begin(); M5.Power.begin(); Serial.begin(115200); irsend.begin(); } void loop() { M5.update(); if (M5.BtnA.wasPressed()) { irsend.sendRaw(rawData, arraySize(rawData), kSendFrequencyKhz); M5.Lcd.println("On"); } delay(10); } |
Aボタンを押すと送信します。
タッチスクリーン対応のM5Stack Core2を使えば、たくさんコントロールできそうです。