MicroPythonにBlinkaをインストールしてCircuitPythonライブラリを使う

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.の手順で行う。

  1. 最初に最低限のファイルをコピー
  2. REPLでCircuitPythonの’board’モジュールのimportを試みる
  3. エラーが出たら、エラーメッセージで「無い」と言われたモジュールファイルを追加コピー
  4. ‘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など手持ちのマイコンでも動作してくれたらと考えたが、残念ながら未対応の様子。期待薄のような気もするが、今後対応化してくれると有難いなと思う。

コメント