본문 바로가기
뻘소리

ICM-20948 라이브러리 만드는 중

by mokhwasomssi 2021. 2. 19.

ICM-20948은 드론 자세 제어에 필요한 IMU센서이다.

(9축 센서 = 3축 각속도 + 3축 가속도 + 3축 지자계)

 


보통 IMU센서하면 MPU6050(I2C 통신)이나 MPU9250(SPI 통신)을 사용하고 자료도 많다.

근데 제조사에서는 MPU 시리즈는 현재 추천하지 않고 ICM 시리즈를 추천하고 있어서

새로운 센서도 써볼겸 ICM-20948 센서 모듈을 샀다.

내가 아는 한에서 이 제품이 관련문서 공개가 가장 많이 되어있다.

https://www.sparkfun.com/products/15335

 

SparkFun 9DoF IMU Breakout - ICM-20948 (Qwiic) - SEN-15335 - SparkFun Electronics

about a year ago by Member #1529768 verified purchaser I bought three of these for a project and they all perform nicely. The datasheet provides information for basic operation; initializing, calibration and settings, reading sensor data etc. Wasn't able t

www.sparkfun.com

 

SparkFun에서 판매하는 ICM-20948센서 모듈이 2가지(Qwiic, Ding and Dent)가 있는데

회로도도 떡하니 제공을 하지만 나는 회로알못이라 차이점을 잘 모르겠다.

그냥 Qwiic 버전이 기능이 더 있는 것 같아서 이걸로 샀다.

지금보니 Ding and Dent 버전이 Qwiic 버전의 반 값이다. 이거 살껄...


SPI 통신은 안써봐서 SPI 통신도 공부하고

stm32 HAL 라이브러리로 SPI 예제 동작시켜보고

ICM 20948 라이브러리 만드는 단계로 넘어왔다.

MPU 시리즈와 ICM 시리즈의 큰 차이점은 USER BANK가 생겼다는 점 같다.

USER BANK가 레지스터의 한 집합이다.

User Bank 0, 1, 2, 3,,,, 이런식으로 나뉘어져있다.

만약 User Bank 0에 해당하는 레지스터를 r/w 하려면

User Bank를 선택하는 레지스터에 User Bank 0에 해당하는 값을 넣어야 접근이 가능하다.

이 과정이 중요한 이유는 User Bank마다 주소가 겹치는 레지스터가 있기 때문에

User Bank를 제대로 선택하지 않으면 이상한 레지스터로 접근할 것이다.


라이브러리 만드는 절차는

1. 내가 사용할 기능 정리

2. 그 기능을 위해 세팅해야하는 레지스터들

3. 레지스터 세팅

4. 여러 보드에 테스트

기능 구현 절차는

1. SPI 통신으로 자이로, 가속도 값 읽기

2. 보조 I2C 통신으로 지자계 값 읽기

3. SPI랑 I2C 통신 속도 설정

4. Calibration값 offset 레지스터에 write

5. low 센서 데이터 가공

이 외에 센서에서 FIFO, DMP 기능을 제공하는데 얘네는 잘모르겠다.


지금 작성하고 있는 라이브러리

https://github.com/mokhwasomssi/ICM20948

 

mokhwasomssi/stm32f4_hal_icm20948

Simple ICM-20948 library (STM32 HAL). Contribute to mokhwasomssi/stm32f4_hal_icm20948 development by creating an account on GitHub.

github.com

 

아직 수정중이다.

자이로랑 가속도 값은 통신 성공했는데

지자계 값이 안받아진다ㅜㅜ

관련 레지스터 다 세팅한거 같은데 놓친부분이 있나보다

지자계 데이터 시트 볼 생각하니 너무 신난다