LPS331AP は ST mirco 製のデジタル気圧センサICです。 表面実装タイプではんだ付けしにくいのですが、DIP変換モジュールを 秋月電子と ストロベリーリナックスが販売しています。 電源電圧範囲は 1.71[V]〜3.6[V]ですので、3.3[V]動作のArduinoに 直接つないで使うことが出来ます。 I2CもしくはSPIバスで使います。
ここではストロベリーリナックス製のモジュールをSPIで接続していますが、秋月電子のものでも同様に使えるはずです。 次のように配線しています。
ピン番号 | 名称 | Arduinoのピン | 備考 |
1 | GND | GND | 1, 8はモジュール内で接続されている |
2 | CLK | SCK (D13) | |
3 | SDI | MOSI (D11) | |
4 | SDO | MISO (D12) | |
5 | ~CS | SS (D10) | |
6 | INT2 | - | |
7 | INT1 | - | |
8 | GND | GND | 1, 8はモジュール内で接続されている |
9 | VDD_IO | 3.3[V] (3V3) | |
10 | VDD | 3.3[V] (3V3) |
このスケッチは、気圧と温度について読んだそのままの値と[hPa], [℃]に変換した値をシリアルへ出力します。
#include <SPI.h> const int LPS331AP_CS = SS; //const int SS = 10; // 必ず 10 番を出力にすること //const int MOSI = 11; //const int MISO = 12; //const int SCK = 13; const byte LPS331AP_ADDR = B1011100; // SA0 = GND //const byte LPS331AP_ADDR = B1011101;// SA0 = VDD_IO const byte LPS331AP_WHOAMI = 0x0f; const byte LPS331AP_CTRL1 = 0x20; const byte LPS331AP_CTRL2 = 0x21; const byte LPS331AP_CTRL3 = 0x22; const byte LPS331AP_P_LL = 0x28; const byte LPS331AP_P_L = 0x29; const byte LPS331AP_P_H = 0x2A; const byte LPS331AP_T_L = 0x2B; const byte LPS331AP_T_H = 0x2C; const byte LPS331AP_RW = 0x80; const byte LPS331AP_MS = 0x40; void LPS331AP_write(byte reg, byte val) { digitalWrite(LPS331AP_CS, LOW); SPI.transfer(reg); SPI.transfer(val); digitalWrite(LPS331AP_CS, HIGH); } byte LPS331AP_read(byte reg) { byte ret = 0; digitalWrite(LPS331AP_CS, LOW); SPI.transfer(reg | LPS331AP_RW); ret = SPI.transfer(0); digitalWrite(LPS331AP_CS, HIGH); return ret; } void setup() { digitalWrite(SS, HIGH); pinMode(SS, OUTPUT); SPI.begin(); SPI.setBitOrder(MSBFIRST); SPI.setClockDivider(SPI_CLOCK_DIV8); // 8MHz/8 = 1MHz; (max 10MHz) Serial.begin(9600); while (!Serial) {} Serial.println(LPS331AP_read(LPS331AP_WHOAMI), HEX); // should show BB LPS331AP_write(LPS331AP_CTRL1, B10010000); // |||||||+ SPI Mode selection // ||||||+- DELTA_EN // |||||+-- BDU: block data update // ||||+--- DIFF_EN: interrupt circuit enable // |+++---- ODR2, ODR1, ODR0 (1Hz) // +------- PD: 0: power down, 1: active } void loop() { long P; short T; float p, t; P = LPS331AP_read(LPS331AP_P_H); P = (P << 8) | LPS331AP_read(LPS331AP_P_L); P = (P << 8) | LPS331AP_read(LPS331AP_P_LL); T = LPS331AP_read(LPS331AP_T_H); T = (T << 8) | LPS331AP_read(LPS331AP_T_L); p = P; p = p/4096.0; t = T; t = 42.5 + t/480.0; Serial.print(P); // pressure (reading) Serial.print(" "); Serial.print(T); // temperature (reading) Serial.print(" "); Serial.print(p); // pressure in [mbar]/[hPa] Serial.print(" "); Serial.println(t); // temprerature in [`C] delay(1000); }
上記のスケッチです