SpresenseでLチカから始める (26) Wireライブラリ 温度気圧MS5637-02BA03

 TEのMS5637-02BA03は、MS5837-30BAとよく似た気圧センサです。実験用に、プリント基板に実装されている評価ボードPMOD MS5637を入手しました。

MS5637-02BA03のおもなスペック

  • 動作電圧 1.5~3.6V
  • 消費電流 0.6uA
  • 分解能 0.016mbar
  • 確度 ±2mbar(25℃、300~1200mbar)
  • 変換時間 0.5ms
  • 動作時の温度 -40~85℃
  • インターフェース I2C(最大400kHz)

接続

 Spresenseは3.3Vで利用しています。スレーブ・アドレスは0x76です。

MS5637-02BA03 Spresense
3 SCL SCL
4 SDA SDA
5 GND GND
6 Vdd 3.3V

スケッチ

 読み出し手順はデータシートには次のように指定されています。

  • リセット
  • キャリブレーション・データの読み出し
  • D1データの設定と読み出し
  • D2データの設定と読み出し
  • 温度をキャリブレーション・データで補正
  • 温度が-15℃以下、20℃以下、それ以上の温度の条件でそれぞれ補正データを計算
  • それらを使って気圧データを補正

 データの型はデータシートに従って指定しました。64ビットの型は指定していますが、コンパイラによって64ビット整数になっているかは不明です。キャリブレーション・データの最初のデータはCRCですが、計算せずに読み飛ばしました。

#include <Wire.h>
#define MS5637_address 0x76
#define reset 0x1e
#define PROMread 0xa0 //a0 to ae
#define Convert_D1 0x4a // OSR 8192
#define Convert_D2 0x5a // OSR 8192
#define ADCread 0x00
int readbuffer[12];
uint16_t c1,c2,c3,c4,c5,c6;
float Temp,P;
int64_t dT, T2, OFF, SENS, OFF2, SENS2;

void setup() {
Serial.begin(9600);
Serial.println("\nStart");
Wire.begin();
Wire.beginTransmission(MS5637_address);
Wire.write(reset);
Wire.endTransmission();
delay(100);
for ( int i = 0 ; i < 7 ; i++ ) {
Wire.beginTransmission(MS5637_address);
Wire.write(PROMread + i * 2);
Wire.endTransmission();
Wire.requestFrom(MS5637_address,2);
readbuffer[i] = (Wire.read() << 8) | Wire.read();
}
c1 = readbuffer[1]; //readbuffer[0] is CRC
c2 = readbuffer[2];
c3 = readbuffer[3];
c4 = readbuffer[4];
c5 = readbuffer[5];
c6 = readbuffer[6];
Serial.println(c1);
Serial.println(c2);
Serial.println(c3);
Serial.println(c4);
Serial.println(c5);
Serial.println(c6);
}

void loop() {
Wire.beginTransmission(MS5637_address);
Wire.write(Convert_D1);
Wire.endTransmission();
delay(100);
Wire.beginTransmission(MS5637_address);
Wire.write((byte)ADCread);
Wire.endTransmission();
delay(100);
Wire.requestFrom(MS5637_address, 3);
readbuffer[0] = Wire.read(); readbuffer[1] = Wire.read(); readbuffer[2] = Wire.read();
uint32_t d1 = readbuffer[0] << 16 | readbuffer[1] << 8 | readbuffer[2];

Wire.beginTransmission(MS5637_address);
Wire.write(Convert_D2);
Wire.endTransmission();
delay(100);
Wire.beginTransmission(MS5637_address);
Wire.write((byte)ADCread);
Wire.endTransmission();
delay(100);
Wire.requestFrom(MS5637_address, 3);
readbuffer[0] = Wire.read(); readbuffer[1] = Wire.read(); readbuffer[2] = Wire.read();
uint32_t d2 = readbuffer[0] << 16 | readbuffer[1] << 8 | readbuffer[2];

dT = d2 - c5 * pow(2,8);
Temp = 2000.0 + dT * c6 / pow(2,23);
if (Temp <2000.0) {
T2 = 3 * dT * dT / pow(2,33);
OFF2 = 61 * (Temp - 2000) * (Temp - 2000) / pow(2,4);
SENS2 = 29 * (Temp - 2000) * (Temp - 2000) / pow(2,4);
if (Temp <-1500.0) {
OFF2 = OFF2 + 17 * (Temp + 1500) * (Temp + 1500);
SENS2 = SENS2 + 9 * (Temp + 1500) * (Temp + 1500);
}
} else {
T2 = 5 * dT * dT / pow(2,38);
OFF2 = 0 ;
SENS2 = 0;
}
OFF = c2 * pow(2,17) + (c4 * dT) / pow(2,6);
SENS = c1 * pow(2,16) + (c3 * dT) / pow(2,7);

OFF = OFF - OFF2;
SENS = SENS - SENS2;
Temp = (Temp - T2) / 100.0;
P = (d1 * SENS / pow(2,21) - OFF ) / pow(2,15);
P = P / 100.0;

Serial.print("Temp ");Serial.println(Temp);
Serial.print("P ");Serial.println(P);
delay(2000);
}

 実行中の様子です。

ライブラリの利用

 MS5637で検索すると二つ見つかります。BaroLibraryを入れました。

 GitHubに行き、サンプルのSimpleBaro.inoを実行しました。

(※)個体差かもしれませんが、一度目は指でつまんでも温度があまり上がらなかったり、二度目は普通に上昇したり、独特な動きを見せることがありました。

前へ

SpresenseでLチカから始める (25) Wireライブラリ 温度気圧MS5837-30BA

次へ

SpresenseでLチカから始める (27) Wireライブラリ 温度気圧DPS310