TOPに戻る

ラズパイ5 2025年夏(2023年10月更新 bookworm) ④ I2C LPS22HB

 ラズパイ5のI2Cバスに接続した気圧センサLPS22HBをPythonでアクセスします。

  ラズパイ2023年10月更新 bookworm ② pythonでI2Cバスをアクセス

上の記事をトレースし、何か変更があるかどうかを検証します。

環境

  • Windows11;24H2 コマンドプロンプト sshでアクセス、もしくはRealVNC
  • Raspberry Pi 5  4GBモデル
  • OS Raspberry Pi OS (64ビット)、bookworm (2025-06-26)
  • Python 3.11.2

利用したのはAdafruitのStemma QT/Qwiicボード

  LPS22ボード解説のページ

 Stemma QT/Qwiic(JST SH 4ピン)コネクタは2か所に装着されていて、どちらにつないでもかまいません。このコネクタを使ってI2Cで制御する場合、特に、ジャンパ線をつなぐなどは不要です。

 コネクタは、表と裏のどちらも差し込めそうですが、ピンがコネクタ内部の上部に並んでいるので、差し込める方向は一意です。ロック機構はないですが、すぐに抜けるということはありません。

気圧センサLPS22HBのおもなスペック

 LPS22HBのデータシートはこのWebページから

  • 電源電圧  1.7~3.6V
  • 気圧測定範囲 260~1260hPa、確度;±1hPa、分解能;±0.1hPa
  • 温度測定範囲 -40~+85℃、確度;±1.5℃
  • インターフェース I2C(0~400kHz)、SPI(10MHz)
  • スレーブ・アドレス 0x5d、裏面のAddrをショートすると0x5c

接続

$ i2cdetect -y 1

で、接続を確認します。0x5dはLPS22HBのスレーブ・アドレスです。

利用するPythonのI2Cライブラリはsmbus2

 下記の記事でpythonの仮想環境envを作成しました。

  ラズパイ5 2025年夏(2023年10月更新 bookworm) ② GPIO gpiozero

$  source env/bin/activate

(env) yoshidaw@ras05:~ $ pip list
Package    Version
---------- -------
colorzero  2.0
gpiozero   2.0.1
pip        23.0.1
setuptools 66.1.1

 smbus2ライブラリをインストールします。

 smbus2のドキュメントはこちらにあります

(env) yoshidaw@ras05:~ $ pip install smbus2
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting smbus2
  Downloading https://www.piwheels.org/simple/smbus2/smbus2-0.5.0-py2.py3-none-any.whl (11 kB)
Installing collected packages: smbus2
Successfully installed smbus2-0.5.0

(env) yoshidaw@ras05:~ $ pip list
Package    Version
---------- -------
colorzero  2.0
gpiozero   2.0.1
pip        23.0.1
setuptools 66.1.1
smbus2     0.5.0

smbus2ライブラリを使ったプログラム

import smbus2
import time

i2c =  smbus2.SMBus(1)
addr = 0x5d

i2c.write_byte_data(addr, 0x10, 0x10)

while 1:
    i2c.write_byte_data(addr, 0x11, 0x11)
    data = i2c.read_i2c_block_data(addr, 0x28, 3)
    press = (data[2]<<16 | data[1] << 8 | data[0] ) / 4096.0
    print("\nPress = " + str(int(press)) + "hPa")
    data = i2c.read_i2c_block_data(addr, 0x2b, 2)
    temp = (data[1] << 8 | data[0] ) / 100.0
    print("Temp  = " + str(round(temp,1)) + "`C")
    time.sleep(2)

 実行します。GPIOをアクセスしたときのように、管理者権限は必要ないようです。

-