公開日:2024/11/30
title.png

32nd Season


#32-9 気圧と標高(実践)

 気圧センサBMP180モジュール(下図、およびリンク参照)を使用して、計測した気圧から標高を概算するアプリケーションを作って行きたいと思います。

a311_bmp180.jpg

 前回、理論の構築と机上検討が済ませてあるので、今回はマイコンボードへの実装と実践(実験)でテーマを閉じる予定です。

ソフトウェア設計

 今回は、M5StickC PlusUIFlowを使いたいと思います。

U/I設計

 まず、ユーザインターフェイス(U/I)を設計します。画面表示は、以下図の様な感じにしてみました。

a329_uialti.png


 M5StickC Plusのスイッチ操作に関しては、以下の通り、機能を割り当てようと思います。

 このU/Iにて一通り、想定していた必要な機能へアクセスすることができると思います。

BMP180モジュールからの読み出し

 引き続き、プログラミングの要点を考察して行こうと思います。

 こちらの関係式を使って標高を算出するためには、気圧と気温を知る必要があります。2つ共、手持ちのBMP180モジュールで測定可能です。詳しくは、以下記事をご参照ください。

  「#31-1 気圧の測定

 今回のアプリケーションでは、高い建物へ上る場合等、短い時間の気圧変化で数十メートルの高低差を測定しようとしています。従って、BMP180内部の、気圧センサ自体やAD変換器等の測定誤差が大きく影響すると予想できます。
 測定誤差の影響を低下させるため、BMP180のオーバサンプリング機能を使い、気圧データを平均化して読み出すことを選択しました。×8倍のオーバサンプリングモード(BMP180コントロールレジスタ=0xf4)を選択すると、最大測定時間25.5msで1回の測定が完了する様です(BMP180データシート)。
 よほどの高速エレベータにでも乗らない限り、それほど短周期での測定は必要ないため、問題ないと判断しました。実用上は、5sとか10s間隔くらいでの連続測定を想定しています。

読み出し値から測定値への換算

 BMP180のI/Oレジスタから読み出せる値は、センサから読み出した生のAD変換結果であるらしく、そこから実際の気温と気圧を求めるには、結構複雑な計算が必要です。計算方法については、BMP180データシートに記載があります。
 以前、Arduino UNOやDUEで完成させたプログラムがありますので、ここからM5StickC PlusのUIFlowへ移植して見ました。

 UIFlowの数値演算は基本的に浮動小数演算なのですが、BMP180データシートに記載されていた計算式は、32ビット整数演算です。このため、以下の様な修正が必要でした。

 1気圧=1,013.25hPa前後の気圧値を、小数点以下2桁(整数[Pa])まで計算するプログラムでしたので、有効数字は約6桁です。そんな高精度で測定できるセンサなの?と言う疑問は、さておき……。
 数値演算の有効数字は、32ビット符号付整数>単精度浮動小数(∵仮数部23ビット)なので、浮動小数演算すると32ビット整数演算に比べて多少不利かもしれません(精度が下がる)。しかし、単精度浮動小数の有効数字は約7桁なので、十分な精度が得られると判断しました。

※ちなみに、32ビット符号付整数の有効数字は、log10232−1≒9.33桁です。

プログラム

 完成したプログラムを以下にリンクしておきます。

  完成プログラム:alti_estima.m5f

 UIFlowから読み込んで、ご確認ください。
 M5StickC Plusに於けるUIFlowの環境立ち上げについては、こちらをご参照ください。

○○と煙が上る実験

 完成したアプリケーションを使って、動作を確認して行きましょう。M5StickC PlusとBMP180モジュールを以下接続表に従って接続してください。

M5StickC Plus 接続 BMP180モジュール
5V→(出力) VIN
GND GND
G25(SCL) SCL
G26(SDA) SDA

 こちらのプログラムをM5StickC PlusのUIFlowで実行して、実験を進めましょう。以下、実験中の様子です。

a329_expr.jpg

 準備が整ったら、実験を進めて行きましょう。

測定地点の標高推定

 まず最初に、測定地点の標高を求めて、実際の標高と比較してみたいと思います。
 こちらを参照して、測定地点付近の現在気圧を気象庁HPから調べ、基準圧力P0に設定してください。すると、標高差hに表示された値が、その地点の標高です。測定地点の標高を調べて比較して見てください。はたして、どの程度の誤差で標高を求めることができるでしょうか?

 当方の実験では、以下の様な結果となりました。

 誤差6%は、ちょっと出来過ぎな気もしますが、よくよく考えてみると、そもそも気象庁だって、どこかの気象台での観測結果を、こちらに示したのと同様な関係式を使って標高0mの気圧に換算して発表しているはずです。言わば、その逆算をしているだけなので、気象庁が発表した気圧と、観測時間や観測場所がある程度近ければ、正確な標高を知ることができて当然、でしたね……。

 本命の実験に移りましょう。

相対標高測定

 測定地点の標高を求める実験では、思った以上の手ごたえがありました。続いて、マンション🏢などの建物を上下して、相対的な標高差を測定してみたいと思います。

  実験サンプル:

 M5StickC Plusでプログラム実行している様子を撮影しながら、マンションの1階から14階までエレベータで移動して、気圧と標高の変化を記録した様子を、以下動画でご確認ください。




 動画より、各階到達時点で観測できた相対標高hを抜き出し、グラフ化して見ました(下図)。

a329_height.png

 概ね想定通りの測定結果となりました。高い山に登る様な場合だけでなく、建物の1階から2階に移動する程度の高低差(およそ3m)でも、十分検出可能な解像度を有していると判りました。ただし、BMP180モジュールから読み出した気圧値には1hPa未満の読み出し誤差が観測されているので、例えば、床面からテーブルの高さ約80cmとか、そういう細かい高さの検出は困難だと思いました。


 BMP180モジュールとM5StickC Plusを接続しただけ、という簡単な装置でありながら、中々高い精度で標高差を測定できるアプリケーションと、なりました。色々と応用が利きそうです。いと宜し。


btn_arduino.png

btn_prev.png btn_next.png

home