M5stackで作る赤外線リモコンとCO2濃度測定器

M5stackを使って室内環境の測定(温度,湿度,CO2濃度)とついでに照明のON/OFFが出来るリモコン機能を付けました。
Arduinoを扱った経験はあったのですが、こういったハードウェアプログラミングの経験はほぼ無いので躓きまくりました。

特に以下の点で困りまくったのでどうやって解決したのかを順番に書いていこうと思います。

* はんだ付けミスりまくる問題
* M5stack Basic(初代core)　Grove端子がPortA(I2C)しか無い問題
* 赤外線信号が届かない問題
* リモコン機能と室内環境測定機能、どう両立させるか問題
* M5stack BasicのAボタン　WiFi機能をONにすると使えない問題

#用意したもの
* [M5stack Basic(初代core)](https://www.switch-science.com/catalog/3647/)
* [M5Stack用CO2モニターキット](https://www.switch-science.com/catalog/6923/)
* [M5Stack用電池モジュール](https://www.switch-science.com/catalog/3653/) →結局外しました
* [Power Switch for M5Stack](https://www.switch-science.com/catalog/5726/) →電池を使わないので外しました
* [Power Switch for M5Stack用ケース](https://www.switch-science.com/catalog/6295/) ->同上
* [M5Stack用赤外線送受信ユニット](https://www.switch-science.com/catalog/5699/)
* [M5Stack PLUSエンコーダモジュール](https://www.switch-science.com/catalog/5206/)
* [M5Stack 壁掛けシステム（ガッチリVer)](https://make.dmm.com/item/900013/)

#序章　CO2濃度を測る
まずはM5stackとCO2モニターキットを買って室内のCO2濃度を測ることにしました。
プログラムも配布されているため、特にソースコードを書く必要がないところが素晴らしいです。
なお、赤外線リモコン機能を追加した後も土台となるプログラムは配布されていたものを使っています。
そのため著作権関係が怪しくなると思い、今回の記事にプログラム全体を載せることはしません。
使い方もサポートページに詳細が載っているのでそちらをご覧ください。

このキットははんだ付けが必要なのですが、ここでミスりまくりました。

1. 裏表を間違える→それだけならはんだ付けをし直せばいいじゃないかと思うところですが、除去も失敗しまくったことで結局ピンソケットを壊して外しました
1. 代わりに買ってきたピンソケットが長すぎて入らない→結局秋葉原まで行って代わりのピンソケットを買ったのですが、長さを確認しなかったため、ケースに入らないことに気が付きました。結局ピンソケットは使わず、基板同士をピンソケットで繋ぐ荒業を使いました(なので2度と外せなってます…)

なんとかキットを組み立てて、測定することに成功しました。(なお、ここで飽きてしまい2か月程度寝かせることになります)

#第一章 赤外線リモコン機能の追加
早速話が逸れますが、eRemote5というスマート家電化デバイスを買いました。これでスマートフォンから家電を操れるようになりました。
めでたしめでたし…で終わればよかったのですが、照明のON/OFFがめんどくさいことに気づきました。

一番簡単なON/OFFの操作は壁掛けの物理スイッチを使うことです。ですがこれを使ってしまうと主電源が切れてしまうためリモコン操作が出来なくなります。
そのため、主電源を切らずに簡単にON/OFF操作をするための機能をM5stackに追加することにしました。

### CO2濃度センサーと赤外線送受信ユニット、共存できない問題
早速赤外線ユニットを購入し、M5stack BasicのGrove端子に繋いでリモコンの信号を測定してみました。
結果は成功！めでたしめでたし…とはいきません。(なお単体だけなら用例がたくさん出てきますので、説明は省きます)

実はCO2濃度センサーと赤外線ユニットは同じ端子を共有していました。
CO2濃度センサーはBottomモジュールのピン端子を経由して接続されています(21,22番端子とGND・5V端子を使用)。
一方、赤外線ユニットはPortAのGrove端子に接続されています。実はこのGrove端子はI2C用なので繋がっているピンは同じです。

CO2濃度センサーはI2Cで通信している一方、赤外線ユニットはGPIOなので共存が出来ないことに気づきました。
Grove端子をGPIOないしシリアル通信(PortCの役割)だけで使うのであればI2Cを無効化すればいいのですが、どちらも使いたいのでこの方法は使えません。

そのため、Plusモジュールを追加購入、Portを増設するに至りました。
PlusモジュールのPortB(GPIO端子)は36,26番端子を使っているのでこれで分けることが出来ました。(なおPortCは16,17番端子のようです)
これで両機能を使うことが可能になりました。

### いらない電池　ありすぎ問題
実は赤外線ユニットを買うついでに電池モジュールも買っていました。
元々M5stack Basicを買うと付いてくるBottomモジュールにも110mAhのLi-ionバッテリーが付いています。
ただこの容量だとすぐに尽きるだろうと思い、700mAhのバッテリーが付いている電池モジュールを買いました。

更にPlusモジュールも買ったので、500mAhのバッテリーも追加されてしまいました。
しかしながら、Li-ionバッテリーを並列接続すると発火したりするリスクがあるため、700mAhのバッテリーのみを残し、他のバッテリーは無効化(ピンを外したり、はんだ付けされていた配線を外しました)しました。

ですがWiFi機能を使うと結構な電流を消費するので結局12時間も持たないことがわかりました。そのため、電池運用は諦め、USB給電で使うことにし、電池モジュールは全て外しました。
(なお電池運用を想定して際に、M5stackの電源を落としていても過放電する可能性を考慮し、物理的な電源スイッチモジュールを買いました)

### 赤外線信号が届かない問題
当初は赤外線送受信モジュールは信号の解析だけに使って、実運用ではPlusモジュールについている赤外線LEDを使う予定でした。
ですが信号が弱すぎて照明側が受信できませんでした。(送受信モジュールなら50cm~1mぐらい離れてもいけますが、Plusモジュールだと10~30cmぐらい近づけないと反応しませんでした)
見た目のごちゃごちゃ感が増えてしまいますが、仕方がないので送受信モジュールを実運用でも使うことにしました。

# 第二章　機能を両立させるための試行錯誤
CO2濃度の測定と画面への表示、そして赤外線リモコン機能を両立させるためのプログラムを書く日々が続きました。
なおCO2濃度を1回測定するだけで若干時間が掛かります。そのため割り込みをさせないと赤外線リモコン機能を使うためのボタンが上手いこと反応してくれません(loop関数内でボタン操作を検知させると連打したりタイミングよく押さないと反応しません)。

割り込みをさせるためにマルチスレッド機能を使ってみたりしましたが、うまくいきませんでした。
結局attachInterrupt関数を使ってGPIO割り込みをさせる方法に落ち着きました。

### 5stack BasicのAボタン　WiFi機能をONにすると使えない問題
GPIO割り込みをさせることにしましたが、Aボタン(39番端子)を使おうとするとなぜか勝手に押されたり再起動を繰り返すようになりました。(なおattachInterruptではなくM5.btnで押した判定をしようとすると検知してくれません)

[こちら](https://github.com/m5stack/M5Stack/issues/52)によるとWiFi機能を使っているとAボタンが使えなくなることが書いてありました。
そこに書いてあることを一通り試してみたり、ファームウェアを書き換えたりしましたがどれも効果はありません。ですがABCボタン全てを使わないといけないので困り果てました。

このことをTwitterに書いてみたら、なんと助け船を出してくれる方が現れました！！！！！(マジ感謝です)

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">あとはM5Stackに関してはTwitterを検索するとお宝情報がいっぱいですよ(&#39;ω&#39;)<a href="https://t.co/Asg617C4lc">https://t.co/Asg617C4lc</a></p>&mdash; 紅樹　タカオ (@mongonta555) <a href="https://twitter.com/mongonta555/status/1412066670743490562?ref_src=twsrc%5Etfw">July 5, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

結局ADCを常時ONにするように設定すればAボタンも使えるようになりました。(2度目のマジ感謝)
(自力ではこのツイートに辿り着けなかったので、検索力が試されてますね)

# 最終章　なんとか完成した
結局追加したプログラムが汚かったり、著作権関係が怪しいのでソースコードは1行も載せませんでした。(なので全然参考にならない記事になってしまいました)

実はON/OFFボタンを押したあとの挙動がおかしかったりするんですが、使う上での影響はないので一応仮完成とします。
これがゴールというわけではなく、10分後ぐらいのCO2濃度を予測させる機能をスマホに持たせたいですね。(Tensorflow LiteとかTensorflow jsを使えばいけそう？)

最後に実物を載せて終わりにします。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">挙動が完璧ではないですが、一応仮完成ということで <a href="https://twitter.com/hashtag/M5Stack?src=hash&amp;ref_src=twsrc%5Etfw">#M5Stack</a> <a href="https://t.co/7IoOnXYBCh">pic.twitter.com/7IoOnXYBCh</a></p>&mdash; 木魚 (@maccha_tech) <a href="https://twitter.com/maccha_tech/status/1412359726247997440?ref_src=twsrc%5Etfw">July 6, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>