本記事は次の記事の続編です。
前回の記事では、手元で遊んでいる、キーボード一体型のRaspberry Pi 400に温湿度・気圧センサーのBME280を初めて接続して、これらの接続方法を確立した。
今回はその接続方法を、自宅サーバをやっている、箱型のRaspberry Pi 4 Model Bに対して適用し、念願の「室内温度・湿度・気圧のグラフ化」を実現する準備を進める。
テストワイヤ
サンハヤト(Sanhayat)
【国内正規代理店品】Raspberry Pi4 ModelB 4GB ラズベリーパイ4 技適対応品【RS・OKdo版】
Raspberry Pi RS・OKdo
waves Raspberry Pi4 用 ヒートシンク 一体型 アルミケース (ゴールド)
waves(ウェイブス)
前回の記事で温湿度・気圧センサーBME280との接続を確立したRaspberry Pi 400の、OSはラズパイ界標準のRaspberry Pi OSであった。これは標準OSであるためにウェブ上に接続方法の知見が多く、迷うところはほとんどなかったが、今回のRaspberry Pi 4はOSがUbuntuだ。
PC | 用途 | 導入OS |
---|---|---|
Raspberry Pi 400 | 未定 | Raspberry Pi OS |
Raspberry Pi 4 Model B | 自宅サーバ | Ubuntu 20.04.1 LTS (Focal) |
とりあえずのスタンスでUbuntuにてBME280を動かした方法を以下に述べるが、不慣れなため本来は不要な操作も、無駄に行ってしまっている可能性があります。あらかじめご了承ください。
最初にraspi-config
コマンドを導入する。
ラズパイ上のUbuntuで、ラズパイ/Raspberry Pi OS固有のコマンドを使えるようになるのかもしれない、次のPPAを発見した。
Assorted software and drivers to support the creation of community created Ubuntu images for the Raspberry Pi 2, 3 & 3+
しかしながら、これはRaspberry Pi 4とUbuntu 20.04 (Focal) の組み合わせ向けではないようで、このPPAリポジトリを加えてsudo apt update
かけたあと、sudo apt install raspi-config
ではパッケージがないと言われた。
次のブログで紹介されている手順をやってみる。ラズパイのDebianのリポジトリを参照させる方法だ。
ちなみに、UbuntuとDebianの各バージョンの名称の対象表は、次のページにある。
Debianの名称は、実際のラズパイのUbuntu環境でも確認ができ、
$ cat /etc/debian_version
bullseye/sid
Ubuntu 20.04に対応するDebianは「bullseye」とわかるが、ブログの手順にそのまま当てはめると http://archive.raspberrypi.org/debian bullseye Release
部分で404 Not Foundになるので、適当にひとつ古い「buster」へ変えている。
以上をまとめると、ブログの手順を部分的に変更した次の手順で、ラズパイのUbuntu 20.04環境にraspi-config
コマンドが導入できた。
$ echo 'deb http://archive.raspberrypi.org/debian/ buster main' | sudo tee /etc/apt/sources.list.d/raspberrypi-debian.list
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 7FA3303E
$ sudo apt update
$ sudo apt install raspi-config
そして次のコマンドで、ラズパイのI2C通信の機能を有効にして、本体とOS側の準備を整える。
$ sudo raspi-config # CUI画面が起動する
$ sudo apt install i2c-tools
sudo raspi-config
でCUI画面が起動するので、[3 Interface Options]→[P5 I2C]→「Would you like the ARM I2C interface to be enabled?」→[Yes]→「The ARM I2C interface is enabled」と進んでいけば良いはず。
Raspberry Pi用のUbuntu 20.04.1 LTSにおいては、raspi-config
の導入と、上で次のように書いた設定変更は不要だと判明した。
sudo raspi-config
でCUI画面が起動するので、[3 Interface Options]→[P5 I2C]→「Would you like the ARM I2C interface to be enabled?」→[Yes]→「The ARM I2C interface is enabled」
変更が不要な理由としては、ラズパイ用Ubuntuのデフォルト設定にenable_uart=1
が書かれていて、I2C通信がすでに有効化されているから、らしい。
$ grep enable_uart /boot/firmware/*.txt
/boot/firmware/config.txt:enable_uart=1
/boot/firmware/syscfg.txt:enable_uart=1
ラズパイをshutdown (電源OFF) して、ラズパイのGPIOとセンサーBME280との配線を、前回の記事の接続手順と同様に実施する。その後にラズパイを電源ONする。
OS起動後に次のコマンドを実行し、「76」が現れたら、センサーとの通信はうまく行っている状態と思われる。
$ sudo i2cdetect -y 1
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 --
前回同様、次のページで公開されているサンプルのPythonスクリプトで、センサーの動作を確認する。
ただし、このPythonスクリプトはPython 2.7環境で動かすことが前提の内容。前回のRaspberry Pi 400 (Raspberry Pi OS) ではセンサーの接続方法の確立と動作確認だけが目的だったため、Pythonのバージョンは適当に2系で済ませたが、自宅サーバの環境ではPython 3系を基本にしているので、サンプルスクリプトをPython 3で動作するよう改造する。
しかしPython 3でエラーとなるのは、サンプルスクリプト内の3つのprint
文の部分だけで、ほんのちょっとの手直しで済む。手元にダウンロードしたbme280_sample.py
と、Python 3用の手直し版との差分は次の通り。print
以降を丸括弧でくくったのみだ。
$ diff ./bme280_sample.py ./bme280_sample_python3.py
95c95
< print "pressure : %7.2f hPa" % (pressure/100)
---
> print("pressure : %7.2f hPa" % (pressure/100))
103c103
< print "temp : %-6.2f ℃" % (temperature)
---
> print("temp : %-6.2f ℃" % (temperature))
117c117
< print "hum : %6.2f %" % (var_h)
---
> print("hum : %6.2f %" % (var_h))
ラズパイのPython 3環境にsmbus2
モジュールを追加したあと、サンプルスクリプトを実行する。気温・気圧・湿度それぞれで、室内環境に応じた現実的な値が表示されれば、動作確認OKである。
$ sudo pip3 install smbus2
$ sudo python3 bme280_sample_python3.py
temp : 25.03 ℃
pressure : 1022.40 hPa
hum : 50.65 %
ちなみにsudoしない場合、サンプルスクリプトの実行は次のようにエラーとなる。
$ python3 bme280_sample_python3.py
Traceback (most recent call last):
File "bme280_sample_python3.py", line 9, in <module>
bus = SMBus(bus_number)
File "/usr/local/lib/python3.8/dist-packages/smbus2/smbus2.py", line 279, in __init__
self.open(bus)
File "/usr/local/lib/python3.8/dist-packages/smbus2/smbus2.py", line 308, in open
self.fd = os.open(filepath, os.O_RDWR)
PermissionError: [Errno 13] Permission denied: '/dev/i2c-1'
エラーの原因は、エラーメッセージに表示されているように/dev/i2c-1
へのアクセス権限が無いためであり、ls -al
でも見て取れる。
$ ls -al /dev/i2c-*
crw-rw---- 1 root i2c 89, 1 Apr 2 2020 /dev/i2c-1
そこで次のコマンドで、スクリプトを実行するユーザ (一般権限) をi2c
というグループに追加すればこの問題は解消する。
$ sudo gpasswd -a $(whoami) i2c
グループ追加後はログオフして (SSH master connectionも切って)、再ログインを行う。以降は、サンプルスクリプトをユーザ自身の権限で動かすことができる。
$ python3 bme280_sample_python3.py
temp : 25.05 ℃
pressure : 1022.25 hPa
hum : 51.13 %
今回はここまで。一気に測定値 (気温・気圧・湿度) のグラフ化まで行いたかったが、力尽きました。
次回以降の記事で、自宅サーバRaspberry Pi 4に接続したセンサーBME280の測定値を、ThingSpeakでグラフ化する内容をやってみたいと思います。
続編できました。