前回まではBMP180ライブラリーを使うことでセンサーからの温度・圧力データの読み取り詳細手順をプログラミングすることなく簡単にデータ取得ができてました。

ライブラリ関数、readTemperature()関数、readPressure()関数の内部では以下の手順で処理がされてます。

  1. 補正値の読み出し(センサー製造工程にて個々のチップの補正値を書き込んだ後に出荷されてます)
  2. センサー生データの(温度・気圧)取得
  3. 補正値を使い実際の温度・気圧を算出

そこで今回はセンサー内部からの読み取り手順の詳細をこれらライブラリー関数を解析しながら調べてみようと思います。

気圧センサー

センサー概略仕様

以前の記事と重複しますが気圧センサーBMP180の仕様は

  • 検出方式:ピエゾ抵抗式
  • 電源電圧:2.0V~5.0V(モジュール) / 1.8V~3.6V(BMP180単体)
  • 気圧測定範囲:300~1100hPa
  • インタフェース:I2C(アドレス=0x77)
  • 圧力測定精度(相対):±0.12hPa(±1.0m) (@25℃/950~1050hPa)
  • 圧力測定精度(絶対):-4.0~2.0hPa (@25℃/950~1050hPa)
  • 温度測定精度(絶対):±1.0℃ typ. / ±2.0℃ max.  (0℃~65℃)
  • 測定分解能:0.01hPa(気圧)/ 0.1℃(温度)
  • データシート:BMP180(BOSCH社サイト)
  • BMP180は2015年から市場に投入されているが現在はディスコンで、後継のBP280に生産が引き継がれている。

独BOSCH製センサー

BOSCH社では気圧センサー以外にもモーションセンサー環境センサーをリリースしています、特に気圧だけでなく温度・湿度も計測できるものは環境センサーと呼んでいます。

一連の環境センサーをピックアップしてみると

型番 検出可能環境値
BMP180 大気圧・気温
BMP280 大気圧・気温
BMP380 大気圧・気温
BMP388 大気圧・気温
BME280 大気圧・気温・湿度
BME680 大気圧・気温・湿度・ガス(溶剤・アルコールなど)

 

BMP180からの気圧・温度データ取得手順

BMP180データシートのPage15に詳しく書かれてますが、概略フローは以下のようになります

  1. 補正値の読み出し:補正値は16bitx11ワード、トータル176bit)
  2. センサー生データの(温度・気圧)取得:温度データ=16bit、圧力データ=19bit
  3. 補正値を使い実際の温度・気圧を算出:温度データ=long型/単位℃、圧力データ=long型/単位Pa

 

このフローの具体的な内容はBMP180データシートPage15(以下に示す)に書かれています。

BST-BMP180-DS000-09-15

 

補正値の読み出し

フロー図に示すトップ処理「Read calibration data」」がこれに相当します、16bit長のデータが全部で11種あります、それぞれの名称がAC1~AC6、B1/B2、MB/MC/MDとなってますが、各値の意味については説明が無いので不明です。

センサー生データの取得

センサー素子(温度・気圧)のアナログ値をADコンバーターでデジタル変換したそのものです。フロー図では「read uncompensated temperature value」と「read uncompensated pressure value」の各処理がこれに相当します。

補正値を使い実際の温度・圧力を算出

得られた温度・気圧の各生データを補正値を使い計算して得られます。「calculate true temperature value」と「calculate true pressure value」がこれに相当します。

この計算式、気圧の方は結構複雑な式となってますが、式の導入の説明は記述されてないの詳細は不明です。

ただ、気圧計算の式の中にUT(Uncompensated Temperature)の項が入っているので、温度補正が入っていそうな感じはします。(推測です)

 

標高値を求める計算

気圧・気温・標高の関連一般式

カシオのKEISANサイトの「地学編」では気圧・気温・標高の計算式が紹介されてます、その中の「気圧から標高を計算」によると以下の計算式が提示されてます。

 

  • P:測定地点の気圧(Pa)
  • P0:海面気圧(Pa)
  • T:測定地点の気温(℃)

 

BMP180ライブラリで採用されている式

BMP180のデータシートのPage16によると

ということで温度は15℃と固定で計算されてます、以降に説明するライブラリーでもこの計算式が使用されてます。実際の気温との差異がどうなるか少々気になります。

ちなみにオリジナルのPDFページは以下の内容

BST-BMP180-DS000-09-16

ライブラリー

次に今回使用しているライブラリー「Adafruits BMP085 Library」の関数について説明をしていきます。

一般的にライブラリーで使用可能な関数はヘッダーファイルに定義されてますので、ヘッダーファイル「Adafruits_BMP085.h」の中味を覗いてみると以下の様になってました、

 

class Adafruit_BMP085 {
 public:
  Adafruit_BMP085();
  boolean begin(uint8_t mode = BMP085_ULTRAHIGHRES);  // by default go highres
  float readTemperature(void);
  int32_t readPressure(void);
  int32_t readSealevelPressure(float altitude_meters = 0);
  float readAltitude(float sealevelPressure = 101325); // std atmosphere
  uint16_t readRawTemperature(void);
  uint32_t readRawPressure(void);
  
 private:
  int32_t computeB5(int32_t UT);
  uint8_t read8(uint8_t addr);
  uint16_t read16(uint8_t addr);
  void write8(uint8_t addr, uint8_t data);

  uint8_t oversampling;

  int16_t ac1, ac2, ac3, b1, b2, mb, mc, md;
  uint16_t ac4, ac5, ac6;
};

 

上記の中でpublic:でて以後されている部分が公開されている関数なので、次に個々の関数を説明していきます。(一部省略してます)

float readTemperature(void);

  • 引数:無し(void)
  • 戻り値:補正温度(℃)(型=float)

 

int32_t readPressure(void);

  • 引数:無し(void)
  • 戻り値:補正気圧(Pa)(型=int32)

 

int32_t readSealevelPressure(float altitude_meters = 0);

  • 引数:標高(m)(型=float)、無指定の場合はデフォルト値の0mが使用される
  • 戻り値:海面気圧(Pa)(型=int32)

測定地点の気圧と標高を元に海面気圧を計算して戻す。標高は別途地図等の情報から入手。

 

float readAltitude(float sealevelPressure = 101325); 

  • 引数:海面気圧(Pa)(型=float)、無指定の場合はデフォルト値の101325Paが使用される。海面気圧は別途気象庁サイトのアメダス情報等から入手。
  • 戻り値:標高(m)(型=float)