この記事は IoTLT Advent Calendar 2021 の11日目です。書いている時間は12日になりました...
こちらはPyCon JP 2021で登壇したネタの抜粋です。
お手軽にセンサーデータを取りたい
IoTでLチカ以降にやりたくなることの次には必ずあると思うセンサーデバイスの扱いでは?と思います。ArduinoやMicroPython等で扱うのが楽で、センサーのドライバ含むライブラリの充実さが理由でしょうか。
ここでは、センサー=マイコン系だろというところから少し外れた手段でお手軽センシングが出来ないか検討してみました。
Raspberry Piでセンサーを扱う
Raspberry PiはLinuxを動かすシングルボードコンピュータ(SBC)と言われています。言ってみればただのLinuxサーバーとも言えますが、所持してみればわかる通り、何やら部品をつけたりするピンも存在します。
GPIO(general purpose input/output)という汎用的な入出力可能なピンが多数あり、それぞれ規格に対応したピンの組合せもあります。
このGPIOはデジタルな情報しか扱うことができません(アナログとデジタルの違いについてはググってください)センサーデバイスでデジタル通信を行うような製品はたくさんあるので、アナログ的なトラブルを回避するして楽しみたい時には選択肢としておススメです。
センサー自体は有名な物を扱うと良いと思います。その時に楽する手段をここで共有していきます
CircuitPython + Raspberry Pi
Raspberry Piはいたって普通のPython(CPython)が動く環境としても使われます。PythonのIoT向けの処理系にMicroPythonやCircuitPythonがあります。 この二つは通常互換性はない(MicroPython/CircutPython側が互換性を持たせようとするが扱うハードの都合で限界がある)のですが、CircuitPythonは少し別の手段があります。それがBlinkaライブラリと呼ばれる、互換レイヤーです。
Overview | CircuitPython on Linux and Raspberry Pi | Adafruit Learning System
CircutPython向けに書かれたコードやセンサーの操作をほぼそのままRaspberry Pi上で動かすことが出来ます。最も対応したセンサーしか動かせませんが、センサーやそのほかのデバイスのライブラリは豊富に用意されています。全てBlinka上で動かせるわけではないと思われますが、よく使われるセンサーデバイスや小型ディスプレイ、LED系なんかは大体あるように見えます
ライブラリ一覧の検索は、PyPI上でadafruit-circuitpython
で検索すると探しやすいはずです。
adafruit-circuitpython
: Search results · PyPI
Blinkaライブラリの扱い方は、英語ですが公式ドキュメントをたどるとわかりやすいです。
作例
PyCon JP 2021 で登壇したときのプロジェクトで使っています。詳しくはこちら(手抜き説明ですみません...)
slides/slide.pdf at master · hrsano645/slides
BME280をRaspberry Pi 4 + Blinkaライブラリ + adafruit-circuitpython-bme280ライブラリ を使って、センサー情報を取得したうえでダッシュボードアプリ上にグラフを載せています。
adafruit-circuitpython-bme280 · PyPI
BME280は実際にはAE-BME280を使いました。さらにSPI接続をしています。サンプルコードはこちらです。
homeenvdash-mini/test_bme280.py at main · hrsano645/homeenvdash-mini
import time
import board
from adafruit_bme280 import basic as adafruit_bme280
import digitalio
# OR create sensor object, using the board's default SPI bus.
spi = board.SPI()
bme_cs = digitalio.DigitalInOut(board.D5)
bme280 = adafruit_bme280.Adafruit_BME280_SPI(spi, bme_cs)
# 海の気圧を描くこと。大体1013hPaとのこと
#
bme280.sea_level_pressure = 1013.25
while True:
print("\nTemperature: %0.1f C" % bme280.temperature)
print("Humidity: %0.1f %%" % bme280.relative_humidity)
print("Pressure: %0.1f hPa" % bme280.pressure)
print("Altitude = %0.2f meters" % bme280.altitude)
time.sleep(2)
まとめ: 楽して楽しくセンサーを扱おう
少しだけIoTをかじりつつ、色々と興味が沸いた結果積みボードが増えつつありますがせっかく積んでも使わないともったいないです。
センサーを扱うライブラリは扱いやすいもの増えていますし、身近で見えない情報を見るにはピッタリだと思います。
皆さんの中でRaspberry Piを余らせている方がいたら、ぜひセンサー(とその他ワイヤーやブレットボードは必要ですが😅)を買ってお手軽センシング生活をしてみてはいかがでしょうか?