LSM303DLHを用いたPro Microのデジタルコンパス・加速度入力 プログラム」でPro Microを使って、LSM303DLHからデジタルコンパス・加速度入力を行いましたが、ここでは、Raspberry Piを使って、LSM303DLHからデジタルコンパス・加速度入力を行います。

デジタルコンパス・加速度センサ「LSM303DLH」との接続

Raspberry Piとデジタルコンパス・加速度センサ「LSM303DLH」間は、I2Cインタフェースで接続します。次のように各ピンを接続します。

Raspberry Pi 3とLSM303DLHの接続
Raspberry Pi 3 LSM303DLH
GND GND
5V VCC(3~5V)
GPIO03 SCL
GPIO02 SDA

次のコマンドで接続したLSM303DLHのI 2 Cアドレスを確認します。I2Cアドレスは、「18」が加速度センサー、「1e 」がデジタルコンパスになっていました。

$ sudo i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- 18 -- -- -- -- -- 1e --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

Raspberry Pi 3とLSM303DLHとの接続画像を次に示します。

Raspberry Pi 3とLSM303DLHとの接続

LSM303DLHによるデジタルコンパス・加速度プログラムの作成

LSM303用のモジュールとサンプルプログラムは、「adafruit/Adafruit_CircuitPython_LSM303」を参照して作成します。

最初に、PyPIから次のコマンドで「Adafruit CircuitPython module for the LSM303」をダウンロードしてインストールします。

 $ pip3 install adafruit-circuitpython-lsm303

次に、「/home/pi/.local/lib/python3.5/site-packages/adafruit_lsm303.py」の60行目を次のように変更します。変更しないと、「OSError: [Errno 121] Remote I/O error」が発生します。

_ADDRESS_ACCEL             = const(0x19)  # (0x32 >> 1)       // 0011001x

               ↓↓↓

_ADDRESS_ACCEL             = const(0x18)  # (0x32 >> 1)       // 0011000x

次のデジタルコンパス・加速度プログラム「sample.py」を作成します。

import time
import board
import busio

import adafruit_lsm303

i2c = busio.I2C(board.SCL, board.SDA)
sensor = adafruit_lsm303.LSM303(i2c)

while True:
        raw_accel_x, raw_accel_y, raw_accel_z = sensor.raw_acceleration
        accel_x, accel_y, accel_z = sensor.acceleration
        raw_mag_x, raw_mag_y, raw_mag_z = sensor.raw_magnetic
        mag_x, mag_y, mag_z = sensor.magnetic

        print('Acceleration raw: ({0:6d}, {1:6d}, {2:6d}), (m/s^2): ({3:10.3f}, {4:10.3f}, {5:10.3f})'.format(raw_accel_x, raw_accel_y, raw_accel_z, accel_x, accel_y, accel_z))
        print('Magnetometer raw: ({0:6d}, {1:6d}, {2:6d}), (gauss): ({3:10.3f}, {4:10.3f}, {5:10.3f})'.format(raw_mag_x, raw_mag_y, raw_mag_z, mag_x, mag_y, mag_z))
        print('')
        time.sleep(1.0)

LSM303DLHによるデジタルコンパス・加速度プログラムの実行

作成したデジタルコンパス・加速度プログラムを次のコマンドで実行すると、次のような加速度センサX/Y/Z、地磁気センサX/Y/Zの値(計6軸)の数値が表示されます。最初に加速度センサX/Y/Zの生データ、次に処理したデータ、次に地磁気センサX/Y/Zの生データ、次に処理したデータを繰り返し表示します。

$ python3 sample.py
Acceleration raw: (    80,   -128,  16112), (m/s^2): (     0.047,     -0.075,      9.459)
Magnetometer raw: (   110,    -45,   -566), (gauss): (    10.000,     -4.091,    -57.755)

Acceleration raw: (   128,    -32,  16176), (m/s^2): (     0.075,     -0.019,      9.497)
Magnetometer raw: (   113,    -55,   -566), (gauss): (    10.273,     -5.000,    -57.755)

Acceleration raw: (    80,   -128,  16144), (m/s^2): (     0.047,     -0.075,      9.478)
Magnetometer raw: (   115,    -43,   -559), (gauss): (    10.455,     -3.909,    -57.041)

ダウンロードしたAdafruit CircuitPython module for the LSM303を変更しないと、次のエラーが発生し、実行できません。

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File “sample.py”, line 8, in
sensor = adafruit_lsm303.LSM303(i2c)
File “/home/pi/.local/lib/python3.5/site-packages/adafruit_lsm303.py”, line 148, in __init__
self._accel_device = I2CDevice(i2c, _ADDRESS_ACCEL)
File “/home/pi/.local/lib/python3.5/site-packages/adafruit_bus_device/i2c_device.py”, line 76, in __init__
raise ValueError(“No I2C device at address: %x” % device_address)
ValueError: No I2C device at address: 19