ICM-20948은 드론 자세 제어에 필요한 IMU센서이다.
(9축 센서 = 3축 각속도 + 3축 가속도 + 3축 지자계)
보통 IMU센서하면 MPU6050(I2C 통신)이나 MPU9250(SPI 통신)을 사용하고 자료도 많다.
근데 제조사에서는 MPU 시리즈는 현재 추천하지 않고 ICM 시리즈를 추천하고 있어서
새로운 센서도 써볼겸 ICM-20948 센서 모듈을 샀다.
내가 아는 한에서 이 제품이 관련문서 공개가 가장 많이 되어있다.
https://www.sparkfun.com/products/15335
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
아직 수정중이다.
자이로랑 가속도 값은 통신 성공했는데
지자계 값이 안받아진다ㅜㅜ
관련 레지스터 다 세팅한거 같은데 놓친부분이 있나보다
지자계 데이터 시트 볼 생각하니 너무 신난다