Adafruit-Blinkaを使ってみる

インストールと対応ボードの確認


Python GPIOライブラリのAdafruit-Blinkaを紹介します。
変わった名前のライブラリですが、CircuitPython マスコットの Blinka(とぐろを巻いた紫のヘビ)にちなんで名付けられています。
以前はAdafruit_Python_GPIOとして、こちらに公開 されていたライブラリです。

Adafruitは各種センサーと、Arduino環境でそれらを使うためのC++ライブラリを提供していますが、
pythonライブラリも提供していることを初めて知りました。
githubページはこちらで、 対応するボードの情報がこ ちらに有ります。
bananapi nanopi orangepi raspberrypi 等のSBCに対応しています。
ドキュメントはこ ちらに公開されています。

Adafruit-Blinkaのインストールは以下の手順です。
aptでインストールできるpipはバージョンが古いので、一度古いバージョンを入れてからアップデートします。
$ sudo apt update
$ sudo apt install python3-libgpiod python3-pip python3-setuptools

$ python3 -m pip --version
pip 20.3.4 from /usr/lib/python3/dist-packages/pip (python 3.9)

$ python3 -m pip install -U pip

$  python3 -m pip --version
pip 24.0 from /home/pi/.local/lib/python3.9/site-packages/pip (python 3.9)

$ python3 -m pip install adafruit-blinka

対応するボードの情報はこ ちらに有りますが、このライブラリはこ ちらのAdafruit_Python_PlatformDetectを使ってSoCの名前とボードの名前を自動検出します。
以下のコード(platformdetect.py)で自動検出の結果を確認することができます。
from adafruit_platformdetect import Detector
detector = Detector()
print("Chip id: ", detector.chip.id)
print("Board id: ", detector.board.id)

このコードを実行すると検出したChip id(SoCの名前)と、Board id(ボードの名前)を表示します。
$ python3 ./platformdetect.py
Chip id:  BCM2XXX
Board id:  RASPBERRY_PI_2B

この時点でNoneが表示された場合は、未対応のボードです。
Adafruit_Python_PlatformDetectライブラリは以下のファイルを読み込んでSoCとボードを判定します。
SoCとボードの自動検出は非常に難しいロジックですが、なかなか良くできたライブラリです。
/proc/cpuinfo
/proc/device-tree/compatible
/etc/armbian-release
/proc/device-tree/model
/sys/devices/virtual/dmi/id

こちらがOrangePi PC2の結果です。
$ python3 ./platformdetect.py
Chip id:  H5
Board id:  None

なぜかBoard idが検出できません。
デバッグコードを入れてみました。
$ python3 ./platformdetect.py
Chip id:  H5
_armbian_id board_value=orangepipc2
Board id:  None

ライブラリ内部ではこのように判定しています。
        elif board_value == "orangepi2":
            board = boards.ORANGE_PI_2

OrangePiシリーズのネーミングはちょっと変則的です。
Orangepi -> Orangepi 2 -> Orangepi PC -> Orangepi PC2 -> Orangepi 3 -> Orangepi 4 -> Orangepi 5.
Orangepi 2の廉価版がOrangepi PCで、その後継機がOrangepi PC2です。
Orangepi 2 -> Orangepi PC -> Orangepi PC2 の関係が正しく理解できていない様です。
この定義を追加する必要が有ります。
        elif board_value == "orangepipc2":
            board = boards.ORANGE_PI_PC2



このライブラリは自動検出したBoard id(ボードの名前)を元に、ボードに実装されている物理的なポート情報を決定します。
従ってadafruit_platformdetectライブラリがボードの名前を検出できないと動きません。
以下のコード(boarddetect.py)でボードに定義されている物理的なポート情報を確認することができます。
import board
print(vars(board))

Raspberry Pi2でこのコードを実行すると、[board_id=RASPBERRY_PI_2B]に定義されている物理的なポート情報を表示します。
Copyright (c) 1991-1995 Stichting Mathematisch Centrum, Amsterdam.
All Rights Reserved., 'credits':     Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands
    for supporting Python development.  See www.python.org for more information., 'license': Type license() to see the full license text, 'help': Type help() for interactive help, or help(object) for help about object.}, '__version__': '8.39.2', '__repo__': 'https://github.com/adafruit/Adafruit_Blinka.git', '__blinka__': True, 'sys': <module 'sys' (built-in)>, 'os': <module 'os' from '/usr/lib/python3.9/os.py'>, 'ap_board': <module 'adafruit_platformdetect.constants.boards' from '/home/pi/.local/lib/python3.9/site-packages/adafruit_platformdetect/constants/boards.py'>, 'board_id': 'RASPBERRY_PI_2B', 'detector': <adafruit_platformdetect.Detector object at 0x76702c40>, 'pin': <module 'adafruit_blinka.microcontroller.bcm283x.pin' from '/home/pi/.local/lib/python3.9/site-packages/adafruit_blinka/microcontroller/bcm283x/pin.py'>, 'D0': 0, 'D1': 1, 'D2': 2, 'SDA': 2, 'D3': 3, 'SCL': 3, 'D4': 4, 'D5': 5, 'D6': 6, 'D7': 7, 'CE1': 7, 'D8': 8, 'CE0': 8, 'D9': 9, 'MISO': 9, 'D10': 10, 'MOSI': 10, 'D11': 11, 'SCLK': 11, 'SCK': 11, 'D12': 12, 'D13': 13, 'D14': 14, 'TXD': 14, 'D15': 15, 'RXD': 15, 'TX': 14, 'RX': 15, 'D16': 16, 'D17': 17, 'D18': 18, 'D19': 19, 'MISO_1': 19, 'D20': 20, 'MOSI_1': 20, 'D21': 21, 'SCLK_1': 21, 'SCK_1': 21, 'D22': 22, 'D23': 23, 'D24': 24, 'D25': 25, 'D26': 26, 'D27': 27, 'I2C': <function I2C at 0x7670e2b0>, 'SPI': <function SPI at 0x76650730>}

これでboardオブジェクトには、D0やSDAのメンバー変数が存在していることが分かります。
これらがポートの名称とGPIO番号の一覧になります。
Raspberry Pi2以外のボードでは、このメンバー変数の名前とGPIO番号が変わります。



OrangePiシリーズやNanoPiシリーズのボード検出は少し厄介です。
Raspberry Piの場合、Raspberry Pi OS(旧名称はRaspbian)が使われるので問題は発生しませんが、
OrangePiシリーズやNanoPiシリーズではOSを選ぶことができます。
例えばOrangePi PCの場合、私が知っているだけでこれらのOSが公開されています。
・Xunlong images(Ubuntu/Debian)
・Armbian images(Ubuntu/Debian)
・SD card images(Ubuntu/Debian) https://sd-card-images.johang.se/
・Libre Elec images https://libreelec.tv/
・RetroOrangePi images https://www.retrorangepi.org/

ボードの判定は/proc/device-tree/modelや/etc/armbian-relaseのファイルに書かれている文字で判定し ますが、
これがOSによりまちまちの事が有り、正しく判定できないことが有ります。
特にArmbian images以外のOSでは、正しく検出できないことが報告されています。

続く
...