M5+MicroPythonで快適に開発する方法の模索
はじめに
M5StickC Plus + MicroPython環境を快適にしたいという思いを込めたポエムである
M5StackをMicroPythonで開発されている方で、UIFlowは使わずに、
REPLで動作確認したり、Pythonのコードを書いている方向けの記事である
環境
Windows
Thonny 4.1.2
M5StickC Plus(MicroPython 9309f5a80-dirty on 2023-08-03)
まとめ
長いのでまとめから、
REPL画面で`import mysound`をしてスクリプトを実行した後、
`del sys.modules['mysound']`をすると、モジュールを削除できるので、
再度`import mysound`でスクリプトを実行できる
Thonnyを使って開発する場合は、F5キーを活用する(詳細は「他の方法」項目に書いた)
背景
ちょっとした動作確認をするときは、数秒で動作確認ができるMicroPythonが便利である
例えば、M5StickC Plusのスピーカーの音の品質、聞きやすい周波数を模索する、など
C言語でプログラミングするとコンパイル時間、転送時間、フラッシュへの書き込み時間が長い(数秒から数十秒はかかる)
すべての音階を出すようにプログラムして、UI(ボタンやWebページ)を作るなどの実装をするのは骨が折れる
REPLでコマンドを入力して即時に動作確認したい
「ドの音は、どんな感じ?」、「じゃあ、レは?」など
今までは、UIFlow Desktop版を使っていたのだが、ついにWeb版のみになってしまったようだ
個人的に、インターネット経由でデータを送信して、開発するのは、あまり好きではないのと
UIFlowでブロックを使ってプログラムをしたいのではなく、Pythonでプログラムをしたい
Web版でも、UIFlowをPython画面にすれば、Pythonでプログラミングすることはできる
UIFlow Block Custom(*.m5bファイル)を使えば、モジュールを管理できそう
現状は、rshellやThonnyなどのIDEで、REPLを使って簡単な動作確認したり、Pythonでプログラミングをしている
M5StickC Plusではリセットをすると時間を要する
REPLを利用する場合は、モードをアプリ起動モードにする必要がある
USBモードにすると、USBモード用のアプリが起動した状態になるので、CTRL-Cで止める必要がある(自動で再起動する仕組みがあるのか、なかなか止まらず時間がかかる)
ESP32の開発ボードでは、リセット(リブート)をした後、1秒程度でREPLの入力状態になる印象だが、
M5StickC Plusでは、すぐにはREPLの入力画面にならず、おそらくUIflow用の初期化処理が走る
UIflowの起動は、3秒~4秒くらいかかる印象だ
ソフトリセットして、すぐに中断すれば(CTRL-D、CTRL-Cと素早く入力すれば)、高速にREPLの入力状態に入ることができるのだが
UIflowの初期化が完了する前に中断すると、speakerなどのモジュールが使えない(`NameError: name 'speaker' isn't defined`というエラーがでる)
ユーザーが記述するimport文とは別の仕組みで、読み込みが行われているモジュールがあるのかもしれない
speakerが使えない原因追究に時間を要した
CTRL-DとCの意味
CTRL-C -- interrupt a running program(中断)
CTRL-D -- on a blank line, do a soft reset of the board(リセット)
ソフトリセットせずに再importしたい
`M5Led.on()`(LEDをつける)などを、REPLでコマンドを発行する上では、問題ないのだが、
少し長いプログラムを書きたいとき、タイミングが重要なときは、、pyファイルに保存して実行することがある
例えば、音楽を作るときは、REPLで入力するとタイミングが確認できないので、以下のようなファイルを作る
mysound.pyの中身
from m5stack import *
speaker.sing(131, 1) # C
speaker.sing(147, 1) # D
speaker.sing(165, 1) # E
speaker.sing(175, 1) # F
speaker.sing(196, 1) # G
speaker.sing(220, 1) # A
speaker.sing(246, 1) # B
speaker.sing(261, 1) # C
そして、`import mysound`と、REPLでコマンドを発行することで スクリプトを実行させる
ファイルにせずに、複数行入力した方がよいかもしれないが、微調整することを考えるとファイルにした方が便利とも思える
ドレミファソラシドという音階が流れる
そのあと、微調整(ドシラソファミレドにして)して、再び、音楽を鳴らしたいと思う
再び、`import mysound`しても、再読み込みは行われない
今までは、ソフトリセットをしていた
ソフトリセット時のUIFlowの起動時間に頭を抱えていたのだが
ソフトリセットをせずに、再インポートする方法をみつけた
再起動は3秒程度なので、どちらの方が早いかは個人の技量によりそうだ
再インポートする方法
再度インポートしてスクリプトを実行するには、`import`命令で既に読み込んでいるモジュールを削除する必要がある
以下のようにコマンドを発行すると、モジュールを削除できる
`import sys`はUIFlowの初期化処理で既に読み込まれているはずなので、おそらく省略できる
import sys
del sys.modules['mysound']
`del`コマンドを発行した後、`import mysound`とコマンドを入力すれば、スクリプトが実行されて、再び音階を確認することができる
他の方法
Thonnyの便利機能
Thonnyを使う場合は、F5キーを押すと、、開いているスクリプトをフラッシュへ書き込んで、ソフトリブートして、開いているスクリプトを実行してくる(しかも、importするわけだはないようだ)
コマンドは、`%Run -c $EDITOR_CONTENT`という、おそらくThonny用のコマンドで、裏で何が行われているかは不明
こちらの方が早く実行できそうだと、記事を書き終わった後に気が付いた
条件は不明だが、実行までに時間がかかることがある(30行ぐらいのスクリプトの場合、8秒程度かかった、スクリプトの量と待ち時間の因果関係は未確認)単純に処理時間がかかるスクリプトであった再インポートだと1秒かからない(Shellへの入力速度に依存するが)ので、状況に応じて使い分けるのが良さそう(ThonnyのF5はソフトリブートするので時間がかかる)
delコマンドが便利
Thonnyが使えない環境、
REPLで過去に入力した状態を維持しながら、一部だけ、再インポートしたいという用途など
`del`コマンドは、かなり活用できそうだ
さいごに
とんでもなく、回りくどいことをしているが、もしかしたら、実はもっと簡単な方法があるのかもしれない、と感じる
そして、こんなことで悩んでいる人は、他にはいないような気もしてきた
素直にM5FlowのWeb版に開発環境を移行すれば、それでよい話でもある
M5Flow Web版をElectronなどのアプリにして、ローカルサーバーで動くようにしてくればうれしいのだが
そんなことをすると、開発、運用コストがあがる、それよりも他にリソースを回す戦略の方が理にかなっているとも感じる(せっかく、Desktop版をなくしたのに、また仕事が増えてしまう)
M5Stackは、C言語用のライブラリとMicroPython用のライブラリがあって、さらにビジュアルスクリプティングの環境もあって、開発は大変だと思うが、がんばってほしい
いろいろ長々とポエムを書いてしまったが、M5Stackを応援している
リンク
Thonny
rshell
この記事が気に入ったらサポートをしてみませんか?