Arduino
LPS25H

LPS25Hを高速化する

背景


気圧センサのLPS25Hのデフォルトのサンプリングレートが1Hzと中々に遅いので、
25Hzまで上げたというお話。

普通にデータシート読めば一瞬なのですが、備忘録として。
http://www.st.com/content/ccc/resource/technical/document/datasheet/58/d2/33/a4/42/89/42/0b/DM00066332.pdf/files/DM00066332.pdf/jcr:content/translations/en.DM00066332.pdf

使用機材

  • Arduino UNO x 1
  • LPS25H(I2Cでつなぎました)

配線

Arduino LPS25H
3.3V VDD(1)
A5(SCL) SCL(2)
A4(SDA) SDA(3)
3.3V SDO(4)
3.3V CS(5)
GND GND(8)

コード

sensor.ino
/**
 * LPS25Hのサンプリングレートを上げたコード
 */
#include <Wire.h>

#define LPS25H_ADDRESS  0x5d /* SA0 -> VCC */
//#define LPS25H_ADDRESS  0x5c /* SA0 -> GND */
#define LPS25H_WHO_AM_I     0x0f
#define LPS25H_CTRL_REG1    0x20
#define LPS25H_PRESS_OUT_XL 0x28
#define LPS25H_PRESS_OUT_L  0x29
#define LPS25H_PRESS_OUT_H  0x2a
#define LPS25H_TEMP_OUT_L   0x2b
#define LPS25H_TEMP_OUT_H   0x2c

void setup() {
  // put your setup code here, to run once:
  Serial.begin(19200);
  Wire.begin();

  Serial.print("WHO_AM_I = 0x");
  Serial.println(whoAmI(), HEX);

  setCtrlReg1();
}

void loop() {
  Serial.print("Pressure = ");
  Serial.print(getPressure());
  Serial.println(" hPa, ");
  delay(50);
}

int whoAmI() {
  Wire.beginTransmission(LPS25H_ADDRESS);
  Wire.write(LPS25H_WHO_AM_I);
  Wire.endTransmission();

  Wire.requestFrom(LPS25H_ADDRESS, 1);
  while(Wire.available() < 1) {
    ;
  }

  return Wire.read();
}

void setCtrlReg1() {
  Wire.beginTransmission(LPS25H_ADDRESS);
  Wire.write(LPS25H_CTRL_REG1);
  Wire.write(0xC0); // 25Hzにまであげる  
  //Wire.write(0x90); // default: 1Hz
  Wire.endTransmission();
}

float getPressure() {
  long pData = 0;

  for (int i = 0; i < 3; i++) {
    Wire.beginTransmission(LPS25H_ADDRESS);
    Wire.write(LPS25H_PRESS_OUT_XL + i);
    Wire.endTransmission();

    Wire.requestFrom(LPS25H_ADDRESS, 1);
    while(Wire.available() < 1) {
      ;
    }

    pData |= Wire.read() << (8 * i);
  }

  return pData / 4096.0;
}

float getTemperature() {
  short tData = 0;

  for (int i = 0; i < 2; i++) {
    Wire.beginTransmission(LPS25H_ADDRESS);
    Wire.write(LPS25H_TEMP_OUT_L + i);
    Wire.endTransmission();

    Wire.requestFrom(LPS25H_ADDRESS, 1);
    while(Wire.available() < 1) {
      ;
    }

    tData |= Wire.read() << (8 * i);
  }

  return 42.5 + tData / 480.0;
}

以上です。