MECHATRAXのブログ

本ブログでは、Raspberry Pi および関連モジュールを用いた
業務・産業用途での開発・運用に関する技術情報を発信しています。
ラズパイ対応センサシリーズと専用4chインターフェース基板の使い方

ラズパイ対応センサシリーズと専用4chインターフェース基板の使い方

この度、業務用途で手軽に導入できる Raspberry Pi 対応センサ2種 (CO2、加速度) とこれらセンサを使用するためのインターフェース基板をリリースいたしました。詳細は こちら を参照ください。

今回はそれぞれのセンサとインターフェース基板ならびにこれらのセットアップ方法をご紹介します。

ラズパイ対応センサシリーズ

今回リリースするのは以下の2種のセンサになります。
各センサには5mのインターフェース基板接続用ハーネスが付属します。

  • CO2センサ (SCD41搭載)
  • 加速度センサ (LSM6DSR搭載)

いずれも Raspberry Pi との接続は I2C です。

また、各センサ素子は代表的なものを使用しているのでサンプルコードなどの情報も数多く存在し、開発も容易です。

CO2センサ (SCD41搭載)

CO2 センサ SCD41 がアルミの筐体に入っています。
コネクタには XS3H を使用しています。このコネクタには OMRON XS3F が嵌合します。

センサ素子の詳細については以下をご参照ください。

加速度センサ (LSM6DSR搭載)

加速度センサ LSM6DSR がアルミの筐体に入っています。
センサは防塵防水の金属筐体に入っているので屋外でも使用可能です。
コネクタには XS3H を使用しています。このコネクタには OMRON XS3F が嵌合します。

センサ素子の詳細については以下をご参照ください。

センサ用4chインターフェース基板

先ほど紹介したセンサを Raspberry Pi で使用するためのインターフェース基板についてご紹介します。

センサを接続するコネクタが4つ実装されています。このコネクタには ZHR-4 が嵌合します。

このインターフェース基板には、I2C エクステンダが搭載されており、I2C センサのケーブルが 15m まで延長可能です。
また、インターフェース基板には I2C マルチプレクサと GPIO エキスパンダが搭載されています。
I2C マルチプレクサにより、センサを接続するバスを分けられます。それぞれのバスは GPIO エキスパンダから生成した GPIO から電源の操作が可能です。

センサ用4chインターフェース基板の使い方

Raspberry Pi でこのインターフェース基板を使用する方法をご紹介します。

動作環境

  • Raspberry Pi 4 modelB
    • 使用 OS: Raspberry Pi OS (64bit) Bookworm
  • slee-Pi 3
    • 必須ではありませんが、Raspberry Pi ならびに本センサーへの安定した電源供給のために使用します。
  • センサ用4chインターフェース基板
  • AC アダプター (12V/2A)
  • CO2センサ (SCD41搭載)
  • 加速度センサ (LSM6DSR搭載)
  • インターフェース基板接続用ハーネス (5m) 2本

ハードウェアの準備

Raspberry Pi + slee-Pi 3 の上にセンサ用4chインターフェース基板を下図のようにスタックします。
ピンヘッダをさす位置がずれないように注意してください。最後は必要に応じてネジで止めてください。

センサをセンサ用4chインターフェース基板に接続します。
インターフェース基板接続用ハーネスの ZH のコネクタを センサ用4chインターフェース基板 の CN1 ~ CN4 のいずれかに接続します。

次に、インターフェース基板接続用ハーネスの OMRON XS3F コネクタをセンサに接続します。
接続の際はネジを十分に締めこんでください。

今回は CN1 に CO2センサ (SCD41搭載)、CN2 に加速度センサ (LSM6DSR搭載)を接続します。

 

ソフトウェアの準備

ドライバのロード

※ Raspberry Pi と 4GPi とインターフェース基板の組み合わせなど、slee-Pi3 を使用しない場合は I2C を有効にする必要があります。
raspi-config → Interface Options → `I2C` でI2C を有効にしてください。

slee-Pi3 を使用する場合は、slee-Pi3 のパッケージインストール時に I2C が有効になります。

センサ用4chインターフェース基板を使用するためには I2C マルチプレクサと GPIO エキスパンダ のドライバをロードする必要があります。

/boot/firmware/config.txt に以下の記述を追記します。

[all]
dtoverlay=i2c-mux,pca9545,addr=0x73
dtoverlay=pca953x,pca9574,addr=0x21

再起動してドライバをロードします。

sudo shutdown -r now

再起動すると /dev/i2c-22 のように I2C のバスが作成されます。 下記の例では /dev/i2c-22/dev/i2c-23/dev/i2c-24/dev/i2c-25 が作成されました。


mtx@raspberrypi:~ $ ls /dev/i2c* /dev/i2c-1 /dev/i2c-21 /dev/i2c-23 /dev/i2c-25 /dev/i2c-20 /dev/i2c-22 /dev/i2c-24

各バスの先にセンサのアドレスが見えるようになります。下記の例では 0x62 に SCD41 が見えています。

mtx@raspberrypi:~$ i2cdetect -y 22
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:                         -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- UU -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- 62 -- -- -- -- -- -- -- -- -- -- -- 6e UU
70: -- -- -- UU -- -- -- --

また、GPIO のコントローラが新たに作成されます。 下記の例では /dev/gpiochip2 が追加されています。

mtx@raspberrypi:~$ gpiodetect
gpiochip0 [pinctrl-bcm2711] (58 lines)
gpiochip1 [raspberrypi-exp-gpio] (8 lines)
gpiochip2 [1-0021] (8 lines)
gpiochip0 [pinctrl-bcm2711] (58 lines)

この GPIO コントローラを操作すると作成された I2C のバスの電源の ON / OFF ができます。

# 電源 ON
sudo gpioset gpiochip2 0=1

# 電源 OFF
sudo gpioset gpiochip2 0=0

センサの値を取得するサンプルコード

このインターフェース基板を使用してセンサの値を取得する例をご紹介します。

※ 弊社からこのセンサを扱うためのライブラリは提供していません。 外部の公開されているライブラリ等を使用していただきますようお願いします。

CO2センサ (SCD41搭載)

今回の例では以下の Adafruit のライブラリを使用します。

 https://github.com/adafruit/Adafruit_CircuitPython_SCD4X

サンプルコード

取得した値の表示と csv ファイルへの保存を行う例です。

import csv
import time

from adafruit_extended_bus import ExtendedI2C as I2C
import adafruit_scd4x

COLUMN_SCD41 = ['co2', 'temperature', 'humidity']

I2C_BUS = 22
I2C_ADDRESS = 0x62

i2c = I2C(I2C_BUS, frequency=400000)
scd4x = adafruit_scd4x.SCD4X(i2c, address=I2C_ADDRESS)
print("Serial number:", [hex(i) for i in scd4x.serial_number])

scd4x.start_periodic_measurement()
print("Waiting for first measurement....")

with open(f'scd41_{int(time.time())}.csv', 'w', newline='') as f:
    writer = csv.writer(f)
    writer.writerow(['timestamp']+COLUMN_SCD41)

    while True:
        if scd4x.data_ready:
            timestamp = time.time()
            co2 = scd4x.CO2
            temperature = scd4x.temperature
            humidity = scd4x.relative_humidity

            print("CO2: %d ppm" % co2)
            print("Temperature: %0.1f *C" % temperature)
            print("Humidity: %0.1f %%" % humidity)
            print()
            writer.writerow([timestamp, co2, f'{temperature:.1f}', f'{humidity:.1f}'])
            f.flush()
        time.sleep(1)

※ ライブラリ公式のサンプルコードからの変更箇所は以下の通りです。

  • I2C のバスの指定を追加
  • csv ファイルへの保存処理を追加

以下のようなデータが取得可能です。保存した csv ファイルから作成しました。

加速度センサ (LSM6DSR搭載)

今回の例では以下の Adafruit のライブラリを使用します。

 https://github.com/adafruit/Adafruit_CircuitPython_LSM6DS

サンプルコード

取得した値の表示と csv ファイルへの保存を行う例です。

import csv
import time

from adafruit_extended_bus import ExtendedI2C as I2C
from adafruit_lsm6ds import LSM6DS

COLUMN_LSM6DSR = ['ax', 'ay', 'az', 'gx', 'gy', 'gz']

I2C_BUS = 22
I2C_ADDRESS = 0x6A

class LSM6DSR(LSM6DS):
    CHIP_ID = 0x6B
    def __init__(self, i2c_bus, address=0x6A, ucf=None):
        super().__init__(i2c_bus, address, ucf)

        self._i3c_disable = True

i2c = I2C(I2C_BUS, frequency=400000)
sr = LSM6DSR(i2c)

with open(f'lsm6dsr_{int(time.time())}.csv', 'w', newline='') as f:
    writer = csv.writer(f)
    writer.writerow(['timestamp']+COLUMN_LSM6DSR)

    while True:
        timestamp = time.time()
        accel_x, accel_y, accel_z = sr.acceleration
        gyro_x, gyro_y, gyro_z = sr.gyro

        print("Acceleration: X:%.2f, Y: %.2f, Z: %.2f m/s^2" % (accel_x, accel_y, accel_z))
        print("Gyro X:%.2f, Y: %.2f, Z: %.2f radians/s" % (gyro_x, gyro_y, gyro_z))
        print("")
        writer.writerow([timestamp, accel_x, accel_y, accel_z, gyro_x, gyro_y, gyro_z])
        f.flush()
        time.sleep(0.1)

※ ライブラリ公式のサンプルコードからの変更箇所は以下の通りです。

  • I2C のバスの指定を追加
  • csv ファイルへの保存処理を追加

以下のようなデータが取得可能です。保存した csv ファイルから作成しました。

おわりに

ラズパイ対応センサシリーズとセンサ用 4ch インターフェース基板の使い方をご紹介しました。

技術資料等は弊社 GitHub をご参照ください。

ラズパイ対応センサシリーズ
https://github.com/mechatrax/sensor-series

センサ用 4ch インターフェース基板
https://github.com/mechatrax/sensor-series-interface

また、不明な点は弊社サポートへお問い合わせください。

Appendix

本記事で使用した Python のパッケージは以下の通りです。

Adafruit-Blinka==9.0.4
Adafruit-Blinka-Raspberry-Pi5-Neopixel==1.0.0rc2
adafruit-circuitpython-busdevice==5.2.16
adafruit-circuitpython-connectionmanager==3.1.7
adafruit-circuitpython-lsm6ds==4.6.2
adafruit-circuitpython-register==1.11.2
adafruit-circuitpython-requests==4.1.16
adafruit-circuitpython-scd4x==1.4.10
adafruit-circuitpython-typing==1.12.3
adafruit-extended-bus==1.0.2
Adafruit-PlatformDetect==3.88.0
Adafruit-PureIO==1.1.11
binho-host-adapter==0.1.6
lgpio==0.2.2.0
pyftdi==0.57.1
pyserial==3.5
pyusb==1.3.1
rpi-ws281x==5.0.0
RPi.GPIO==0.7.1
sysv_ipc==1.2.0
typing_extensions==4.15.0

< ブログ一覧へ戻る

関連製品はこちら

関連記事はこちら