BNO055 (Adafruit 9-DOF IMU) を Raspberry Pi 4(Ubuntu)で I²C 接続で使う手順

  • URLをコピーしました!

※本ページはアフィリエイト広告を利用しています

以下では、Adafruit の BNO055 センサーを Raspberry Pi 4(Ubuntu インストール済み)と I²C 接続し、動作確認するまでの手順をまとめています。

ハードウェア配線、Ubuntu 上での設定、ライブラリのインストール、サンプルコードの実行方法について、一連の流れに沿って解説します。

目次

1. Adafruit 9-DOF Absolute Orientation Sensor とは

Adafruit が提供する「9-DOF Absolute Orientation Sensor (BNO055)」は、慣性計測ユニット(IMU)として加速度、角速度、磁気、温度などをひとまとめに取得できるセンサーです。Raspberry Pi 4 と組み合わせることで、ロボットやドローン、姿勢制御システムなどの開発に活用できます。

本手順では、Raspberry Pi 4 に Ubuntu をインストールして使用している場合を想定し、I²C モードで BNO055 を読み取る方法を整理しました。Ubuntu 環境向けに特有の設定やインストール手順も含めて解説しています。

入手先

Adafruit 9-DOF Absoluteはスイッチサイエンスで購入可能です。

使用するマイコンボードはロボットに搭載してバッテリ駆動するためRaspberry Pi 4を使用します。

配線はプロトタイプなのでジャンパーワイヤーを使用します。

2. 必要な機材と前提条件

  • ハードウェア
    • Raspberry Pi 4 Model B(Ubuntu 22.04 LTS がインストール済み)
    • Adafruit 9-DOF Absolute Orientation IMU Fusion Breakout – BNO055 (製品番号 2472)
    • ジャンパワイヤ × 6 本以上(余裕を持って接続用に用意)
    • I²C 有効化用の microSD カード(Ubuntu イメージが書き込まれているもの)
  • ソフトウェアと前提条件
    1. Raspberry Pi 4 に Ubuntu がインストール済み
    2. ターミナル操作が可能であること
    3. インターネット接続がある(パッケージやリポジトリのクローンに必要)
    4. sudo 権限を持つユーザ(例:pi ユーザ)で操作できる

3. ハードウェア配線(I²C 前提)

以下の表は、BNO055 を I²C モードで動作させるための Raspberry Pi 4 ヘッダピンとの接続一覧です。すべて 3.3V ロジックで接続し、PS0/PS1 を GND に落とすことで I²C モードを選択します。

BNO055 ブレイクアウト ピンRaspberry Pi 4 ヘッダ ピンBCM 番号 / 機能説明
VINPin 1 (3V3)3.3Vセンサ用電源。必ず 3.3V を供給します。5V は使わない。
GNDPin 6 (GND)GNDグランドを接続し、Pi とセンサで共通の基準電位をとります。
PS0Pin 6 (GND)GNDI²C モード選択のため、PS0 を GND に接続(PS0=GND, PS1=GND => I²C)。
PS1Pin 6 (GND)GNDI²C モード選択のため、PS1 も GND に接続。
SDAPin 3 (GPIO 2 / SDA)BCM 2 (I²C SDA)Pi の SDA をセンサの SDA に接続。Pi には内蔵プルアップ抵抗があるため追加不要。
SCLPin 5 (GPIO 3 / SCL)BCM 3 (I²C SCL)Pi の SCL をセンサの SCL に接続。Pi4 はクロックストレッチングをサポートしているため安定動作。
RST(任意)Pin 18 (GPIO 24)BCM 24外部リセット用。必要に応じて GPIO からリセット可能。不要なら未接続で OK。

PS0, PS1 を両方 GND にすることで、BNO055 は I²C インターフェースを使うモードになります。PS1 を 3.3V にすると UART モードになりますが、本手順では I²C 前提です。

4. Ubuntu での I²C 有効化

Ubuntu 環境で Raspberry Pi の I²C を動作させるために、/boot/firmware/config.txt に対して dtparam=i2c_arm=on を追加し、I²C カーネルモジュールを読み込む必要があります。

4.1 /boot/firmware/config.txt の編集

ターミナルを開き、config.txt を編集用に開きます:

sudo nano /boot/firmware/config.txt

ファイル内の [all] セクションを探し、dtparam=audio=ondtparam=spi=on が書かれているブロックの直下に、以下の行を追加します: dtparam=i2c_arm=on

例:

[all] 
dtparam=audio=on 
dtparam=i2c_arm=on # ここに追加 
dtparam=spi=on 
disable_overscan=1 
enable_uart=1

変更を保存して nano を終了します (Ctrl+O, Enter, Ctrl+X)。

システムを再起動します: sudo reboot

4.2 I²C バスの認識確認

再起動後、i2cdetect コマンドで I²C バスが /dev/i2c-1 として認識されているか確認します。事前に i2c-tools がインストールされていない場合は第 5 章でインストールしてから実行します。

sudo i2cdetect -y 1

結果に 0x28 または 0x29 が表示されれば、BNO055 が正しく I²C バスに接続されていることを示します(BNO055 のデフォルトアドレスは 0x28)。

表示例:

     0 1 2 3 4 5 6 7 8 9 a b c d e f
00:          -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- 28 -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
...

5. パッケージのインストール

Ubuntu 環境で I²C や GPIO 制御、Python からのアクセスを行うため、必要なパッケージとモジュールをインストールします。

sudo apt-get update
sudo apt-get install -y \
  i2c-tools python3-smbus \
  python3-pip python3-dev build-essential \
  python3-rpi.gpio libgpiod-dev
  • i2c-tools / python3-smbus: I²C デバイスの検出・アクセスに必要。
  • python3-rpi.gpio: CircuitPython の Blinka が内部で RPi.GPIO を使うケースのため。
  • libgpiod-dev: Blinka が libgpiod ベースで GPIO 制御する際に必要。
  • python3-pip, python3-dev, build-essential: Pip や Python モジュールのビルドに必要な開発環境。

6. Git リポジトリからサンプルをクローン

Adafruit が公開している CircuitPython 用 BNO055 ドライバのリポジトリをクローンし、サンプルコードを取得します。

公式リポジトリは以下となります。

6.1 Git のインストール確認

Git がインストールされていない場合、以下で導入してください:

git --version
# インストールされていなければ
sudo apt-get install -y git

6.2 リポジトリのクローン

クローン先ディレクトリを選んで移動し、git clone を実行します。以下ではホームディレクトリを例にしています。

cd ~
git clone https://github.com/adafruit/Adafruit_CircuitPython_BNO055.git
cd Adafruit_CircuitPython_BNO055/examples
  • クローン後、examples/ フォルダ内に複数のサンプルスクリプト(bno055_simpletest.py など)が格納されています。

7. Python ライブラリのインストール

Adafruit の CircuitPython ドライバを Python 環境に追加します。

sudo pip3 install --upgrade adafruit-circuitpython-bno055 adafruit-blinka Adafruit-PlatformDetect
  • adafruit-blinka: CircuitPython を Linux 環境上で動かすための抽象レイヤ。GPIO/I²C などを背後で統一的に扱う。
  • Adafruit-PlatformDetect: ブードプラットフォーム検出用ライブラリ。
  • adafruit-circuitpython-bno055: BNO055 固有のドライバモジュール。

これによって、以下のようなインポートが可能になります:

import board
import busio
import adafruit_bno055

8. サンプルスクリプトの実行

8.1 bno055_simpletest.py の概要

温度、加速度、磁力、ジャイロ、オイラー角、クォータニオン、リニア加速度、重力加速度などを 1 秒間隔でターミナルに表示します。

I²C モードで初期化する場合は、スクリプト中に以下のようになっています:

import board
import busio
import adafruit_bno055
import time

# I2C 初期化
i2c = busio.I2C(board.SCL, board.SDA)
sensor = adafruit_bno055.BNO055_I2C(i2c)

while True:
    print("Temperature:", sensor.temperature, "degrees C")
    print("Accelerometer (m/s^2):", sensor.acceleration)
    print("Magnetometer (microteslas):", sensor.magnetic)
    print("Gyroscope (rad/sec):", sensor.gyro)
    print("Euler angle:", sensor.euler)
    print("Quaternion:", sensor.quaternion)
    print("Linear acceleration (m/s^2):", sensor.linear_acceleration)
    print("Gravity (m/s^2):", sensor.gravity)
    print()
    time.sleep(1)

8.2 実行手順

ターミナルで examples/ ディレクトリに移動:

cd ~/Adafruit_CircuitPython_BNO055/examples

サンプルを実行:

python3 bno055_simpletest.py

初回は Temperature: -100 degrees C が出力されることがありますが、その後しばらく待つと正しい周囲温度が表示されます。

ボードを傾けたり回転させたりすると、AccelerationEuler angle などがリアルタイムに変化するはずです。

8.3 表示項目の解説

以下は、スクリプト実行時にターミナル上に表示される各項目の意味を日本語で説明したものです。

  1. Temperature センサー内部にある温度センサーが返す温度値を示します。単位は摂氏(°C)です。起動直後はセンサー内の初期化中であるため -100 °C が表示されることがありますが、しばらく待つと実際の温度が反映されます。
  2. Accelerometer (m/s²) X, Y, Z 軸方向の加速度値を示します。重力の影響を含むため、静止時には Z 軸方向に約 9.8 m/s² が表示されます。X や Y 軸には、傾きや振動に応じた小さな値(例:0.1〜0.3 m/s² 程度)が表示されるのが正常です。
  3. Magnetometer (microteslas) X, Y, Z 軸方向の磁界強度を μT(マイクロテスラ)単位で表示します。地磁気は日本国内で約 30〜60 μT 程度ですが、近くに金属や電子機器があると数値が変動します。
  4. Gyroscope (rad/sec) X, Y, Z 軸方向の角速度をラジアン毎秒(rad/sec)で示します。センサーが静止している場合はほぼ 0 rad/sec が表示され、回転させると回転速度に応じた値が検出されます。わずかなノイズで ±0.001 rad/sec 程度の値が表示されることがあります。
  5. Euler angle (heading, roll, pitch) の組を度(°)で表示します。heading は方位角(0〜360°)、rollpitch は機体の傾き(-90°〜+90°程度)を示します。センサーを水平に置くと、rollpitch がほぼ 0° になるはずです。
  6. Quaternion 回転を表現する 4 元数 (w, x, y, z) の値を表示します。オイラー角より連続的な回転表現に優れており、クォータニオンのノルム(√(w² + x² + y² + z²))が 1 に近ければ正しい回転表現が得られています。
  7. Linear acceleration (m/s²) センサーから得られた加速度値から重力成分を除去した純粋な動きによる加速度を示します。動かさない状態ではほぼ (0, 0, 0) に近い値となり、急に動かすとその方向の加速度値が大きく表示されます。
  8. Gravity (m/s²) 重力成分のみを抽出して表示します。静止状態では Z 軸に約 9.8 m/s² が表示され、X, Y 軸には傾きによる成分(-0.05〜0.3 m/s² 程度)が表示されます。

9. 動作確認とトラブルシューティング

以下はいくつかのチェックポイントと対策例です。

9.1 I²C デバイスが検出できない場合

  • i2cdetect -y 1 を実行して、0x28(場合によっては 0x29)がリストに出ているかを確認。
  • もし出ていなければ、
    1. 配線(SDA, SCL, VIN, GND, PS0/PS1)を再確認
    2. /boot/firmware/config.txtdtparam=i2c_arm=on が反映されているかをチェック (ls /dev/i2c-1 を実行して確認)
    3. Pi を再起動して再確認

9.2 ModuleNotFoundError: No module named 'RPi' が出る場合

  • Ubuntu 環境では python3-rpi.gpio パッケージをインストールしていない可能性が高いため、以下を実行: sudo apt-get install -y python3-rpi.gpio
  • それでもエラーが出る場合は、pip3 install RPi.GPIO を試すか、手動で _GPIO.so をコピーする方法を検討(第 2.4 節を参照)。

9.3 温度がずっと -100 °C のままの場合

  • スクリプト実行直後は BNO055 内部の温度センサーがウォームアップ中のため -100 °C が出ます。数秒–数十秒待っても直らない場合は、
    • i2cdetect でアドレスを再確認
    • I²C バスが速すぎる場合に通信が不安定になることがあるので、/boot/firmware/config.txtdtparam=i2c_arm_baudrate=50000 などで 50kHz に落としてみる
    • センサ自体の障害の可能性を念頭に置きつつ、別の BNO055 基板で試してみる

9.4 値がノイズまみれ・動きがおかしい場合

  • BNO055 はキャリブレーションが完了していないと大きく値がばらつきます。公式サンプル bno055_calibrator.py を使ってキャリブレーション状態を確認し、
    1. ジャイロを水平に置いて全軸キャリブレーション
    2. 磁気センサーは八の字を描くように回してキャリブレーション
    3. 各種オフセットを保存して次回起動時に適用
  • リニア加速度と重力成分を別々に取得するには BNO055 の動作モードを変更する必要があります。SDK のリファレンスを参照してください。

10. まとめ

  1. ハードウェア配線: PS0/PS1 を GND にして I²C モード化し、VIN→3V3, GND→GND, SDA→BCM2, SCL→BCM3 と接続。
  2. Ubuntu での I²C 有効化: /boot/firmware/config.txt[all] セクションに dtparam=i2c_arm=on を追加し、再起動。
  3. 必要パッケージの導入: i2c-tools, python3-smbus, python3-rpi.gpio, libgpiod-dev, python3-pip, build-essential などをインストール。
  4. サンプルクローン: git clone https://github.com/adafruit/Adafruit_CircuitPython_BNO055.git でサンプル取得。
  5. Python ライブラリのインストール: sudo pip3 install adafruit-blinka adafruit-circuitpython-bno055 Adafruit-PlatformDetect
  6. サンプル実行: python3 bno055_simpletest.py を実行し、値が安定して表示され、ボードを傾けるとリアルタイムに変化すれば成功。

以上の手順を踏むことで、Ubuntu 環境下の Raspberry Pi 4 でも安定して BNO055 を I²C 接続で利用できるようになります。ロボットの姿勢制御や慣性計測、IMU データの解析など、さまざまなプロジェクトでお役立てください。

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


目次