[Arduinoのすすめ][ArduinoConf][ArduinoMonitor][iArduino]

ST micro のデジタル気圧センサ LPS331AP を使う(I2C接続)

LPS331AP は ST mirco 製のデジタル気圧センサICです。 表面実装タイプではんだ付けしにくいのですが、DIP変換モジュールを 秋月電子ストロベリーリナックスが販売しています。 電源電圧範囲は 1.71[V]〜3.6[V]ですので、3.3[V]動作のArduinoに 直接つないで使うことが出来ます。 I2CもしくはSPIバスで使います。

ここではストロベリーリナックス製のモジュールをI2Cで接続していますが、秋月電子のものでも同様に使えるはずです。 次のように配線しています。

ピン番号名称Arduinoのピン備考
1GNDGND1, 8はモジュール内で接続されている
2SCLSCL (A5) 
3SDASDA (A4) 
4SA0GNDGNDにつなぐとアドレスがB10111000, 3.3VにつなぐとB1011101
5~CS3.3[V] (3V3)I2C接続のときは3.3Vにつなぐ
6INT2- 
7INT1- 
8GNDGND1, 8はモジュール内で接続されている
9VDD_IO3.3[V] (3V3) 
10VDD3.3[V] (3V3) 

スケッチ

このスケッチは、気圧と温度について読んだそのままの値と[hPa], [℃]に変換した値をシリアルへ出力します。

#include <Wire.h>

// Connect INA226 with SCL (A5), SDA (A4)

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;

void LPS331AP_write(byte reg, byte val)
{
  Wire.beginTransmission(LPS331AP_ADDR);
  Wire.write(reg);
  Wire.write(val);
  Wire.endTransmission();  
}

byte LPS331AP_read(byte reg)
{
  byte ret = 0;
  // request the registor
  Wire.beginTransmission(LPS331AP_ADDR);
  Wire.write(reg);
  Wire.endTransmission();  

  // read
  Wire.requestFrom((unsigned int)LPS331AP_ADDR, 1);
  
  while (Wire.available()) {
    ret = Wire.read();
  }
  
  return ret;
}

void setup() {
  Serial.begin(9600);
  while (!Serial) {}

  Wire.begin();

  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);
}

ダウンロード

上記のスケッチです


Arduinoのすすめ
Copyright (c) 2013, Noriaki Mitsunaga