以下では、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 イメージが書き込まれているもの)
- ソフトウェアと前提条件
- Raspberry Pi 4 に Ubuntu がインストール済み
- ターミナル操作が可能であること
- インターネット接続がある(パッケージやリポジトリのクローンに必要)
- sudo 権限を持つユーザ(例:
pi
ユーザ)で操作できる
3. ハードウェア配線(I²C 前提)
以下の表は、BNO055 を I²C モードで動作させるための Raspberry Pi 4 ヘッダピンとの接続一覧です。すべて 3.3V ロジックで接続し、PS0/PS1 を GND に落とすことで I²C モードを選択します。
BNO055 ブレイクアウト ピン | Raspberry Pi 4 ヘッダ ピン | BCM 番号 / 機能 | 説明 |
---|---|---|---|
VIN | Pin 1 (3V3) | 3.3V | センサ用電源。必ず 3.3V を供給します。5V は使わない。 |
GND | Pin 6 (GND) | GND | グランドを接続し、Pi とセンサで共通の基準電位をとります。 |
PS0 | Pin 6 (GND) | GND | I²C モード選択のため、PS0 を GND に接続(PS0=GND, PS1=GND => I²C)。 |
PS1 | Pin 6 (GND) | GND | I²C モード選択のため、PS1 も GND に接続。 |
SDA | Pin 3 (GPIO 2 / SDA) | BCM 2 (I²C SDA) | Pi の SDA をセンサの SDA に接続。Pi には内蔵プルアップ抵抗があるため追加不要。 |
SCL | Pin 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=on
や dtparam=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
が出力されることがありますが、その後しばらく待つと正しい周囲温度が表示されます。
ボードを傾けたり回転させたりすると、Acceleration
や Euler angle
などがリアルタイムに変化するはずです。
8.3 表示項目の解説
以下は、スクリプト実行時にターミナル上に表示される各項目の意味を日本語で説明したものです。
- Temperature センサー内部にある温度センサーが返す温度値を示します。単位は摂氏(°C)です。起動直後はセンサー内の初期化中であるため
-100 °C
が表示されることがありますが、しばらく待つと実際の温度が反映されます。 - Accelerometer (m/s²) X, Y, Z 軸方向の加速度値を示します。重力の影響を含むため、静止時には Z 軸方向に約 9.8 m/s² が表示されます。X や Y 軸には、傾きや振動に応じた小さな値(例:0.1〜0.3 m/s² 程度)が表示されるのが正常です。
- Magnetometer (microteslas) X, Y, Z 軸方向の磁界強度を μT(マイクロテスラ)単位で表示します。地磁気は日本国内で約 30〜60 μT 程度ですが、近くに金属や電子機器があると数値が変動します。
- Gyroscope (rad/sec) X, Y, Z 軸方向の角速度をラジアン毎秒(rad/sec)で示します。センサーが静止している場合はほぼ 0 rad/sec が表示され、回転させると回転速度に応じた値が検出されます。わずかなノイズで ±0.001 rad/sec 程度の値が表示されることがあります。
- Euler angle (
heading
,roll
,pitch
) の組を度(°)で表示します。heading
は方位角(0〜360°)、roll
とpitch
は機体の傾き(-90°〜+90°程度)を示します。センサーを水平に置くと、roll
とpitch
がほぼ 0° になるはずです。 - Quaternion 回転を表現する 4 元数 (w, x, y, z) の値を表示します。オイラー角より連続的な回転表現に優れており、クォータニオンのノルム(√(w² + x² + y² + z²))が 1 に近ければ正しい回転表現が得られています。
- Linear acceleration (m/s²) センサーから得られた加速度値から重力成分を除去した純粋な動きによる加速度を示します。動かさない状態ではほぼ (0, 0, 0) に近い値となり、急に動かすとその方向の加速度値が大きく表示されます。
- 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
)がリストに出ているかを確認。- もし出ていなければ、
- 配線(SDA, SCL, VIN, GND, PS0/PS1)を再確認
/boot/firmware/config.txt
のdtparam=i2c_arm=on
が反映されているかをチェック (ls /dev/i2c-1
を実行して確認)- 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.txt
にdtparam=i2c_arm_baudrate=50000
などで 50kHz に落としてみる - センサ自体の障害の可能性を念頭に置きつつ、別の BNO055 基板で試してみる
9.4 値がノイズまみれ・動きがおかしい場合
- BNO055 はキャリブレーションが完了していないと大きく値がばらつきます。公式サンプル
bno055_calibrator.py
を使ってキャリブレーション状態を確認し、- ジャイロを水平に置いて全軸キャリブレーション
- 磁気センサーは八の字を描くように回してキャリブレーション
- 各種オフセットを保存して次回起動時に適用
- リニア加速度と重力成分を別々に取得するには BNO055 の動作モードを変更する必要があります。SDK のリファレンスを参照してください。
10. まとめ
- ハードウェア配線: PS0/PS1 を GND にして I²C モード化し、VIN→3V3, GND→GND, SDA→BCM2, SCL→BCM3 と接続。
- Ubuntu での I²C 有効化:
/boot/firmware/config.txt
の[all]
セクションにdtparam=i2c_arm=on
を追加し、再起動。 - 必要パッケージの導入:
i2c-tools
,python3-smbus
,python3-rpi.gpio
,libgpiod-dev
,python3-pip
,build-essential
などをインストール。 - サンプルクローン:
git clone https://github.com/adafruit/Adafruit_CircuitPython_BNO055.git
でサンプル取得。 - Python ライブラリのインストール:
sudo pip3 install adafruit-blinka adafruit-circuitpython-bno055 Adafruit-PlatformDetect
。 - サンプル実行:
python3 bno055_simpletest.py
を実行し、値が安定して表示され、ボードを傾けるとリアルタイムに変化すれば成功。
以上の手順を踏むことで、Ubuntu 環境下の Raspberry Pi 4 でも安定して BNO055 を I²C 接続で利用できるようになります。ロボットの姿勢制御や慣性計測、IMU データの解析など、さまざまなプロジェクトでお役立てください。
コメント