M5StickCでMicroPython(本家ESP32版+Thonny編)


M5Burner経由で利用できるM5StickC用MicroPythonは、ベースがv1.11と、ちょっと以前のバージョン(リリース時期は2019年5月。現在のMicroPythonの最新リリースは1.13)です。一方、MicroPythonの公式サイトで配布されている汎用のESP32版MicroPythonは最新版であり、M5StickCでも動作しますが、M5StickC固有のハードウェアのドライバは含まれていません。

そこで今回はESP32用MicroPythonにLCD、モーションセンサ、電源管理チップのドライバを導入して使ってみます。また併せて、Python用IDEである「Thonny」をMicroPythonで使ってみます。

まずThonnyをインストールしてください。

Thonny, Python IDE for beginners

次に、ESP32用MicroPythonですが、以下のMicroPython公式ページからダウンロードできます。今回はesp32-idf3-20200902-v1.13.binを使用しました。

MicroPython - Python for microcontrollers
MicroPython is a lean and efficient implementation of the Python 3 programming language that includes a small subset of the Python standard libr...

MicroPythonのM5StickCへの書き込みはThonnyで行えます。

Thonnyのメニューから「Tools」→「Options」を選択して設定ウインドウを開き、「Interpreter」タブで処理系としてMicroPython(ESP32)を選択。さらに、ウインドウ下部の「Open the dialog for(中略)your device」という長いボタンをクリックし、M5StickCのシリアルポートと、ダウンロードしたMicroPythonのbinファイルを指定してMicroPythonをインストールします。

Thonnyの画面はuPyCraftと同様、上がエディタ、下がREPLのウインドウになっています。Thonnyの詳しい使い方は下記の公式Wikiこの記事などを見てください。

REPLから、インストールしたMicroPythonにアクセスしてみます。
汎用のESP32版MicroPythonで使用できるモジュールは以下の通りです。

>>> help('modules')
__main__          gc                uasyncio/stream   upip_utarfile
_boot             inisetup          ubinascii         upysh
_onewire          machine           ubluetooth        urandom
_thread           math              ucollections      ure
_uasyncio         micropython       ucryptolib        urequests
_webrepl          neopixel          uctypes           uselect
apa106            network           uerrno            usocket
btree             ntptime           uhashlib          ussl
builtins          onewire           uhashlib          ustruct
cmath             sys               uheapq            utime
dht               uarray            uio               utimeq
ds18x20           uasyncio/__init__ ujson             uwebsocket
esp               uasyncio/core     umqtt/robust      uzlib
esp32             uasyncio/event    umqtt/simple      webrepl
flashbdev         uasyncio/funcs    uos               webrepl_setup
framebuf          uasyncio/lock     upip              websocket_helper
Plus any modules on the filesystem
>>>

ここに、M5StickC用のライブラリを追加していきます。
今回追加するのは、MicroPythonで書かれたドライバが見つかった
・LCD(ST7735S)
・電源管理(AXP192)※LCDのバックライトも制御しています
・6軸センサ(MPU6886)
です。M5StickCには、このほかリアルタイムクロック(BM8563)やI2S接続のマイクがありますが、MicroPythonのドライバは見つかりませんでした。

まず、以下のファイルをPCにダウンロードします。

MicroPython-ST7735/ST7735.py at master · boochow/MicroPython-ST7735
MicroPython/sysfont.py at master · GuyCarver/MicroPython
M5StickC-uPy/axp192.py at master · karfas/M5StickC-uPy
micropython-mpu6886/mpu6886.py at master · tuupola/micropython-mpu6886

そして、これらのスクリプトをM5StickCにダウンロードします。
スクリプトのダウンロードもThonnyで行えます。
まず、スクリプトをThonnyから開きます。そして、FileメニューからSave As…を選択します。

すると、保存先をPCにするかデバイスをするか選択することができますので、「MicroPython device」を選択します。

最後にファイル名を入力します。これでスクリプトがM5StickC内部に保存されます。

全てのファイルを転送し終えたら、テストの意味も含め、これらのデバイスの初期化スクリプトを作成しておきましょう。特にLCDは解像度等の設定が必須です。

Thonnyで新規ファイルを作成し、以下のスクリプトを貼り付けます。そしてFileメニューからSave Asを選択し、MicroPython deviceにファイル名「main.py」で保存します。このスクリプトは3つのグローバル変数axp、lcd、imuを作成しています。(API仕様はUI.flow用のファームウェアとは異なります。)

最後に、コードをファイルに保存せずに、REPLに貼り付けて実行する例です。

Thonnyでは、MicroPythonのREPLを使用せず、独自のREPLを動作させています。Thonnyと接続中はMicroPythonを常にRAWモード(通常、MicroPythonのREPLからはRAWモードにCTRL-Aで入りCTRL-Bで抜けます)で動作させられており、インタラクティブな部分はThonnyが処理しています。

このThonny REPLでは、MicroPythonの「ペーストモード」(CTRL-Dで入りCTRL-Eで抜ける)はありません。
その代わり、REPLのウインドウに対してコードを単にペーストするだけで実行することができます。

以下のコードをコピーして、ThonnyのREPLウインドウにペーストし、エンターキーを押してみてください。
6軸センサの値がLCDに表示されるはずです。

無限ループになっていますが、止めるのは、Thonnyのウインドウ上のメニュー直下にあるSTOPボタンを押してください。CTRL-Cでは止まりません。

コメント

  1. Ash より:

    質問よろしいでしょうか?ブログ主さんの記事を参考に大学で研究進めている者です。m5stickcの音声認識で義手を動かすといった研究内容なのですが、YESとNOコマンドからstop goコマンドに変えたいのですがGoogle colabで学習したものをTiny g microのファイルに代入したのですがコンパイルは成功したもののm5stickc側が固まってしまいます。他に変えるべきところが分からなくて困ってます。お時間ありましたら返信待っています。

  2. boochow より:

    ご質問ありがとうございます。こちらの記事に関するお話ですね。
    https://blog.boochow.com/article/m5stickc-tflite-micro-speech-2.html

    うーん、すみませんがお役に立てそうにありません。
    私がYes/NoからLeft/Rightに変更した際の変更点が以下ですが、表示回りを別にすれば、特に大きな違いはなかったように思います。

    https://github.com/boochow/TFLite_Micro_MicroSpeech_M5Stack/commit/113c09d66d237dc8cd4aed1ec6774de610efc427

  3. Ash より:

    返信ありがとうございます。YESとnoのファイルのmatrix fusionの値を変える必要とかはないのでしょうか?

  4. Ash より:

    https://oskit-my.sharepoint.com/:f:/g/personal/e1917053_oit_ac_jp1/Enq27hFrtGNDh35hgispyWEBr4An_4LvWG1brdvRA9lqzQ?e=mr1plm

    またお時間あるときで大丈夫なので一度見ていただけないでしょうか?無茶をいって申し訳ございません。

  5. boochow より:

    代わりにデバッグすることはできませんが、シリアルポートにメッセージをprintする文をsetup()やloop()の関数内の随所に適宜追加して、どこで止まっているのか調べてみてはいかがでしょうか。

  6. Ash より:

    なるほど試してみますありがとうございます!

  7. Ash より:

    やはり試してみたところ学習した値がどうもおかしいようでした。リンクにはっているgoogle colabから学習したものではどれも作動しませんでした。もとのYESとNOも学習してみましたが値が元のtinyファイルにある値と違いかたまってしまいます。ブログ主さんはgo stopで学習した値とかは保存してたりしませんか?

  8. boochow より:

    > ブログ主さんはgo stopで学習した値とかは保存してたりしませんか?

    探してみたら、学習したモデルが残っていたので、動かしてみました。
    一応動きましたが、goの認識率はあまり良くないです。私の発音が悪いのかもしれませんが・・・

    モデルを入れ替えたブランチを以下にアップロードしました。

    https://github.com/boochow/TFLite_Micro_MicroSpeech_M5Stack/tree/m5stickc_stop_go

  9. Ash より:

    ありがとうございます!ほんとに助かります!