この記事はM5Stack Advent Calendar 2018の20日目の記事です。
先日SabaBoxというM5Stack + MicroPythonを使ったプロダクトを作ったことを紹介しました。 今日は、SabaBox作成時に気がついたことなどを書いていきたいと思います。
ファームウェア
M5StackでMicroPythonを使うには専用のファームウェアを書き込む必要があります。 MicroPythonファームウェアは以下のリポジトリに存在します。
MicroPythonファームウェアにはオンライン版とオフライン版があります。
オンライン版は、M5CloudというM5Stack社が運営するクラウドIDEを使ってM5Stackを開発することができるバージョンです。
オフライン版は、USBを接続してシリアル通信で開発するバージョンです。
オンライン版のファームウェアはファイル名のプレフィックスが m5cloud であり、オフライン版はm5stackとなっています。
自分が使いたいバージョンを選んでダウンロードするとよいです。
この2つ以外にpsram版というのも存在します。 これは、M5Stack FireなどのRAMを拡張した機種を使うときに使うと良いようです。
書き込み
MacやLinuxでファームウェアの書き込みを行なう場合にはesptoolを使います。 これはPython製のツールであるため、pipでインストールできます。
pip install esptool
esptoolをインストールしたらM5StackをPCに接続します。
接続するとデバイスファイルが追加されると思います。
ここでは /dev/ttyUSB0 が追加されたこととします。
デバイスファイルを確認したらファームウェアを書き込みます。
# フラッシュ esptool.py --chip esp32 --port /dev/ttyUSB0 erase_flash # ファームウェアの書き込み esptool.py --chip esp32 --port /dev/ttyUSB0 write_flash --flash_mode dio -z 0x1000 firmware.bin
パーミッションエラーになる場合は適宜sudoを使うなりしてください。 Linuxの場合、生えてくるデバイスファイルの所有グループがdialoutになるため、ログインユーザをdialoutグループに所属させると良いと思います。
シリアル接続
MicroPythonファームウェアの書き込みが完了するとリセットがかかります。 起動後に、M5Stackデバイスにシリアル接続を行なうとMicroyPythonインタープリタ画面に接続できます。 シリアル接続を行なえるコマンドはいくつかありますが、私はGNU screenを使用しています。 GNU screenでシリアル接続を行なうには以下のようにコマンドを実行します。
screen /dev/ttyUSB0 115200
コマンドを実行後、Enterキーを押すと >>> と表示されると思います。
この画面はインタープリタになっているので直接Pythonのコードが実行できます。
以下のように入力するとM5StackのLCDにhello world と表示されると思います。
>>> from m5stack import lcd
>>> lcd.print('hello world!')
シリアル接続から切断するには、GNU screenの場合Ctrl-a -> :quit と入力します(またはCtrl-a -> \)
ソフトリセット
プロンプトを表示した状態で Ctrl-D を押すと、ソフトリセットができます。
何かがおかしくなったときに使います。
>>> (Ctrl-Dを押す)
ESP32: soft reboot
ets Jun 8 2016 00:22:57
rst:0xc (SW_CPU_RESET),boot:0x17 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0018,len:4
load:0x3fff001c,len:4636
load:0x40078000,len:0
load:0x40078000,len:12948
entry 0x4007852c
Internal FS (SPIFFS): Mounted on partition 'internalfs' [size: 2424832; Flash address: 0x1B0000]
----------------
Filesystem size: 2221568 B
Used: 16128 B
Free: 2205440 B
----------------
Device ID:840d8e25c144
FreeRTOS running on BOTH CORES, MicroPython task started on App Core (1).
Reset reason: Soft CPU reset
uPY stack: 19456 bytes
uPY heap: 80000/9984/70016 bytes
MicroPython ESP32_LoBo_v3.2.16 - 2018-05-15 on M5Stack with ESP32
Type "help()" for more information.
エディタモード
プロンプトモードでCtrl-e を押すとエディタモードになり、ファイルに書き込めます。
書き込み先は main.py になります。
エディタモードを終了するにはCtrl-dを入力します。
複数ファイルの書き込み
エディタモードを使えばmain.pyに書き込むことはできますが、複数のファイルを使うことができません。
ampy というツールを使うとファイルを書き込むことができます。
ampyもpythonのツールなのでpipでインストールができます。
パッケージ名がampyではないので注意が必要です。
pip install adafruit-ampy
ampyはシリアル接続を抜けた状態で使用します。 たとえば、ローカルにあるmain.pyをM5Stackにアップロードするには以下のように実行します。
ampy --port /dev/ttyUSB0 put main.py
第3引数を省略すると /flash 配下にアップロードされます。
また、--portでポートを指定してますが AMPY_PORT 環境変数を設定しておけば省略できます。
export AMPY_PORT=/dev/ttyUSB0 ampy put main.py
使用できるAPI
使用できるAPIはリポジトリのREADMEに記載されています。 …が記述が古かったりしてたまに間違っていたりします。 そういう場合は、私はQiitaとかを検索して確認していました。。 ぐぐるとMicroPythonのAPIドキュメントがヒットしますが、M5Stack MicroPythonが使用しているバージョンと乖離があり使えないことが多いです。。
非公開?なAPI
READMEに書いてあるAPIにも使用できるAPIがあります。 例えば、スレッドとかです。 これは以下のWikiにのっています。
これはM5Stack MicroPythonがBASEにしているファームウェアで、このファームウェアで使えるAPI群になります。 Curlやスレッドあたりは興味深いで機能です。
スレッド使用時の注意
スレッドは大変便利なのですが、使用方法を間違えるとCPUパニックを起こします。。 例えば、スレッドの中からファイルに書き込みを行なうと確実にCPUパニックを起こします。。
CPUパニックを起こすとリセットがかかります。
無限ループになった時の回避方法
CPUパニックが起きるコードをアップロードしてしまい無限ループに陥ってしまった場合は、起動時にボタン1(左のボタン)を押しているとセーフモードになります。
セーフモードではmain.pyが自動実行されないので、main.pyを安全なものに書き換えて再起動すると回避できます。
おわりに
MicroPythonファームウェアを使う時のTipsをまとめてみました。 MicroPythonを使うとより簡単に作りたいものを作ることができると思います。 MicroPythonはPython3ベースになっているため、非常に書きやすいと私自身感じました。
この記事がM5Stackで開発しようとしている人の助力になればと思います。
