TOP > カテゴリ > ロボット・電子工作・マイコン >

気圧センサー(LPS25H)の使い方 - SPI版 [Arduino]

気圧をhPa(ヘクトパスカル)で取得できる「LPS25H」の使い方です。

実行結果

基準値となる海面0mにおける1気圧(標準大気圧)は「1013.25hPa」です。標高(高度)が上がるほど気圧が下がります。

この記事はLPS25HのSPI接続版です。I2C接続版及び標高の算出方法などの詳細はこちらです。

使用部品・材料

総額で約1,270円です。(Arduino本体の値段を除く)

部品/材料値段備考
ブレッドボード¥270秋月電子の通販コード(P-00315)
LPS25H使用 気圧センサーモジュールDIP化キット¥600秋月電子の通販コード(K-08338)
I2Cバス用双方向電圧レベル変換モジュール(FXMA2102)
2個
¥400秋月電子の通販コード(M-05825)

配線図

Arduino UNOの動作電圧は5V。LPS25Hの動作電圧は1.7-3.6Vですので、電圧レベル変換モジュールを使用して3.3Vで接続しています。

ロジック変換モジュールのFXMA108は相性が悪く正常に接続できませんでしたので、FXMA2102を2個使用しています。

※FXMA108を使用してレジスタデータを取得すると、本来の「0xBD(1011 1101)」というデータが「0xBF(1011 1111)」になります。(何故か下位バイトが必ず0x0Fになる)

SPI接続用のピン

マスターはArduino。スレーブはLPS25Hです。

番号名称内容
13SCKSerial ClocK。データ転送の同期の為のマスターからのクロ ック信号。
12MISOMaster In Slave Out。スレーブからマスターへデータを送る。
11MOSIMaster Out Slave In。マスターからスレーブへデータを送る。
(10)SSSlave Select pin。スレーブ選択ピン。10ピン以外でも使用可能です。

SPI接続でデバイス間の通信をする場合は、このピンをLOWにしている間に行います。通信を終了する場合はHIGHにします。

このピン番号と名称はArduinoで使用されているものです。デバイスによって異なる場合があります。

スケッチ(プログラム)

現在地の「気圧、温度、標高」をシリアルモニターへ表示します。

#include <SPI.h>
 
// SCK  : pin 13 (Serial ClocK)
// MISO : pin 12 (Master In Slave Out)
// MOSI : pin 11 (Master Out Slave In)
// SS   : pin 10 (Slave Select pin)
 
// テスト用レジスタの結果
bool WHO_AM_I = false;
 
void setup() {
  Serial.begin(9600); 
    
  // SPIの初期化
  // ※自動的に「SCK、MOSI、SSのピンの動作はOUTPUT」となり「SSはHIGH」となる
  SPI.begin();
  // SPI転送モード
  // クロック位相(CPOL) = 1 クロック極性(CPHA) = 1
  SPI.setDataMode(SPI_MODE3);
  // SPI送受信用のビットオーダー(MSBFIRST)
  SPI.setBitOrder(MSBFIRST);
  // SPIクロック分周器 4MHz = 16MHz/4 
  SPI.setClockDivider(SPI_CLOCK_DIV4) ;
  
  // テスト用レジスタの読み込み
  digitalWrite(SS, LOW);
  
    // WHO_AM_Iのレジスタアドレス(0x0F)に移動する
    SPI.transfer(0x0F | 0x80); 
    // 1byteのデータを取得する
    uint8_t  test =  SPI.transfer(0x00);

  digitalWrite(SS, HIGH);

  if(0xBD != test){
    Serial.println("レジスタの値が正常に取得できません。");
    return;
  }
  WHO_AM_I = true;
  
  // CTRL_REG1(制御レジスタ1)
  digitalWrite(SS, LOW); 
   
    // CTRL_REG1のアドレス 
    SPI.transfer(0x20);
    // パワーダウンをオフにしてセンサー周期を1Hzにする
    //   パワーダウン制御 : 1->Active mode
    //   出力データレート : 0,0,1->1Hz(1秒1回)    
    SPI.transfer(0x90); // 2進 10010000
    
  digitalWrite(SS, HIGH); 
}
 
void loop() {
  // テストに成功しない場合は終了
  if(!WHO_AM_I) return;

  int i; uint8_t RegTbl[5];  
  
  // 5byteのデータを取得する
  for (int i = 0; i < 5; i++) {
    digitalWrite(SS, LOW);
      SPI.transfer(0x80 | (0x28 + i));
      RegTbl[i] = SPI.transfer(0x00);
    digitalWrite(SS, HIGH);
  }
      
  // --- [気圧] ---
  // 読み取った「3byte」を24bitに変換する
  // ※UNOは16bitを超えるシフトはできませんので、乗算で対処しています。 hamatta(-;
  uint16_t lo = RegTbl[1] << 8 | RegTbl[0];
  uint32_t hi = RegTbl[2] * 65536; // 16bitの左シフト
  float P = (hi +  lo) / 4096.0;
  
  Serial.print("気圧:");      
  Serial.print(P);
  Serial.print("hPa(mbar)");    

  // --- [温度] ---  
  // 温度は符号ありのデータ型でOK
  int temperature = (RegTbl[4] << 8 |  RegTbl[3]);
  float T = 42.5 + (temperature / 480.0); 
  Serial.print(" 温度:");      
  Serial.print(T);
  Serial.print("℃");   

  // --- [標高] ---  
  float H = ((pow(1013.25 / P, 1 / 5.257) - 1) * (T+ 273.15)) / 0.0065;
  Serial.print(" 標高:");    
  Serial.print(H);
  Serial.println("m");      
  delay(1000);}

以上です。





掲示板

ソフトウェア、ハードウェアのプログラミング用の掲示板を作成しました。質問やわからない事は@掲示板でユーザー同士で情報を共有して下さい。

関連記事



公開日:2017年06月23日 最終更新日:2017年07月22日
記事NO:02438