Arduino MKR WiFi 1010をデータ入力に使う④気圧センサLPS25HB <その1>

 STマイクロシステムズのLPS25HBは、比較的新しい気圧センサで、補正などの処理が不要です。読み出した24ビットのデータを4096で割ると、hPa単位の気圧になります。

気圧センサLPS25HBの特徴

  • 動作電圧 3.3/5V(デバイスは1.7~3.6 V)
  • 消費電流 約2mA(LED分を含む。ハイレゾ、1Hz測定間隔時25uA)
  • 測定範囲 260~1260hPa
  • 確度 ±0.1hPa(25℃)、±1hPa(0~80℃)
  • インターフェース SPI、I2C
  • STEEMA QTの4ピン・コネクタはI2C専用。I2C用プルアップ抵抗は実装

 利用したのは、Adafruitのブレークアウト・ボードです。

接続

(2020/10/18)Arduino MKR WiFi 1010のSCL/SDA端子が逆に接続されていたのを修正。

プログラム

 最初にI2Cのサンプルを開きます。

 温度センサtmp102をI2Cでつないでいます。

 内容を見ながら、今回のプログラムに修正していきます。

a = arduino('COM9', 'Uno', 'Libraries', 'I2C');

は、

clear
a = arduino('COM15', 'MKR1010', 'Libraries', 'I2C')

に変更しました。

tmp102 = device(a,'I2CAddress',0x48)

は、

LPS25HB = device(a,'I2CAddress',0x5d)

に変更しました。
 この時点で、ファイル名LPS25HB.mlxで保存しました。実行します。ライブエディタはインタプリタで、1行ずつ実行し、デバッグ情報も表示してくれます。

 ワーニング(エラー)表示の赤色の部分を読むと、変数名とスクリプト名が同じだという警告です。Lps25hbに変更しました。

write(tmp102, 0x0, 'uint8');
data = read(tmp102, 2, 'uint8');
temperature = (double(bitshift(int16(data(1)), 4)) + double(bitshift(int16(data(2)), -4))) * 0.0625

 サンプルの温度センサでは、0x0を書き込み、8ビット×2のデータを読み出しています。
 LPS25HBは、電源が入った後にスリープしているので、CTRL_REG1 (0x20)レジスタに0x90を書き込んで起こします。

CTRL_REG1 = 0x20;
writeRegister(Lps25hb, CTRL_REG1, 0x90, 'uint8')

 このあと、気圧は0x28レジスタから3バイトを読みますが、期待した値を読めません。GitHubにあるいろいろなソースを読むと、0x28 | 0x80を書きこんで読むと正しい値が読み出せるようです。

PRESS_OUT = bitor(0x28, 0x80);
write(LPS25, PRESS_OUT, 'uint8')
PressData = read(Lps25hb, 3, 'uint8');

press = (bitshift(PressData(3), 16) + bitshift(PressData(2), 8) + PressData(1)) / 4096;

 最初の読み取りは7xxhPaのデータが読み出されます。データシートを読んでも理由がわかりませんでした。なので、2度目以降のデータを正しいとします。

 なお、

bitor(PRESS_OUT_XL, READ_BIT)

は、C言語では、

PRESS_OUT_XL | READ_BIT

です。

bitshift(PressData(3), 16) + bitshift(PressData(2), 8) + PressData(1)

は、C言語では、

PressData[2] << 16 | PressData[1] << 8 | PressData[0]

です。C言語では、配列の添え字は0から始まりますが、matlabは1です。

前へ

Arduino MKR WiFi 1010をデータ入力に使う③I2Cscan

次へ

Arduino MKR WiFi 1010をデータ入力に使う⑤気圧センサLPS25HB <その2>グラフ