Adafruit-Blinkaを使ってみる

Adafruit CircuitPython ライブラリ


Adafruit CircuitPython ライブラリと言うライブラリが有ります。
こ ちらにライブラリの一覧が公開されています。
2024年時点で利用可能なライブラリは 273 個もあります。
これらのリポジトリを見ると全てのリポジトリのrequirements.txtにAdafruit-Blinkaが登録されています。
つまりこれらのライブラリは全てAdafruit-Blinkaをベースに構築されています。
Adafruit-Blinkaが対応しているボードでは、これらのライブラリを利用することができますが、
名前の通り、CircuitPythonをターゲットにしているので、Linux上のCpythonでは一部の機能が使えないライブラリも有りま す。



こ ちらのBMP280用のライブラリを試してみました。
$ python3 -m pip install adafruit-circuitpython-bmp280

BMP280は4ピン仕様(i2c専用)と6ピン仕様(i2c/SPI兼用)のモジュールが有りますが、
6ピン仕様のモジュールをi2cで使うときは以下の結線でi2cモジュールとして使うことができます。
BMP280 Host
Vcc 3V3
Gnd GND
SCL SCL
SDA SDA
CSB 3.3V
SDO i2cアドレス選択
Gnd=0x76/3.3V=0x77

4ピン仕様のモジュールのi2cアドレスは0x76固定となっています。
今回は4ピン仕様のモジュールを使いました。
こ ちらのサンプルコードからi2cアドレス(0x76)の指定を追加しただけです。
#!/usr/bin/python
#-*- encoding: utf-8 -*-
import time
import board
# import digitalio # For use with SPI
import adafruit_bmp280

# Create sensor object, communicating over the board's default I2C bus
i2c = board.I2C()   # uses board.SCL and board.SDA
bmp280 = adafruit_bmp280.Adafruit_BMP280_I2C(i2c, 0x76)

# OR Create sensor object, communicating over the board's default SPI bus
# spi = board.SPI()
# bmp_cs = digitalio.DigitalInOut(board.D10)
# bmp280 = adafruit_bmp280.Adafruit_BMP280_SPI(spi, bmp_cs)

# change this to match the location's pressure (hPa) at sea level
bmp280.sea_level_pressure = 1013.25

while True:
    print("\nTemperature: %0.1f C" % bmp280.temperature)
    print("Pressure: %0.1f hPa" % bmp280.pressure)
    print("Altitude = %0.2f meters" % bmp280.altitude)
    time.sleep(2)

いとも簡単に動きました。
$ python3 bmp280-i2c-lib.py

Temperature: 24.0 C
Pressure: 1014.3 hPa
Altitude = -8.98 meters

Temperature: 24.0 C
Pressure: 1014.3 hPa
Altitude = -8.84 meters

Temperature: 24.0 C
Pressure: 1014.3 hPa
Altitude = -8.98 meters



6ピン仕様のモジュールを使ってSPIで動かしてみました。
これも、こ ちらのサンプルコードからCSピンのGPIO番号をD14に変えただけです。
注意点としてこのライブラリはCSの制御を全く行いません。
SPIのCS0やCS1としてシステムでアサインされているポートをCSとして使うと、ポートBUSYでエラーになります。
#!/usr/bin/python
#-*- encoding: utf-8 -*-
import time
import board
import digitalio # For use with SPI
import adafruit_bmp280

# Create sensor object, communicating over the board's default I2C bus
#i2c = board.I2C()   # uses board.SCL and board.SDA
#bmp280 = adafruit_bmp280.Adafruit_BMP280_I2C(i2c, 0x76)

# OR Create sensor object, communicating over the board's default SPI bus
spi = board.SPI()
bmp_cs = digitalio.DigitalInOut(board.D14)
bmp280 = adafruit_bmp280.Adafruit_BMP280_SPI(spi, bmp_cs)

# change this to match the location's pressure (hPa) at sea level
bmp280.sea_level_pressure = 1013.25

while True:
    print("\nTemperature: %0.1f C" % bmp280.temperature)
    print("Pressure: %0.1f hPa" % bmp280.pressure)
    print("Altitude = %0.2f meters" % bmp280.altitude)
    time.sleep(2)

こちらも、あっさりと動きました。
$ python3 bmp280-spi-lib.py

Temperature: 24.0 C
Pressure: 1016.1 hPa
Altitude = -24.03 meters

Temperature: 24.0 C
Pressure: 1016.1 hPa
Altitude = -23.76 meters

Temperature: 24.0 C
Pressure: 1016.1 hPa
Altitude = -24.11 meters



こ ちらにDHT11/22のライブラリが公開されています。
DHT11/22は少し変わったインタフェースで、40ビット(5バイト)のディジタル値だけで温度を通知してきます。
ライブラリの内部ではディジタル入力を使って対応しています。
そこで、DHT11/22のライブラリを試してみます。
$ python3 -m pip install adafruit-circuitpython-dht

DHT11/22は4ピン仕様ですが、使用するのは3ピンだけで、向かって左からVcc/Data/NotUsed/Gndです。
DataピンをD18ポートに接続すれば、こ ちらのサンプルコードのままで動きます。
時々エラーになるのは1線式の宿命です。
$ python3 ./dht_simpletest.py
Temp: 77.2 F / 25.1 C    Humidity: 58.5%
Temp: 76.6 F / 24.8 C    Humidity: 59.9%
Temp: 76.6 F / 24.8 C    Humidity: 59.9%
Temp: 76.6 F / 24.8 C    Humidity: 59.9%
Temp: 76.8 F / 24.9 C    Humidity: 59.8%
A full buffer was not returned. Try again.
Temp: 76.8 F / 24.9 C    Humidity: 58.6%
Temp: 76.8 F / 24.9 C    Humidity: 59.8%
Temp: 76.8 F / 24.9 C    Humidity: 59.6%
Checksum did not validate. Try again.
Temp: 76.8 F / 24.9 C    Humidity: 59.6%

1線式のインタフェースにmaxim社の1-Wireインターフェースが有ります。
こ ちらにds18x20のライブラリが公開されていますが、Raspberry Piでは動かないという記事がこ こに有りました。

Adafruit-Blinkaにはpulseioとpwmioの2つのモジュールが有ります。
こちらの以下の様に書 かれていて違いが分かりません。
pulseio - contains classes that provide access to basic pulse IO (PWM)
pwmio - contains classes that provide access to basic pulse IO (PWM)

pulseioは赤外線の様にパルス幅だけが意味を持つデータ通信を行います。
赤外線の通信は特殊でON状態のパルス幅とOFF状態のパルス幅が意味を持ちます。
パルス幅を取得する必要があるので、ディジタル入力では対応できません。

pwmioはパルス周期と周期内のパルス幅を使って周辺機器を制御する処理を行います。
こ ちらにこのモジュールを使ってサーボモータを動かすサンプルが公開されています。



Adafruit-Blinkaの最大の特徴は、この273個のライブラリに有ります。
Adafruit-Blinkaさえ動くようになれば、かなりの数の周辺機器が使えるようになりますが、
元々Arduinoのために開発されたライブラリなので、上記の様にLinux環境では動かないライブラリも有ります。
ライブラリにはセンサーだけでなく、SSD1306やST7789の様なTFTも含まれています。

こ ちらのSSD1306のサンプルを実行してみました。
このサンプルを実行するためには、こ ちらのフレームバッファライブラリのサンプルに含まれるフォントファイルが必要になります。
また、手元のモジュールにはRESETピンが無いので、RESETピンの指定を無効にしています。
$ python3 -m pip install adafruit-circuitpython-ssd1306

$ git clone https://github.com/adafruit/Adafruit_CircuitPython_SSD1306
$ git clone https://github.com/adafruit/Adafruit_CircuitPython_framebuf
$ cp $HOME/Adafruit_CircuitPython_framebuf/examples/font5x8.bin $HOME/Adafruit_CircuitPython_SSD1306/examples/

$ cd $HOME/Adafruit_CircuitPython_SSD1306/examples/

$ vi ssd1306_framebuftest.py

#reset_pin = DigitalInOut(board.D5)
#display = adafruit_ssd1306.SSD1306_I2C(128, 32, i2c, addr=0x3C, reset=reset_pin)
display = adafruit_ssd1306.SSD1306_I2C(128, 32, i2c, addr=0x3C)

$ sudo -E python3 ./ssd1306_framebuftest.py

あっという間に動くのが嬉しいです。




続く...