LoginSignup
0
1

More than 5 years have passed since last update.

LPS25Hを高速化する

Posted at

背景


気圧センサの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;
}

以上です。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1