前回の記事で、小さなLinuxマシンNanoPi NEOと、そのセットアップ方法を紹介しました。
今回はそのNanoPi NEOに、温度・湿度・気圧の3つが測れるセンサーBME280をつないでみます。
以前、Raspberry Piにもこのセンサーをつないだことがあります。 NanoPi NEOでも同じように使えます。
BME280
BME280とは、ドイツのボッシュが出している湿度・気圧センサーです。湿度を正確に測定するために温度センサーも内蔵しています。必ずしも気温を測るための温度センサーではないので若干ずれることもありますが、まあほぼ同じでしょう。
I2CまたはSPIで通信することで、温度・湿度・気圧のデータが取れます。
センサーには個体差がつきものですが、工場で個体差を吸収する調整が行われて出荷されているため、誤差の少ないデータが取れるようになっていて便利です。
Raspberry Piにつないでみよう
BME280モジュールの準備
私が買ったBME280モジュールはピンヘッダを自分ではんだ付けする必要があるタイプでしたので、はんだ付けをしてみました。
はんだごてがない方は、こちらのICテストクリップケーブルを使って、端子同士を引っかけてつかうこともできます。ピンヘッダにもスルーホールの穴にもクリップできるので便利です。ただし、ショート⚡️させないよう注意してくださいね。
NanoPi NEOへの接続
Raspberry Piのピンヘッダは上図のように機能が割り当てられています。このモジュールはI2Cで通信するので、次のピンに接続します。
NanoPiピンヘッダ | BME280モジュール | 説明 |
---|---|---|
OUT (3.3V) | VIN | 電源(3.3V) |
SDA (I2C0) | SDA | I2Cデータ |
SCL (I2C0) | SCL | I2Cクロック |
GND | GND | グランド (0V基準電圧) |
これらをジャンプワイヤーで接続すると、次のようになりました。
PythonからBME280にアクセス
正しく接続できたら、早速NanoPi NEO上でPythonからアクセスしてみましょう。
なお、ここから先はNanoPi NEOのOSとしてArmbian 22.08 Jammyを使った場合の例を示します。 他のOSの場合は動かし方が異なるかもしれませんのでご注意ください。
I2Cの有効化
NanoPi NEOのArmbianは初期状態でI2Cが無効になっています。
有効化するには、armbian-config
を使うと便利です。
$ sudo armbian-config
で設定画面を起動します。
Hardwareを選びます。
有効にするインターフェースにアスタリスクをつけます。スペースキーを押すとON/OFFが切り替えられます。
ここで、I2C0を有効にしましょう。
これでarmbian-config
を終了すると、再起動を促されるので再起動しましょう。
再起動すると、I2C0が使えるようになっています。試しに、i2cdetect
でデバイススキャンをしてみましょう。
$ sudo i2cdetect -y 0 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- 76 --
I2Cアドレス0x76にデバイスが見つかりました。 このBME280モジュールのI2Cアドレスは0x76なので、正しく認識できています!
Pythonライブラリのインストール
アメリカでオープンソースハードウェアを展開しているAdafruit IndsustriesがBME280のPythonライブラリを公開しているので、使わせていただきましょう😌
PyPIにも登録されているので、pipを使って簡単にインストールできます。まずはpip
をインストールします。
また、libgpiod
も必要になるので、あわせてインストールしておきます。
$ sudo apt install python3-pip python3-libgpiod
続いて、先ほどのライブラリをインストールします。
$ sudo pip3 install adafruit-circuitpython-bme280
これで準備が完了です。
サンプルプログラム
準備ができたら、次のようなプログラムを適当な名前で作成しましょう。
$ nano bme280_test.py
中身は次のようになります。
import time import board from adafruit_bme280 import basic as adafruit_bme280 i2c = board.I2C() bme280 = adafruit_bme280.Adafruit_BME280_I2C(i2c, address=0x76) while True: print("\nTemperature: %0.1f C" % bme280.temperature) print("Humidity: %0.1f %%" % bme280.relative_humidity) print("Pressure: %0.1f hPa" % bme280.pressure) time.sleep(5)
これを実行すると、センサーの値が読めます。
$ sudo python3 bme280_simpletest.py Temperature: 29.9 C Humidity: 49.2 % Pressure: 1012.3 hPa (...1秒ごとに表示が続く)
おめでとうございます!センサーの値が簡単に読めましたね。 便利なライブラリを使えばらくらくですね。
一般ユーザーで実行したい
これまでのコマンドを見てもわかるように、全てsudo権限で実行しています。 実はArmbianのデフォルトではI2CやGPIOのアクセスにはsudo権限が必要になっています。
でも一般ユーザで実行させたい場合もありますよね。 そのような場合は、次のようにして権限を変更する必要があります。
I2Cの権限変更
I2Cのデバイスファイルは/dev/i2c-0
です。このパーミッションは次のようになっています。
$ ls -l /dev/i2c* crw-rw---- 1 root i2c 89, 0 9月 9 17:32 /dev/i2c-0
rootとi2cグループのユーザーがI2Cにアクセスできるみたいです。
というわけで、自分自身をi2cグループに参加させましょう。例えば自分のユーザー名がmikanだった場合は、次のようにします。
$ sudo usermod -aG i2c mikan
これで、sudoなしでI2Cにアクセスできるようになりました。
GPIOの権限変更
NanoPi NEOの場合、I2CにアクセスするにはGPIOのアクセス権も持っている必要があるようです。
GPIOのデバイスファイルは/dev/gpiochip*
です。見てみましょう。
$ ls -l /dev/gpio* crw------- 1 root root 254, 0 9月 9 17:43 /dev/gpiochip0 crw------- 1 root root 254, 1 9月 9 17:43 /dev/gpiochip1
rootしかいじれないよう、厳しいパーミッション設定になっています。 I2Cと違いできることが多いので、下手にいじられるとシステムが壊れるからセキュリティ上あえて厳しくしているのかもしれません。
リスクを承知で一般ユーザーでも使えるようにするには、例えばudevルールをカスタマイズする方法があります。
エディタで/etc/udev/rules.d/99-gpiod.rules
というファイルを作成しましょう。
$ sudo nano /etc/udev/rules.d/99-gpiod.rules
中身は次の1行だけ記載して保存します。
SUBSYSTEM=="gpio", KERNEL=="gpiochip[01]", GROUP="gpiod", MODE="0666"
これで、/dev/gpiochip0
と1
のパーミッションが666、つまり一般ユーザーでもアクセスできるようになります。
再起動すると、パーミッションが変わっていることがわかります。
$ ls -l /dev/gpio* crw-rw-rw- 1 root root 254, 0 9月 9 17:32 /dev/gpiochip0 crw-rw-rw- 1 root root 254, 1 9月 9 17:32 /dev/gpiochip1
これで一般ユーザーもGPIOにアクセスできるようになりました。
うごかしてみよう
ここまでくれば、先ほどのサンプルプログラムがsudoなしで実行できます。
$ python3 bme280_simpletest.py
エラーが出ずにセンサーの値が取れましたね。
このように、NanoPi NEOでもI2Cを使って様々なセンサーなどにアクセスできます。 コンパクトなLinuxボードなので、使い道が多そうですね。
ぜひ活用してください!