ラズパイはLinux (2) I2CデバイスBME280をつなぐ
ラズパイのもつセンサなどを接続するI2CやSPIバスを利用するために、インストール時のデフォルトから設定を変更します。2019年6月のRaspbian Busterがリリースされるまでは、設定後にリブートが必要でしたが、今は不要になりました。
メイン・メニューのPreferencesからRaspberry Pi Configurationをクリックします。
Interfaceのタブを選びます。SPIとI2CをEnableにし、OKをクリックして設定は終了です。
●ルートから見えるファイル
File Managerの左メニュー・アイコンの一番上 / がファイル・システムの一番上位になります。その下にbootフォルダがあり、その中にconfig.txtがあります。
ターミナルを起動し、
sudo mousepad |
と入力します。Windowsのように右クリックで管理者で実行のような機能はデフォルトではありません。sudoを最初に入れたので、root権限でテキスト・エディタのmousepadが起動します。
mousepadが開いた中に、マウスを使ってconfig.txtをドラッグします。
config.txtは、ラズパイが立ち上がるとき、いろいろな設定、デバイス・ドライバの組み込みなどを指示できるシステムのファイルです。通常、
sudo nano /boot/config.txt |
としてnanoというテキスト・エディタを利用することが多いのですが、ここではGUIで使えるmousepadを利用します。
●デバイス・ドライバを組み込む
Linuxに限らず、今のOSは、必要なときに必要なデバイス・ドライバを組み込んで利用します。世の中に利用できるデバイスをすべて読み込むと、メモリに入りきらないからです。WindowsではPnPという機能やUpdateで、自動的にデバイス・ドライバを組み込んだり更新する機能が多くの場合うまく働きます。
ラズパイでは、/boot/overlaysにコンパイル済みのデバイス・ドライバが入っているので、利用したいデバイスをconfig.txtに記述して、リブートします。
今、テキスト・エディタのmousepadでその作業をしようとしています。
/boot/overlaysの中にREADMEがあるので、ダブルクリックして開きます。
キーボードのCTRL-Fで検索をします。BME280(後述)と入れると、該当個所を見つけてきます。
記述の方法が書いてあります。
dtoverlay = i2c-sensor,bme280,param=0x76 |
これを、config.txtの最後の行に追加します。
キーボードのCTRL-Sで上書き保存をします。root権限で立ち上げているので、システム・ファイルの書き込みはエラーなく正しく実行されます。sudoを使うと、普通のLinuxではパスワードを聞かれるのですが、ラズパイのpiユーザの場合、不要です。
デバイス・ドライバの組み込みを有効にするためにリブートしますが、その前に、次のようにセンサの接続を行います。
●接続
ラズパイをシャットダウンし、緑のLEDが消えたら電源を切ります。BME280をつなぎます。BME280は温度、湿度、気圧が同時に測れる便利なボッシュのセンサです。
GPIOの1番ピンから順に、次のようにBME280のボードをジャンパ・ピンで接続します。メス-メス・タイプを使います。
BME280はアマゾンで入手しました。多くは、香港や深センからの発送なので、郵送時間が10日ほどかかりますが、今回はアマゾンの倉庫からだったので、翌日に届きました。
「HiLetgo BME280 温度 センサー 湿度 センサー 気圧 センサー Arduino センサー 大気圧センサ 温湿度センサー ブレイクアウト Arduinoに対応 [並行輸入品]」
プリント基板を見ると、抵抗が四つ、コンデンサが一つついています。抵抗の表示は103なので10kΩです。テスタで当たると、I2C信号のSDAとSCLはプルアップ(10kがVccにつながっている)、チップ・セレクトのCSBも同じくプルアップされているので、選択イネーブル状態、I2Cのスレーブ・アドレスを選択するSDOはプルダウンされているので、アドレスは0x76です。
BME280はI2CとSPIバスの両方をサポートしますが、このボードは、I2Cバス専用のようです。
なお、BME280はBMP280とおなじMEMSデバイスです。BMP280は価格が安いですが、湿度は測れません。内部のレジスタ構成は同じです。
●読み取ったデータ
4本の配線ですが、3.3VとVccは赤色、GNDは黒色のジャンパ線を使います。そうすると、接続の勘違いなどを早めに発見できます。
ラズパイの電源を入れます。
測定結果は、次の三か所に最新の値が書かれているので読み出します。
温度は千倍の整数値なので、22.69℃、気圧はPaなので10倍して1015.7hPa、湿度は千倍の整数値なので52.982%です。
pythonのプログラムで読み出します。値の書かれたファイルはテキストなので、オープンして読み出し、閉じるという作業を三つのファイルに対して行います。温度と湿度は整数、気圧は実数で記録されています。round()はまるめ関数です。必要な確度の桁数を得るために四捨五入的な使い方をしています。
(※) 本Webのプログラム中、インデントなどのスペースもしくは改行は、通常のプログラム内ではごみ文字になるので、コピペした後、エディタでスペース文字などを入れなおしてください。
import time
while 1:
f = open('/sys/bus/i2c/devices/1-0076/iio:device0/in_temp_input')
Temp = round(int(f.read()) / 1000.0, 1)
f.close
f = open('/sys/bus/i2c/devices/1-0076/iio:device0/in_humidityrelative_input')
Humi = round(int(f.read()) / 1000.0, 0)
f.close
f = open('/sys/bus/i2c/devices/1-0076/iio:device0/in_pressure_input')
Press = round(float(f.read()) * 10.0, 1)
f.close
message = "Temp is %sC, Humi is %sRH, Press is %shPa"
print(message % (Temp, Humi, Press))
time.sleep(3.14)
実行中の様子です。
なお、三つのデータを読み出したフォルダには、ほかにも設定用のテキストなどもあります。
2017.11.15の記事では、読み出しがおかしくなっていました。今回は、12時間ほど連続で読み出していますが、問題なさそうです。
(※)ラズパイのI2Cのバス1は、ボード内で1.8kΩの抵抗でプルアップされています。購入したBME280のボードにも10kΩの抵抗でプルアップされています。つなぐと、1.8kと10kが並列につながれます。合成抵抗は約1.5kΩです。低めですが、波形の崩れなどは未確認ですが、問題なく通信できています。