この記事は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で開発しようとしている人の助力になればと思います。