ぶていのログでぶログ

思い出したが吉日

M5StackでMicroPythonを使うときのTips

この記事はM5Stack Advent Calendar 201820日目の記事です。


先日SabaBoxというM5Stack + MicroPythonを使ったプロダクトを作ったことを紹介しました。 今日は、SabaBox作成時に気がついたことなどを書いていきたいと思います。

ファームウェア

M5StackでMicroPythonを使うには専用のファームウェアを書き込む必要があります。 MicroPythonファームウェアは以下のリポジトリに存在します。

github.com

MicroPythonファームウェアにはオンライン版とオフライン版があります。 オンライン版は、M5CloudというM5Stack社が運営するクラウドIDEを使ってM5Stackを開発することができるバージョンです。 オフライン版は、USBを接続してシリアル通信で開発するバージョンです。 オンライン版のファームウェアはファイル名のプレフィックスm5cloud であり、オフライン版はm5stackとなっています。 自分が使いたいバージョンを選んでダウンロードするとよいです。

この2つ以外にpsram版というのも存在します。 これは、M5Stack FireなどのRAMを拡張した機種を使うときに使うと良いようです。

書き込み

MacLinuxファームウェアの書き込みを行なう場合には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のLCDhello 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にのっています。

github.com

これはM5Stack MicroPythonがBASEにしているファームウェアで、このファームウェアで使えるAPI群になります。 Curlやスレッドあたりは興味深いで機能です。

スレッド使用時の注意

スレッドは大変便利なのですが、使用方法を間違えるとCPUパニックを起こします。。 例えば、スレッドの中からファイルに書き込みを行なうと確実にCPUパニックを起こします。。

CPUパニックを起こすとリセットがかかります。

無限ループになった時の回避方法

CPUパニックが起きるコードをアップロードしてしまい無限ループに陥ってしまった場合は、起動時にボタン1(左のボタン)を押しているとセーフモードになります。

セーフモードではmain.pyが自動実行されないので、main.pyを安全なものに書き換えて再起動すると回避できます。

おわりに

MicroPythonファームウェアを使う時のTipsをまとめてみました。 MicroPythonを使うとより簡単に作りたいものを作ることができると思います。 MicroPythonはPython3ベースになっているため、非常に書きやすいと私自身感じました。

この記事がM5Stackで開発しようとしている人の助力になればと思います。