M5Stack Nodeモジュールの各機能を使う

M5Stack に  音声入出力(WM8978)、赤外線リモコン入出力、LED(NeoPixel)、温湿度センサ(DHT12)を一度に追加できる、[M5Stack Smart Node](https://ja.aliexpress.com/store/product/M5Stack-New-NODE-Samrt-Speaker-WM8978-Audio-Development-Board-I2S-Module-with-DHT12-Sensor-MIC-IR/3226069_32949773234.html) の利用メモです。2018年12月現在では1人1個限定販売です。

- [公式ドキュメント](https://github.com/m5stack/Bases-Node) (GitHub)
- [購入](https://ja.aliexpress.com/store/product/M5Stack-New-NODE-Samrt-Speaker-WM8978-Audio-Development-Board-I2S-Module-with-DHT12-Sensor-MIC-IR/3226069_32949773234.html) (AliExpress)

## 温湿度センサ (DHT12)
こちらは定番のセンサとなっています。I2C で接続します (アドレス: 0x5c)。公式のサンプルコードがそのまま動作します(Arduino IDE: ファイル > スケッチ例 > M5Stack > Modules > DHT12)。
動作させてみると、おそらく温度が高め、湿度が低めに表示されると思います。これはセンサが本体に内蔵されており、本体の発熱等の影響を受けているものと推測されます。より正確に温湿度を取得したい場合には、LCDオフ、全体をスリープし、必要なときのみ測定を行うといった工夫が必要となります。

## LED
裏面に12個の NeoPixel LED (SK6812) が搭載されており、M5Stack Fire と同じく GPIO15 に接続されています。M5Stack Fire は LED が 10個なので、Fire 向けのコードを若干修正すれば動作させることができます。あらかじめ、[AdafruitのNeoPixelライブラリ](https://github.com/adafruit/Adafruit_NeoPixel)を追加しておいてください。なお、LEDにデータを送信する初回時は想定外の色が表示されることがあります。

- [サンプルコード](https://gist.github.com/ksasao/1c6b4ef131456a3cfc6b9d115e2543da)

![DvKbZvgV4AIeoNn.jpg](https://qiita-image-store.s3.amazonaws.com/0/43450/94b1dd25-0cc1-fce1-c759-414c32db7724.jpeg)

### 参考
- [M5StackFire_NeoPixelTest]( https://github.com/m5stack/M5Stack/blob/master/examples/Fire/M5StackFire_NeoPixelTest/M5StackFire_NeoPixelTest.ino
) (M5Stack)
- [Adafruit NeoPixel Library](https://github.com/adafruit/Adafruit_NeoPixel) (Adafruit)

## 赤外線送受信
赤外線受信モジュールが GPIO35、赤外線送信回路が GPIO12 に接続されています。RMT (Remote Control) module driver が Espressif から提供されていますので ```#include "driver/rmt.h"``` で利用できます。

- [サンプルコード](https://gist.github.com/ksasao/358ae9432322cd496d50ace9d69a7e85)

動作確認したところ、電灯やテレビのリモコンなど信号が短いタイプではうまくいくものの、エアコンなど長い信号では ```RMT RX BUFFER FULL``` エラーが出てしまいうまく動作しませんでした。なお、メモリが足りなくなるまでバッファを広げてみましたがNGでした。エアコン対応のためには、このドライバーを利用せず、[スイッチサイエンスさんの記事](http://mag.switch-science.com/2016/08/22/espr-ir-aircon/)などを参考に自前で読み書きしたほうが良いかもしれません。

また、[こちらの記事](http://watako-lab.com/2018/12/02/m5stack_irremocon/)でも指摘されているように、赤外線出力がかなり弱いため、赤外線操作対象の近くに配置する必要があります。

### 参考
- [RMT](https://docs.espressif.com/projects/esp-idf/en/latest/api-reference/peripherals/rmt.html) (ESP-IDF Programming Guide)
- [ESP32で赤外線学習リモコンを作る](https://qiita.com/td2sk/items/4c0ef83bcc7e74e5e8d5#%E9%85%8D%E7%B7%9A) (Qiita/@td2sk)
- [M5StackのNodeモジュールで赤外線リモコン](http://watako-lab.com/2018/12/02/m5stack_irremocon/) (Watako-Lab.)
- [ESPr IR 赤外線リモコンでエアコンの電源を操作してみました。](http://mag.switch-science.com/2016/08/22/espr-ir-aircon/) (スイッチサイエンス)

## 音声録音再生
Node モジュールには、マイクが2個、スピーカーが1個、イヤホンジャックが1個搭載されており、WM8978 という音声入出力用ドライバに接続されています。WM8978 は I2S 経由で音声信号をやり取りし、 I2C で詳細な動作設定(ボリューム、イコライザー、フィルタなど)を行います。これ単体では、MP3 や WAV のビットストリームを直接再生することはできませんが、[Espressif Audio Development Framework](https://github.com/espressif/esp-adf) を介して操作ができそうです(確認中)。


- サンプルコード (鋭意制作中)

### 参考
- [WM8978 スピーカ・ドライバ内蔵、98/95 dB ステレオ・コーデック](https://www.jp.cirrus.com/products/wm8978/) (Cirrus)
- [Espressif Audio Development Framework](https://github.com/espressif/esp-adf) (Espressif)


## まとめ
M5Stack Node モジュールはうまく使えばスマートスピーカーとしても使用できそうなモジュールとなっています。[価格も安い($19)](https://ja.aliexpress.com/store/product/M5Stack-New-NODE-Samrt-Speaker-WM8978-Audio-Development-Board-I2S-Module-with-DHT12-Sensor-MIC-IR/3226069_32949773234.html) ので、数量制限がなくなったらいろいろなところで使っていきたいですね。