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です。