
SparkFun BNO086 Qwiic (SEN-22857)
SparkFun · VR IMU Breakout BNO086 (Qwiic), SEN-22857
Девятиосевой датчик с готовым расчётом ориентации
Автор: SLDV LAB
Опубликовано · Обновлено
О МОДУЛЕ
Что делает VR IMU Breakout BNO086 (Qwiic), SEN-22857
SparkFun SEN-22857 — плата с BNO086, в котором объединены трёхосевые акселерометр, гироскоп, магнитометр и процессор с прошивкой SH-2. Главная польза — готовое объединение измерений: хост может получать кватернион ориентации, вектор гравитации и линейное ускорение, а не писать весь алгоритм sensor fusion с нуля.
Кватернион удобен для плавного вращения 3D-модели и вычислений ориентации. Для интерфейса его можно преобразовать в углы, учитывая выбранную систему координат. Обычный Rotation Vector использует магнитометр; Game Rotation Vector обходится без него и допускает дрейф курса. Эти режимы выбирают под задачу, а не считают взаимозаменяемыми. Отличия BNO086 от BNO085 включают 14-битные данные акселерометра в fusion и интерактивную калибровку.
Идеи проектов:
- Трекер поворота головы или ручного контроллера: передавать ориентацию в приложение или визуализировать её в 3D.
- Телеметрия наклона небольшого робота: получать ориентацию и вектор гравитации для экспериментального контроллера.
- Учебный стенд sensor fusion: сравнивать Rotation Vector с Game Rotation Vector, наблюдать влияние магнитных помех и калибровки.
Сенсор измеряет движение и оценивает ориентацию; он не выдаёт точные пространственные координаты. Магниты, силовые провода, моторы и стальные детали могут искажать магнитный курс. Калибровать и проверять систему нужно после окончательной установки; заявленные показатели datasheet не являются гарантией для любого корпуса и окружения.
Для стартового примера выбран classic ESP32 и SPI: это позволяет обойти особенности обмена I²C семейства BNO08x. SparkFun также документирует работающий вариант I²C с ESP32, но требует линии INT и RST дополнительно к Qwiic и предупреждает о чувствительности таймингов. Поэтому наличие Qwiic не означает гарантированный запуск одним четырёхпроводным кабелем.
Arduino UNO R3 с ATmega328P не является поддержанным хостом для показанной полной библиотеки SparkFun: у него только 2 КБ SRAM, а драйвер SH-2 использует значительные буферы и состояние протокола. Прямое соединение 5-В сигналов UNO с этой платой также недопустимо. Для данного примера используйте ESP32; упрощённый UART-RVC — другой протокол и отдельная интеграция, а не замена библиотеке с теми же кватернионами.
Характеристики
- Микросхема
- BNO086: акселерометр + гироскоп + магнитометр + Cortex-M0+/SH-2
- Измерительные оси
- 9
- Питание платы
- 2.4–3.6 В
- Логические уровни
- Соответствуют питанию, обычно 3,3 В. VDD и VDDIO объединены; 5 В недопустимы.
- Диапазон акселерометра при SH-2
- ±8 g
- Диапазон гироскопа при SH-2
- ±2000 °/с
- Sensor fusion
- Rotation Vector, Game Rotation Vector, гравитация и линейное ускорение; отчёты включаются по отдельности
- Особенности BNO086
- 14-битное ускорение в fusion и Interactive Calibration; не обещание 14-битной точности всех выходов
- I²C
- До 400 кГц; default 0x4B, ADR замкнут → 0x4A; INT/RST нужны для рекомендованного подключения SparkFun
- SPI
- До 3 МГц, mode 3; пример 1 МГц, PS0=PS1=1, нужны INT и RST
- UART
- SHTP до 3 Мбит/с; UART-RVC 115200 бит/с, отдельный ограниченный формат
- Предельные частоты отчётов
- Rotation Vector / Game Rotation Vector до 400 Гц; Gyro Rotation Vector до 1000 Гц. Ограничения интерфейса и совместных отчётов сохраняются.
- Размер платы
- 25,4 × 30,48 мм
- Хост стартового примера
- Classic ESP32-DevKitC V4 с ESP32-WROOM-32; UNO R3 с полной библиотекой не поддерживается
- Калибровка
- Нужна проверка статуса калибровки и магнитного окружения; ошибка направления выдаётся отдельно от кватерниона
- Интерфейс
- I²C, SPI, UART
- Питание модуля
- На 3V3 и все сигнальные выводы SEN-22857 нельзя подавать 5 В. Плата не имеет 5→3,3-В входного стабилизатора и преобразователей логических уровней; VDD/VDDIO соединены. Для classic ESP32 подать стабилизированные 3,3 В с общей землёй. Для 5-В UNO потребовались бы отдельное безопасное 3,3-В питание и подходящее согласование всех сигналов, но это не решает ограничение SRAM полной библиотеки. Не соединять два источника 3,3 В параллельно. Все перемычки менять при снятом питании.
ПРАКТИКА
Подключение

| Контакт модуля | Контакт платы | Назначение |
|---|---|---|
| 3V3 | ESP32-DevKitC V4 / ESP32-WROOM-32: 3V3 | Пример SPI для classic ESP32, питание и логика 3,3 В. |
| GND | GND | Общая земля. |
| SCK | GPIO18 | SPI clock; также соединён с SCL/RXI на этой плате. |
| SO | GPIO19 (MISO) | Выход BNO086 → вход ESP32; также соединён с SDA/TXO. |
| SI | GPIO23 (MOSI) | Выход ESP32 → вход BNO086; ADR оставить разомкнутым, чтобы не замыкать SI на землю. |
| CS | GPIO27 | Активный низкий, beginSPI(PIN_CS, PIN_INT, PIN_RST, ...). |
| INT | GPIO32 | Активный низкий; нужен библиотеке для готовности SHTP, не оставлять неподключённым. |
| RST | GPIO33 | Активный низкий сброс; нужен библиотеке при старте. |
| PS0 и PS1 | Замкнуть обе штатные перемычки в положение 1 | Выбор SPI считывается при сбросе/включении. Менять только без питания. |
| I2C jumper | Разомкнуть перемычку подтяжек I²C для SPI | Требование принципиальной схемы SparkFun v10. После изменения проверить отсутствие случайных перемычек. |
| BOOT; WAK; Qwiic | BOOT/WAK не управляются скетчем; кабель Qwiic-хоста отключён | BOOT оставить в штатном высоком состоянии; низкий BOOT при старте запускает загрузчик. WAK связан с PS0; не тянуть его вниз при старте SPI. Не смешивать I²C и SPI на общих выводах. |
Подходит для ESP32. Выберите контакты по документации своей платы.
ВАШ ПРОЕКТ · ВАШ ДАТЧИК
Интегрируйте модуль с ChatGPT
Скопируйте запрос в ChatGPT. Укажите свою плату и среду разработки — получите подключение и код для своего проекта.
Помоги интегрировать именно SparkFun SEN-22857 BNO086 Qwiic. Сначала уточни точную плату хоста, среду, нужные отчёты ориентации и частоту. Не подменяй её 5-В breakout другого производителя. На SEN-22857 питание и логика обычно 3,3 В; 5 В запрещены. UNO R3/ATmega328P с 2 КБ SRAM не предлагай как готовый хост полной библиотеки SparkFun. Для стартового classic ESP32-DevKitC V4/ESP32-WROOM-32 используй SPI: SCK18, MISO19, MOSI23, CS27, INT32, RST33. При снятом питании установи PS0=PS1=1, разомкни I2C pull-up jumper согласно схеме v10, оставь ADR разомкнутой и BOOT штатным. Отключи Qwiic-кабель к I²C-хосту. Другим ESP32 подбери свои GPIO. Дай точные зависимости Arduino IDE, полный скетч для SparkFun BNO08x Cortex Based IMU 1.0.6, проверку beginSPI(), enableReport(SH2_ROTATION_VECTOR, 20000UL), обработку wasReset() и отсутствия новых отчётов. interval_us — микросекунды. Кватернион печатай в явно указанном порядке x/y/z/w; accuracy_rad — радианы, status — уровень точности, не градусы. Различай Rotation Vector с магнитометром и Game Rotation Vector без абсолютной привязки курса. Объясни калибровку и магнитные помехи. I²C допустим только с учётом известных таймингов, INT/RST и версии хоста; не обещай запуск одним Qwiic-кабелем. Отделяй проверку исходников от компиляции и физического теста.
Библиотеки
Установите библиотеку для своей среды и откройте пример из её документации.
Что именно прописать
- Хост и среда
Arduino IDE; classic ESP32-DevKitC V4 / ESP32-WROOM-32Нужен установленный пакет esp32 by Espressif Systems. S3/C3/C6 требуют другой подтверждённой распиновки.
- Библиотека
SparkFun BNO08x Cortex Based IMU 1.0.6Не старая SparkFun BNO080 Arduino Library. SH-2 включён в выбранную библиотеку; SPI входит в core.
- Заголовок
#include <SparkFun_BNO08x_Arduino_Library.h>Объект BNO08x imu; также #include <SPI.h>.
- Питание
3.3 V; common GNDНа SEN-22857 нет допуска 5-В питания/логики.
- SPI-режим платы
PS0=1; PS1=1; I2C pull-up jumper open; ADR openПеремычки менять без питания. Штатный BOOT не замыкать на GND. SPI/I²C/UART используют общие контакты.
- GPIO
SCK=18; MISO=19; MOSI=23; CS=27; INT=32; RST=33Соответствует pins и SPI.begin(18, 19, 23, PIN_CS). Управляющие GPIO выбраны вне strapping-пинов classic ESP32.
- Инициализация
imu.beginSPI(PIN_CS, PIN_INT, PIN_RST, 1000000, SPI)API версии 1.0.6. Библиотека сама использует SPI_MODE3; предельная частота датчика 3 МГц.
- Отчёт / интервал
SH2_ROTATION_VECTOR; 20000 usenableReport() принимает микросекунды; запрашивается 50 отчётов/с, фактическую частоту измерять по данным.
- Кватернион и качество
x=i, y=j, z=k, w=real; accuracy_rad; status 0..3Кватернион безразмерный; радианная оценка ошибки и status не заменяют проверку магнитного окружения.
- Сброс датчика
wasReset() -> enableReport(...) againПосле сброса включить отчёты заново; при 2 с без новых данных считать ориентацию устаревшей.
- Альтернативный I²C
PS0=0; PS1=0; default 0x4B; ADR closed -> 0x4AОтдельная схема с INT/RST, подтяжками и проверкой таймингов. В SPI-примере адрес I²C не используется.
- UNO R3
Not supported by this full-library example2 КБ SRAM и 5-В логика. Преобразователь уровней не исправляет нехватку памяти; отдельный UART-RVC-проект имеет другой формат и возможности.
Arduino IDE: BNO086 Rotation Vector по SPI на classic ESP32
cpp// SLDV LAB: SparkFun SEN-22857; Arduino IDE; BNO08x library 1.0.6.
// Classic ESP32-DevKitC V4 / ESP32-WROOM-32 ONLY.
// BNO086: 3V3->3V3, GND->GND, SCK->18, SO->19, SI->23,
// CS->27, INT->32, RST->33. Set PS0=1 and PS1=1 while unpowered.
// Open the I2C pull-up jumper per schematic v10; keep ADR open.
// Disconnect Qwiic/I2C host cables in this SPI setup; leave BOOT unforced.
#include <SPI.h>
#include <SparkFun_BNO08x_Arduino_Library.h>
constexpr uint8_t PIN_CS = 27;
constexpr uint8_t PIN_INT = 32;
constexpr uint8_t PIN_RST = 33;
constexpr uint32_t SPI_HZ = 1000000;
constexpr uint32_t REPORT_INTERVAL_US = 20000; // requested 50 reports/s
BNO08x imu;
uint32_t lastReportMs = 0;
uint32_t lastWarningMs = 0;
bool reportsEnabled = false;
bool configureReports() {
const bool ok = imu.enableReport(SH2_ROTATION_VECTOR, REPORT_INTERVAL_US);
if (!ok) Serial.println(F("Cannot enable Rotation Vector."));
delay(100);
return ok;
}
void setup() {
Serial.begin(115200);
SPI.begin(18, 19, 23, PIN_CS); // SCK, MISO, MOSI, SS
if (!imu.beginSPI(PIN_CS, PIN_INT, PIN_RST, SPI_HZ, SPI)) {
Serial.println(F("BNO086 not found: check PS0/PS1, 3V3, INT/RST and SPI."));
while (true) delay(1000);
}
reportsEnabled = configureReports();
if (!reportsEnabled) {
Serial.println(F("Stop: no report configured. Check wiring and restart."));
while (true) delay(1000);
}
lastReportMs = millis();
Serial.println(F("qx,qy,qz,qw,accuracy_rad,status"));
}
void loop() {
// A reset disables report subscriptions. Re-enable them before using data.
if (imu.wasReset()) {
Serial.println(F("Sensor reset; re-enabling reports."));
reportsEnabled = configureReports();
lastReportMs = millis();
}
if (!reportsEnabled) {
// A visible failure is preferable to publishing a stale orientation.
Serial.println(F("Reports unavailable. Check wiring and restart."));
delay(1000);
return;
}
if (imu.getSensorEvent() &&
imu.getSensorEventID() == SENSOR_REPORTID_ROTATION_VECTOR) {
lastReportMs = millis();
Serial.print(imu.getQuatI(), 6); Serial.print(',');
Serial.print(imu.getQuatJ(), 6); Serial.print(',');
Serial.print(imu.getQuatK(), 6); Serial.print(',');
Serial.print(imu.getQuatReal(), 6); Serial.print(',');
Serial.print(imu.getQuatRadianAccuracy(), 4); Serial.print(',');
Serial.println(imu.getQuatAccuracy());
}
const uint32_t now = millis();
if (now - lastReportMs > 2000 && now - lastWarningMs > 2000) {
lastWarningMs = now;
Serial.println(F("No new Rotation Vector for 2 s. Do not use stale data."));
}
delay(1);
}
Полный скетч для ESP32-DevKitC V4/ESP32-WROOM-32. API и единицы сверены с SparkFun 1.0.6, commit fd0149c280b4c7420e2dea4d034587373a8ca8b9, и официальным SPI-примером. Компиляция и физический запуск не выполнялись. Для проверки: убедиться в сообщениях инициализации, поворачивать плату медленно, проверить норму кватерниона около 1, отсутствие длительных пауз и состояние точности. Порядок печати x,y,z,w. Запрошенные 50 Гц не являются гарантией ровно 50 строк/с. Если библиотечный обмен блокируется внутри вызова, программное предупреждение в loop не заменяет watchdog и контроль питания в конечном устройстве.
Проекты с этим компонентом
Все проектыСвязанные проекты пока не опубликованы.


