Linuxが動いているラズパイにBlinkaをインストールしてCircuitPythonライブラリを使えるようにする方法をこの記事にまとめたが、BlinkaをインストールすることでMicroPython上でCircuitPythonライブラリを使うことも出来る。
rshellを使い、MicroPythonが動いているラズパイPicoへBlinkaのインストールを試してみた。
BlinkaとPlatformDetectのダウンロード
必要な物はAdafruit_BlinkaとPlatformDetectの2つ。gitコマンドで持ってきておく。
git clone https://github.com/adafruit/Adafruit_Blinka
git clone https://github.com/adafruit/Adafruit_Python_PlatformDetect
マイコンへのインストール方法
フラッシュ容量に余裕のあるマイコンであれば簡単だ。上でgitコマンドを実行したのと同じディレクトリ階層に居る状態でrshellを起動し、以下のrshell内部コマンドを実行すればインストールは完了する。
mkdir /pyboard/lib
cp -r Adafruit_Python_PlatformDetect/adafruit_platformdetect /pyboard/lib/
cp -r Adafruit_Blinka/src/* /pyboard/lib/
この時のrshellセッションの様子は、以下のようになる。
$ rshell -p /dev/ttyACM0
Connecting to /dev/ttyACM0 (buffer-size 512)...
Trying to connect to REPL connected
Retrieving sysname ... rp2
Testing if sys.stdin.buffer exists ... Y
Retrieving root directories ...
Setting time ... Apr 18, 2022 19:54:51
Evaluating board_name ... pyboard
Retrieving time epoch ... Jan 01, 1970
Welcome to rshell. Use Control-D (or the exit command) to exit rshell.
/home/common/work/EleDIY/CircuitPython/Blinka> ls
Adafruit_Blinka/ Adafruit_Python_PlatformDetect/
/home/common/work/EleDIY/CircuitPython/Blinka> mkdir /pyboard/lib
/home/common/work/EleDIY/CircuitPython/Blinka> cp -r Adafruit_Python_PlatformDetect/adafruit_platformdetect /pyboard/lib/
/home/common/work/EleDIY/CircuitPython/Blinka> cp -r Adafruit_Blinka/src/* /pyboard/lib/
Omitting directory /home/common/work/EleDIY/CircuitPython/Blinka/Adafruit_Blinka/src/microcontroller
Copying '/home/common/work/EleDIY/CircuitPython/Blinka/Adafruit_Blinka/src/micropython.py' to '/pyboard/lib/micropython.py' ...
Copying '/home/common/work/EleDIY/CircuitPython/Blinka/Adafruit_Blinka/src/pulseio.py' to '/pyboard/lib/pulseio.py' ...
:
(略)
:
/home/common/work/EleDIY/CircuitPython/Blinka>
フラッシュサイズが十分でない場合のインストール方法
しかしラズパイPicoのようなフラッシュサイズが小さいマイコンは、上記手順では容量オーバーでインストールが失敗してしまう。そこで以下の1.〜4.の手順で行う。
- 最初に最低限のファイルをコピー
- REPLでCircuitPythonの’board’モジュールのimportを試みる
- エラーが出たら、エラーメッセージで「無い」と言われたモジュールファイルを追加コピー
- ‘board’モジュールのimportが成功するまで2.と3.を繰り返す
以下は上記1.の手順「最低限のファイルコピーとディレクトリ作成」を実行するためのrshellコマンド。rshell実行時のカレントディレクトリはBlinkaとPlatformDetectが直下にあるディレクトリ階層となるよう、予めディレクトリを移動してからrshellを起動するか起動後にcdコマンドで移動しておく。
mkdir /pyboard/lib
cp -r Adafruit_Python_PlatformDetect/adafruit_platformdetect /pyboard/lib/
mkdir /pyboard/lib/adafruit_blinka
cp Adafruit_Blinka/src/* /pyboard/lib/
cp Adafruit_Blinka/src/adafruit_blinka/* /pyboard/lib/adafruit_blinka/
cp -r Adafruit_Blinka/src/microcontroller /pyboard/lib/
cp -r Adafruit_Blinka/src/adafruit_blinka/agnostic/ /pyboard/lib/adafruit_blinka/
mkdir /pyboard/lib/adafruit_blinka/board
mkdir /pyboard/lib/adafruit_blinka/microcontroller
上記1.が終わったら、2.〜3.を実行する。Raspberry Pi Picoの場合は、以下3つのコピーで完了した。
cp -r Adafruit_Blinka/src/adafruit_blinka/board/raspberrypi /pyboard/lib/adafruit_blinka/board/
cp -r Adafruit_Blinka/src/adafruit_blinka/microcontroller/rp2040 /pyboard/lib/adafruit_blinka/microcontroller/
cp -r Adafruit_Blinka/src/adafruit_blinka/microcontroller/generic_micropython /pyboard/lib/adafruit_blinka/microcontroller/
これらの必要ファイルを探し出した時のrshellセッションは以下(Ctrl-xでREPLを抜けた箇所は、後から【Ctrl-xを入力】と注釈を入れた)。他のマイコンでも同じような手順を踏めばインストール出来るだろう。
/home/common/work/EleDIY/CircuitPython/Blinka> repl
Entering REPL. Use Control-X to exit.
>
MicroPython v1.18 on 2022-01-17; Raspberry Pi Pico with RP2040
Type "help()" for more information.
>>>
>>> import board
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/lib/board.py", line 37, in <module>
ImportError: no module named 'adafruit_blinka.board.raspberrypi'
>>> 【Ctrl-xを入力】
/home/common/work/EleDIY/CircuitPython/Blinka> cp -r Adafruit_Blinka/src/adafruit_blinka/board/raspberrypi /pyboard/lib/adafruit_blinka/board/
/home/common/work/EleDIY/CircuitPython/Blinka> repl
Entering REPL. Use Control-X to exit.
>
MicroPython v1.18 on 2022-01-17; Raspberry Pi Pico with RP2040
Type "help()" for more information.
>>>
>>> import board
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/lib/board.py", line 37, in <module>
File "/lib/adafruit_blinka/board/raspberrypi/pico.py", line 6, in <module>
ImportError: no module named 'adafruit_blinka.microcontroller.rp2040'
>>> 【Ctrl-xを入力】
/home/common/work/EleDIY/CircuitPython/Blinka> cp -r Adafruit_Blinka/src/adafruit_blinka/microcontroller/rp2040 /pyboard/lib/adafruit_blinka/microcontroller/
/home/common/work/EleDIY/CircuitPython/Blinka> repl
Entering REPL. Use Control-X to exit.
>
MicroPython v1.18 on 2022-01-17; Raspberry Pi Pico with RP2040
Type "help()" for more information.
>>>
>>> import board
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/lib/board.py", line 37, in <module>
File "/lib/adafruit_blinka/board/raspberrypi/pico.py", line 6, in <module>
File "/lib/adafruit_blinka/microcontroller/rp2040/pin.py", line 6, in <module>
ImportError: no module named 'adafruit_blinka.microcontroller.generic_micropython'
>>> 【Ctrl-xを入力】
controller/n/work/EleDIY/CircuitPython/Blinka> cp -r Adafruit_Blinka/src/adafruit_blinka/microcontroller/generic_micropython /pyboard/lib/adafruit_blinka/microc
/home/common/work/EleDIY/CircuitPython/Blinka> repl
Entering REPL. Use Control-X to exit.
>
MicroPython v1.18 on 2022-01-17; Raspberry Pi Pico with RP2040
Type "help()" for more information.
>>>
>>> import board 【← 成功!!】
>>>
ESP32にもBlinkaをインストール出来るか?
ESP32で動いているMicroPythonにもBlinkaをインストール出来ればCircuitPythonの豊富なドライバが利用出来るようになる筈。しかし残念ながら手持ちのESP32ボードにインストールを試みたものの、ボード自体が認識されずBlinkaのインストール自体出来なかった。まぁ、Adafruit社にしてみれば中華ボードに対応させるメリットは特に無いだろうし、仕方無いかな。
CircuitPythonライブラリのインストール
Blinkaのインストールが完了すれば、ラズパイPicoにCircuitPythonを直接インストールした直後と同様な状態になっており、あとは適宜必要なライブラリをインストールすることでCircuitPythonとソースコード互換でプログラムを動かすことが出来るようになる。
ライブラリのインストール方法
インストールは簡単で、単にMicroPythonのlib/(rshellを使う時は/pyboard/lib/)ディレクトリへライブラリをコピーするだけだ。但し、MicroPythonでは.mpy形式を認識しないので、.pyのライブラリソースコードをコピーしてあげる必要がある。
ネイティブCircuitPythonとの差分
Raspberry Pi Picoでboard.board_idを調べたところ、MicroPython上では全て大文字になってしまうようだ。
>>> import board
>>> board.board_id
'RASPBERRY_PI_PICO'
これに関しては、lowerメソッドでboard_idを小文字に変換してから参照するようにすれば良いだろう。例えば、前回記事のプログラムでPicoとそれ以外の場合分けをif文で行うような場合、
if board.board_id == 'raspberry_pi_pico':
:
以下のように書き換えれば互換性は保てる。
if board.board_id.lower() == 'raspberry_pi_pico':
:
まとめ
MicroPythonが動作するマイコンにBlinkaをインストールしてCircuitPython化する方法をまとめた。
CircuitPython未対応のESP32やESP8266など手持ちのマイコンでも動作してくれたらと考えたが、残念ながら未対応の様子。期待薄のような気もするが、今後対応化してくれると有難いなと思う。
コメント