Настройка акселерометра на датчике BNO055
Я использую датчик BNO055 9DOF Adafruit для измерения ускорения/ориентации. Как изменить конфигурацию акселерометра с 4G (по умолчанию) на 16G?
Что я уже знаю:
Техническое описание: https://cdn-shop.adafruit.com/datasheets/BST_BNO055_DS000_12.pdf
В пункте 3.5.2 на странице 27 мне нужно изменить xxxxxx01b на xxxxxx11b в файле конфигурации (то есть в библиотеке). Я использую https://github.com/adafruit/Adafruit_BNO055, но не смог найти информацию о том, что и где нужно изменить в h-файле.
Есть идеи?
Спасибо
@Docopol, 👍1
1 ответ
Это частично обсуждалось как проблема на GitHub библиотеки
- https://github.com/adafruit/Adafruit_BNO055/issues/48
Вот как я это понимаю:
Библиотека не настраивает нужные вам регистры. Я не вижу ссылки на запись в регистр ACC_CONFIG (адрес 8). Это даже не определено в заголовке.
Датчик имеет две страницы регистров (0 и 1) [см. стр. 50]. То есть, если выбрать страницу 0, то регистр по адресу X будет означать одно, а на странице 1 — другое.
Мы хотим записать в ACC_Config по адресу 0x08 на странице 1.
На странице 77 говорится, что относительно записи в регистр: «Запись: может быть изменена только в режиме датчика, см. раздел 3.5.2».
В коде можно что-то взломать:
- https://github.com/adafruit/Adafruit_BNO055/blob/master/Adafruit_BNO055.cpp#L115
После перехода в режим датчика вы можете записать в регистр как
//значения взяты из раздела 3.5.2, стр. 27
#define BNO055_ACC_CONFIG_2G (0) //0B00
#define BNO055_ACC_CONFIG_4G (1) //0B01
#define BNO055_ACC_CONFIG_8G (2) //0B10
#define BNO055_ACC_CONFIG_16G (3) //0B11
//определения пропускной способности
#define BNO055_ACC_BW_7_81_Hz (0)
#define BNO055_ACC_BW_15_63_Hz (1)
#define BNO055_ACC_BW_31_25_Hz (2)
#define BNO055_ACC_BW_62_5_Hz (3)
#define BNO055_ACC_BW_125_Hz (4)
#define BNO055_ACC_BW_250_Hz (5)
#define BNO055_ACC_BW_500_Hz (6)
#define BNO055_ACC_BW_1000_Hz (7)
//определения режима мощности
#define BNO055_ACC_PWRMODE_NORMAL (0)
#define BNO055_ACC_PWRMODE_SUSPEND (1)
#define BNO055_ACC_PWRMODE_LP1 (2)
#define BNO055_ACC_PWRMODE_STANDBY (3)
#define BNO055_ACC_PWRMODE_LP2 (4)
#define BNO055_ACC_PWRMODE_DEEP_SUSPEND (5)
#define BNO055_ACC_CONFIG_ADDR 0x08
//Выберите идентификатор страницы 1 для записи в правый регистр
write8(BNO055_PAGE_ID_ADDR, 1);
//создать значение конфигурации с помощью битовых сдвигов
//см. стр. 77
//использовать все стандартные значения, кроме параметра 16G
uint8_t acc_config = (uint8_t)((BNO055_ACC_PWRMODE_NORMAL << 5)
| (BNO055_ACC_BW_62_5_Hz << 2)
| BNO055_ACC_CONFIG_16G);
//записать новую конфигурацию акселерометра
write8(BNO055_ACC_CONFIG_ADDR, acc_config);
//возврат к идентификатору страницы 0 (или тому, что было до этого)
//В противном случае мы считываем данные датчика с неправильной страницы, имея совершенно другой смысл.
write8(BNO055_PAGE_ID_ADDR, 0);
Поскольку у меня нет этого датчика, я не могу его проверить. Это лишь базовая идея. Вы также можете читать регистры с помощью read8, чтобы убедиться, что перед записью в регистр он имеет некое стандартное (или ожидаемое) значение. Например, ACC_CONFIG должен читаться как 0B00001101 = 0x0d. И после записи значения вы должны иметь возможность прочитать то же значение обратно, иначе чип не позволил бы вам выполнить запись, и вам придётся разбираться, почему.
Да, большую часть работы придётся выполнять самостоятельно. Переход с 4G на 16G может также повлечь за собой необходимость в других расчётах исходных данных, но я в этом не уверен.
- Определение относительно точной скорости с помощью ИДУ
- После восстановления смещения BNO055 на датчике все значения калибровки равны 0.
- Получить значения акселерометра от BNO055 с помощью Единой библиотеки датчиков adafruit
- Ooops, no LSM303 detected ... Check your wiring!
- Как подключить несколько акселерометров MMA8451 (протокол I2C) с помощью одного Arduino Mega
- ADXL345 выдает ошибку проводки в режиме SPI
- Значения кватернионов из BNO055 недоступны.
- Можно ли измерить скорость акселерометром? Насколько точно?