Raspberry Pi で、温度湿度気圧センサーの BME280 から、測定値を読み取ります。
というネタは、ネット上に溢れているのですが、困ったことに、ほとんどがPythonで書かれているため、C/C++で書かれたものが少なく、参考にならないとか、外部のI2Cライブラリに依存していて、そもそもI2Cハードウェアやライブラリを持たないようなマイコンチップで応用しづらい、などの不便さを感じました。そこで、この記事では、次のような方針でBME280から値を読み取ります。
- Amazonで820円で買える激安センサーを使用する
- C++で実装
- I2Cの信号線を自前制御
お手軽に購入できる、安いセンサーモジュールを使用します。
作例では Raspberry Pi を使用しましたが、メモリの少ないマイコンチップなどでの使用も想定し、C++で実装しています。AVRマイコンとavr-gccの様なプラットフォームにも簡単に移植できると思います。classを解体すればC言語にすることもできるでしょう。
最近の多くのマイコンチップにはI2Cの送受信ハードウェアが搭載されていますが、そういった機能が使えないチップを想定し、GPIOをダイレクト制御して、ソフトウェアI2Cによる通信を行います。
BME280から値を読み出す処理は、スイッチサイエンス社が公開しているArduino用のサンプルプログラムを元に開発し、ソフトウェアI2Cライブラリは、昔私が自作したものを使用しています。
ソースコード: https://github.com/soramimi/bme280
Raspberry Pi のヘッダから4本の線を引き出します。
- 1番ピン : 3.3V
- 3番ピン : SDA
- 5番ピン : SCL
- 6番ピン : GND
I2Cは電源以外に2本の信号線で双方向通信を行う規格です。Raspberry PiはハードウェアI2Cの機能を搭載していますが、それは使用せず、GPIOとして直接制御し、ソフトウェアI2Cを実現しています。
センサー基板のシルク印刷の通りに線をつなぎます。VCCとSDOは3.3Vに接続します。CSBというピンは使いません。
Raspberry Pi でC/C++を使ってGPIO制御するには、次のライブラリが使いやすいです。
http://www.airspayce.com/mikem/bcm2835/