CircuitPythonにドライバを追加してデバイスを動かす

少し前にラズパイLinux上でCircuitPython互換環境を構築するとpipでCicuitPython用ドライバのインストールが出来て幸せ、という記事をまとめた。では、Picoで動作する組み込み版CircuitPython(この記事に簡単な使い方はまとめた)のドライバのインストールってどうやってやるの?と思いやってみることにした。

スポンサーリンク

まずはI2Cスキャンを試す

ライブラリのインストールを行う前に、I2Cスキャンだけならデフォルト状態でも動かす事が出来るので試しておく。ちょっとした落とし穴があって、Pico版はLinux版と全く同じ挙動をするわけでは無いことが分かった。以下が、Pico上で動作するプログラム。Picoかどうかをboard.board_idで判定するため、4行目にif文を追加している。

import board
import busio

if board.board_id == 'raspberry_pi_pico':
    i2c = busio.I2C(board.GP1, board.GP0)
    while not i2c.try_lock():
        pass
else:
    i2c = busio.I2C(board.SCL, board.SDA)

port = i2c.scan()
print(hex(port[0]))

Pico版ではI2Cのピンアサインboard.SCLとbaord.SDAが何故か定義されておらず、5行目は仕方なくPicoのGIPO番号を直接指定している。また特にオートリロードで実行した場合、ボードが起動した直後はI2Cバスの初期化が終わっていない時があり、6〜7行目でi2c.try_lock()を実行して初期化の完了を待っている。

I2Cデバイスを接続した状態で、上記コードをCtrl-Eの貼り付けモードで実行した結果は以下。

I2Cスキャン

ライブラリのインストール方法

CircuitPythonの公式ライブラリは、下記サイトで配布されている。ライブラリにはハードウエアのドライバは勿論のこと、HTTPサーバなどネットワーク関連ライブラリなど各種用意されている。

CircuitPython - Libraries
The easiest way to program microcontrollers

ライブラリのバージョンはCircuitPythonのメジャーバージョンに合わせる必要があり、2022年5月時点の最新版は7.2.5だから7.x用のZIPファイルををダウンロードする。

ダウンロードしたZIPファイルを展開するとサブフォルダlib/の下に.mpyファイルが沢山現れる。.mpyファイルとは.pyファイルをコンパイルした中間コードで、.pyファイルよりもサイズが小さいためマイコンへのロードが速くなりストレージも節約出来る。サブディレクトリrequirements/の下にあるテキストファイルにライブラリが必要とする依存ライブラリが列挙されており、使いたいライブラリ本体と依存ライブラリをCircuitPython側にコピーすればインストール完了だ。

SSD1306ディスプレイを動かしてみる

この記事でLinux上のCircuitPythonでも動かしたSSD1306ディスプレイをPico上のCircuitPythonでも試す。

ドライバのインストール

SSD1306小型OLEDディスプレイ用ドライバはadafruit_ssd1306なので、まずはライブラリの依存関係が書かれたrequirements/adafruit_ssd1306/requirements.txtを確認する。requirement.txtの中身は以下のような物。

# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries
#
# SPDX-License-Identifier: Unlicense

Adafruit-Blinka
adafruit-circuitpython-busdevice
adafruit-circuitpython-framebuf

#で始まる行はコメントだから無視し、Adafruit-Blinkaとadafruit-circuitpython-busdeviceはデフォルトでファームウエアに含まれているから、ドライバ本体以外で追加が必要なのはadafruit-circuitpython-framebufのみ。というわけで、adafruit_ssd1306.mpyと共にadafruit-circuitpython-framebuf.mpyをCIRCUITPYドライブのlibフォルダにコピーすればドライバのインストールは完了だ。

デフォルトフォントでのディスプレイ表示

この記事で動かしたコードのi2c初期化コードを少し変更してPicoでも動くようにしたプログラムは以下。

import board
import busio
import adafruit_ssd1306

if board.board_id == 'raspberry_pi_pico':
    i2c = busio.I2C(board.GP1, board.GP0)
else:
    i2c = busio.I2C(board.SCL, board.SDA)

display = adafruit_ssd1306.SSD1306_I2C(128, 64, i2c)
display.fill(0)
display.show()

display.text("Hello world!", 0, 0, 1)
display.show()

このプログラムをCIRCUITPYドライブのcode.pyに保存し、
デフォルトのフォントファイルfont5x8.binをCIRCUITPYドライブにコピーする。

オートリロードでプログラムが実行されると、下の写真のようにテキストが表示された。

PicoでSSD1306の描画

TrueTypeフォントでの表示は不可

この記事で試したTrueTypeフォントでのテキスト描画は、CPython(PC上で動作するPython)のライブラリPIL(Python Imaging Library)を使っており、CircuitPythonでは実行不可能と判明。残念…

まとめ

ラズパイPicoで動作する組み込み版CircuitPythonにドライバをインストールしてI2C接続のディスプレイを動かしてみた。この記事にてPicoじゃないラズパイで試したLinux上のpipコマンド一発でライブラリをインストールするのと比べてしまうと手間が増える印象。そのうえPythonコードの互換性が完全ではない点も微妙。とはいえ、MicroPythonと比べるとハードウエアの対応数は圧倒的に多い所は魅力なので、うまく使い分けて行ければと思う。

コメント