Bosch BNO055 9軸絶対方位センサー用のArduinoライブラリです。Spresense開発ボードでの使用に最適化されています。
- 9軸センサーフュージョン: 加速度計、ジャイロスコープ、磁気計のデータを融合
- I²C通信: シンプルで信頼性の高い通信プロトコル
- 自動キャリブレーション: センサーの精度を自動的に最適化
- 豊富なデータ出力: 生データとフュージョンデータの両方を提供
- 使いやすいAPI: 直感的なメソッドでセンサーデータにアクセス
- 加速度 (m/s²): 3軸の線形加速度
- 角速度 (dps): 3軸の回転速度
- 磁束密度 (µT): 3軸の磁場強度
- オイラー角 (degrees): ヘディング、ロール、ピッチ角
- キャリブレーションステータス: 各センサーの校正状態
- マイコン: Arduino互換ボード(Spresense推奨)
- センサー: BNO055モジュール
- 通信: I²C(Wire ライブラリ使用)
- 電源: 3.3V または 5V
| BNO055 | Spresense | 説明 |
|---|---|---|
| VDD | 3.3V | 電源(正) |
| GND | GND | 電源(負) |
| SCL | D15 (SCL) | I²Cクロック |
| SDA | D14 (SDA) | I²Cデータ |
| ADR | GND | I²Cアドレス選択(0x28) |
- このリポジトリをダウンロードまたはクローン
- Arduino IDEの「ライブラリ」フォルダにコピー
- Arduino IDEを再起動
#include "BNO055.h"でライブラリを使用
スケッチ → ライブラリをインクルード → ライブラリを管理 → "BNO055" を検索
#include "BNO055.h"
BNO055 bno = BNO055(); // デフォルトアドレス(0x28)
void setup() {
Serial.begin(115200);
if (!bno.begin()) {
Serial.println("BNO055初期化失敗");
while(1);
}
Serial.println("BNO055初期化完了");
}
void loop() {
// オイラー角を取得
EulerAngles euler = bno.getEulerAngles();
Serial.print("Heading: "); Serial.print(euler.heading);
Serial.print(", Roll: "); Serial.print(euler.roll);
Serial.print(", Pitch: "); Serial.println(euler.pitch);
delay(100);
}void loop() {
CalibrationStatus calib = bno.getCalibrationStatus();
Serial.print("System: "); Serial.print(calib.system);
Serial.print(", Gyro: "); Serial.print(calib.gyro);
Serial.print(", Accel: "); Serial.print(calib.accel);
Serial.print(", Mag: "); Serial.println(calib.mag);
if (calib.system >= 1 && calib.gyro >= 3 &&
calib.accel >= 3 && calib.mag >= 3) {
Serial.println("キャリブレーション完了!");
}
delay(1000);
}- 説明: BNO055インスタンスを作成
- パラメータ:
i2cAddress: I²Cアドレス(0x28 または 0x29)
- デフォルト: 0x28
- 説明: センサーを初期化し、NDOFモードに設定
- 戻り値: 成功時
true、失敗時false - 処理内容:
- I²C通信開始
- センサーリセット
- 内部クロック設定
- 単位設定
- NDOFモード切り替え
- 説明: 3軸加速度データを取得
- 戻り値:
Vector<float>構造体(x, y, z成分) - 単位: m/s²
- 説明: 3軸角速度データを取得
- 戻り値:
Vector<float>構造体(x, y, z成分) - 単位: dps(度/秒)
- 説明: 3軸磁束密度データを取得
- 戻り値:
Vector<float>構造体(x, y, z成分) - 単位: µT(マイクロテスラ)
- 説明: オイラー角を取得
- 戻り値:
EulerAngles構造体 - 成分:
heading: 方位角(0-360°)roll: ロール角(-180~+180°)pitch: ピッチ角(-90~+90°)
- 説明: キャリブレーション状況を取得
- 戻り値:
CalibrationStatus構造体 - 成分:
system: システム全体(0-3)gyro: ジャイロスコープ(0-3)accel: 加速度計(0-3)mag: 磁気計(0-3)
- レベル: 0=未校正、3=完全校正
- 説明: センサーとの接続状態を確認
- 戻り値: 接続成功時
true
template<typename T>
struct Vector {
T x, y, z;
};struct EulerAngles {
float heading; // ヨー角
float roll; // ロール角
float pitch; // ピッチ角
};struct CalibrationStatus {
uint8_t system; // システム全体
uint8_t gyro; // ジャイロスコープ
uint8_t accel; // 加速度計
uint8_t mag; // 磁気計
};BNO055は使用前にキャリブレーションが必要です。各センサーのキャリブレーション方法:
- デバイスを8の字にゆっくりと動かす
- 様々な向きに傾けながら実行
- 磁気的に清浄な環境で行う
- デバイスを6つの面に静止配置
- 上面、下面、左面、右面、前面、後面
- 各面で2-3秒間静止させる
- デバイスを完全に静止状態で配置
- 振動のない安定した場所を選ぶ
- 数秒間動かさずに待機
- 原因: 配線不良、電源不足、I²Cアドレス不一致
- 対策:
- 配線を再確認
- 電源電圧を確認(3.3V推奨)
- ADRピンの接続確認
- 原因: キャリブレーション不足、I²C通信エラー
- 対策:
- キャリブレーションを完了させる
- プルアップ抵抗の追加(4.7kΩ推奨)
- 原因: 不完全なキャリブレーション、環境的干渉
- 対策:
- キャリブレーション手順を正しく実行
- 磁気的・振動的干渉を除去
このライブラリには以下のサンプルが含まれています:
- BNO055_BasicExample.ino: 基本的な使用方法
- BNO055_CalibrationMonitor.ino: キャリブレーション監視
- 通信プロトコル: I²C(最大400kHz)
- 動作電圧: 2.4V - 3.6V
- 動作温度: -40°C - +85°C
- データ更新レート: 最大100Hz
- 分解能:
- 加速度: 1mg
- 角速度: 1°/s
- 磁気: 1µT
- オイラー角: 1°
MIT License
プルリクエストとイシューの報告を歓迎します。
- GitHub Issues: バグ報告・機能要望
- Wiki: 詳細なドキュメント
- Examples: 実用的なサンプルコード
- BNO055の基本機能実装
- NDOF モードサポート
- キャリブレーション監視機能
- サンプルコード提供