STEMMAで広がるArduinoの世界②Step1 気圧センサ ±0.03hPa BMP390

 ボッシュのMEMS気圧センサは古くから製品があるようです。現在入手しやすい気圧センサは次のとおりです。

型名 会社名 電源電圧
[V]

測定範囲
[hPa]

絶対確度圧力
[hPa]
相対確度圧力
[hPa]
その他の機能
BMP280 Bosch 1.71~3.6 300~1100 ±1 ±0.12 温度
BME280 Bosch 1.71~3.6 300~1100 ±1 ±0.12 温度、湿度
BMP388 Bosch 1.65~3.6 300~1250 ±0.40 ±0.08 温度
BMP390 Bosch 1.65~3.6 300~1250 ±0.50 ±0.03 温度
BME680 Bosch 1.71~3.6 300~1100 ±0.6 ±0.12 温度、湿度、汚れ
DPS310 Infineon 1.7~3.6  3001200 ±1 ±0.06 温度
LPS25HB STMicroelectronics 1.7~3.6 260~1260 ±0.2 ±0.1 温度

 気圧(絶対確度圧力)の値は、1日ながめていてもほとんど変化しません。台風のような低気圧が近辺を通過するときは、大きく変化します。
 相対確度(分解能)は、センサによって大きく異なります。DPS310の±0.06は高度±50cm、BMP390の±0.03hPaは±25cmに相当するので、階段の上り下りを判別できます。

Adafruitのブレークアウト・ボード

 上記の表の中で、最初に相対確度圧力の細かなBME390を取り上げます。STEMMA QT(JST SH 4ピン)コネクタは2か所に装着されていて、どちらにつないでもかまいません。このコネクタを使ってI2Cで制御する場合、特に、ジャンパ線をつなぐなどは不要です。

  Adafruit BMP390 - Precision Barometric Pressure and Altimeter - STEMMA QT / Qwiic

 ボードには、5V->3.3Vのレギュレータと3.3<->5V信号レベル変換回路が入っています。BMP390は3.3Vで動作させますが、Arduino UNOでは5Vの電源を利用します。信号のHighレベルは5Vです。

 SDA/SCL信号には10kΩのプルアップ抵抗が入っています。I2Cのスレーブ・アドレスはデフォルトが0x77で、裏面のaddr(SDR)の部分をショートすると0x76になります。回路図は、次のPDFに掲載されています。

  https://cdn-learn.adafruit.com/downloads/pdf/adafruit-bmp388-bmp390-bmp3xx.pdf?timestamp=1607556313

気圧センサBME390のおもなスペック

  データシート 見つからない。下記のプログラムがBME388と共通なので、BME388のデータシートが参考になるかもしれない。

  プログラム事例 https://github.com/BoschSensortec/BMP3-Sensor-API

  • 電源電圧;1.65~3.6V
  • 温度測定範囲;不明、分解能不明
  • 気圧測定範囲;300~1250hPa、確度±0.50hPa、分解能±0.03hPa
  • インターフェース;SPI、I2C
  • I2Cアドレス;0x76、0x77どちらかを選択

使用環境

  • Arduino UNO R3
  • Arduino IDE 1.8.13
  • Windows10 20H2

接続

 電源は5V を使いました。Arduino UNO R3のI2Cは、SCLとSDA端子がありますが、SCLはA5に、SDAはA4につながっています。どちら側につないでもかまいません。白色のリード線は見えないので、黄色で配線図を描きました。

 電源がつながると、ボード上の緑色のLEDが点灯します。

スケッチ

 利用手順は、Adafruit BMP388 and BMP390 - Precision Barometric Pressure and Altimeter Overviewに書かれています。

 ライブラリを導入します。メニューのツールから、ライブラリを管理を選び、検索欄にBMP3を入力します。見つけてきたAdafruit BMP3XX Libearyのインストールをクリックします。


 同時にサンプル・スケッチも導入されます。

 メニューのファイルからサンプルの入っているスケッチ例を選択します。そこから、Adafruit BMEXXX Library - bmp3_simpletestを選択します。デフォルトでI2Cバスを使うように記述されています。スレーブ・アドレスは0x77です。ボードの裏面のaddrをショートして0x76に設定したときは、begin_I2C()の引数に0x76を記述します。

高度差

 ±25cmの分解能があるので、机の上の高度とセンサをにおろしたときの値を見ました。

 机の上;(54.13+54.04)/2 = 54.085

 床;(53.8 + 53.68+53.7)/3 = 53.726

  差=35.9cm

でした。実際の高低差は70cmなので、あまり正確とはいえない結果になりました。

パラメータ

 スケッチbmp3_simpletestのsetup()の中で、初期設定をしています。 

  // Set up oversampling and filter initialization
  bmp.setTemperatureOversampling(BMP3_OVERSAMPLING_8X);
  bmp.setPressureOversampling(BMP3_OVERSAMPLING_32X);
  bmp.setIIRFilterCoeff(BMP3_IIR_FILTER_COEFF_3);
  bmp.setOutputDataRate(BMP3_ODR_50_HZ);

 これらのパラメータで記述できる引数は、C:\Users\ユーザ名\Documents\Arduino\libraries\Adafruit_BMP3XX_Libraryのbmp3_defs.hに記述があります。

/**\name Over sampling macros */

#define BMP3_NO_OVERSAMPLING UINT8_C(0x00)
#define BMP3_OVERSAMPLING_2X UINT8_C(0x01)
#define BMP3_OVERSAMPLING_4X UINT8_C(0x02)
#define BMP3_OVERSAMPLING_8X UINT8_C(0x03)
#define BMP3_OVERSAMPLING_16X UINT8_C(0x04)
#define BMP3_OVERSAMPLING_32X UINT8_C(0x05)

/**\name Filter setting macros */
#define BMP3_IIR_FILTER_DISABLE UINT8_C(0x00)
#define BMP3_IIR_FILTER_COEFF_1 UINT8_C(0x01)
#define BMP3_IIR_FILTER_COEFF_3 UINT8_C(0x02)
#define BMP3_IIR_FILTER_COEFF_7 UINT8_C(0x03)
#define BMP3_IIR_FILTER_COEFF_15 UINT8_C(0x04)
#define BMP3_IIR_FILTER_COEFF_31 UINT8_C(0x05)
#define BMP3_IIR_FILTER_COEFF_63 UINT8_C(0x06)
#define BMP3_IIR_FILTER_COEFF_127 UINT8_C(0x07)

/**\name Odr setting macros */
#define BMP3_ODR_200_HZ UINT8_C(0x00)
#define BMP3_ODR_100_HZ UINT8_C(0x01)
#define BMP3_ODR_50_HZ UINT8_C(0x02)
#define BMP3_ODR_25_HZ UINT8_C(0x03)
#define BMP3_ODR_12_5_HZ UINT8_C(0x04)
#define BMP3_ODR_6_25_HZ UINT8_C(0x05)
#define BMP3_ODR_3_1_HZ UINT8_C(0x06)
#define BMP3_ODR_1_5_HZ UINT8_C(0x07)
#define BMP3_ODR_0_78_HZ UINT8_C(0x08)
#define BMP3_ODR_0_39_HZ UINT8_C(0x09)
#define BMP3_ODR_0_2_HZ UINT8_C(0x0A)
#define BMP3_ODR_0_1_HZ UINT8_C(0x0B)
#define BMP3_ODR_0_05_HZ UINT8_C(0x0C)
#define BMP3_ODR_0_02_HZ UINT8_C(0x0D)
#define BMP3_ODR_0_01_HZ UINT8_C(0x0E)
#define BMP3_ODR_0_006_HZ UINT8_C(0x0F)
#define BMP3_ODR_0_003_HZ UINT8_C(0x10)
#define BMP3_ODR_0_001_HZ UINT8_C(0x11)

前へ

STEMMAで広がるArduinoの世界①Step1 温度センサ±0.1°C TMP117

次へ

STEMMAで広がるArduinoの世界③Step1 湿度センサSHTC3