前回MicroPythonをNucleo F401REボード用にソースからビルドして書き込んだところ動作OK。STM32マイコンの周辺回路への直接アクセス用のモジュールもあり。ハード使い放題じゃん、と喜びました。しかし調べてみると予想以上に機能が充実してます。STM32用のMicroPython最強。ホントか?
※「MicroPython的午睡」投稿順 Indexはこちら
Nucleo F401REに書き込んだMicroPythonをThonnyに接続
前回、WSL2(Ubuntu20.04)上でビルドしたMicroPythonインタプリタをST Microelectoronics社製のNucleo F401REボードに書き込み、仮想シリアル端末(Teraterm)を接続してREPLが動作していることを確認しました。
今回はまずMicroPythonのフロントエンドとして使わせていただいている Thonny IDE(Windows版)に接続してみます。
今回はThonnyに含まれるバイナリをボードにインストールしたわけではないので、以下のように MicroPython(generic) ということで指定してます。接続用のポートは、STLinkのCOMポートが検出されているのでそこに向けます(STLink用のドライバは事前にインストールしておかねばなりません。NUCLEOボード使っている場合はきっとインストールしてあるハズ。)
接続したところが以下に。Shellウインドウ内にNucleo F401RE上のMicroPythonのREPLのプロンプトが表示されているだけでなく、左下のウインドウ内にはマイコン上のFlashの一部を使って確保したMicroPythonの「ストレージ」もしっかり見えています。
まずは、そのファイルシステムの情報から。トータル47kBで、使用は1kBとな。まあ、かなり少ないですが無いよりはマシと。
ストレージの中にはお約束どおり、ファイルが2つ書き込まれてます。
-
- boot.py
- main.py
main.pyはユーザのコードを書き込んでおけば自動起動されるものですが、現状はコメントのみで仕事は無しの空のファイルでした。一方、電源投入後にまず走って初期設定を行いmain.pyへつなぐ役目のboot.pyの方の主要な部分は以下のようでした。
pyb.country('US')
pybというのは、pyboardというボード用のモジュールです。pybモジュールで地域設定(米国用みたい)していると。Nucleo F401RE用にビルドしているのですが、STM32マイコン用の処理系にはpybモジュールが漏れなくついてくるみたいです。確かめたわけじゃないケド。
pyboardというボード(国内でも買えますが、結構お高いボードです。円安だし。。。私は持っておりませぬ。)が印象深いのは、MicroPythonの公式、以下のページへ行くと
最初に紹介されているボードだからです。というかMicroPythonのサイト内にpyboardを購入するためのページがある感じです。まさにMicroPython公式、「MicroPython業界?」の標準機ではありませんか。
Pyboardについては以下にドキュメントがあります。
Quick reference for the pyboard
ざくっと pyboard v1.1と Nucleo-F401REの諸元を比較すると以下のようになります。
board | pyboard v1.1 | Nucleo-F401RE |
---|---|---|
MCU | STM32F405RG | STM32F401RET |
CORE | Cortex-M4 | Cortex-M4 |
FREQ | 68 MHz | 84MHz |
FLASH | 1024 KB | 512KB |
RAM | 192 KB | 96KB |
メモリは pyboardの方が倍積んでますが、クロック周波数は何気にF401の方がちょっと速いです。
pybモジュールはNucleo F401RE上でも動く
試みに pyboard用のLチカを pybモジュールでできるのかやってみました。import pyb してあれば、こんな感じ。
ちゃんとLEDが点滅しますぞ。なお、調べてみると pyboard上には LEDが4灯4色搭載されており、LED(1)からLED(4)として操作可能。LED(1)は赤色LEDらしいです。しかし、NUCLEO-F401RE上では唯一のUSER LED(LD2、緑色)が点灯します。
pybモジュールとmachine(umachine)モジュール
前回見た通り処理系にはいくつかのモジュールが既に取り込まれているのですが、その中でハードウエアの操作に関連する主要モジュールが2つあります。
-
- pyb
- machine(umachine、”u”つけないでもimport できる)
インポート後、helpを使えばモジュール内に含まれる関数やクラスを列挙することができます。以下は、pybのhelpの先頭部分です。
比較したところでは、どちらにもハード関連のクラスや関数など多数含まれるのですが
-
- pybとmachineの両方に含まれる?クラス等もあるように見える
- 片方にしか含まれないものもある
pybの方がpyboardとの共通部分用なんですかね~ machineの方がよりローカルなのかな~ 知らんけど。
同シリーズのSTM32F4xxマイコンなので、周辺回路などは限りなく近いでしょう。しかし、回路図みるとボード上のピンネームが違いますね。pyboardは Xチョメチョメ、とか Yチョメチョメとかいうボードピン端子名が幅を利かせてます。一方 Nucleoの方は、Arduino配列互換のピンソケットなども積んでいるのでArduino風のボード端子名が印字されてます。
以下のように machne.Pin.board をhelpしてみると、Arduino式のピン名がその中に含まれていることがわかりました。以下はその一部。
また、マイコンチップの実際の端子名である PA_x のような端子は、machine.Pin.cpu の方に定義が入ってます。
上記のどちらかを使えば、任意の端子を操作できると思います。
試みに、先ほどの pyb.LED(1) で操作したユーザLEDをmachine.Pinを使って操作してみたものが以下に(マイコンの端子的には PA_5 です。)
Lチカいたしましたぞ。
このMicroPython、インラインアセンブラが使える
フルPythonにもCで書かれたコードとインタフェースする方法がありますが、メンドイです(やってないのに勝手な感想です。)MicroPythonは直接メモリを操作することができるので、フルPythonよりもハードよりですが、その中でもSTM32バージョンは最強じゃないかと。
MicroPythonのクセに?インラインアセンブラ(Arm Thumb2)
が使えます。ラズパイPico版でハードウエアステートマシンのPIO用にアセンブラ記述ができますが、STM32版ではメインCPUで走らせる関数をアセンブラ記述できます。
とりあえずリファレンスのページが以下に。
Inline assembler for Thumb2 architectures
MicroPythonのホームページのサンプルを見ながら、実際にNucleo F401RE上でインラインアセンブラ記述したものが以下に。動いてますな。
お値打ち価格のNucleo系のボードでSTM32用のMicroPython走らせるのは良いかもしれないです。でも、も少しメモリが多い機種を選びたいな。