注釈

こんにちは、SunFounder Raspberry Pi & Arduino & ESP32 Enthusiast Community on Facebookへようこそ!他の愛好家と一緒に、Raspberry Pi、Arduino、ESP32の世界により深く入り込みましょう。

参加する理由

  • 専門家サポート: 購入後の問題や技術的な課題を、コミュニティと私たちのチームの助けを借りて解決します。

  • 学習と共有: ヒントやチュートリアルを交換して、スキルを向上させましょう。

  • 限定プレビュー: 新製品の発表や先行プレビューに早期アクセスできます。

  • 特別割引: 最新製品を特別割引でお楽しみいただけます。

  • 季節限定キャンペーンとプレゼント: プレゼント企画やホリデーキャンペーンに参加しましょう。

👉 一緒に発見し、創造する準備はできましたか? [こちら] をクリックして、今すぐ参加しましょう!

2.15 10軸IMUセンサーモジュール

はじめに

10軸IMU(Inertial Measurement Unit:慣性計測装置)モジュールは、複数のセンサーを統合し、包括的な動作データおよび環境データを提供します。高度測定用の気圧センサー(SPL06_001)、加速度および回転を測定する6軸モーションセンサー(SH3001)、そして方位を検出する3軸磁気センサー(QMC6310)を搭載しています。この高機能モジュールは、ロボティクス、ナビゲーションシステム、モーショントラッキングなどの用途に最適です。


必要なもの

このプロジェクトに必要なコンポーネントは以下のとおりです。

COMPONENT INTRODUCTION

PURCHASE LINK

ジャンパーワイヤー

購入

10 Axis IMU module

-

Raspberry Pi

-


配線図

以下の図のようにIMUモジュールをRaspberry Piに接続します。

../_images/2.15_10axis_bb.png

I2C接続が正しく行われていることを確認してください。

  • VCC → 3.3V

  • GND → GND

  • SDA → GPIO 2 (SDA)

  • SCL → GPIO 3 (SCL)


ライブラリのインストール

10軸IMU用ライブラリをインストールします。

sudo pip install git+https://github.com/sunfounder/sunfounder-imu-python.git --break-system-packages

IMUのキャリブレーション

IMUをキャリブレーションするために、以下のスクリプトを実行します。

sudo python3 -m sunfounder_imu.calibrate

その後、スクリプトの指示に従ってIMUのキャリブレーションを行ってください。


サンプルの実行

このチュートリアルで使用するすべてのサンプルコードは ai-lab-kit ディレクトリに含まれています。 以下の手順に従ってサンプルを実行してください。

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コードです。

#!/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. インポートと設定:

    from time import sleep
    from sunfounder_imu import IMU
    

    このスクリプトでは、タイミング制御用の sleep と、センサーモジュールと通信するためのSunfounderライブラリの IMU クラスをインポートしています。

  2. センサーの初期化:

    imu = IMU()
    sensors = imu.find_sensor()
    if len(sensors) == 0:
        print("No sensor found.")
        return
    

    IMUオブジェクトを作成し、I2Cバス上の接続センサーをスキャンします。センサーが検出されない場合、プログラムは終了します。

  3. センサーの検出表示:

    for address, class_type in sensors.items():
        name = class_type.__name__
        print(f"Found sensor {name} at address 0x{address:02X}")
    

    検出された各センサーの種類とI2Cアドレスを表示し、デバッグや接続確認に役立てます。

  4. メインのデータ読み取りループ:

    while True:
        data = imu.read()
        # Display all sensor readings with formatted output
        sleep(0.5)
    
    • imu.read() を呼び出して、すべてのセンサーデータを辞書形式で取得します。

    • 各パラメータを整形して表示します。

    • 更新頻度と可読性のバランスを取るため、0.5秒の遅延を入れています。

  5. 安全な終了処理:

    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. モーション検出アラート: 加速度がしきい値を超えたときに警告を出します。

    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. 姿勢検出: センサーデータを組み合わせてデバイスの向きを判定します。

    # 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. データログ記録: センサーデータをファイルに保存して分析できます。

    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. チルト補正コンパス: 加速度データを使用して方位精度を向上させます。

    # 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モジュールを使用して、動作データと環境データを取得する方法を学びました。気圧、加速度、回転、磁場などのセンサーを統合することで、このモジュールはドローンの姿勢制御、ロボットナビゲーション、モーショントラッキングなどの高度なアプリケーションに適した包括的な慣性計測ソリューションを提供します。この基礎をもとに、センサーフュージョンアルゴリズムや高度な動作解析へと発展させることができます。