MicroPython的午睡(11) ラズパイPico、Thonny IDEで動作確認

Joseph Halfmoon

昨日、待望のRaspberry Pi Picoが到着、早速ピンヘッダを半田づけして吉例のLチカをやってみました。お手軽さを最優先し、MicroPythonでの動作確認です。とりあえず5分10分程度の作業時間でOK。お楽です。動作させればラズパイPico上でのMicroPythonの実装についても少し分かってきました。

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

以下の投稿にて宅急便屋さんの到着前に搭載マイコンRP2040についてグダグダ書いていました。

鳥なき里のマイコン屋(120) RP2040搭載、Raspberry Pi Pico到着予定

いざ到着し、箱を開けてみるとちょっと予想外の会社の名前が印字された袋に入ってました。Seeed Studio社です。中身は純正Raspberry Pi Picoですよ。

RPi Pico Package在庫が払拭しているらしい中、私が見つけたのは、ラズパイPicoボードにピンヘッダとUSBケーブルが付属したキットです。Seeed社は手広くボード開発などしている会社です。私もマイコンボードなど、いろいろ買わせてもらっています。ラズパイPicoの単体ボード購入でもSeeed社の袋に入ってくるのだろうか。お値段的には単体ボードにピンヘッダやケーブルを買い足したとしたらリーズナブル、と思える値段設定でした。まあピンヘッダとかは手元にいつも在庫を置いていますが消耗品です。気付いて即ポチりました。

ピンヘッダを半田付けしながら、とりあえずの開発環境考えたのですが、MicroPythonにすることにいたしました。それは手元の事情によります。

  • MicroPythonの資料によるとC/C++での開発の場合、ラズパイ4を開発母艦にするのを勧めている。
  • クロスコンパイルとオブジェクトの書き込みは、Linux機、Windows機などでもできる。
  • ラズパイ4はクロスコンパイルに使えるだけでなく、SWDのデバッグインタフェースとしても働く(なかなか良い考えに思える)
  • 手元にはラズパイ3Bしかないが、多分、ラズパイ3Bでも出来そうではある。
  • しかし手元のラズパイ3BはHDDにとりつけて「サーバー化」しているので配線引き出すのが非常に不便。

C/C++でやるのはこれまた買う買う言いながら買っていないラズパイ4入手後だな~、と思った次第。また、エディタ兼IDEとして

  • 今まで VS Code はPCからリモートでラズパイ3Bに接続していた
  • 最近の VS Code の改定以来、ラズパイ上のネイティブ版も公式サポートになったみたい
  • 当然 VS Code でラズパイPicoのSDK扱える。

ということなので、C/C++の場合は VS Code利用だろうなと思います。

ただ、残念なことに御馴染みのPlatformIOはまだ公式にはPicoをサポートしていないみたい。その辺の経緯が分かるページはここ。PlatoformIOのPicoをサポートする実験的な実装はあるようなので使おうとすれば使えそうです。FreeRTOSはどこまで使えるかは不明だけれども「使える」みたいです(未確認。)ネット上でPico用のZephyr(これもRTOS)を欲しがっている人がいたのですが、まで見つけてないみたいなので、多分、Zephyrはまだ対応していない?Arm Mbed OSも未対応みたい。まあ、これから徐々に各方面のサポート充実するんじゃないかと思います。

バイナリインストール

さて、本題のMicroPythonです。PicoのMicroPythonについては、立派な資料があります。いろいろ書かれていますが、バイナリインストールであれば数分の作業でラズパイPico上でMicroPythonが動作します。

  1. バイナリをダウンロード(.uf2型式)
  2. ラズパイPicoをストレージとしてUSB接続(ボタンを押したまま接続)
  3. 見えたドライブに.uf2ファイルを書きこむ
  4. ラズパイPicoのUSBを再接続(ボタン押さない)してCOMポートに見えたらOK

なお、ボーレートは115400です。私は伝統のTeratermで接続いたしました。インストールできたプリビルトのバイナリのバージョンは以下のようでした。

MicroPython v1.14 on 2021-02-05; Raspberry Pi Pico with RP2040

ファイル名的にはまだ途上みたいなので、今後もアップデートされるものと思います。

インストール時に含まれているモジュール群

REPLに接続した直後、MicroPythonのお作法にしたがい  help(‘modules’) してみると以下のようです。

>>> 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

ラズパイPicoのハードウエアに特有の部分は、machineとRP2に押し込められているようです。非標準的なモジュールはあまりプリインストールされていない「バニラ」な雰囲気のするMicroPython実装じゃないかと思います。同じMicroPythonでも、K210上の実装であるMaixPyなどとは大分趣が異なる感じです。ただ、MaixPyでは実装されていなかった uasyncio(コルーチン関係)が含まれているのはIOいじるのには良いなとおもいました。

machineモジュールを見てみると以下のようなPicoのハードを操作するための関数やクラスが含まれます。この辺の使い方はPythonのSDK文書でよく説明されているようです。

>>> import machine
>>> help(machine)
object <module 'umachine'> is of type module
__name__ -- umachine
unique_id -- <function>
soft_reset -- <function>
reset -- <function>
reset_cause -- <function>
bootloader -- <function>
freq -- <function>
idle -- <function>
lightsleep -- <function>
deepsleep -- <function>
disable_irq -- <function>
enable_irq -- <function>
time_pulse_us -- <function>
mem8 -- <8-bit memory>
mem16 -- <16-bit memory>
mem32 -- <32-bit memory>
ADC -- <class 'ADC'>
I2C -- <class 'I2C'>
SoftI2C -- <class 'SoftI2C'>
Pin -- <class 'Pin'>
PWM -- <class 'PWM'>
SPI -- <class 'SPI'>
SoftSPI -- <class 'SoftSPI'>
Timer -- <class 'Timer'>
UART -- <class 'UART'>
WDT -- <class 'WDT'>
PWRON_RESET -- 1
WDT_RESET -- 3

RP2モジュールの中を覗くと、昨日しらべて、RP2040のユニークな機構であると認識した”PIO”関係の制御用と思われるものが含まれています。MicroPythonからもPIO使えそうなので嬉しいです。やることあるなあ。

>>> import rp2
>>> help(rp2)
object <module 'rp2'> is of type module
Flash -- <class 'Flash'>
PIOASMEmit -- <class 'PIOASMEmit'>
const -- <function>
asm_pio -- <function asm_pio at 0x20006960>
PIOASMError -- <class 'PIOASMError'>
_pio_funcs -- {'in_': None, 'y_dec': 4, 'pin': 6, 'iffull': 64, 'gpio': 0, 'not_osre': 7, 'clear': 64, 'rel': <function <lambda> at 0x200066f0>, 'wrap': None, 'x_not_y': 5, 'word': None, 'out': None, 'push': None, 'noblock': 1, 'pull': None, 'wrap_target': None, 'x_dec': 2, 'mov': None, 'irq': None, 'set': None, 'y': 2, 'x': 1, 'null': 3, 'pc': 5, 'invert': <function <lambda> at 0x20006400>, 'pins': 0, 'not_x': 1, 'not_y': 3, 'ifempty': 64, 'isr': 6, 'pindirs': 4, 'exec': 8, 'label': None, 'status': 5, 'nop': None, 'osr': 7, 'block': 33, 'reverse': <function <lambda> at 0x20006410>, 'jmp': None, 'wait': None}
__name__ -- rp2
StateMachine -- <class 'StateMachine'>
asm_pio_encode -- <function asm_pio_encode at 0x200067e0>
PIO -- <class 'PIO'>
Thonny IDE

仮想端末からラズパイPicoのREPLに接続して操作しているだけでは本格的にPythonできないので、ThonnyIDEをインストールいたしました。

Thonny, Python IDE

このThonnyIDEのインストール手順についても、さきほどのSDKで説明されているのですが、私がダウンロードしたSDK文書 1.2 と実体は既に違ってしまっているようです。文書では Thonny IDEのインストール後にPicoに接続するためのプラグインなど入れるように書いてあったのですが、私がWindows用にダウンロードしたThonny IDEでは不要でした(だいたいプラグインのページ、既にリンクが切れてます。)

Thonnyをインストールして、ラズパイPicoを接続し、ターゲットをPC上のPython3からPico上のMicroPythonに設定変更すれば即使えました。こんな感じ。

TonnyIDESDKに書いてあるBlink(Lチカ)サンプルをそのまま入力しました。アイキャッチ画像に掲げましたるとおり、オンボードLEDでLチカできます。ソースみれば分かりますが、通常の遅延関数で点滅させるようなスタイルではなく、タイマにより周期的にコールバックをかけるスマートな実装です。これがRP2040らしいスタイル?

また、公式的MicroPythonでは、リブート時に ストレージにboot.pyが存在すれば、それをまず起動し、その終了後 main.py を起動する(main.pyも終了すればREPLに落ちる)という手順です。実際に2ファイルを置いてみるとちゃんと公式通りに実装されていました。

なお、MicroPythonに独特なオンボードのストレージですが、uosモジュール使って観察すると処理状態ではルート “/” には何も格納されていません。Thonnyからは「表示>ファイル」で、ホストPCのフォルダとラズパイPico用のフォルダを表示できるようになります。右クリックで相互にファイル転送も可能。勿論、編集したファイルを格納するときも、PC側にもPico側にも書き込みできます。

ラズパイPico上のMicroPython、普通にお気楽。

MicroPython的午睡(10) _thread、マルチスレッドは出来るけれども に戻る

MicroPython的午睡(12) ラズパイPico、簡単!マルチコアでLチカを へ進む