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


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

* [M5StackでセンサーデーターをAmbientに送る (Arduino編)](https://ambidata.io/samples/m5stack/m5stack-arduino/)

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


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

M5StackのMicroPython開発環境には次の二つがあります。

* M5Cloud: クラウドでソースコードを管理する開発環境
* オフライン環境: ローカルのPCでソースを管理する環境

[公式サイト](https://github.com/m5stack/M5Cloud)の説明に沿って環境を設定していくとM5Cloud環境になりますが、M5Cloudは現時点(2018年3月16日)ではβ版で、一度つけたプロジェクト名が変更できないなど、まだ荒削りなところがあります。また、ソースコードのバージョン管理機能がないので、今回はローカル開発環境を使います。

## USBドライバーのインストール

[SiLabs CP2104 Driver](https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers)をダウンロードしてインストールします。ここはArduino IDEで使う場合と共通です。

## esptoolのインストール

過去にesptoolをインストールしていなければ、次のようにしてesptoolをインストールします。

```bash
$ sudo pip install esptool
```

以前にインストールしていれば、次のようにして更新します。

```bash
$ sudo pip install -U esptool
```

## MicroPythonファームウェアのダウンロード

[M5Stack用のMicroPythonファームウェアのダウンロードページ](https://github.com/m5stack/M5Cloud/tree/master/firmwares)でファームウェアをダウンロードします。この時、M5Cloud用とオフライン用があるので、オフライン用をクリックし、最新のファームウェアを選択します。

![MicroPythonファームウェア](https://ambidata.io/wp/wp-content/uploads/2018/03/upythonfirm-768x493.jpg)

## ファームウェアをM5Stackに書き込む

M5StackをUSBケーブルでPCに接続し、esptoolを使い、まずerase_flashコマンドでフラッシュを消し、次にwrite_flashコマンドでファームウェアを書き込みます。

```bash
$ esptool.py --chip esp32 --port /dev/tty.SLAB_USBtoUART erase_flash

$ esptool.py --chip esp32 --port /dev/tty.SLAB_USBtoUART write_flash --flash_mode dio -z 0x1000 m5stack-20180228-v0.3.4.bin 
```

## Wi-Fiの設定

ファームウェアを書き込むと、M5Stackの画面に次のようなメッセージが表示されます。

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

M5StackがWi-Fiアクセスポイントになっているので、画面に表示されたssidにPCやスマートフォンで接続します。パスワードは設定されていません。ブラウザーで192.168.4.1にアクセスすると、次のような設定画面が表示されます。

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

お使いのWi-FiルーターのSSIDとPasswordを入力してConfigureをクリックすると、M5StackのWi-Fi環境が設定され、Wi-Fiに接続されます。

## M5Stackの動作確認

PCからCoolTermなどの通信プログラム、あるいはcuコマンドなどでM5Stackにつなぎ、リターンキーを押すと、次のようにMicroPythonのプロンプトが表示されます。MicroPythonの文を入力すると、実行されます。ちなみに、cuコマンドは「~.(チルダ ピリオド)」で切断できます。

```bash
$ sudo cu -s 115200 -l /dev/tty.SLAB_USBtoUART 
Connected.

>>> print('hello world')
hello world
>>> 
>>> from m5stack import lcd     # lcdモジュールをインポート
>>> lcd.clear()    # lcdをクリア
>>> lcd.print('hello')    # lcdにhelloと出力される

>>> ~.

Disconnected.
```

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

## M5StackにBME280をつなぐ

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

Arduino編と同様にM5Stackに温湿度・気圧センサーBME280をつないでみます。詳細は「[M5Stack(Arduino編)](https://ambidata.io/samples/m5stack/m5stack-arduino/)」をご覧ください。

BME280を接続したら、M5StackをUSBケーブルでPCに接続し、通信プログラムを起動します。次のプログラムを入力すると、BME280のI2Cアドレスを確認できます。センサーの動作が簡単に確認できるところは対話モードは非常に便利です。

```bash
>>> from machine import I2C, Pin    # I2CモジュールとPinモジュールをインポート
>>> i2c = I2C(sda=Pin(21), scl=Pin(22))    # I2Cを初期化
>>> print('0x%x' % i2c.scan()[0])    # BME280のI2Cアドレスを確認する
0x76
>>> 
```

## BME280ライブラリーをM5Stackに転送する

M5StackからBME280をアクセスするプログラムはGithubに置きました。
* [ambient-python-lib](https://github.com/AmbientDataInc/ambient-python-lib)

[このページ](https://github.com/AmbientDataInc/ambient-python-lib)右上の「Clone or download」をクリックし、「Download ZIP」をクリックして、ZIP形式のファイルをダウンロードし、適当なディレクトリーで展開します。

BME280のライブラリーはGithubに公開されているESP8266用MicroPythonライブラリ「[catdog2/mpy_bme280_esp8266](https://github.com/catdog2/mpy_bme280_esp8266)」を使いました。

PC上のファイルをM5Stackに転送するのはampyというコマンドが便利です。ampyコマンドのインストールと使い方は「[ampy: MicroPythonマイコンとPCとのファイル転送ツール](https://ambidata.io/blog/2018/03/15/ampy/)」をご覧ください。

```bash
$ export AMPY_PORT=/dev/tty.SLAB_USBtoUART
$ ampy put examples/M5_BME280/bme280.py
$ ampy ls /flash
boot.py
config.json
bme280.py
```

## M5StackからBME280をアクセスする

PCからM5Stackに接続し、以下のMicroPythonプログラムを入力すると、BME280にアクセスして温度、湿度、気圧を取得し、表示するのが確認できます。

```bash
>>> import bme280
>>> from machine import I2C, Pin
>>> i2c = I2C(scl=Pin(22), sda=Pin(21))
>>> bme = bme280.BME280(i2c=i2c)
>>> print(bme.values)
('21.57C', '1017.90hPa', '40.41%')
```

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

センサーデーターをAmbientに送信するMicroPythonライブラリーはESP8266用のものと同じです。BME280のデーターをAmbientに送信するプログラムは次のようになります。

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

これらのプログラムも先程Githubからダウンロードしてきたものに含まれています。main.pyのAmbientオブジェクトの初期化にご自分のチャネルIDとライトキーを設定し、ampyでM5Stackに転送します。

```bash
$ ampy put ambient.py
$ ampy put examples/M5_BME280/main.py
$ ampy ls /flash
boot.py
config.json
ambient.py
main.py
bme280.py
```

これでM5Stackに次のようにファイルが置かれます。

```bash:
/flash
+---boot.py
    config.json
    ambient.py
    main.py
    bme280.py
```

/flashの下にmain.pyというファイルがあると、M5Stackがリセットされた時、そのプログラムが実行されます。

M5Stackをリセットして、Ambientサイトで設定したIDのチャネルページを見ると、次のように温度、湿度、気圧データーが送信されているのが確認できます。

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


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

## M5StackにBME680をつなぐ

温湿度・気圧に加えて、空気品質を測定できるBME680というセンサーがあります。これもM5Stackにつなげてみます。接続の詳細は「[M5Stack(Arduino編)](https://ambidata.io/samples/m5stack/m5stack-arduino/)」をご覧ください。

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

## M5StackからBME680をアクセスする

BME680をアクセスするPythonライブラリーモジュールはBME680モジュールを提供してい[Pimoroni社のもの](https://github.com/pimoroni/bme680)を使いました。このライブラリーを[MicroPythonで動かすためのアダプター](https://github.com/gkluoe/bme680)も使います。
ファイルはBME280をアクセスするプログラムと一緒にGithubに公開してあり、すでにPC上にダウンロードされています。

次のようにM5Stackの/flashの下にbme680というディレクトリーを作り、必要なファイルを転送します。

BME280のアクセスから続いて操作している場合は、ここでM5Stackをリセットしてください。

```bash
$ ampy mkdir bme680
$ ampy put examples/M5_BME680/bme680/__init__.py /flash/bme680/__init__.py
$ ampy put examples/M5_BME680/bme680/constants.py /flash/bme680/constants.py
$ ampy put examples/M5_BME680/bme680/i2c.py /flash/bme680/i2c.py
$ ampy put examples/M5_BME680/main.py
```

これでM5Stackのファイルシステムは次のようになります。

```bash:
/flash
+---boot.py
    config.json
    ambient.py
    bme280.py
    main.py
    bme680
    +---__init__.py
        constants.py
        i2c.py
```

M5Stackをリセットすると、今転送したmain.pyが実行され、BME680で取得した温度、湿度、気圧がAmbientに送信されます。


# まとめ

M5Stackは5.4cm x 5.4cmのコンパクトなケースにESP32、電池、320 x 240 TFTカラーディスプレイなどが搭載されたIoT端末です。拡張モジュールを積み重ねることで機能を拡張していけます。
MicroPythonで使うと、対話モードでセンサーなどの動作を確認しながらプログラムを作っていけるので、プロトタイプ段階で特に便利です。