Библиотека Arduino для связи с шестиосными инерциальными измерительными блоками (IMU) ICM42688.
InvenSense ICM42688 поддерживает I2C до 400 кГц и связь SPI до 1 МГц для настройки регистров и 24 МГц для чтения данных. Доступны следующие выбираемые полномасштабные диапазоны датчиков:
Полномасштабный диапазон гироскопа | Полный диапазон шкалы акселерометра |
---|---|
+/- 15,6 (град/с) | - |
+/- 31,2 (град/с) | - |
+/- 62,5 (град/с) | - |
+/- 125 (град/с) | - |
+/- 250 (град/с) | +/- 2 (г) |
+/- 500 (град/с) | +/- 4 (г) |
+/- 1000 (град/с) | +/- 8 (г) |
+/- 2000 (град/с) | +/- 16 (г) |
ICM42688 осуществляет выборку данных гироскопов и акселерометров с помощью 16-битных аналого-цифровых преобразователей. Он также оснащен программируемыми цифровыми фильтрами, точными часами, встроенным датчиком температуры, программируемыми прерываниями (включая пробуждение при движении) и буфером FIFO емкостью 512 байт.
Эта библиотека поддерживает связь I2C и SPI с ICM42688.
Просто клонируйте или загрузите эту библиотеку в папку Arduino/libraries.
Эта библиотека поддерживает связь I2C и SPI с ICM42688. Объявление объекта ICM42688 перегружено различными объявлениями для связи I2C и SPI. Все остальные функции остаются прежними. Кроме того, включен производный класс ICM42688FIFO , который обеспечивает настройку FIFO и функции сбора данных в дополнение ко всем функциям, включенным в базовый класс ICM42688 .
ICM42688(TwoWire &bus, адрес uint8_t) Должен быть объявлен объект ICM42688, указав шину I2C и адрес I2C ICM42688. Адрес ICM42688 I2C будет равен 0x68, если вывод AD0 заземлен, или 0x69, если вывод AD0 поднят на высокий уровень. Например, следующий код объявляет объект ICM42688, называемый IMU , с датчиком ICM42688, расположенным на шине I2C 0, с адресом датчика 0x68 (заземленный AD0).
ICM42688 IMU (Wire, 0x68 );
ICM42688(TwoWire &bus, адрес uint8_t) Должен быть объявлен объект ICM42688, указав шину I2C и адрес I2C ICM42688. Адрес ICM42688 I2C будет равен 0x68, если вывод AD0 заземлен, или 0x69, если вывод AD0 поднят на высокий уровень. Например, следующий код объявляет объект ICM42688, называемый IMU , с датчиком ICM42688, расположенным на шине I2C 0, с адресом датчика 0x68 (заземленный AD0). Вы должны указать контакты SDA и SCL для вашего соединения I2C (по умолчанию для Arduino — SDA=18, SCL=19, ESP32 — SDA=21, SCL=22).
ICM42688 IMU (Wire, 0x68 , _sda_pin, _scl_pin);
ICM42688FIFO(SPIClass &bus, uint8_t csPin, uint32_t SPI_HS_CLK=8000000) Должен быть объявлен объект ICM42688, указывающий используемую шину SPI и вывод выбора микросхемы. На одной и той же шине SPI можно использовать несколько объектов ICM42688 или других объектов SPI, каждый со своим собственным выводом выбора микросхемы. Выводом выбора чипа может быть любой доступный цифровой вывод. Например, следующий код объявляет объект ICM42688, называемый IMU , с датчиком ICM42688, расположенным на шине SPI 0 с контактом выбора чипа 10.
ICM42688 IMU (SPI, 10 );
Обратите внимание, что тактовая частота высокоскоростной шины SPI по умолчанию установлена на 8 МГц, но ICM 42688-p поддерживает тактовую частоту SPI до 24 МГц. Используйте более быструю тактовую частоту для более быстрой передачи данных SPI при чтении данных.
Следующие функции используются для настройки датчика ICM42688. Их следует вызывать один раз перед сбором данных, обычно это делается в функции Arduino setup()
. Функцию begin()
следует использовать всегда. При желании функции setAccelFS
и setGyroFS
, setAccelODR
и setGyroODR
можно использовать для установки диапазонов полной шкалы акселерометра и гироскопа и скорости выходных данных на значения, отличные от значений по умолчанию. enableDataReadyInterrupt
и disableDataReadyInterrupt
контролируют, генерирует ли ICM42688 прерывание при готовности данных. enableFifo
устанавливает и включает буфер FIFO. Эти функции подробно описаны ниже.
int Begin() Это должно быть вызвано в вашей функции настройки. Он инициализирует связь с ICM42688, настраивает датчик для считывания данных и оценивает смещение гироскопа, которое удаляется из данных датчика. Эта функция возвращает положительное значение при успешной инициализации и отрицательное значение при неудачной инициализации. Если это не помогло, проверьте проводку или попробуйте сбросить питание датчика. Ниже приведен пример настройки ICM42688.
int status = IMU.begin();
(необязательно) int setAccelRange(диапазон AccelRange) Эта функция устанавливает полный диапазон шкалы акселерометра на заданное значение. По умолчанию, если эта функция не вызывается, будет использоваться полный диапазон шкалы +/- 16 г. Перечисленные диапазоны полной шкалы акселерометра:
Название акселерометра | Полный диапазон шкалы акселерометра |
---|---|
gpm2 | +/- 2 (г) |
gpm4 | +/- 4 (г) |
gpm8 | +/- 8 (г) |
gpm16 | +/- 16 (г) |
Эта функция возвращает положительное значение в случае успеха и отрицательное значение в случае неудачи. См. пример Advanced_I2C . Ниже приведен пример выбора полного диапазона шкалы акселерометра +/- 8g.
status = IMU.setAccelFS(ICM42688::gpm2);
(необязательно) int setGyroRange(GyroRange range) Эта функция устанавливает полный диапазон шкалы гироскопа на заданное значение. По умолчанию, если эта функция не вызывается, будет использоваться полный диапазон шкалы +/- 2000 град/с. Перечисленные диапазоны полной шкалы гироскопа:
Название гироскопа | Полномасштабный диапазон гироскопа |
---|---|
dps15_625 | +/- 15,625 (град/с) |
dps31_25 | +/- 31,25 (град/с) |
dps62_5 | +/- 62,5 (град/с) |
дпс125 | +/- 125 (град/с) |
дпс250 | +/- 250 (град/с) |
дпс500 | +/- 500 (град/с) |
дпс1000 | +/- 1000 (град/с) |
dps2000 | +/- 2000 (град/с) |
Эта функция возвращает положительное значение в случае успеха и отрицательное значение в случае неудачи. См. пример Advanced_I2C . Ниже приведен пример выбора полного диапазона шкалы гироскопа +/- 250 град/с.
status = IMU.setGyroFS(ICM42688::dps250);
(необязательно) int setFilters(bool gyroFilters, bool accFilters) Это дополнительная функция для установки программируемых фильтров (Режекторный фильтр, фильтр сглаживания, блок фильтров пользовательского интерфейса). По умолчанию все фильтры включены. На следующем рисунке показана блок-схема пути прохождения сигнала для ICM42688:
Эта функция возвращает положительное значение в случае успеха и отрицательное значение в случае неудачи. Ниже приведен пример включения фильтров.
status = IMU.setFilters( true , true );
(необязательно) int EnableDataReadyInterrupt() Прерывание привязано к скорости вывода данных. Вывод ICM42688 INT выдаст импульс 50 мкс, когда данные будут готовы. Это чрезвычайно полезно для использования прерываний для синхронизации сбора данных, который должен происходить через регулярные промежутки времени. См. пример Interrupt_SPI . Эта функция разрешает это прерывание, которое будет происходить с частотой, заданной SRD. Эта функция возвращает положительное значение в случае успеха и отрицательное значение в случае неудачи. Ниже приведен пример включения прерывания готовности данных.
status = IMU.enableDataReadyInterrupt();
(необязательно) int DisableDataReadyInterrupt() Эта функция отключает прерывание готовности данных, описанное выше. Эта функция возвращает положительное значение в случае успеха и отрицательное значение в случае неудачи. Ниже приведен пример отключения прерывания готовности данных.
status = IMU.disableDataReadyInterrupt();
(необязательно) uin8_t isInterrupted() Эта функция считывает регистр прерывания готовности данных. Эта функция возвращает true, когда она прерывается. Ниже приведен пример чтения регистра прерывания готовности данных.
status = IMU.isInterrupted();
(необязательно) int CalibrateGyro() Смещение гироскопа автоматически оценивается во время функции Begin() и удаляется из измерений датчика. Эта функция повторно оценит смещение гироскопа и удалит новое смещение из будущих измерений датчика. Во время этого процесса датчик должен быть неподвижен. Эта функция возвращает положительное значение в случае успеха и отрицательное значение в случае неудачи. Ниже приведен пример оценки новых смещений гироскопа.
status = IMU.calibrateGyro();
(необязательно) float getGyroBiasX() Эта функция возвращает текущее смещение гироскопа в направлении X в единицах град/с.
float gxb;
gxb = IMU.getGyroBiasX();
(необязательно) float getGyroBiasY() Эта функция возвращает текущее смещение гироскопа в направлении Y в единицах град/с.
float gyb;
gyb = IMU.getGyroBiasY();
(необязательно) float getGyroBiasZ() Эта функция возвращает текущее смещение гироскопа в направлении Z в единицах град/с.
float gzb;
gzb = IMU.getGyroBiasZ();
(необязательно) void setGyroBiasX(float BiasX) Эта функция устанавливает смещение гироскопа, используемое в направлении X, на входное значение в единицах град/с.
float gxb = 0.001 ; // gyro bias of 0.001 deg/s
IMU.setGyroBiasX(gxb);
(необязательно) void setGyroBiasY(float BiasY) Эта функция устанавливает смещение гироскопа, используемое в направлении Y, на входное значение в единицах град/с.
float gyb = 0.001 ; // gyro bias of 0.001 deg/s
IMU.setGyroBiasY(gyb);
(необязательно) void setGyroBiasZ(float BiasZ) Эта функция устанавливает смещение гироскопа, используемое в направлении Z, на входное значение в единицах град/с.
float gzb = 0.001 ; // gyro bias of 0.001 deg/s
IMU.setGyroBiasZ(gzb);
(необязательно) int CalibrateAccel() Эта функция оценит смещение и масштабный коэффициент, необходимые для калибровки акселерометров. Эта функция работает по одной оси за раз, и ее необходимо запускать для всех 6 ориентаций датчика. После того, как он соберет достаточно данных с датчиков, он оценит смещение и масштабный коэффициент для всех трех каналов акселерометра и применит эти поправки к измеренным данным. Калибровку акселерометра необходимо выполнить на IMU только один раз. Функции получения и установки, описанные ниже, можно использовать для получения расчетных значений смещения и масштабных коэффициентов и использования их во время будущих циклов включения или операций с IMU. Эта функция возвращает положительное значение в случае успеха и отрицательное значение в случае неудачи.
status = IMU.calibrateAccel();
(необязательно) float getAccelBiasX_mss() Эта функция возвращает текущее смещение акселерометра в направлении X в единицах м/с/с.
float axb;
axb = IMU.getAccelBiasX_mss();
(необязательно) float getAccelScaleFactorX() Эта функция возвращает текущий масштабный коэффициент акселерометра в направлении X.
float axs;
axs = IMU.getAccelScaleFactorX();
(необязательно) float getAccelBiasY_mss() Эта функция возвращает текущее смещение акселерометра в направлении Y в единицах м/с/с.
float ayb;
ayb = IMU.getAccelBiasY_mss();
(необязательно) float getAccelScaleFactorY() Эта функция возвращает текущий масштабный коэффициент акселерометра в направлении Y.
float ays;
ays = IMU.getAccelScaleFactorY();
(необязательно) float getAccelBiasZ_mss() Эта функция возвращает текущее смещение акселерометра в направлении Z в единицах м/с/с.
float azb;
azb = IMU.getAccelBiasZ_mss();
(необязательно) float getAccelScaleFactorZ() Эта функция возвращает текущий масштабный коэффициент акселерометра в направлении Z.
float azs;
azs = IMU.getAccelScaleFactorZ();
(необязательно) void setAccelCalX(float смещение,float ScaleFactor) Эта функция устанавливает смещение акселерометра (м/с/с) и коэффициент масштабирования, используемые в направлении X, в соответствии с входными значениями.
float axb = 0.01 ; // accel bias of 0.01 m/s/s
float axs = 0.97 ; // accel scale factor of 0.97
IMU.setAccelCalX(axb,axs);
(необязательно) void setAccelCalY(float смещение,float ScaleFactor) Эта функция устанавливает смещение акселерометра (м/с/с) и масштабный коэффициент, используемые в направлении Y, в соответствии с входными значениями.
float ayb = 0.01 ; // accel bias of 0.01 m/s/s
float ays = 0.97 ; // accel scale factor of 0.97
IMU.setAccelCalY(ayb,ays);
(необязательно) void setAccelCalZ(float смещение,float ScaleFactor) Эта функция устанавливает смещение акселерометра (м/с/с) и масштабный коэффициент, используемые в направлении Z, в соответствии с входными значениями.
float azb = 0.01 ; // accel bias of 0.01 m/s/s
float azs = 0.97 ; // accel scale factor of 0.97
IMU.setAccelCalZ(azb,azs);
Приведенные ниже функции используются для сбора данных с датчика ICM42688. Пожалуйста, обратитесь к разделу 10.1 таблицы данных для ориентации чувствительных осей.
int getAGT() считывает данные датчика и сохраняет самые новые данные в буфере; его следует вызывать каждый раз, когда вы хотите получить данные от датчика. Эта функция возвращает положительное значение в случае успеха и отрицательное значение в случае неудачи.
IMU.getAGT();
float accX() получает значение акселерометра из буфера данных в направлении X и возвращает его в единицах g.
float ax = IMU.accX();
float accY() получает значение акселерометра из буфера данных в направлении Y и возвращает его в единицах g.
float ay = IMU.accY();
float accZ() получает значение акселерометра из буфера данных в направлении Z и возвращает его в единицах g.
float az = IMU.accZ();
float gyrX() получает значение гироскопа из буфера данных в направлении X и возвращает его в единицах град/с.
float gx = IMU.gyrX();
float gyrY() получает значение гироскопа из буфера данных в направлении Y и возвращает его в единицах град/с.
float gy = IMU.gyrY();
float gyrZ() получает значение гироскопа из буфера данных в направлении Z и возвращает его в единицах град/с.
float gz = IMU.gyrZ();
float temp() получает значение температуры кристалла из буфера данных и возвращает его в единицах C.
float temperature = IMU.temp();
Производный класс ICM42688FIFO расширяет функциональность базового класса ICM42688 , обеспечивая поддержку настройки и чтения буфера ICM42688FIFO. Все функции, описанные выше, как часть класса ICM42688, также доступны для класса ICM42688FIFO .
ICM42688FIFO(TwoWire &bus, uint8_t адрес) Должен быть объявлен объект ICM42688FIFO, указав шину I2C и адрес ICM42688 I2C. Адрес ICM42688 I2C будет равен 0x68, если вывод AD0 заземлен, или 0x69, если вывод AD0 поднят на высокий уровень. Например, следующий код объявляет объект ICM42688FIFO, называемый IMU , с датчиком ICM42688, расположенным на шине I2C 0, с адресом датчика 0x68 (заземленный AD0).
ICM42688FIFO IMU (Wire, 0x68 );
ICM42688FIFO(SPIClass &bus, uint8_t csPin, uint32_t SPI_HS_CLK=8000000) Должен быть объявлен объект ICM42688FIFO, указывающий используемую шину SPI и вывод выбора микросхемы. На одной шине SPI можно использовать несколько объектов ICM42688 или других объектов SPI, каждый со своим собственным выводом выбора чипа. Выводом выбора чипа может быть любой доступный цифровой вывод. Например, следующий код объявляет объект ICM42688FIFO, называемый IMU , с датчиком ICM42688, расположенным на шине SPI 0 с контактом выбора чипа 10.
ICM42688FIFO IMU (SPI, 10 );
Обратите внимание, что тактовая частота высокоскоростной шины SPI по умолчанию установлена на 8 МГц, но ICM 42688-p поддерживает тактовую частоту SPI до 24 МГц. Используйте более быструю тактовую частоту для более быстрой передачи данных SPI при чтении данных.
(необязательно) int EnableFifo(bool accel,bool gyro,bool temp) Эта функция настраивает и включает буфер FIFO ICM42688. Этот 512-байтовый буфер производит выборку данных со скоростью вывода данных, установленной SRD, и позволяет микроконтроллеру выполнять массовое считывание данных, снижая рабочую нагрузку микроконтроллера для определенных приложений. Он настроен с набором логических значений, описывающих, какие данные буферизовать в FIFO: акселерометр, гироскоп или температуру. Данные акселерометра и гироскопа занимают по 6 байтов пространства на каждую выборку, а данные о температуре — 2 байта. Важно выбирать только нужные источники данных, чтобы гарантировать, что FIFO не переполнится между его чтением. Например, включение всех источников данных потребует 21 байт на выборку, что позволит FIFO хранить только 24 выборки до переполнения. Если необходимы только данные акселерометра, перед переполнением это число увеличивается до 85 выборок. Эта функция возвращает положительное значение в случае успеха и отрицательное значение в случае неудачи. См. пример FIFO_SPI . Ниже приведен пример включения FIFO для буферизации данных акселерометра и гироскопа.
status = IMU.enableFifo( true , true , false , false );
int readFifo() считывает буфер FIFO из ICM42688, анализирует его и сохраняет данные в буферах микроконтроллера. Его следует вызывать каждый раз, когда вы хотите получить данные из буфера FIFO. Эта функция возвращает положительное значение в случае успеха и отрицательное значение в случае неудачи.
IMU.readFifo();
void getFifoAccelX_mss(size_t size,float data) получает значение акселерометра из буфера данных в направлении X и возвращает его в единицах м/с/с. Данные возвращаются в виде массива вместе с количеством элементов в этом массиве. Убедитесь, что буфер, в который вы передаете, имеет достаточную емкость для хранения данных.
float ax[ 100 ];
size_t samples;
IMU.getFifoAccelX_mss(&samples,ax);
void getFifoAccelY_mss(size_t size,float data) получает значение акселерометра из буфера данных в направлении Y и возвращает его в единицах м/с/с. Данные возвращаются в виде массива вместе с количеством элементов в этом массиве. Убедитесь, что буфер, в который вы передаете, имеет достаточную емкость для хранения данных.
float ay[ 100 ];
size_t samples;
IMU.getFifoAccelY_mss(&samples,ay);
void getFifoAccelZ_mss(size_t size,float data) получает значение акселерометра из буфера данных в направлении Z и возвращает его в единицах м/с/с. Данные возвращаются в виде массива вместе с количеством элементов в этом массиве. Убедитесь, что буфер, в который вы передаете, имеет достаточную емкость для хранения данных.
float az[ 100 ];
size_t samples;
IMU.getFifoAccelZ_mss(&samples,az);
void getFifoGyroX(size_t size,float data) получает значение гироскопа из буфера данных в направлении X и возвращает его в единицах град/с. Данные возвращаются в виде массива вместе с количеством элементов в этом массиве. Убедитесь, что буфер, в который вы передаете, имеет достаточную емкость для хранения данных.
float gx[ 100 ];
size_t samples;
IMU.getFifoGyroX(&samples,gx);
void getFifoGyroY(size_t size,float data) получает значение гироскопа из буфера данных в направлении Y и возвращает его в единицах град/с. Данные возвращаются в виде массива вместе с количеством элементов в этом массиве. Убедитесь, что буфер, в который вы передаете, имеет достаточную емкость для хранения данных.
float gy[ 100 ];
size_t samples;
IMU.getFifoGyroY(&samples,gy);
void getFifoGyroZ(size_t size,float data) получает значение гироскопа из буфера данных в направлении Z и возвращает его в единицах град/с. Данные возвращаются в виде массива вместе с количеством элементов в этом массиве. Убедитесь, что буфер, в который вы передаете, имеет достаточную емкость для хранения данных.
float gz[ 100 ];
size_t samples;
IMU.getFifoGyroZ(&samples,gx);
void getFifoTemperature_C(size_t size,float data) получает значение температуры кристалла из буфера данных и возвращает его в единицах C. Данные возвращаются в виде массива вместе с количеством элементов в этом массиве. Убедитесь, что буфер, в который вы передаете, имеет достаточную емкость для хранения данных.
float temp[ 100 ];
size_t samples;
IMU.getFifoTemperature_C(&samples,temp);
Пожалуйста, обратитесь к техническому описанию ICM42688. Эта библиотека должна хорошо работать с другими коммутационными платами или встроенными датчиками, см. схему распиновки вашего поставщика.
Выводы ICM42688 должны быть подключены следующим образом:
В качестве подтягиваний на SDA и SCL следует использовать резисторы сопротивлением 4,7 кОм, эти резисторы должны подтягиваться источником 3,3 В.
Выводы ICM42688 должны быть подключены следующим образом:
Некоторые коммутационные платы, включая коммутационную плату Embedded Masters, требуют небольшой модификации для включения SPI. См. документацию вашего поставщика.