新しいものづくりがわかるメディア

RSS


土日で完成! 趣味のラズパイ

土日で完成! 趣味のラズパイ ラズパイ工作の基本! 気温と湿度、気圧を計測する

本日から新しい連載「土日で完成! 趣味のラズパイ」がスタートします。ここでは初心者の方向けに、ラズパイを使った楽しい電子工作をご紹介していこうと考えています。目標は部品を集めてからその週末、土日で作り上げられることです。

パーツのはんだ付けはやったことがある、という人であれば、それほど難しいことではありません。Pythonのプログラムも出てきますが、できるだけ解説を入れていくようにします。

本題に戻ります。連載の第1回目として選んだのは、ラズパイで気温や湿度、気圧を測定すること、です。ご存じの方も多いと思いますが、ラズパイでのセンシングとしては、気温/湿度/気圧の測定は基本中の基本となっています。

多くのサイトで紹介されているのは、秋月電子通商などで販売されている「BME280」を使った測定です。とてもこなれているセンサーなので、いろいろなWebサイトで紹介されています。昔はこれを使うために長いコードを書いていましたが、最近ではライブラリも充実し、短いコードで利用できるようになってきました。

ということで、ここでもBME280を使ってもいいのですが、それではあまり芸がありません。そこでBME280を提供しているBosch Sensortecが作っている「BME680」を使うことにします。BME680がBME280と異なるのは、ガスセンサーが搭載されていることです。BME680のガスセンサーでは7段階で空気の質を測れますので、検知してみましょう。

今回必要なパーツと価格は以下の通りです。合わせて2000円以下で購入できます。

BME680をラズパイに接続する

BME680ですが、上でも挙げたように1キットが1320円と少し高めです。複数の機能が用意されているセンサー類は、どうしても1000円を超えてしまう傾向がありますね。

キットはBME680が配置された基板とL字型のピンヘッドで構成されています。このピンヘッドを基板にはんだ付けして使います。

BME680をこのようにはんだ付けして使う BME680をこのようにはんだ付けして使う

はんだ付けが済んだら、ブレッドボードに差して、ジャンパーワイヤーでラズパイと接続します。BME680のキットはI2C(アイ・スクエアド・シー、またはアイツーシー)という方式でラズパイとデータをやり取りします。この時に使うのは「SDA」(シリアルデータ)と「SCL」(シリアルクロック)の2本です。ラズパイではSDAは3番ピン、SCLは5番ピンに割り当てられていますので、そこと接続します。

この他に3.3V電源(ラズパイの1番ピン)、GND(ラズパイの9番ピンなど)を接続する必要があります。また基板背面にあるジャンパー回路のうちJ2をはんだ付けして短絡させます。

このようにラズパイと接続する このようにラズパイと接続する
J2を短絡する(赤丸の箇所) J2を短絡する(赤丸の箇所)

なおmicroSDメモリーカードにRaspberry Pi OSをインストールし、ラズパイに差して使う方法については、以前掲載した連載「第2回 ラズパイってどうしたら使えますか」「第3回 Raspberry Pi OSって何ですか」を参考にしてください。また今回利用するI2Cの有効化については「第4回 ラズパイを使う準備って何をしたらいいですか」を参考にしてください。

BME680で使うライブラリをインストールする

ではまず、BME680がラズパイ側で認識されているか確認しましょう。ラズパイのデスクトップを利用しても良いですが、それよりも手軽なターミナル接続で操作します。ターミナルを利用する方法については、同じく「第6回 ターミナルソフトって何ですか」を参考にしてください。

ターミナルソフトを起動してラズパイにログインしたら、「i2cdetect -y 1」と入力します。すると以下のように表示されます。

$ 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 --

このように横軸が6、縦軸が70の場所に「76」と表示されればOKです。この場合、BME680がI2Cで「0x76」のアドレスを利用している、と言います。

では続いてライブラリをインストールします。これはPIMORONIが公開しているものです。以下のコマンドを順次入力してください。

$ git clone https://github.com/pimoroni/bme680
$ cd bme680/library
$ sudo python setup.py install

これでBME680のライブラリを利用する準備が整いました。今回インストールしたファイルには、Pythonのサンプルプログラムが用意されています。センサーの値全てを読み取るテストプログラムを走らせてみましょう。

$ cd /home/pi/bme680/examples
$ python read-all.py

すると以下のように表示され、測定した値が1秒ごとに表示されます。

read-all.py - Displays temperature, pressure, humidity, and gas.

Press Ctrl+C to exit!


Calibration data:
par_gh1: 5
par_gh2: -12446
par_gh3: 18
par_h1: 618
par_h2: 1039
par_h3: 0
par_h4: 45
par_h5: 20
par_h6: 120
par_h7: -100
par_p1: 35462
par_p10: 30
par_p2: -10325
par_p3: 88
par_p4: 6124
par_p5: 36
par_p6: 30
par_p7: 25
par_p8: -531
par_p9: -3463
par_t1: 26453
par_t2: 26325
par_t3: 3
range_sw_err: 0
res_heat_range: 1
res_heat_val: 45
t_fine: 115507


Initial reading:
gas_index: 0
gas_resistance: 12946860.58570794
heat_stable: False
humidity: 43.905
meas_index: 0
pressure: 1013.28
status: 32
temperature: 22.56


Polling:
22.56 C,1013.28 hPa,43.91 %RH
22.58 C,1013.29 hPa,43.83 %RH,4704.015880716148 Ohms
22.62 C,1013.32 hPa,43.75 %RH,5307.952503912426 Ohms
22.65 C,1013.33 hPa,43.68 %RH,6452.475192311798 Ohms
22.69 C,1013.33 hPa,43.60 %RH,7848.209416808962 Ohms
22.73 C,1013.30 hPa,43.53 %RH,9293.061311990426 Ohms
22.76 C,1013.31 hPa,43.47 %RH,10812.45936080907 Ohms
……(続く)

この数値は左から気温、気圧、湿度、ガスセンサーの値となっています。

測定用のプログラムを作成する

このサンプルプログラムを元に、測定するためのプログラムを作成していきましょう。先ほどのサンプルプログラムをWindows側にコピーし、プログラム作成支援ツールの「Visual Studio Code」で読み取り、そこから要素を拾い出して作っていきます。

なおWindowsにコピーする方法については「第9回 ラズパイでWindowsとやり取りするにはどうしたらいいですか」に、Visual Studio Codeについては「第10回 ラズパイでLチカって何ですか」で述べていますので参考にしてください。

ところでPIMORONIのBME680ライブラリ紹介ページには、センサーの値を「sensor = bme680.BME680()」として読み出す、とあります。これを元に作っていけばよさそうです。作り上げたプログラムが以下となります。

#!usr/bin/env python
# -*- coding: utf-8 -*-
import bme680
import time

sensor = bme680.BME680()

sensor.set_temperature_oversample(bme680.OS_8X)
sensor.set_humidity_oversample(bme680.OS_2X)
sensor.set_pressure_oversample(bme680.OS_4X)

try:
    while True:
        output = '{0:.1f} C,{1:.1f} %RH,{2:.1f} hPa'.format(
            sensor.data.temperature,
            sensor.data.humidity,
            sensor.data.pressure)
        print(output)
        time.sleep(1)
except:
    KeyboardInterrupt

BME680の測定値を「sensor = bme680.BME680()」で呼び出したあと、続く3行で気温、湿度、気圧のデータを格納し、「sensor.data.temperature」「sensor.data.humidity」「sensor.data.pressure」で温度、気圧、湿度をそれぞれ変数「output」に格納して表示させています。そして「while True」文で繰り返し表示する仕組みです。

これを実際に走らせると、以下のような表示が無限ループで繰り返されます。このプログラムは「try:」~「except:」でくくられており、最後の「KeyboardInterrupt」で、キーボードからCtrl+Cが入力されると中断する仕組みです。

$ python sokutei.py
22.9 C,43.0 %RH,1007.0 hPa
22.9 C,43.0 %RH,1007.0 hPa
22.9 C,43.0 %RH,1007.0 hPa
22.9 C,43.0 %RH,1007.0 hPa
22.9 C,43.0 %RH,1007.0 hPa
22.9 C,43.0 %RH,1007.0 hPa
22.9 C,43.0 %RH,1007.0 hPa
22.9 C,43.0 %RH,1007.0 hPa
……(以下続く)
humidity(湿度)、pressure(気圧)、temperature(温度)とそれぞれデータが正しく取得できました。 humidity(湿度)、pressure(気圧)、temperature(温度)とそれぞれデータが正しく取得できました。

ここまでで気温と湿度、気圧の測定結果が得られるようにしました。次回はもう1つのデータ、空気の汚染度を測るやり方について解説していきます。

ニュース

編集部のおすすめ

連載・シリーズ

注目のキーワード

もっと見る