創るたのしみを応援

Pololu LPS25HB 気圧/標高センサボードを使ってみる

Raspberry Pi版

Python3で書いていきます。

使う前にラズパイの設定でI2Cを有効にしたり、i2c-toolやsmbusモジュールをインストールする必要があります。ここでは割愛しますので分からない方は、つぎのサイトなど「Raspberry Pi で I2C を利用するための設定」を参考にしてみてください。

こちらのプログラムはパッケージ化(ライブラリ化)していないので、パッケージ化したい方はぜひ、ご自身で挑戦してみてください。

サンプルプログラム

「lps25.py」(lps25は好きな名前)というファイル名のファイルをホームディレクトリに作成して、つぎのコードをコピペして保存してください。

# パッケージ(モジュール)をインポート
import smbus
from time import sleep

# オブジェクト生成
i2c = smbus.SMBus(1)

# 定義
# アドレス等
SA0_LOW_ADDRESS = 0x5C
SA0_HIGH_ADDRESS = 0x5D
address = SA0_HIGH_ADDRESS

TEST_REG_NACK = -1

LPS25H_WHO_ID = 0xBD

# デバイスタイプ
device_25H = 0
device_auto = 1
device = device_25H

# sa0の状態
sa0_low = 0
sa0_high = 1
sa0_auto = 2

REF_P_XL = 0x08
REF_P_L = 0x09
REF_P_H = 0x0A
                              
WHO_AM_I = 0x0F
                              
RES_CONF = 0x10
                              
CTRL_REG1 = 0x20
CTRL_REG2 = 0x21
CTRL_REG3 = 0x22
CTRL_REG4 = 0x23
              
STATUS_REG = 0x27
                            
PRESS_OUT_XL = 0x28
PRESS_OUT_L = 0x29
PRESS_OUT_H = 0x2A

TEMP_OUT_L = 0x2B
TEMP_OUT_H = 0x2C
      
FIFO_CTRL = 0x2E
FIFO_STATUS = 0x2F
      
RPDS_L = 0x39
RPDS_H = 0x3A
    
INTERRUPT_CFG = -1
INT_SOURCE = -2
THS_P_L = -3
THS_P_H = -4
      
LPS25H_INTERRUPT_CFG = 0x24
LPS25H_INT_SOURCE = 0x25
LPS25H_THS_P_L = 0x30
LPS25H_THS_P_H = 0x31

translated_regs = [0] 

# 関数一覧

# LPS25HBのステータスを取得する
def testWhoAmI():
    return i2c.read_i2c_block_data(address,WHO_AM_I,1)
    
# 接続されているデバイスがLPS25HBか確認する   
def detectDevice():
    id = testWhoAmI()
    if (id[0] == LPS25H_WHO_ID):
        return True
    
    return False   

# LPS25HBが接続されているとき初期化する
def LPS_init():
    
    if (detectDevice() == False):
        return False
    
    else:
        translated_regs.append(LPS25H_INTERRUPT_CFG)
        translated_regs.append(LPS25H_INT_SOURCE)
        translated_regs.append(LPS25H_THS_P_L)
        translated_regs.append(LPS25H_THS_P_H)
        return True
      

# コマンドを送ってデータを送る(1バイト)
def writeReg(reg,value):
    if (reg < 0):
        reg = translated_regs[-reg]
    val = [value]
    i2c.write_i2c_block_data(address,reg,val)

# コマンドを送ってデータを受け取る(1バイト)
def readReg(reg):
    if(reg < 0):
        reg = translated_regs[-reg]
    value = i2c.read_i2c_block_data(address,reg,1)
    return value

# LPS25HBの読み込みモードや読み込み周期を変更する
def enableDefault():
    if (device == device_25H):
        # 0xB0 = 0b10110000
        # PD = 1 (active mode);  ODR = 011 (12.5 Hzで気圧と気温を出力する)
        writeReg(CTRL_REG1, 0xB0)


# 大気圧を取得する(3バイト)
def readPressureRaw():  
    p = i2c.read_i2c_block_data(address,PRESS_OUT_XL,1)
    p = p + i2c.read_i2c_block_data(address,PRESS_OUT_L,1)
    p = p + i2c.read_i2c_block_data(address,PRESS_OUT_H,1)
    
    #受け取ったそれぞれのデータを変換して一つのデータにする
    return p[2] << 16 | p[1] << 8 | p[0]

# 大気圧をhPaで返す 計算((mbar)/(hPa))
def readPressureMillibars():
    return readPressureRaw() / 4096

# 大気圧をinHgで返す
def readPressureInchesHg():
    return readPressureRaw() / 138706.5

# 気温を取得する(2バイト)
def readTemperatureRaw():
    t = i2c.read_i2c_block_data(address,TEMP_OUT_L,1)
    t = t + i2c.read_i2c_block_data(address,TEMP_OUT_H,1)

    #受け取ったそれぞれのデータを変換して一つのデータにする
    return (t[1] << 8 | t[0] ) - 65535

# 気温を摂氏で返す
def readTemperatureC():
    return 42.5 + readTemperatureRaw() / 480

# 気温を華氏で返す
def readTemperatureF():
    return 108.5 + readTemperatureRaw() / 480 * 1.8

# 気圧から標高(m)を推定計算して返す
def pressureToAltitudeMeters(pressure_mbar,altimeter_setting_mbar = 1013.25):
    return (1 - pow(pressure_mbar / altimeter_setting_mbar, 0.190263)) * 44330.8

# 気圧から標高(feet)を推定計算して返す
def pressureToAltitudeFeet(pressure_inHg, altimeter_setting_inHg = 29.9213):
    return (1 - pow(pressure_inHg / altimeter_setting_inHg, 0.190263)) * 145442

#######################
####メインプログラム####
#######################
sleep(0.1)
if (LPS_init() == False):
    print("Failed to autodetect pressure sensor!")
    while (True):
        sleep(0.1)
        
enableDefault()
while(True):
    pressure = readPressureMillibars()
    altitude = pressureToAltitudeMeters(pressure)
    temperature = readTemperatureC()
  
    print("p:",round(pressure,2),"tmbar a:",round(altitude,2),"mttt:",round(temperature,2),"deg C ")
    sleep(0.1)

########################   
###メインプログラム終了###
########################

実行と結果

プログラムを実行するにはターミナルを開いて、次のコマンドを入力してエンターを押してください。Pythonのコードを実行します。

$ python3 lps25.py

気圧と気温が表示されれば成功です。

関数リスト

Raspberry Pi引数戻り値機能
LPS_init()無しtrue or false初期化
成功時:true
失敗時:false
enableDefault()無し無し標準モードに設定
readPressureMillibars()無しfloat大気圧(hPa)を返す
readPressureInchesHg()無しfloat大気圧(inHg)を返す
readTemperatureC()無しfloat気温(摂氏)を返す
readTemperatureF()無しfloat気温(華氏)を返す
pressureToAltitudeMeters()floatfloat引数にhPaをとり、標高(m)を返す
pressureToAltitudeFeet()floatfloat引数にinHgをとり、標高(feet)を返す
  1. Pololu LPS25HB概要
  2. Arduino版
  3. Nucleo mbed版
  4. Raspberry Pi版
  5. 建物内で何階にいるか推定実験

SNSでフォローする