M5StackはEspressif社のマイコンESP32を搭載したコンパクトなIoT端末です。Arduino IDE、MicroPythonとEspressif社のESP-IDFでプログラミングできます。ここではM5Stackと温湿度・気圧センサーBME280、空気品質センサーBME680をMicroPythonで制御してセンサーデーターを読み、Ambientに送る例を紹介します。M5Stackの概要とArduinoで使う例は以下のページをご覧ください。
M5Stackを使うためのMicroPythonの環境設定
M5StackのMicroPython開発環境には次の二つがあります。
- M5Cloud: クラウドでソースコードを管理する開発環境
- オフライン環境: ローカルのPCでソースを管理する環境
公式サイトの説明に沿って環境を設定していくとM5Cloud環境になりますが、M5Cloudは現時点(2018年3月16日)ではβ版で、一度つけたプロジェクト名が変更できないなど、まだ荒削りなところがあります。また、ソースコードのバージョン管理機能がないので、今回はローカル開発環境を使います。
USBドライバーのインストール
[SiLabs CP2104 Driverをダウンロードしてインストールします。ここはArduino IDEで使う場合と共通です。
esptoolのインストール
過去にesptoolをインストールしていなければ、次のようにしてesptoolをインストールします。
$ sudo pip install esptool
以前にインストールしていれば、次のようにして更新します。
$ sudo pip install -U esptool
MicroPythonファームウェアのダウンロード
M5Stack用のMicroPythonファームウェアのダウンロードページでファームウェアをダウンロードします。この時、M5Cloud用とオフライン用があるので、オフライン用をクリックし、最新のファームウェアを選択します。
ファームウェアをM5Stackに書き込む
M5StackをUSBケーブルでPCに接続し、esptoolを使い、まずerase_flashコマンドでフラッシュを消し、次にwrite_flashコマンドでファームウェアを書き込みます。
$ 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の画面に次のようなメッセージが表示されます。
M5StackがWi-Fiアクセスポイントになっているので、画面に表示されたssidにPCやスマートフォンで接続します。パスワードは設定されていません。ブラウザーで192.168.4.1にアクセスすると、次のような設定画面が表示されます。
お使いのWi-FiルーターのSSIDとPasswordを入力してConfigureをクリックすると、M5StackのWi-Fi環境が設定され、Wi-Fiに接続されます。
M5Stackの動作確認
PCからCoolTermなどの通信プログラム、あるいはcuコマンドなどでM5Stackにつなぎ、リターンキーを押すと、次のようにMicroPythonのプロンプトが表示されます。MicroPythonの文を入力すると、実行されます。ちなみに、cuコマンドは「~.(チルダ ピリオド)」で切断できます。
$ 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をつなぐ
Arduino編と同様にM5Stackに温湿度・気圧センサーBME280をつないでみます。詳細は「M5StackでセンサーデーターをAmbientに送る(Arduino編)」をご覧ください。
BME280を接続したら、M5StackをUSBケーブルでPCに接続し、通信プログラムを起動します。次のプログラムを入力すると、BME280のI2Cアドレスを確認できます。センサーの動作が簡単に確認できるところは対話モードは非常に便利です。
>>> 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に置きました。
このページ右上の「Clone or download」をクリックし、「Download ZIP」をクリックして、ZIP形式のファイルをダウンロードし、適当なディレクトリーで展開します。
BME280のライブラリーはGithubに公開されているESP8266用MicroPythonライブラリー「catdog2/mpy_bme280_esp8266」を使いました。
PC上のファイルをM5Stackに転送するのはampyというコマンドが便利です。ampyコマンドのインストールと使い方は「ampy: MicroPythonマイコンとPCとのファイル転送ツール」をご覧ください。
$ 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にアクセスして温度、湿度、気圧を取得し、表示するのが確認できます。
>>> 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に送信する
センサーデーターをAmbientに送信するMicroPythonライブラリーはESP8266用のものと同じです。BME280のデーターをAmbientに送信するプログラムは次のようになります。
これらのプログラムも先程Githubからダウンロードしてきたものに含まれています。main.pyのAmbientオブジェクトの初期化にご自分のチャネルIDとライトキーを設定し、ampyでM5Stackに転送します。
$ 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に次のようにファイルが置かれます。
/flash +---boot.py config.json ambient.py main.py bme280.py
/flashの下にmain.pyというファイルがあると、M5Stackがリセットされた時、そのプログラムが実行されます。
M5Stackをリセットして、Ambientサイトで設定したIDのチャネルページを見ると、次のように温度、湿度、気圧データーが送信されているのが確認できます。
温湿度・気圧・空気品質センサーBME680を使う
M5StackにBME680をつなぐ
温湿度・気圧に加えて、空気品質を測定できるBME680というセンサーがあります。これもM5Stackにつなげてみます。接続の詳細は「M5StackでセンサーデーターをAmbientに送る(Arduino編)」をご覧ください。
M5StackからBME680をアクセスする
BME680をアクセスするPythonライブラリーモジュールはBME680モジュールを提供しているPimoroni社のものを使いました。このライブラリーをMicroPythonで動かすためのアダプターも使います。
ファイルはBME280をアクセスするプログラムと一緒にGithubに公開してあり、すでにPC上にダウンロードされています。
次のようにM5Stackの/flashの下にbme680というディレクトリーを作り、必要なファイルを転送します。
BME280のアクセスから続いて操作している場合は、ここで一旦M5Stackをリセットしてください。
$ 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のファイルシステムは次のようになります。
/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で使うと、対話モードでセンサーなどの動作を確認しながらプログラムを作っていけるので、プロトタイプ段階で特に便利です。