Получить значения акселерометра от BNO055 с помощью Единой библиотеки датчиков adafruit

Если я правильно понимаю, используя Adafruit_Sensor, можно извлечь информацию из конкретной информации датчика. Эти датчики в настоящее время упоминаются в файле README. Я использую BNO055 для двух вещей:

  1. Значения ориентации (курс, тангаж, крен)
  2. Значения линейного ускорения

Мой код похож на упомянутый пример adafruit_bno055's bunny

Код

Я попробовал следующее в своем цикле()

void loop() {
  // put your main code here, to run repeatedly:
  sensors_event_t event;
  bno.getEvent(&event);

  Serial.print(F("Orientation: "));
  Serial.print((float)event.orientation.x);
  Serial.print(F(" "));
  Serial.print((float)event.orientation.y);
  Serial.print(F(" "));
  Serial.print((float)event.orientation.z);
  Serial.println(F(""));

  Serial.print(F("Acceleration: "));
  Serial.print((float)event.acceleration.x);
  Serial.print(F(" "));
  Serial.print((float)event.acceleration.y);
  Serial.print(F(" "));
  Serial.print((float)event.acceleration.z);
  Serial.println(F(""));

  delay(BNO055_SAMPLERATE_DELAY_MS);
}

Создал событие sensors_event_t и использовал параметры ориентации и ускорения для получения значений ориентации и ускорения в направлениях x, y, z.

выход

Значения ориентации и акклаерации одинаковы:

Orientation: 105.50 -20.56 -101.00
Acceleration: 105.50 -20.56 -101.00
Orientation: 97.81 -14.69 -119.56
Acceleration: 97.81 -14.69 -119.56
Orientation: 93.81 -10.94 -125.56
Acceleration: 93.81 -10.94 -125.56
Orientation: 94.44 -12.25 -122.56

Я попытался добавить еще одно событие event1 в цикл (), но все равно получил те же результаты

sensors_event_t event;
  bno.getEvent(&event);

  Serial.print(F("Orientation: "));
  Serial.print((float)event.orientation.x);
  Serial.print(F(" "));
  Serial.print((float)event.orientation.y);
  Serial.print(F(" "));
  Serial.print((float)event.orientation.z);
  Serial.println(F(""));

  sensors_event_t event1;
  bno.getEvent(&event1);
  Serial.print(F("Acceleration: "));
  Serial.print((float)event1.acceleration.x);
  Serial.print(F(" "));
  Serial.print((float)event1.acceleration.y);
  Serial.print(F(" "));
  Serial.print((float)event1.acceleration.z);
  Serial.println(F(""));

  delay(BNO055_SAMPLERATE_DELAY_MS);

Не может ли BNO055 вместе с библиотекой Adafruit_Sensor не предоставлять значения ускорения и ориентации в качестве событий или библиотека используется только для получения значений ориентации из BNO055?

, 👍1

Обсуждение

I2C сканер найти его?, @Juraj

@Juraj да я получаю адреса 0x28 и 0x68. Также у меня есть RTC, подключенный к шине I2C., @Shan-Desai

согласно данным bno 0x28 является вторичным адресом и, следовательно, обнаруживается., @Shan-Desai


2 ответа


Лучший ответ:

1

Выводы

Если я использую один и тот же sensors_event_t в коде и использую event.acceleration и event.orientation в цикле (), и они предоставляют мне точно такие же значения. На самом деле я получаю одинаковые значения для курса, тангажа, крена и ускорения в направлениях x, y, z.

sensors_event_t event;
  bno.getEvent(&event);

  Serial.print(F("Orientation: "));
  Serial.print((float)event.orientation.heading);
  Serial.print(F(" "));
  Serial.print((float)event.orientation.pitch);
  Serial.print(F(" "));
  Serial.print((float)event.orientation.roll);
  Serial.println(F(""));
 Serial.print((float)event.acceleration.x); // same as roll
 Serial.println(F(""));
 Serial.print((float)event.acceleration.y); // same as pitch
 Serial.println(F(""));
 Serial.print((float)event.acceleration.z); // same as heading
 Serial.println(F(""));

Датчик

У меня есть датчик BNO055 с синей точкой, и на нем есть маркировка для направлений X, Y, Z следующим образом: Orientation on Sensor

Я сверился с логикой углов Эйлера из Википедии

Если я поворачиваюсь вдоль оси x, я действительно получаю крен (от 0 до 360) и так далее.

Вывод

Библиотека Adafruit_Sensor предоставляет только значения ориентации при использовании с BNO055, а значения линейного ускорения необходимо вызывать отдельно с помощью Adafruit_BNO055.

код для линейного ускорения и ориентации

  sensors_event_t event;
  bno.getEvent(&event);

  Serial.print(F("Orientation: "));
  Serial.print((float)event.orientation.heading);
  Serial.print(F(" "));
  Serial.print((float)event.orientation.pitch);
  Serial.print(F(" "));
  Serial.print((float)event.orientation.roll);
  Serial.println(F(""));
//  Serial.print((float)event.acceleration.x); // same as roll
//  Serial.println(F(""));
//  Serial.print((float)event.acceleration.y); // same as pitch
//  Serial.println(F(""));
//  Serial.print((float)event.acceleration.z); // same as heading
//  Serial.println(F(""));

  imu::Vector<3> li_ac = bno.getVector(Adafruit_BNO055::VECTOR_ACCELEROMETER);
  Serial.print(F("Li. Acc.: "));
  Serial.print((float)li_ac.x());
  Serial.print(F(" "));

  Serial.print((float)li_ac.y());
  Serial.print(F(" "));

  Serial.print((float)li_ac.z());
  Serial.print(F(" "));
  Serial.println();

  delay(BNO055_SAMPLERATE_DELAY_MS);
,

0

Вы должны установить режим работы из перечисления adafruit_bno055_opmode_t. Используйте bno.setMode.

Для режимов см. раздел 3.3 в техническом описании.

sensors_event_t-это структура объединения, поэтому доступ к одной и той же памяти осуществляется с разными именами членов.

,

Я не уверен, какой режим использовать, и я попытался установить его в "IMUPlus", а также попробовал с "NDOF", но я получаю те же значения для "событие.ускорение" и "событие.ориентация"., @Shan-Desai

не очень-то помогает. Я сослался на таблицу данных после того, как вы ответили, и установил их в коде " setup ()", и это обеспечивает тот же вывод, @Shan-Desai

как я пишу, структура-это союз. он содержит массив из 4 поплавков. эти поплавки доступны, так как [0], [1], [2], [3] или над одним из псевдонимов типа "sensors_vec_t" с именами "ускорение", магнитное, ориентация и "гироскоп". первый поплавок имеет дополнительные псевдонимы, такие как "температура", расстояние. Событие может вернуть только одно чтение, @Juraj

прочитайте описание режимов "В режиме IMU относительная ориентация BNO055 в пространстве рассчитывается по данным акселерометра и гироскопа. Расчет выполняется быстро (т. е. с высокой скоростью передачи выходных данных)", @Juraj

Поэтому я предполагаю, что с помощью этой библиотеки я могу использовать только "событие.ориентация" и получать крен, высоту и крен, и мне нужно использовать "Adafruit_BNO055", чтобы получить линейное значение acc. отдельно, @Shan-Desai

вы можете считывать данные отдельных датчиков или режимов слияния. Я не вижу, как считывать данные с помощью этой библиотеки для комбинированных режимов, таких как режим AMG, @Juraj