MicroPython的午睡(32) ラズパイPicoの処理系をようやくv1.15に更新

Joseph Halfmoon

前回、たまたまRaspberry Pi Picoの公式ページ(getting-started)を眺めていて、配布されているMicroPythonがバージョンUPされていることに気づきました。これはいけない更新しないと。ということで更新いたしました。ところで何が変わった?

※「MicroPython的午睡」投稿順 Indexはこちら

初回入荷では買いそびれたRaspberry Pi Picoをようやく入手し、MicroPythonをインストールしてここ2か月ほど使っておりましたのは、2021年4月16日にダウンロードし、インストールいたしました以下のファイル名のものです(リンクじゃありません、名前だけです。)

rp2-pico-20210205-unstable-v1.14-8-g1f800cac3.uf2

ファイル名の unstable はちょっと気になったのですが、出始めだし、仕方ないよね、と使っておりました。しかし、そのわずか2日後の2021年4月18日には、unstableの文字の消えた、以下のファイル名のv1.15が出ていたとは

rp2-pico-20210418-v1.15.uf2

昨日(2021年6月18日)時点でオフィシャルサイトからダウンロードできたのは上記ファイルです。どこかに Revision History があるのかと思って検索しましたがそれらしいものは見当たりません。ただ、ラズパイPicoでPython書くときのしるべとなるドキュメント raspberry-pi-pico-sdk.pdf についてもバージョンが更新されており、改版履歴が記載されていることに気づきました(Pythonインタプリタのバージョンの違いによる細かい話は書いてないように見受けられますが。)

私が4月にダウンロードして今まで頼ってきたのは、以下です。

release 1.2 01/Feb/2021

しかし、既にドキュメントは大分バージョン上がっていました。本日時点で以下が最新かと思われます。

release 1.5 07/Jun/2021

実行ファイル、ドキュメントとも更新できたところで、何が変わったかチョイと調べてみました。

v1.14でのモジュール列挙

まず古いv1.14での内蔵モジュールの一覧です。これが今まで使ってきたもの。

>>> help("modules")
__main__ gc uasyncio/event ujson
_boot machine uasyncio/funcs uos
_onewire math uasyncio/lock urandom
_rp2 micropython uasyncio/stream ure
_thread onewire ubinascii uselect
_uasyncio rp2 ucollections ustruct
builtins uarray uctypes usys
ds18x20 uasyncio/__init__ uhashlib utime
framebuf uasyncio/core uio uzlib
Plus any modules on the filesystem
v1.15でのモジュール列挙

それに対して更新されたファイルから見えるモジュールの一覧はこうです。よく見ると何か追加されていることが分かります。

>>> help("modules")
__main__ gc uasyncio/funcs uos
_boot machine uasyncio/lock urandom
_onewire math uasyncio/stream ure
_rp2 micropython ubinascii uselect
_thread onewire ucollections ustruct
_uasyncio rp2 uctypes usys
builtins uarray uerrno utime
cmath uasyncio/__init__ uhashlib uzlib
ds18x20 uasyncio/core uio
framebuf uasyncio/event ujson
Plus any modules on the filesystem

追加されたモジュール以外でも、モジュール内部の定義が拡張とかされていないのか気になります。全部は調べきれないので、デバイスやバージョン依存性が高いのではないかと思われる machine、rp2、micropythonの3モジュールの内部をざっと見てみました。私の節穴では変化には気づきませんでした。バグFIXのような細かいFIXはあったでしょうが、提供される関数やクラスには変化が無いように思われます。

追加されていたのはcmathとuerrnoの2つ

さて、明らかなのはモジュールの追加です。cmathとuerrnoの2モジュールが追加されています。どちらもMicroPythonでは標準的なモジュールで、日本語によるドキュメントも提供されています(ただし、ラズパイPico版がその通りに実装されているとは限らないと思います。)

一応日本語、ドキュメントへのリンクを貼り付けておきます。

cmath — 複素数のための数学関数

uerrno — システムエラーコード

今のところ、ラズパイPicoで複素数の演算をバリバリやろうという気はあまりありません。ただし、信号処理などをやり始めると複素数が必要になるので有ると何かのときに便利かと思います。ただしRP2040はFPU無です。ROM内に性能が良いらしいソフトウエアの浮動小数点ライブラリを持つようですが、処理性能が本当に必要であればFPU搭載マイコンを選択でしょう。局所的にちょこっと処理する程度かな?

一応、cmathモジュールとuerrnoモジュール内部でどのようなものが定義されているのか調べてみました。

>>> import cmath
>>> help(cmath)
object <module 'cmath'> is of type module
__name__ -- cmath
e -- 2.718282
pi -- 3.141593
phase -- <function>
polar -- <function>
rect -- <function>
exp -- <function>
log -- <function>
log10 -- <function>
sqrt -- <function>
cos -- <function>
sin -- <function>
>>> import uerrno
>>> help(uerrno)
object <module 'uerrno'> is of type module
__name__ -- uerrno
errorcode -- {1: 'EPERM', 2: 'ENOENT', 5: 'EIO', 9: 'EBADF', 11: 'EAGAIN', 12: 'ENOMEM', 13: 'EACCES', 17: 'EEXIST', 19: 'ENODEV', 21: 'EISDIR', 22: 'EINVAL', 95: 'EOPNOTSUPP', 112: 'EADDRINUSE', 113: 'ECONNABORTED', 104: 'ECONNRESET', 105: 'ENOBUFS', 128: 'ENOTCONN', 116: 'ETIMEDOUT', 111: 'ECONNREFUSED', 118: 'EHOSTUNREACH', 120: 'EALREADY', 119: 'EINPROGRESS'}
EPERM -- 1
ENOENT -- 2
EIO -- 5
EBADF -- 9
EAGAIN -- 11
ENOMEM -- 12
EACCES -- 13
EEXIST -- 17
ENODEV -- 19
EISDIR -- 21
EINVAL -- 22
EOPNOTSUPP -- 95
EADDRINUSE -- 112
ECONNABORTED -- 113
ECONNRESET -- 104
ENOBUFS -- 105
ENOTCONN -- 128
ETIMEDOUT -- 116
ECONNREFUSED -- 111
EHOSTUNREACH -- 118
EALREADY -- 120
EINPROGRESS -- 119
ファームウエア更新時に良かったこと

MicroPythonの更新はBOOTSELボタンを押しながら再接続すればBOOT用のドライブが現れ、そこにuf2ファイルを書き込むだけです。たいていの人気デバイスの処理系もそうですかね。その中で、BBC micro:bit のMicroPython処理系のように、ファームウエアを更新してしまうとFlashを共用しているMicroPythonのローカルファイルシステムも初期化されてしまうものがあります。

今回のラズパイPico用の処理系の、v1.14からv1.15への上書き更新の場合ですが、MicroPython処理系をFlashに上書きしてもローカルファイルシステムの内容は保存されていました。今のところローカルファイルシステムをあまり使っていないので、正直実利はなかったです。でも今後もそうだといいなと思いました。ローカルファイルシステムのセーブとリストアみたいなことしなくて済むので(まあバックアップは取った方が身のためですが。)

MicroPython的午睡(31) ラズパイPico、PWMの周波数カウント機能を使う へ戻る

MicroPython的午睡(33) ラズパイPico、S9705フォトICで照度を測る へ進む