この記事はLinkbal(リンクバル) Advent Calendar 2021 12日目の記事です。
空いていたので、滑り込みで登録しました。
びっくりするくらい業務と関係ない話です。
はじめに
先日初めてハッカソンに参加しました。
その中で、何やらよくわからないデバイスを使ってIoTアプリケーションを作成している方がいらっしゃいました。
ネットワークやら、Bluetoothやら、ジャイロセンサーやらがなんとかかんとか...
かっこかわいい!!!!!!!!
ということで、即購入、とりあえず部屋の赤外線家電をスマート家電化することにしました。
本記事では、M5StickC Plus、赤外線受信センサー、赤外線LEDを用いた赤外線リモコン作成まで 行おうと思います。スマホとの連携はいつかまた...
なぜやるのか
かっこいいから!!!!!!面白そうだから!!!!!!!!!!!!!!!
用意したもの
先ず、以下のものを用意しました。
M5StickCユーザーなら気づいたかもしれませんが、今回はM5StickCに接続できる便利モジュール赤外線送受信ユニットを利用していません。
M5StickCの端子に接続するだけで、赤外線送受信機能を付与できる優れものです。もちろん準備する段階で存在は知っていました。ただ....
個別のセンサとかLEDとかでやった方がかっこいい!!!気がする!!!!
というとっても大きな理由があったので、利用しないことにしました。
お値段は528円です。安いですねとても手が出ませんね。センサとLEDを個別で買ったら70円で揃えれちゃいます。配送料の500円はいつもお世話になってる佐川さんへの投げ銭と考えることができるので、はい、とても安いですね。
やってみる
1. M5Stick5 Plusの開発環境の用意
IDEとしては、PlatformIOをインストールしたVSCodeを利用することにしました(ArduinoIDEが多く使われているそうですが、VSCodeを普段使用している人はそちらを利用するのがやりやすいと思います。)
ほか、HelloWorld!までは、以下の記事を参考にさせていただきました。
2. 赤外線センサを使って赤外線を受信してみる
赤外線センサの商品ページのデータシートを参考に、以下のように配線を組みました。
全体図 | センサ |
---|---|
(今回は入力だけで良いので、入出力可能なG26ではなく、入力のみの機能を持つG36ピンを利用しています。)
コードは以下のように記述し、シリアルモニタに赤外線の信号が出力されるようにしました。
(超絶参考: 単子葉類プログラマーのメモ)
// main.cpp
#include <Arduino.h>
#include <M5StickCPlus.h>
#include <IRremoteESP8266.h>
#include <IRrecv.h>
#include <IRtext.h>
#include <IRutils.h>
#include <IRac.h>
#define IR_RECV_PIN 36
const uint8_t kTolerancePercentage = kTolerance;
const uint16_t kCaptureBufferSize = 1024;
const uint8_t kTimeout = 50;
IRrecv irrecv(IR_RECV_PIN, kCaptureBufferSize, kTimeout, true);
decode_results results;
template <typename T, size_t N>
size_t arraySize(T (&arr)[N]) {
return N;
}
void setup() {
M5.begin();
irrecv.setTolerance(kTolerancePercentage);
irrecv.enableIRIn();
M5.Lcd.println("IR wating...");
}
void loop() {
if (irrecv.decode(&results)) {
if (results.overflow) { // overflowした場合
Serial.printf(D_WARN_BUFFERFULL "\n", kCaptureBufferSize);
}
Serial.println(D_STR_LIBRARY " : v" _IRREMOTEESP8266_VERSION_ "\n");
if (kTolerancePercentage != kTolerance) { //
Serial.printf(D_STR_TOLERANCE " : %d%%\n", kTolerancePercentage);
}
Serial.print(resultToHumanReadableBasic(&results));
String description = IRAcUtils::resultAcToString(&results);
if (description.length()) {
Serial.println(D_STR_MESGDESC ": " + description);
}
Serial.println(resultToSourceCode(&results));
Serial.println();
}
}
これをビルドし、M5SickCにアップロードすると、赤外線受信時に、シリアルモニタへ情報を出力することができます。
実際に動作させた時、部屋の照明のリモコンのON/OFFボタンの信号は以下のようになりました。
Library : v2.8.0
Protocol : UNKNOWN
Code : 0x8F2ACD44 (43 Bits)
uint16_t rawData[85] = {2082, 924, 5584, 934, 1584, 430, 1584, 428, 584, 436, 584, 438, 584, 438, 582, 438, 584, 438, 584, 436, 1586, 428, 586, 438, 584, 438, 584, 438, 584, 438, 582, 438, 584, 438, 1586, 426, 586, 438, 1584, 428, 584, 436, 584, 438, 584, 438, 582, 438, 584, 438, 584, 438, 584, 438, 584, 436, 584, 438, 584, 436, 586, 436, 584, 438, 584, 438, 584, 438, 584, 438, 1584, 428, 584, 436, 1586, 428, 1584, 430, 582, 440, 1584, 430, 1582, 430, 558}; // UNKNOWN 8F2ACD44
この信号を赤外線LEDに出力するようにすれば、M5StickCを赤外線リモコン化することができるはずです!!!
3. 赤外線LEDを使って赤外線を送信してみる
今までの配線に追加する形で、以下のように配線しました。
全体図 | LED |
---|---|
LEDを光らせるために、出力も可能な G26ピンを用いました。
(LEDによっては抵抗を噛ませる必要があるかと思います。)
先ほど読み取った信号を赤外線LEDで送信するために以下のようにコードを編集します(追加部分はADDのコメントをつけました)
ここで使ってるIRsend
は、LEDを信号情報を持つようにうまいこと光らせてくれるすごいやつです
// main.cpp
#include <Arduino.h>
#include <M5StickCPlus.h>
#include <IRremoteESP8266.h>
#include <IRrecv.h>
// ADD
#include <IRtext.h>
#include <IRutils.h>
#include <IRac.h>
#include <IRsend.h>
#define IR_RECV_PIN 36
#define IR_SEND_LED_PIN 26 // ADD
const uint8_t kTolerancePercentage = kTolerance;
const uint16_t kCaptureBufferSize = 1024;
const uint8_t kTimeout = 50;
const uint16_t kSendFrequencyKhz = 38; // ADD
IRrecv irrecv(IR_RECV_PIN, 1024, 50, true);
decode_results results;
IRsend irsendLed(IR_SEND_LED_PIN); // ADD
template <typename T, size_t N>
size_t arraySize(T (&arr)[N]) {
return N;
}
// ADD: センサで読み取った信号
uint16_t TURN_ON[85] = {2082, 924, 5584, 934, 1584, 430, 1584, 428, 584, 436, 584, 438, 584, 438, 582, 438, 584, 438, 584, 436, 1586, 428, 586, 438, 584, 438, 584, 438, 584, 438, 582, 438, 584, 438, 1586, 426, 586, 438, 1584, 428, 584, 436, 584, 438, 584, 438, 582, 438, 584, 438, 584, 438, 584, 438, 584, 436, 584, 438, 584, 436, 586, 436, 584, 438, 584, 438, 584, 438, 584, 438, 1584, 428, 584, 436, 1586, 428, 1584, 430, 582, 440, 1584, 430, 1582, 430, 558}; // UNKNOWN 8F2ACD44
void setup() {
M5.begin();
irrecv.setTolerance(kTolerancePercentage);
irrecv.enableIRIn();
// ADD
irsendLed.begin();
pinMode(IR_SEND_LED_PIN, OUTPUT);
M5.Lcd.println("IR wating...");
}
void loop() {
if (irrecv.decode(&results)) {
if (results.overflow) { // overflowした場合
Serial.printf(D_WARN_BUFFERFULL "\n", kCaptureBufferSize);
}
Serial.println(D_STR_LIBRARY " : v" _IRREMOTEESP8266_VERSION_ "\n");
if (kTolerancePercentage != kTolerance) { //
Serial.printf(D_STR_TOLERANCE " : %d%%\n", kTolerancePercentage);
}
Serial.print(resultToHumanReadableBasic(&results));
String description = IRAcUtils::resultAcToString(&results);
if (description.length()) {
Serial.println(D_STR_MESGDESC ": " + description);
}
Serial.println(resultToSourceCode(&results));
Serial.println();
}
// ADD
M5.update();
// 横のボタンを押したら、信号が送信される
if (M5.BtnB.wasPressed()) {
irsendLed.sendRaw(TURN_ON, arraySize(TURN_ON), kSendFrequencyKhz);
}
delay(10);
}
さて、これで、M5StickCのBボタン(横側の電源じゃない方のボタン)をおしたら、信号が送信され、横のセンサで読み取ってくれるはずです。
ビルド、アップロード後、横ボタンを押した結果、シリアルモニタには以下の情報が出力されました。
Library : v2.8.0
Protocol : UNKNOWN
Code : 0x8F2ACD44 (43 Bits)
uint16_t rawData[85] = {2138, 868, 5642, 880, 1638, 378, 1646, 370, 644, 380, 646, 378, 644, 384, 644, 380, 644, 380, 644, 382, 1636, 380, 646, 384, 652, 378, 650, 370, 652, 372, 632, 390, 628, 398, 1638, 378, 646, 382, 1642, 374, 644, 378, 646, 380, 646, 380, 646, 376, 650, 378, 650, 376, 648, 378, 650, 374, 648, 378, 646, 380, 644, 382, 648, 378, 644, 382, 644, 382, 644, 382, 1640, 374, 646, 376, 1642, 376, 1636, 378, 646, 380, 1636, 380, 1640, 374, 624}; // UNKNOWN 8F2ACD44
生のデータは誤差の関係で異なっていますが、コードは0x8F2ACD44
で先程の出力と一致しました!! 🎉🎉🎉🎉
終わりに
さて、以上で、センサとLEDを用いて赤外線受信と送信を行うことができました!
あとは、M5StickCをWifiと接続し、サーバー化なりを行って、家電の赤外線情報の保存/スマートフォンとの接続を行えばスマート家電化は完了しそうです。
大学の授業ぶりに電子工作を触りましたが、全くもって忘れていて、今回のような簡単そうなことを行うにも数日かかってしまいました...
もうちょっと勉強しようかなと思います。かっこよくなりたいので!!!
最後に、実際に赤外線を飛ばして照明をON/OFFする動画を載せておきます。ありがとうございました!!!!