M5StackでセンサーデーターをAmbientに送る (Arduino編)


M5StackはEspressif社のマイコンESP32を搭載したコンパクトなIoT端末です。Arduino IDE、MicroPythonとEspressif社のESP-IDFでプログラミングできます。ここではM5Stackと温湿度・気圧センサーBME280と空気品質センサーBME680をArduinoで制御してセンサーデーターを読み、[IoTデーター可視化サービスAmbient](https://ambidata.io)に送る例を紹介します。MicroPythonで使う例は以下のページをご覧ください(近日公開)。

* M5StackでセンサーデーターをAmbientに送る (MicroPython編)

![M5Stack_BME280](https://ambidata.io/wp/wp-content/uploads/2018/03/M5Stack_BME280.jpg)


# M5Stack

M5StackはESP32マイコン、電池、320 x 240 TFTカラーディスプレイ、スピーカーなどを搭載したIoT端末で、Wi-FiとBluetoothで通信できます。5.4cm x 5.4cmのコンパクトなケースに入っていて、拡張モジュールを積み重ねることで機能を追加できます。現時点ではGPSモジュールやユニバーサル基板モジュールなどの拡張モジュールがあります。

詳細は次のサイトをご覧ください。

* [スイッチサイエンスの販売ページ](https://www.switch-science.com/catalog/3647/)
* [M5Stackであそぼう](http://mag.switch-science.com/2018/02/28/getting-started-with-m5stack/)
* [公式サイト(英語)](http://www.m5stack.com/)

# M5Stackを使うためのArduinoの環境設定

公式サイトに[Windows/Mac/Linuxでのインストール方法](http://www.m5stack.com/assets/docs/index.html#getting-started)が解説されています。ここでは簡単にMacでのインストールの流れを紹介します。

* USBドライバーのインストール: [SiLabs CP2104 Driver](https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers)をダウンロードしてインストールします。

* ESP32 Arduino Coreのインストール: [公式サイト](http://www.m5stack.com/assets/docs/index.html#getting-started)の説明に従ってESP32 Arduino Coreをインストールします。

* M5Stackライブラリーのダウンロード: Arduino IDEのライブラリーマネージャーを使うか、Gitを使う方法があります。どちらかの方法でM5Stackライブラリーをダウンロードします。

以上でArduinoの環境設定は終わりです。

# M5Stackの動作確認

Arduino IDEを立ち上げて、

* M5StackをUSBケーブルでPCに接続
* Arduino IDE メニューの「ツール」→「ボード」で「M5Stack-Core-ESP32」を選択

![selectBoard](https://ambidata.io/wp/wp-content/uploads/2018/03/boardselect-768x705.jpg)

* 「ツール」→「シリアルポート」で「/dev/cu.SLAB_USBtoUART」を選択
* 「ファイル」→「スケッチ例」→「M5Stack」→「Basics」→「Hello」を選択
* ビルドしてマイコンボードに書き込む

プログラムがダウンロードされ、M5Stackの画面が消え、hello worldと出力されれば、環境設定はokです。

# 温湿度・気圧センサーBME280を使う

![M5Stack_back](https://ambidata.io/wp/wp-content/uploads/2018/03/M5Stack_back.jpg)

M5Stackの底に近い部分にはBUS PORTとI/O PORTと呼ばれるスロットがあります。BUS PORT、I/O PORTとも一方がピン、他方がソケットで、対向するピンとソケットは同じ信号がでています。各ピン/ソケットの意味はシールに書かれています。

その中にI2C通信で使うSDA、SCLと3.3V、GNDがあるので、BME280モジュールをそこにつなぎます。SDA、SCLは対向する側ではそれぞれ21、22と書かれていますが、同じ信号です。この他にスイッチサイエンスのBME280モジュールにはSDOとCSBというピンがあり、それぞれGND、3.3Vにつなぎます。

|M5Stack | BME280モジュール |
|:------:|:--------------:|
|GND     | SDO |
| SCL(22) | SCK |
| SDA(21) | SDI |
| 3V3    | CSB |
| GND    | GND |
| 3V3    | Vcore |
| ー     | Vio |

必要な部品をまとめました。M5StackとBME280モジュールをつなぐケーブルは「M5Stack Basic」に含まれています。

| 部品 | 個数 |
|:--------------|:---|
| [M5Stack Basic](https://www.switch-science.com/catalog/3647/) | 1個 |
| [BME280搭載　温湿度・気圧センサモジュール](https://www.switch-science.com/catalog/2236/) | 1個 |
| [ピンヘッダL型1×40](https://www.switch-science.com/catalog/2257/) | 1個 |

# プログラム

## Ambientライブラリーのインストール

AmbientライブラリーはESP8266/ESP32用のものを使います。

* [GithubのAmbientライブラリーページ](https://github.com/AmbientDataInc/Ambient_ESP8266_lib)をアクセスする
* ページ右上の「Clone or download」の「Download ZIP」をクリックし、ZIP型式のライブラリーをダウンロードする

![dl_from_github](https://ambidata.io/wp/wp-content/uploads/2018/03/dl_from_github-768x490.jpg)

* Arduino IDEを立ち上げ、「スケッチ」→「ライブラリをインクルード」→「.ZIP形式のライブラリをインストール」を選択し、ダウンロードしたファイルを選択する

![lib_install.jpg](https://ambidata.io/wp/wp-content/uploads/2018/03/lib_install-768x301.jpg)

「スケッチ」→「ライブラリをインクルード」を選択し「Ambient ESP8266 lib」が表示されればライブラリーは正しくインストールされています。


## BME280をアクセスする

BME280をアクセスし、温度、湿度、気圧を測定してM5StackのLCDに出力してみます。
プログラムはArduino IDEを立ち上げ、「ファイル」→「スケッチ例」→「Ambient ESP8266 lib」→「M5Stack」→「BME280_test」を選択するとロードできます。

<script src="https://gist.github.com/TakehikoShimojima/8a098e6a160475c7781c4c1e3f095ff6.js"></script>

BME280ライブラリーはESP8266用のBME280ライブラリーがそのまま使えます。BME280をI2Cで使う時はSDAとSCLをプルアップする必要があります。スイッチサイエンスのESP8266モジュールにはプルアップ抵抗が載っていませんが、プログラムでプルアップするので大丈夫です。

```cpp
    pinMode(21, INPUT_PULLUP);
    pinMode(22, INPUT_PULLUP);
```

## BME280のデーターを[Ambient](https://ambidata.io)に送る

次にBME280のデーターをAmbientに送信します。Ambientにデーターを送信するライブラリーはESP8266/ESP32共通で、M5Stackでも同じものを使います。Ambientに関係する部分だけを抜き出すと、setup()関数でAmbientの初期化をおこない、loop()関数でセンサーの値を読んで、その値を.set()でパケットにセットし、.send()でAmbientに送信しています。

<script src="https://gist.github.com/TakehikoShimojima/ddc5650a39e61e626592dfbacfc6df4e.js"></script>

プログラムはArduino IDEを立ち上げ、「ファイル」→「スケッチ例」→「Ambient ESP8266 lib」→「M5Stack」→「Ambient_BME280」を選択するとロードできます。

プログラムをビルドし、M5Stackに書き込むと、BME280で温度、湿度、気圧を測定し、データーがAmbientに送信されます。Ambientのチャネルページを見ると、次のようにデーターが確認できます。

![スクショ](https://ambidata.io/wp/wp-content/uploads/2018/03/scsho1-768x490.jpg)

# 温湿度・気圧・空気品質センサーBME680を使う

温湿度・気圧に加えて、空気品質を測定できるBME680というセンサーがあります。これもM5Stackにつなげてみます。BME680センサーチップはI2CとSPIの両方のインターフェースを持っていますが、スイッチサイエンス社が扱っているPimoroni社のモジュールはI2Cインターフェースのみに対応し、5本のピンでアクセスするようになっています。これを次のようにM5Stackに接続します。

| M5Stack | BME680モジュール |
|:-------:|:--------------:|
| 3V3 | 2-6V |
| SDA(21) | SDA |
| SCL(22) | SCL |
| ー      | ー |
| GND     | GND |

信号の並び順がM5StackとPimoroni社のBME680モジュールとで違うので、順番を入れ替える小さな基板を作ってBME680をM5Stackにつなぎました。

![M5Stack_BME680](https://ambidata.io/wp/wp-content/uploads/2018/03/M5Stack_BME680-768x431.jpg)

BME680をアクセスするライブラリーは[Adafruitのもの](https://github.com/adafruit/Adafruit_BME680)を使いました。そのままだとコンパイルエラーになるので、一部修正を加えています。

プログラムはArduino IDEを立ち上げ、「ファイル」→「スケッチ例」→「Ambient ESP8266 lib」→「M5Stack」→「Ambient_BME680」を選択するとロードできます。

<script src="https://gist.github.com/TakehikoShimojima/ee63bb8f220ff1d53f9718c2757e33ff.js"></script>


# まとめ

M5Stackは5.4cm x 5.4cmのコンパクトなケースにESP32、電池、320 x 240 TFTカラーディスプレイなどが搭載されたIoT端末です。拡張モジュールを積み重ねることで機能を拡張していけます。ArduinoとMicroPythonでプログラミングできることも魅力です。簡単な実験から本番での使用まで幅広く使えるIoT端末です。