気圧から高度を取得する ~ Raspberry Pi でBMP280を使用してみた

2020年6月4日

これまでRaspberry Pi(ラズベリーパイ)にGPS受信機を付けてデータを取得するプログラムを作ってきました。その時に、取得する各種データの中で、高度の精度がイマイチだという話をしました。GPS受信機の特性かもしれませんが、このままでは高度のデータ取得には使えません。

そこで、気圧から高度を割り出してみようと思いました。CASIOのプロトレックなども、気圧から高度を割り出しています。調べると、ボッシュのセンサーを使う例がたくさんありました。私は、「BMP280」というセンサーを選びました。

1.BMP280について

BMP280は、気圧と気温を測定できるセンサーです。使用例では湿度も測定できる「BME280」が多いですが、価格の安いBMP280を選びました。

ボッシュから、これらセンサーのドライバーや使用例が提供されています。

https://github.com/BoschSensortec

私も、BMP280のドライバと例をダウンロードして動かしてみました。ところがビルドはできるのですが、実行するとデバイスを認識してくれません。i2ctoolを使うと、BMP280は認識されているのですが、うまく動作できませんでした。

そこで、下記の作者さんのライブラリと例を使用させていただきました。すばらしい内容のサイトです。

今回は、上記サイトさんのプログラムをそのまま使う、加えてフォームアプリケーションへ移植して動かしています。(そのため、高度計算以外のソース提供はありません)

2.BMP280とRaspberry Piの接続について

BMP280とRaspberry Piの接続は以下のとおりです。(左はBMP280)

VCC -> 3.3V
GND -> GND
SCL -> GPIO3(SCL1)
SDA -> GPIO2(SDA1)
CSB -> 3.3V
SDO -> 未接続 ->GND接続に変更

上記の接続にしました。この接続については、参考にしたサイトによって違いがあり、少し自信がありません。

i2cdetectによるダンプでは、I2Cが有効の0x76であることを確認しています。

3.プログラムをフォームベースにする

「ボクにもわかる電子工作..」さんが提供するプログラムを動かすと、問題なく値が取得できました。そして今回は、「Qt Creator」によるフォームベースのプログラムを作ります。同時に、気圧から高度を計算します。

元のプログラムソースは、ほぼそのままに使います。「Qt Creator」がC++ベースなので、Cソースの取り込みは「extern “C"」を使います。詳しくは、巷に溢れているC++でCのソースを取り込む記事を参考にしてください。

4.気圧から高度を計算する

気圧から高度を計算する式は、少し複雑です。式は以下のサイトを参考にしてみました。

そして、ソースにしたものが以下のコードです。変数が適当すぎるところはご了承ください。

float MainWindow::GetAltutude(float wkTemp, float wkPress) {
    float wkAltitude = 0;
    float seaAltitude = (float)1013.25 ;
    float PressJyou = (float)1 / (float)5.257 ;

    float wkPressHi = seaAltitude / wkPress ;

    float wkPress2 =  powf(wkPressHi, PressJyou) ;
    wkPress2 = wkPress2 - (float)1 ;

    float wkTemp2 = wkTemp + (float)273.15 ;

    wkAltitude = wkPress2 * wkTemp2 / (float)0.0065 ;

    return wkAltitude ;
}

floatで計算していることや、キャストが旧型式などは適度に修正してみてください。

5.取得したデータ

実際に取得したデータは、一応それらしい数値になっています。上画像は、オリジナルプログラムの結果と、移植したフォームアプリの結果を並べています。どちらも、ほぼ同じ値を示しています(タイミングで少しずれます)

しかし、近くのアメダスと比較すると、気圧が4hPaほど低く出ます。これはBMP280を使ったときの誤差の範囲内なのか、使い方を間違っているのかが良く分かりません。
※アメダスの値が海面の気圧に変換されているためでした。

CSBやSDOの配線と、プルアップ抵抗の操作(外したりする必要がある記述も見ましたが、老眼が進んだ今の私には無理)が必要なのかもしれません。

日によって気圧が上下して高度が変わりますが、その都度に高度補正をすれば使えそうです。実際の山歩きで使えるように改良しようと思います。

動作テスト継続中

取得したデータがどれだけ正確かをテストしています。フォームアプリケーションは、上画像のようにバージョンアップしました。

気圧補正は、近くのアメダスと比較して誤差がある場合に入力します。アメダスの気圧が海面における値に変換されていることに注意してください。

また、日によって気圧が高い日と低い日があります。そうなると海面気圧も変わるわけですが、プログラムでは海面気圧を「1013.25」で固定にしています。

そのため、海面気圧を利用して計算する高度が上下してしまいます。そこで、高度が分かっている場所で高度を補正する機能も付けました。それでも、1日で気圧は結構変わるので完全ではありませんが、これでしばらくテストしていきたいと思います。

※海面気圧を高度から取得する方法の方が良いのかもしれません。今のテスト次第で変更したいと思います。

BMP280を「Raspberry Pi Zero」に接続するだけで、気圧と温度が簡単に取得できます。費用は業者に頼むよりも格段に安くできるので、作ってみてはいかがでしょうか。

BMP280センサーは、kunimiyasoftアイテムセンターで紹介しています。

2020年6月20日のログ

2020年6月20日に、自宅でログを取ってみました。

気圧ですが、値に跳ねている時が結構見受けられます。これでは、高度がおかしくなります。値が跳ねた場合は無効にする処理が必要かもしれません。

->SDOをGND接続していなかったためのようです

こちらは温度ですが、やはり跳ねている値があります。温度自体は、横に置いていた温度計とほぼ同じでした。

このように、エラー値の処理を考えないと、実用で問題になりそうです。

>SDOをGND接続していなかったためのようです

128m標高点に行ってみた

本当は登山でテストしたいのですが、登山をやめたので近くの丘でテストしました。

予定では340m標高点に行く予定でしたが、時間が取れないため、すぐ近くの丘に変更しました。

テスト日は気圧が高いため、スタート地点の標高を+補正します。スタート地点を57mと補正しましたが、実際は47mくらいでした。

ログを見ると、最高点は136mくらいです。これは、補正した時の標高が高すぎたため、実際よりも高い標高が出たと思います。正直、これほど近い値が出るとは思いませんでした。

しかし、相変わらず値が跳ねる部分があります。跳ねるのがセンサーの個体的な問題なのか、特性的な問題なのかが分かりません。いずれにせよ、しきい値を超えた値は無効にしようと思います。

->SDOをGND接続していなかったためのようです

2020年6月25日のログ

BMP280のSDO端子をGND接続している例があったため、試してみました。すると、取得する値が安定しました。

これで、実用性の問題が解決と言えそうです!

フォームアプリケーションでの提供を開始します

フォームアプリケーションでの実行形式でプログラムを提供します。詳しくは、以下のページをご覧ください。