見出し画像

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はソフトリブートするので時間がかかる)

%Run -c $EDITOR_CONTENT is Thonny's internal command

https://github.com/thonny/thonny/issues/1227

delコマンドが便利

  • Thonnyが使えない環境、

  • REPLで過去に入力した状態を維持しながら、一部だけ、再インポートしたいという用途など

  • `del`コマンドは、かなり活用できそうだ

さいごに

  • とんでもなく、回りくどいことをしているが、もしかしたら、実はもっと簡単な方法があるのかもしれない、と感じる

  • そして、こんなことで悩んでいる人は、他にはいないような気もしてきた

  • 素直にM5FlowのWeb版に開発環境を移行すれば、それでよい話でもある

    • M5Flow Web版をElectronなどのアプリにして、ローカルサーバーで動くようにしてくればうれしいのだが

    • そんなことをすると、開発、運用コストがあがる、それよりも他にリソースを回す戦略の方が理にかなっているとも感じる(せっかく、Desktop版をなくしたのに、また仕事が増えてしまう)

    • M5Stackは、C言語用のライブラリとMicroPython用のライブラリがあって、さらにビジュアルスクリプティングの環境もあって、開発は大変だと思うが、がんばってほしい

いろいろ長々とポエムを書いてしまったが、M5Stackを応援している

リンク

Thonny

rshell


この記事が気に入ったらサポートをしてみませんか?