「LSM303DLHを用いたPro Microのデジタルコンパス・加速度入力 プログラム」でPro Microを使って、LSM303DLHからデジタルコンパス・加速度入力を行いましたが、ここでは、Raspberry Piを使って、LSM303DLHからデジタルコンパス・加速度入力を行います。
デジタルコンパス・加速度センサ「LSM303DLH」との接続
Raspberry Piとデジタルコンパス・加速度センサ「LSM303DLH」間は、I2Cインタフェースで接続します。次のように各ピンを接続します。
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との接続画像を次に示します。
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