MicroPython的午睡(78) 限りなくPyboardに近いNucleo

Joseph Halfmoon

前回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ボード使っている場合はきっとインストールしてあるハズ。)

ThonnyOptions

接続したところが以下に。Shellウインドウ内にNucleo F401RE上のMicroPythonのREPLのプロンプトが表示されているだけでなく、左下のウインドウ内にはマイコン上のFlashの一部を使って確保したMicroPythonの「ストレージ」もしっかり見えています。ThonnySTM32MicroPython

まずは、そのファイルシステムの情報から。トータル47kBで、使用は1kBとな。まあ、かなり少ないですが無いよりはマシと。

F401RE_Python_Storage

ストレージの中にはお約束どおり、ファイルが2つ書き込まれてます。

    1. boot.py
    2. main.py

main.pyはユーザのコードを書き込んでおけば自動起動されるものですが、現状はコメントのみで仕事は無しの空のファイルでした。一方、電源投入後にまず走って初期設定を行いmain.pyへつなぐ役目のboot.pyの方の主要な部分は以下のようでした。

pyb.country('US')

pybというのは、pyboardというボード用のモジュールです。pybモジュールで地域設定(米国用みたい)していると。Nucleo F401RE用にビルドしているのですが、STM32マイコン用の処理系にはpybモジュールが漏れなくついてくるみたいです。確かめたわけじゃないケド。

pyboardというボード(国内でも買えますが、結構お高いボードです。円安だし。。。私は持っておりませぬ。)が印象深いのは、MicroPythonの公式、以下のページへ行くと

https://micropython.org/

最初に紹介されているボードだからです。というか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 してあれば、こんな感じ。PYB_LED

ちゃんと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の先頭部分です。modulePYB

比較したところでは、どちらにもハード関連のクラスや関数など多数含まれるのですが

    • pybとmachineの両方に含まれる?クラス等もあるように見える
    • 片方にしか含まれないものもある

pybの方がpyboardとの共通部分用なんですかね~ machineの方がよりローカルなのかな~ 知らんけど。

同シリーズのSTM32F4xxマイコンなので、周辺回路などは限りなく近いでしょう。しかし、回路図みるとボード上のピンネームが違いますね。pyboardは Xチョメチョメ、とか Yチョメチョメとかいうボードピン端子名が幅を利かせてます。一方 Nucleoの方は、Arduino配列互換のピンソケットなども積んでいるのでArduino風のボード端子名が印字されてます。

以下のように machne.Pin.board をhelpしてみると、Arduino式のピン名がその中に含まれていることがわかりました。以下はその一部。PinList

また、マイコンチップの実際の端子名である PA_x のような端子は、machine.Pin.cpu の方に定義が入ってます。PinListCPU

上記のどちらかを使えば、任意の端子を操作できると思います。

試みに、先ほどの pyb.LED(1) で操作したユーザLEDをmachine.Pinを使って操作してみたものが以下に(マイコンの端子的には PA_5 です。)

Machine_Pin

Lチカいたしましたぞ。

このMicroPython、インラインアセンブラが使える

フルPythonにもCで書かれたコードとインタフェースする方法がありますが、メンドイです(やってないのに勝手な感想です。)MicroPythonは直接メモリを操作することができるので、フルPythonよりもハードよりですが、その中でもSTM32バージョンは最強じゃないかと。

MicroPythonのクセに?インラインアセンブラ(Arm Thumb2)

が使えます。ラズパイPico版でハードウエアステートマシンのPIO用にアセンブラ記述ができますが、STM32版ではメインCPUで走らせる関数をアセンブラ記述できます。

とりあえずリファレンスのページが以下に。

Inline assembler for Thumb2 architectures

MicroPythonのホームページのサンプルを見ながら、実際にNucleo F401RE上でインラインアセンブラ記述したものが以下に。動いてますな。

inlineASM

 

お値打ち価格のNucleo系のボードでSTM32用のMicroPython走らせるのは良いかもしれないです。でも、も少しメモリが多い機種を選びたいな。

MicroPython的午睡(77) STM32版MicroPython、WSL2でビルド へ戻る

MicroPython的午睡(79) STM32F401RE版、dhtモジュールを試す へ進む