.. include:: /index.rst
:start-after: start_hello_message
:end-before: end_hello_message
.. _py_10-axis:
2.15 10軸IMUセンサーモジュール
===============================
**はじめに**
10軸IMU(Inertial Measurement Unit:慣性計測装置)モジュールは、複数のセンサーを統合し、包括的な動作データおよび環境データを提供します。高度測定用の気圧センサー(SPL06_001)、加速度および回転を測定する6軸モーションセンサー(SH3001)、そして方位を検出する3軸磁気センサー(QMC6310)を搭載しています。この高機能モジュールは、ロボティクス、ナビゲーションシステム、モーショントラッキングなどの用途に最適です。
----------------------------------------------
**必要なもの**
このプロジェクトに必要なコンポーネントは以下のとおりです。
.. list-table::
:widths: 30 20
:header-rows: 1
* - COMPONENT INTRODUCTION
- PURCHASE LINK
* - :ref:`cpn_wires`
- |link_wires_buy|
* - :ref:`cpn_10_axis_imu`
- \-
* - Raspberry Pi
- \-
.. ----------------------------------------------
.. **回路図**
.. 10軸IMUモジュールはI2Cインターフェースで接続します。
.. .. image:: img/fzz/2.14_sch.png
----------------------------------------------
**配線図**
以下の図のようにIMUモジュールをRaspberry Piに接続します。
.. image:: img/fzz/2.15_10axis_bb.png
:width: 80%
:align: center
I2C接続が正しく行われていることを確認してください。
- VCC → 3.3V
- GND → GND
- SDA → GPIO 2 (SDA)
- SCL → GPIO 3 (SCL)
----------------------------------------------
**ライブラリのインストール**
10軸IMU用ライブラリをインストールします。
.. raw:: html
.. code-block:: shell
sudo pip install git+https://github.com/sunfounder/sunfounder-imu-python.git --break-system-packages
-------------------------------------------------------
**IMUのキャリブレーション**
IMUをキャリブレーションするために、以下のスクリプトを実行します。
.. raw:: html
.. code-block:: shell
sudo python3 -m sunfounder_imu.calibrate
その後、スクリプトの指示に従ってIMUのキャリブレーションを行ってください。
--------------------------------------------------------
**サンプルの実行**
このチュートリアルで使用するすべてのサンプルコードは ``ai-lab-kit`` ディレクトリに含まれています。
以下の手順に従ってサンプルを実行してください。
.. raw:: html
.. code-block:: shell
cd ~/ai-lab-kit/python/
sudo python3 2.15_10axis_imu.py
このPythonスクリプトは、10軸IMUモジュールから包括的な動作データと環境データを読み取ります。実行すると次のように動作します。
1. スクリプトはI2C経由で3つの内蔵センサーすべてとの通信を初期化します。
2. 各センサーが検出され、そのI2Cアドレスが表示されて接続状態を確認できます。
3. メインループでは、以下のデータを継続的に読み取り表示します。
- 高度(気圧から計算)
- コンパス方位(方位角)
- 3軸加速度
- 3軸角速度(ジャイロスコープ)
- 3軸磁場強度
- 温度および気圧
4. データは0.5秒ごとに更新され、リアルタイムの動作追跡が可能です。
5. プログラムは ``Ctrl+C`` で中断されるまで動作し、その後安全に終了します。
----------------------------------------------
**コード**
以下は、10軸IMUモジュールからデータを読み取るPythonコードです。
.. raw:: html
.. code-block:: python
#!/usr/bin/env python3
"""
Read data from all three sensors on the 10 Axis IMU module:
- SPL06_001: temperature, pressure, altitude
- SH3001: temperature, accelerometer, gyroscope
- QMC6310: compass heading
Gracefully exits when Ctrl+C is pressed.
"""
from time import sleep
# Import Sunfounder sensor modules
from sunfounder_imu import IMU
def main():
imu = IMU()
sensors = imu.find_sensor()
if len(sensors) == 0:
print("No sensor found.")
return
for address, class_type in sensors.items():
name = class_type.__name__
print(f"Found sensor {name} at address 0x{address:02X}")
sleep(3)
try:
while True:
data = imu.read()
print(f"Altitude={data['altitude']:7.2f} m")
print(f"Azimuth={data['azimuth']:7.2f} °")
print(f"Acceleration:")
print(f" X={data['acceleration'].x:7.2f} m/s²")
print(f" Y={data['acceleration'].y:7.2f} m/s²")
print(f" Z={data['acceleration'].z:7.2f} m/s²")
print(f"Gyroscrope:")
print(f" X={data['gyroscrope'].x:7.2f} °/s")
print(f" Y={data['gyroscrope'].y:7.2f} °/s")
print(f" Z={data['gyroscrope'].z:7.2f} °/s")
print(f"Magenatic:")
print(f" X={data['magenatic'].x:7.2f} μT")
print(f" Y={data['magenatic'].y:7.2f} μT")
print(f" Z={data['magenatic'].z:7.2f} μT")
print(f"Temperature={data['temperature']:7.2f} °C")
print(f"Pressure={data['pressure']:7.2f} hPa")
sleep(0.5)
except KeyboardInterrupt:
print("\nExiting program...")
if __name__ == "__main__":
main()
----------------------------------------------
**コードの解説**
1. **インポートと設定:**
.. code-block:: python
from time import sleep
from sunfounder_imu import IMU
このスクリプトでは、タイミング制御用の ``sleep`` と、センサーモジュールと通信するためのSunfounderライブラリの ``IMU`` クラスをインポートしています。
2. **センサーの初期化:**
.. code-block:: python
imu = IMU()
sensors = imu.find_sensor()
if len(sensors) == 0:
print("No sensor found.")
return
IMUオブジェクトを作成し、I2Cバス上の接続センサーをスキャンします。センサーが検出されない場合、プログラムは終了します。
3. **センサーの検出表示:**
.. code-block:: python
for address, class_type in sensors.items():
name = class_type.__name__
print(f"Found sensor {name} at address 0x{address:02X}")
検出された各センサーの種類とI2Cアドレスを表示し、デバッグや接続確認に役立てます。
4. **メインのデータ読み取りループ:**
.. code-block:: python
while True:
data = imu.read()
# Display all sensor readings with formatted output
sleep(0.5)
- ``imu.read()`` を呼び出して、すべてのセンサーデータを辞書形式で取得します。
- 各パラメータを整形して表示します。
- 更新頻度と可読性のバランスを取るため、0.5秒の遅延を入れています。
5. **安全な終了処理:**
.. code-block:: python
except KeyboardInterrupt:
print("\nExiting program...")
``Ctrl+C`` が押されたときに ``KeyboardInterrupt`` を捕捉し、プログラムを安全に終了します。
----------------------------------------------
**トラブルシューティング**
1. **センサーが検出されない**
- **原因**: 配線ミスまたはI2C通信の問題。
- **対処方法**:
- VCC、GND、SDA、SCLの接続を確認してください。
- Raspberry PiでI2Cが有効になっているか確認します: ``sudo raspi-config`` → Interface Options → I2C
- ``i2cdetect -y 1`` を実行してセンサーのアドレスが表示されるか確認してください。
2. **値が不安定または異常**
- **原因**: 電気的ノイズまたはセンサーのキャリブレーション不足。
- **対処方法**:
- モジュールを強い磁場やモーターの近くに置かないでください。
- 安定した電源を使用し、必要に応じてデカップリングコンデンサを追加してください。
- 測定時はモジュールを安定した場所に置いてください。
3. **高度の値が正しくない**
- **原因**: 気圧基準値がキャリブレーションされていない。
- **対処方法**: 高度は海面気圧を基準に計算されます。正確な測定には既知の高度でキャリブレーションするか、海面気圧の基準値を更新してください。
4. **コンパスの方位が不正確**
- **原因**: 磁気干渉またはキャリブレーション不足。
- **対処方法**:
- モジュールを8の字に回転させて磁気センサーをキャリブレーションします。
- 金属物体やコンピューターなどの磁気源から離して使用してください。
----------------------------------------------
**拡張アイデア**
1. **モーション検出アラート**: 加速度がしきい値を超えたときに警告を出します。
.. code-block:: python
acceleration_magnitude = (data['acceleration'].x**2 +
data['acceleration'].y**2 +
data['acceleration'].z**2)**0.5
if acceleration_magnitude > 2.0: # 2G threshold
print("Motion detected!")
2. **姿勢検出**: センサーデータを組み合わせてデバイスの向きを判定します。
.. code-block:: python
# Simple orientation detection using accelerometer
if abs(data['acceleration'].z) > 9.0:
print("Device is flat")
elif data['acceleration'].y > 8.0:
print("Device is upright")
3. **データログ記録**: センサーデータをファイルに保存して分析できます。
.. code-block:: python
import csv
with open('imu_data.csv', 'a') as f:
writer = csv.writer(f)
writer.writerow([data['temperature'], data['pressure'],
data['altitude'], data['azimuth']])
4. **チルト補正コンパス**: 加速度データを使用して方位精度を向上させます。
.. code-block:: python
# Basic tilt compensation (simplified)
pitch = math.asin(-data['acceleration'].x / 9.81)
roll = math.asin(data['acceleration'].y / (9.81 * math.cos(pitch)))
# Apply compensation to magnetometer readings
----------------------------------------------
**まとめ**
このプロジェクトでは、Raspberry Piと10軸IMUモジュールを使用して、動作データと環境データを取得する方法を学びました。気圧、加速度、回転、磁場などのセンサーを統合することで、このモジュールはドローンの姿勢制御、ロボットナビゲーション、モーショントラッキングなどの高度なアプリケーションに適した包括的な慣性計測ソリューションを提供します。この基礎をもとに、センサーフュージョンアルゴリズムや高度な動作解析へと発展させることができます。