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 В параллельно. Все перемычки менять при снятом питании.

ПРАКТИКА

Подключение

Схема подключения
Контакт модуляКонтакт платыНазначение
3V3ESP32-DevKitC V4 / ESP32-WROOM-32: 3V3Пример SPI для classic ESP32, питание и логика 3,3 В.
GNDGNDОбщая земля.
SCKGPIO18SPI clock; также соединён с SCL/RXI на этой плате.
SOGPIO19 (MISO)Выход BNO086 → вход ESP32; также соединён с SDA/TXO.
SIGPIO23 (MOSI)Выход ESP32 → вход BNO086; ADR оставить разомкнутым, чтобы не замыкать SI на землю.
CSGPIO27Активный низкий, beginSPI(PIN_CS, PIN_INT, PIN_RST, ...).
INTGPIO32Активный низкий; нужен библиотеке для готовности SHTP, не оставлять неподключённым.
RSTGPIO33Активный низкий сброс; нужен библиотеке при старте.
PS0 и PS1Замкнуть обе штатные перемычки в положение 1Выбор SPI считывается при сбросе/включении. Менять только без питания.
I2C jumperРазомкнуть перемычку подтяжек I²C для SPIТребование принципиальной схемы SparkFun v10. После изменения проверить отсутствие случайных перемычек.
BOOT; WAK; QwiicBOOT/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 us

enableReport() принимает микросекунды; запрашивается 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 example

2 КБ 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 и контроль питания в конечном устройстве.

Проекты с этим компонентом

Все проекты

Связанные проекты пока не опубликованы.

Связанные материалы и компоненты