ICM42688 6축 관성 측정 장치(IMU)와 통신하기 위한 Arduino 라이브러리입니다.
InvenSense ICM42688은 I2C(최대 400kHz) 및 SPI 통신(레지스터 설정 시 최대 1MHz, 데이터 읽기 시 24MHz)을 지원합니다. 다음과 같이 선택 가능한 전체 범위 센서 범위를 사용할 수 있습니다.
자이로스코프 전체 범위 | 가속도계 전체 범위 |
---|---|
+/- 15.6(도/초) | - |
+/- 31.2(도/초) | - |
+/- 62.5(도/초) | - |
+/- 125(도/초) | - |
+/- 250(도/초) | +/- 2(g) |
+/- 500(도/초) | +/- 4(g) |
+/- 1000(도/초) | +/- 8(g) |
+/- 2000(도/초) | +/- 16(g) |
ICM42688은 16비트 아날로그-디지털 변환기를 사용하여 자이로스코프와 가속도계를 샘플링합니다. 또한 프로그래밍 가능한 디지털 필터, 정밀 클록, 내장형 온도 센서, 프로그래밍 가능한 인터럽트(Wake on Motion 포함) 및 512바이트 FIFO 버퍼를 갖추고 있습니다.
이 라이브러리는 ICM42688과의 I2C 및 SPI 통신을 모두 지원합니다.
이 라이브러리를 Arduino/libraries 폴더에 복제하거나 다운로드하기만 하면 됩니다.
이 라이브러리는 ICM42688과의 I2C 및 SPI 통신을 모두 지원합니다. ICM42688 객체 선언은 I2C 및 SPI 통신을 위한 다양한 선언으로 오버로드됩니다. 다른 모든 기능은 동일하게 유지됩니다. 또한 기본 ICM42688 클래스에 포함된 모든 기능 외에도 FIFO 설정 및 데이터 수집 기능을 제공하는 파생 클래스인 ICM42688FIFO가 포함되어 있습니다.
ICM42688(TwoWire &bus, uint8_t address) ICM42688 개체는 I2C 버스 및 ICM42688 I2C 주소를 지정하여 선언되어야 합니다. ICM42688 I2C 주소는 AD0 핀이 접지된 경우 0x68이고 AD0 핀이 하이로 풀링된 경우 0x69입니다. 예를 들어, 다음 코드는 센서 주소가 0x68(AD0 접지)인 I2C 버스 0에 위치한 ICM42688 센서를 사용하여 IMU 라는 ICM42688 개체를 선언합니다.
ICM42688 IMU (Wire, 0x68 );
ICM42688(TwoWire &bus, uint8_t address) ICM42688 개체는 I2C 버스 및 ICM42688 I2C 주소를 지정하여 선언되어야 합니다. ICM42688 I2C 주소는 AD0 핀이 접지된 경우 0x68이고 AD0 핀이 하이로 풀링된 경우 0x69입니다. 예를 들어, 다음 코드는 센서 주소가 0x68(AD0 접지)인 I2C 버스 0에 위치한 ICM42688 센서를 사용하여 IMU 라는 ICM42688 개체를 선언합니다. I2C 연결을 위해 SDA 및 SCL 핀을 지정해야 합니다(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) 사용된 SPI 버스 및 칩 선택 핀을 지정하여 ICM42688 개체를 선언해야 합니다. 여러 ICM42688 또는 기타 SPI 개체를 동일한 SPI 버스에서 사용할 수 있으며 각각 자체 칩 선택 핀이 있습니다. 칩 선택 핀은 사용 가능한 모든 디지털 핀이 될 수 있습니다. 예를 들어 다음 코드는 칩 선택 핀 10이 있는 SPI 버스 0에 위치한 ICM42688 센서를 사용하여 IMU 라는 ICM42688 개체를 선언합니다.
ICM42688 IMU (SPI, 10 );
기본 고속 SPI 버스 클록은 8MHz로 설정되어 있지만 ICM 42688-p는 최대 24MHz SPI 클록을 지원합니다. 데이터를 읽을 때 더 빠른 SPI 데이터 전송을 위해 더 빠른 시계를 사용하십시오.
다음 기능은 ICM42688 센서를 설정하는 데 사용됩니다. 이는 데이터 수집 전에 한 번 호출되어야 하며 일반적으로 Arduino setup()
함수에서 수행됩니다. begin()
함수는 항상 사용해야 합니다. 선택적으로 setAccelFS
및 setGyroFS
, setAccelODR
및 setGyroODR
함수를 사용하여 가속도계 및 자이로스코프 전체 범위와 출력 데이터 속도를 기본값 이외의 값으로 설정할 수 있습니다. enableDataReadyInterrupt
및 disableDataReadyInterrupt
ICM42688이 데이터 준비 시 인터럽트를 생성하는지 여부를 제어합니다. enableFifo
Fifo는 FIFO 버퍼를 설정하고 활성화합니다. 이러한 기능은 아래에 자세히 설명되어 있습니다.
int start() 이는 설정 함수에서 호출되어야 합니다. ICM42688과의 통신을 초기화하고, 데이터를 읽을 수 있도록 센서를 설정하고, 센서 데이터에서 제거되는 자이로 바이어스를 추정합니다. 이 함수는 초기화가 성공하면 양수 값을 반환하고, 초기화가 실패하면 음수 값을 반환합니다. 실패할 경우 배선을 확인하거나 센서 전원을 재설정해 보십시오. 다음은 ICM42688을 설정하는 예입니다.
int status = IMU.begin();
(선택 사항) int setAccelRange(AccelRange range) 이 함수는 가속도계 전체 범위를 주어진 값으로 설정합니다. 기본적으로 이 기능이 호출되지 않으면 +/- 16g의 전체 눈금 범위가 사용됩니다. 열거된 가속도계 전체 범위는 다음과 같습니다.
가속도계 이름 | 가속도계 전체 범위 |
---|---|
gpm2 | +/- 2(g) |
gpm4 | +/- 4(g) |
gpm8 | +/- 8(g) |
gpm16 | +/- 16(g) |
이 함수는 성공 시 양수 값을, 실패 시 음수 값을 반환합니다. Advanced_I2C 예제를 참조하세요. 다음은 +/- 8g의 가속도계 전체 눈금 범위를 선택하는 예입니다.
status = IMU.setAccelFS(ICM42688::gpm2);
(선택 사항) int setGyroRange(GyroRange range) 이 함수는 자이로스코프 전체 범위를 주어진 값으로 설정합니다. 기본적으로 이 기능이 호출되지 않으면 +/- 2000deg/s의 전체 눈금 범위가 사용됩니다. 열거된 자이로스코프 전체 범위는 다음과 같습니다.
자이로스코프 이름 | 자이로스코프 전체 범위 |
---|---|
dps15_625 | +/- 15.625(도/초) |
dps31_25 | +/- 31.25(도/초) |
dps62_5 | +/- 62.5(도/초) |
dps125 | +/- 125(도/초) |
dps250 | +/- 250(도/초) |
dps500 | +/- 500(도/초) |
dps1000 | +/- 1000(도/초) |
dps2000 | +/- 2000(도/초) |
이 함수는 성공 시 양수 값을, 실패 시 음수 값을 반환합니다. Advanced_I2C 예제를 참조하세요. 다음은 +/- 250 deg/s의 자이로스코프 전체 눈금 범위를 선택하는 예입니다.
status = IMU.setGyroFS(ICM42688::dps250);
(선택 사항) int setFilters(bool gyroFilters, bool accFilters) 프로그래밍 가능한 필터(노치 필터, 안티 앨리어스 필터, UI 필터 블록)를 설정하는 선택적 함수입니다. 기본적으로 모든 필터는 켜져 있습니다. 다음 그림은 ICM42688의 신호 경로 블록 다이어그램을 보여줍니다.
이 함수는 성공 시 양수 값을, 실패 시 음수 값을 반환합니다. 다음은 필터를 켜는 예입니다.
status = IMU.setFilters( true , true );
(선택 사항) int 활성화DataReadyInterrupt() 인터럽트는 데이터 출력 속도에 연결됩니다. ICM42688 INT 핀은 데이터가 준비되면 50us 펄스를 발행합니다. 이는 정기적으로 발생해야 하는 데이터 수집을 클럭하기 위해 인터럽트를 사용하는 데 매우 유용합니다. Interrupt_SPI 예제를 참조하세요. 이 기능은 SRD에 의해 지정된 빈도로 발생하는 이 인터럽트를 활성화합니다. 이 함수는 성공 시 양수 값을, 실패 시 음수 값을 반환합니다. 다음은 데이터 레디 인터럽트를 활성화하는 예이다.
status = IMU.enableDataReadyInterrupt();
(선택 사항) int 비활성화DataReadyInterrupt() 이 함수는 위에 설명된 데이터 준비 인터럽트를 비활성화합니다. 이 함수는 성공 시 양수 값을, 실패 시 음수 값을 반환합니다. 다음은 데이터 레디 인터럽트를 비활성화하는 예이다.
status = IMU.disableDataReadyInterrupt();
(선택 사항) uin8_t isInterrupted() 이 함수는 데이터 준비 인터럽트 레지스터를 읽습니다. 이 함수는 중단되면 true를 반환합니다. 다음은 데이터 레디 인터럽트 레지스터를 읽는 예이다.
status = IMU.isInterrupted();
(선택 사항) int calibrateGyro() 자이로 바이어스는 start() 함수 중에 자동으로 추정되며 센서 측정에서 제거됩니다. 이 기능은 자이로 편향을 다시 추정하고 향후 센서 측정에서 새로운 편향을 제거합니다. 이 과정 동안 센서는 정지해 있어야 합니다. 이 함수는 성공 시 양수 값을, 실패 시 음수 값을 반환합니다. 다음은 새로운 자이로 편향을 추정하는 예입니다.
status = IMU.calibrateGyro();
(선택 사항) float getGyroBiasX() 이 함수는 X 방향의 현재 자이로 바이어스를 deg/s 단위로 반환합니다.
float gxb;
gxb = IMU.getGyroBiasX();
(선택 사항) float getGyroBiasY() 이 함수는 Y 방향의 현재 자이로 바이어스를 deg/s 단위로 반환합니다.
float gyb;
gyb = IMU.getGyroBiasY();
(선택 사항) float getGyroBiasZ() 이 함수는 Z 방향의 현재 자이로 바이어스를 deg/s 단위로 반환합니다.
float gzb;
gzb = IMU.getGyroBiasZ();
(선택) void setGyroBiasX(floatbias) X 방향으로 사용되는 자이로 바이어스를 deg/s 단위의 입력 값으로 설정하는 함수입니다.
float gxb = 0.001 ; // gyro bias of 0.001 deg/s
IMU.setGyroBiasX(gxb);
(선택) void setGyroBiasY(floatbias) Y 방향으로 사용되는 자이로 바이어스를 deg/s 단위의 입력 값으로 설정하는 함수입니다.
float gyb = 0.001 ; // gyro bias of 0.001 deg/s
IMU.setGyroBiasY(gyb);
(선택) void setGyroBiasZ(floatbias) Z 방향으로 사용되는 자이로 바이어스를 deg/s 단위의 입력 값으로 설정하는 함수입니다.
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 방향의 현재 가속도계 바이어스를 m/s/s 단위로 반환합니다.
float axb;
axb = IMU.getAccelBiasX_mss();
(선택 사항) float getAccelScaleFactorX() 이 함수는 X 방향의 현재 가속도계 배율 인수를 반환합니다.
float axs;
axs = IMU.getAccelScaleFactorX();
(선택 사항) float getAccelBiasY_mss() 이 함수는 Y 방향의 현재 가속도계 바이어스를 m/s/s 단위로 반환합니다.
float ayb;
ayb = IMU.getAccelBiasY_mss();
(선택 사항) float getAccelScaleFactorY() 이 함수는 Y 방향의 현재 가속도계 배율 인수를 반환합니다.
float ays;
ays = IMU.getAccelScaleFactorY();
(선택 사항) float getAccelBiasZ_mss() 이 함수는 Z 방향의 현재 가속도계 바이어스를 m/s/s 단위로 반환합니다.
float azb;
azb = IMU.getAccelBiasZ_mss();
(선택 사항) float getAccelScaleFactorZ() 이 함수는 Z 방향의 현재 가속도계 배율 인수를 반환합니다.
float azs;
azs = IMU.getAccelScaleFactorZ();
(선택 사항) void setAccelCalX(floatbias,float scaleFactor) 이 함수는 X 방향으로 사용되는 가속도계 바이어스(m/s/s) 및 배율 인수를 입력 값으로 설정합니다.
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(floatbias,float scaleFactor) 이 함수는 Y 방향으로 사용되는 가속도계 바이어스(m/s/s) 및 배율 인수를 입력 값으로 설정합니다.
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(floatbias,float scaleFactor) 이 함수는 Z 방향으로 사용되는 가속도계 바이어스(m/s/s)와 스케일 팩터를 입력 값으로 설정합니다.
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 방향의 데이터 버퍼에서 자이로스코프 값을 가져와 deg/s 단위로 반환합니다.
float gx = IMU.gyrX();
float gyrY()는 Y 방향의 데이터 버퍼에서 자이로스코프 값을 가져와 deg/s 단위로 반환합니다.
float gy = IMU.gyrY();
float gyrZ()는 Z 방향의 데이터 버퍼에서 자이로스코프 값을 가져와 deg/s 단위로 반환합니다.
float gz = IMU.gyrZ();
float temp()는 데이터 버퍼에서 다이 온도 값을 가져와 C 단위로 반환합니다.
float temperature = IMU.temp();
ICM42688FIFO 파생 클래스는 ICM42688FIFO 버퍼 설정 및 읽기에 대한 지원을 제공하여 ICM42688 기본 클래스에서 제공하는 기능을 확장합니다. ICM42688 클래스의 일부로 위에 설명된 모든 기능은 ICM42688FIFO 클래스에서도 사용할 수 있습니다.
ICM42688FIFO(TwoWire &bus, uint8_t address) ICM42688FIFO 객체는 I2C 버스와 ICM42688 I2C 주소를 지정하여 선언되어야 합니다. ICM42688 I2C 주소는 AD0 핀이 접지된 경우 0x68이고 AD0 핀이 하이로 풀링된 경우 0x69입니다. 예를 들어, 다음 코드는 센서 주소가 0x68(AD0 접지)인 I2C 버스 0에 위치한 ICM42688 센서를 사용하여 IMU 라는 ICM42688FIFO 개체를 선언합니다.
ICM42688FIFO IMU (Wire, 0x68 );
ICM42688FIFO(SPIClass &bus, uint8_t csPin, uint32_t SPI_HS_CLK=8000000) ICM42688FIFO 객체는 사용된 SPI 버스 및 칩 선택 핀을 지정하여 선언되어야 합니다. 여러 ICM42688 또는 기타 SPI 개체를 동일한 SPI 버스에서 사용할 수 있으며 각각 자체 칩 선택 핀이 있습니다. 칩 선택 핀은 사용 가능한 모든 디지털 핀이 될 수 있습니다. 예를 들어 다음 코드는 칩 선택 핀 10이 있는 SPI 버스 0에 위치한 ICM42688 센서를 사용하여 IMU 라는 ICM42688FIFO 개체를 선언합니다.
ICM42688FIFO IMU (SPI, 10 );
기본 고속 SPI 버스 클록은 8MHz로 설정되어 있지만 ICM 42688-p는 최대 24MHz SPI 클록을 지원합니다. 데이터를 읽을 때 더 빠른 SPI 데이터 전송을 위해 더 빠른 시계를 사용하십시오.
(선택 사항) int 활성화Fifo(bool accel,bool gyro,bool temp) 이 함수는 ICM42688 FIFO 버퍼를 구성하고 활성화합니다. 이 512바이트 버퍼는 SRD에서 설정한 데이터 출력 속도로 데이터를 샘플링하고 마이크로 컨트롤러가 데이터를 대량으로 읽을 수 있도록 하여 특정 애플리케이션에 대한 마이크로 컨트롤러 작업 부하를 줄입니다. 가속도계, 자이로스코프 또는 온도 등 FIFO에 버퍼링할 데이터를 설명하는 부울 값 세트로 구성됩니다. 가속도계와 자이로스코프 데이터는 각각 샘플당 6바이트의 공간을 차지하고 온도는 2바이트를 차지합니다. FIFO가 읽는 동안 오버런되지 않도록 하려면 원하는 데이터 소스만 선택하는 것이 중요합니다. 예를 들어 모든 데이터 소스를 활성화하려면 샘플당 21바이트가 필요하므로 FIFO는 오버플로되기 전에 24개의 샘플만 보유할 수 있습니다. 가속도계 데이터만 필요한 경우 오버플로되기 전에 샘플이 85개로 늘어납니다. 이 함수는 성공 시 양수 값을, 실패 시 음수 값을 반환합니다. FIFO_SPI 예시를 참조하세요. 다음은 FIFO를 활성화하여 가속도계 및 자이로스코프 데이터를 버퍼링하는 예입니다.
status = IMU.enableFifo( true , true , false , false );
int readFifo()는 ICM42688에서 FIFO 버퍼를 읽고 이를 구문 분석한 후 마이크로 컨트롤러의 버퍼에 데이터를 저장합니다. FIFO 버퍼에서 데이터를 검색할 때마다 호출해야 합니다. 이 함수는 성공 시 양수 값을, 실패 시 음수 값을 반환합니다.
IMU.readFifo();
void getFifoAccelX_mss(size_t size,float data)는 데이터 버퍼에서 X 방향의 가속도계 값을 가져와서 m/s/s 단위로 반환합니다. 데이터는 해당 배열 내의 요소 수와 함께 배열로 반환됩니다. 전송하려는 버퍼에 데이터를 저장할 수 있는 충분한 용량이 있는지 확인하십시오.
float ax[ 100 ];
size_t samples;
IMU.getFifoAccelX_mss(&samples,ax);
void getFifoAccelY_mss(size_t size,float data)는 데이터 버퍼에서 Y 방향의 가속도계 값을 가져와서 m/s/s 단위로 반환합니다. 데이터는 해당 배열 내의 요소 수와 함께 배열로 반환됩니다. 전송하려는 버퍼에 데이터를 저장할 수 있는 충분한 용량이 있는지 확인하십시오.
float ay[ 100 ];
size_t samples;
IMU.getFifoAccelY_mss(&samples,ay);
void getFifoAccelZ_mss(size_t size,float data)는 데이터 버퍼에서 Z 방향의 가속도계 값을 가져와서 m/s/s 단위로 반환합니다. 데이터는 해당 배열 내의 요소 수와 함께 배열로 반환됩니다. 전송하려는 버퍼에 데이터를 저장할 수 있는 충분한 용량이 있는지 확인하십시오.
float az[ 100 ];
size_t samples;
IMU.getFifoAccelZ_mss(&samples,az);
void getFifoGyroX(size_t size,float data)는 X 방향의 데이터 버퍼에서 자이로스코프 값을 가져와 deg/s 단위로 반환합니다. 데이터는 해당 배열 내의 요소 수와 함께 배열로 반환됩니다. 전송하려는 버퍼에 데이터를 저장할 수 있는 충분한 용량이 있는지 확인하십시오.
float gx[ 100 ];
size_t samples;
IMU.getFifoGyroX(&samples,gx);
void getFifoGyroY(size_t size,float data)는 데이터 버퍼에서 Y 방향의 자이로스코프 값을 가져와서 deg/s 단위로 반환합니다. 데이터는 해당 배열 내의 요소 수와 함께 배열로 반환됩니다. 전송하려는 버퍼의 용량이 데이터를 저장할 만큼 충분한지 확인하세요.
float gy[ 100 ];
size_t samples;
IMU.getFifoGyroY(&samples,gy);
void getFifoGyroZ(size_t size,float data)는 데이터 버퍼에서 Z 방향의 자이로스코프 값을 가져와 deg/s 단위로 반환합니다. 데이터는 해당 배열 내의 요소 수와 함께 배열로 반환됩니다. 전송하려는 버퍼의 용량이 데이터를 저장할 만큼 충분한지 확인하세요.
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 핀은 다음과 같이 연결되어야 합니다.
4.7kOhm 저항은 SDA 및 SCL에서 풀업으로 사용해야 하며, 이 저항은 3.3V 소스로 풀업해야 합니다.
ICM42688 핀은 다음과 같이 연결되어야 합니다.
Embedded Masters 브레이크아웃 보드를 포함한 일부 브레이크아웃 보드는 SPI를 활성화하려면 약간의 수정이 필요합니다. 공급업체의 설명서를 참조하세요.