みかんのゆるふわ技術ブログ

Raspberry PiやIoT関係のことを書き残していきます

NanoPi NEOにI2C温湿度気圧センサーBME280をつなぐ

前回の記事で、小さなLinuxマシンNanoPi NEOと、そのセットアップ方法を紹介しました。

www.mikan-tech.net

今回はそのNanoPi NEOに、温度・湿度・気圧の3つが測れるセンサーBME280をつないでみます。

以前、Raspberry Piにもこのセンサーをつないだことがあります。 NanoPi NEOでも同じように使えます。

BME280

BME280とは、ドイツのボッシュが出している湿度・気圧センサーです。湿度を正確に測定するために温度センサーも内蔵しています。必ずしも気温を測るための温度センサーではないので若干ずれることもありますが、まあほぼ同じでしょう。

I2CまたはSPIで通信することで、温度・湿度・気圧のデータが取れます。

センサーには個体差がつきものですが、工場で個体差を吸収する調整が行われて出荷されているため、誤差の少ないデータが取れるようになっていて便利です。

Raspberry Piにつないでみよう

BME280モジュールの準備

私が買ったBME280モジュールはピンヘッダを自分ではんだ付けする必要があるタイプでしたので、はんだ付けをしてみました。

はんだごてがない方は、こちらのICテストクリップケーブルを使って、端子同士を引っかけてつかうこともできます。ピンヘッダにもスルーホールの穴にもクリップできるので便利です。ただし、ショート⚡️させないよう注意してくださいね。

NanoPi NEOへの接続

出典: friendlyelec.com

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ライブラリを公開しているので、使わせていただきましょう😌

github.com

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/gpiochip01のパーミッションが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ボードなので、使い道が多そうですね。

ぜひ活用してください!