スマート家電化計画 !! with M5StickC Plus 〜1. 赤外線受信/送信 (ユニット不使用)〜

この記事は[Linkbal（リンクバル） Advent Calendar 2021](https://qiita.com/advent-calendar/2021/linkbal) 12日目の記事です。
空いていたので、滑り込みで登録しました。
びっくりするくらい業務と関係ない話です。

# はじめに

先日初めて[ハッカソン](https://mashupawards.connpass.com/event/225670/)に参加しました。
その中で、何やらよくわからないデバイスを使ってIoTアプリケーションを作成している方がいらっしゃいました。
ネットワークやら、Bluetoothやら、ジャイロセンサーやらがなんとかかんとか...  

![b8077191-3a52-4799-890a-514788b7f85c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266081/7e02dd4b-d57a-cec5-7ca1-a9fec9ab3258.jpeg)
(SWITCH SCIENCE 商品ページより引用)

**かっこかわいい！！！！！！！！**  

ということで、**即購入**、とりあえず**部屋の赤外線家電をスマート家電化**することにしました。

本記事では、M5StickC Plus、赤外線受信センサー、赤外線LEDを用いた**赤外線リモコン作成まで**　行おうと思います。スマホとの連携はいつかまた...

# なぜやるのか

**かっこいいから！！！！！！面白そうだから！！！！！！！！！！！！！！！**

# 用意したもの

先ず、以下のものを用意しました。

- M5StickPlus
- [赤外線センサー (50円/1個))](https://akizukidenshi.com/catalog/g/gI-06487/)
- [赤外線LED (100円/5個)](https://akizukidenshi.com/catalog/g/gI-03261/)
- [ブレッドボード (200円/1個)](https://akizukidenshi.com/catalog/g/gP-05294/)
- [ジャンパ線 (220円/60本)](https://akizukidenshi.com/catalog/g/gC-05159/)

![iOS の画像 (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266081/50d730f5-8d75-ee90-8ad2-c7f6050bd2e1.jpeg)

M5StickCユーザーなら気づいたかもしれませんが、今回はM5StickCに接続できる便利モジュール[赤外線送受信ユニット](https://www.switch-science.com/catalog/5699/)を利用していません。　　

![6aaa0691-d905-4bc8-92d8-a9942853c4cc.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266081/965a40dd-b56f-1b84-eb23-1c267994c5fe.jpeg)
(SWITCH SCIENCE 商品ページより引用)


M5StickCの端子に接続するだけで、赤外線送受信機能を付与できる優れものです。もちろん準備する段階で存在は知っていました。ただ....

**個別のセンサとかLEDとかでやった方がかっこいい！！！気がする！！！！**

というとっても大きな理由があったので、利用しないことにしました。  
お値段は528円です。~~安いですね~~**とても手が出ませんね**。**センサとLEDを個別で買ったら70円**で揃えれちゃいます。配送料の500円はいつもお世話になってる佐川さんへの投げ銭と考えることができるので、はい、**とても安いですね。**

# やってみる

## 1. M5Stick5 Plusの開発環境の用意

IDEとしては、**PlatformIOをインストールしたVSCode**を利用することにしました(ArduinoIDEが多く使われているそうですが、VSCodeを普段使用している人はそちらを利用するのがやりやすいと思います。)

ほか、HelloWorld!までは、以下の記事を参考にさせていただきました。

https://qiita.com/tatsuya1970/items/ceeb5a5b011d53910fbb　

## 2. 赤外線センサを使って赤外線を受信してみる

[赤外線センサの商品ページのデータシート](https://akizukidenshi.com/download/ds/sharp/GP1UXC4xQS_j.pdf)を参考に、以下のように配線を組みました。

| 全体図 | センサ | 
| --- | --- |
![iOS の画像 (2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266081/06822de8-6e7f-6697-d873-5be84a4d3f48.jpeg)|![iOS の画像 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266081/0de2b1a2-88e9-f426-3e51-84201aba64ba.png)|

(今回は入力だけで良いので、**入出力可能なG26ではなく、入力のみの機能を持つG36ピン**を利用しています。)

コードは以下のように記述し、シリアルモニタに赤外線の信号が出力されるようにしました。
(超絶参考: [単子葉類プログラマーのメモ](https://shining-corn.hatenablog.jp/entry/2020/11/22/213442))

```cpp
// 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 |
| --- | --- |
|![iOS の画像 (4).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266081/6afe9553-a9be-e005-1d76-d82750b3922f.jpeg)|![iOS の画像 (5).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266081/b4d553c5-0807-7d67-9396-254d109b5292.jpeg)|

LEDを光らせるために、**出力も可能な G26ピン**を用いました。
(LEDによっては抵抗を噛ませる必要があるかと思います。)

先ほど読み取った信号を赤外線LEDで送信するために以下のようにコードを編集します(追加部分はADDのコメントをつけました)

ここで使ってる`IRsend`は、LEDを信号情報を持つようにうまいこと光らせてくれるすごいやつです

```cpp
// 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ボタン(横側の電源じゃない方のボタン)をおしたら、信号が送信され、横のセンサで読み取ってくれるはずです。
ビルド、アップロード後、横ボタンを押した結果、シリアルモニタには以下の情報が出力されました。

```cpp
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と接続し、サーバー化なりを行って、家電の赤外線情報の保存/スマートフォンとの接続を行えばスマート家電化は完了しそうです。  

大学の授業ぶりに電子工作を触りましたが、全くもって忘れていて、今回のような簡単そうなことを行うにも数日かかってしまいました... :cry:
**もうちょっと勉強しようかなと思います。かっこよくなりたいので！！！**

最後に、実際に赤外線を飛ばして照明をON/OFFする動画を載せておきます。ありがとうございました！！！！

![ダウンロード.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266081/95494235-1a9c-620e-2923-0eb769ec2d4b.gif)