前回、たまたま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版がその通りに実装されているとは限らないと思います。)
一応日本語、ドキュメントへのリンクを貼り付けておきます。
今のところ、ラズパイ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に上書きしてもローカルファイルシステムの内容は保存されていました。今のところローカルファイルシステムをあまり使っていないので、正直実利はなかったです。でも今後もそうだといいなと思いました。ローカルファイルシステムのセーブとリストアみたいなことしなくて済むので(まあバックアップは取った方が身のためですが。)