ボードを買って30秒で始めるMicroPython


★この記事はMicroPython Advent Calendar 2018に参加しています。★

MicroPythonに興味があって、まずは動かしてみたいという方に、一番簡単な方法を紹介します。

(1)まず、以下の中から好きなボードを入手しましょう。

どれもSTMicro社の製品で、秋月電子、マルツ無線、RSコンポーネンツ、digi-key、chip1stopなどで入手できるはずです。表にない機種もありますが、必ず表の中から選んでください。

フラッシュ容量はできれば512KB以上が良いです。
とりあえずお奨めは、クロックもそこそこ速いF446REでしょうか。秋月電子だと2000円くらいで購入できるようです。

microUSBケーブルまたはminiUSBケーブルが必要ですが、付属していませんのでボードに合わせて準備してください。

形状 名称 クロック
(MHz)
Flash
(KB)
RAM
(KB)
入出力端子等
32 NUCLEO-F091RC 48 256 32
NUCLEO-L432KC 48 256 64
64 NUCLEO-F401RE 84 512 96
NUCLEO-F411RE 100 512 128
NUCLEO-F446RE 180 512 128
NUCLEO-L476RG 80 1024 128
144 NUCLEO-F429ZI 180 2048 260 USB, Ethernet
NUCLEO-F746ZG 216 1024 320 USB, Ethernet
NUCLEO-F767ZI 216 2048 512 USB, Ethernet
NUCLEO-H743ZI 400 2048 640 USB, Ethernet
STM32F429 DISCOVERY 180 2048 256 USB, 8MB SD-RAM,2.4型QVGA TFT LCD
STM32F769 DISCOVERY 216 2048 512 USB, Ethernet, 16MB SD-RAM,4型タッチ入力LCD
STM32F7 DISCOVERY 216 1024 320 USB, Ethernet, 8MB SD-RAM,4.3型タッチ入力LCD
STM32L476 DISCOVERY 80 1024 128 6桁14セグメントLCD
STM32L496G DISCOVERY 80 1024 320 1.5型240×240 TFT LCD,1MB PSRAM

(2)以下のリンクから、ボードに応じたファームウェアをダウンロードします。

MicroPython Ready-to-Go Firmware for MBED enabled boards – 楽しくやろう。

このファームウェアは私が昨晩MicroPythonのメインラインからビルドしたものです。
手持ちのボード(F401REとL432KC)以外は動作確認していないのですが、たぶん動くと思います。
セキュリティ上の理由でzip形式になっていますので、解凍してbinファイルを取り出してください。

また、ターミナルソフト(TeraTerm等)も持っていなければ準備しておいてください。

(3)ボードをUSBでPCに接続し、フォルダが現れたらbinファイルをドラッグ&ドロップしてください。

この操作を行うとボードにMicroPythonがインストールされます。
このとき、ボードに書かれていたデータは全て消去されます。念のため。

(4)完了です!

ターミナルソフトでシリアルポートに接続すると、MicroPythonのプロンプト(REPL)へ接続できるはずです。
設定は、115200bps、8bit、パリティ無しです。

Lチカ(の準備)

まずは動作確認も兼ねて、ボード上のLEDを点けたり消したりしてみましょう。
ターミナルソフトから以下のように入力してみてください。

ボードによっては、LEDが複数搭載されているものもあります。LED(1)のところをLED(2)やLED(3)にしてみてください。
搭載されていない場合は、ValueError: LED(2) doesn't existのようなエラーが出ます。

「pyb」モジュールは、MicroPythonのハードウェア依存のクラスを集約したモジュールです。
どのようなクラスがあるかはhelp(pyb)もしくはdir(pyb)で確認できます。
また、内蔵されているモジュールの一覧はhelp('modules')で確認できます。

※実はpybモジュールは古い仕様で、新しいMicroPythonではmachineモジュールを使うことが推奨されています。
ですが、machineモジュールにはLEDクラスが無いので、今回はpybモジュールを使っています。

Lチカ(スリープ版)

次に、LEDを一定間隔で点滅させる、いわゆるLチカを試してみます。
以下のスクリプトをコピーしてください。

そして、MicroPythonのREPLに「CTRL+E」を入力します。すると、以下のように「ペーストモード」になります。

この状態で、コピーしたスクリプトをターミナルソフトへペーストします。
すると、以下のようになります。

最後に、「CTRL+D」を入力します。
するとペーストしたスクリプトが実行され、LEDが点滅するはずです。

このスクリプトは無限ループなので、抜けるには「CTRL+C」を入力します。

Lチカ(タイマ割込版)

最後に、Lチカをタイマー割込を使ってループ無しで行ってみます。
ターミナルソフトから以下のように入力してみてください。

このスクリプトは、freq()で与えた周期で、callback()で与えた関数を実行します。toggle()はLEDのオンとオフを切り替えるメソッドです。
最後のdeinit()はタイマー動作を終了させます。

freq()の値を100以上にすると、肉眼では点滅を認識できなくなると思いますが、ボードを振ってみるとLEDの残像が点線を描くので、点滅していることが判ります。

解説

今回は「一番手っ取り早くMicroPythonを体験する方法」を書いてみました。
MicroPythonがちょっと気になっても、

1)ソースコードをダウンロードして
2)クロスコンパイル環境を整備して
3)ボードを買ってきて
4)ビルド方法を調べてビルドして
5)ボードへのインストール方法を調べてインストールする

というのは初めての方にはなかなか大変では無いかと思います。

そこで、インストールはMbedの仕組みを利用し、自分でビルドしなくて済むようにビルド済みのバイナリを提供しました。

Mbed対応ボードでは、ボードはPCからUSBマスストレージとして認識され、そのストレージにバイナリファイルをドラッグ&ドリップすると、ファイルがMCUのフラッシュに書き込まれます。

このバイナリファイルは特殊なものではなく、ARMのフラッシュ領域へそのまま書き込まれるファイルだそうです。

BIN file format? | Mbed

この形式のファイルは、ELFファイルからobjdumpツールを使って生成できます。
MicroPythonのSTM32版は、ビルドするとbuild-ボード名/firmware.elfが生成されますので、これを

arm-none-eabi-objcopy -O binary build-NUCLEO_L432KC/firmware.elf upy-l432kc.bin

のようにしてbinファイルに変換し、Mbed対応ボードへドラッグ&ドロップすればMicroPythonがインストールできるわけです。

ただ、このやり方はボードの内蔵フラッシュを全て書き換えるので、内蔵フラッシュに保存してあったファイルシステムも消してしまいます。
MicroPythonのフラッシュメモリは、アドレスの低い番地から

・割り込みベクタ
・ファイルシステム
・MicroPython本体

の順に並んでいますので、1つのファイルで書き込もうとすると、どうしてもファイルシステムを消すことになります。

そのため、MicroPythonのSTM32ポートでは割り込みベクタ用バイナリ(firmware0.bin)とMicroPython本体のバイナリ(firmware1.bin)を分けて生成し、それぞれを個別にフラッシュメモリに書き込むようになっています。

ただ、ファイルシステムを内蔵しない場合はこの限りではありません。
実は昨日紹介したNUCLEO-L432KCは、フラッシュメモリが少ないのでファイルシステムを持たず、結果バイナリは1つになっています。
試しにMbed経由でインストールできるか試してみたら成功したので、他のボード用のバイナリも作って試してみたところ、うまくいくことが確認できました。

もちろん、インストールすればボード内部のファイルシステムは消えてしまうのですが、だとしても、お手軽にインストールできるなら使ってみたいという需要はあるのではないか? と思い、今回MicroPythonが動作するMbed対応ボードのバイナリを作って公開してみました。

ただ、私自身は全てのボードで試すことはできませんので、もしうまくいかない機種があったらご連絡下さい。

コメント