跳到主要内容

icm42688

产品简介

ICM42688 为 6 轴 IMU(三轴陀螺仪 + 三轴加速度计),可通过 I2C 接入 RDK 开发板。驱动注册为独立的陀螺仪与加速度计 IIO 设备,便于分别读取角速度与线加速度原始值。

适用平台

本文档针对 RDK X5 / RDK X5 Module,系统镜像建议 3.4.1 及以上。

安装方法

硬件连接

这里以 RDK 双目摄像头连接举例(不是说一定要用双目摄像头,只是使用模组上的传感器)

rdk_x5_icm4288_hw_connect.png

  1. 将 ICM42688 模组按说明书接入 RDK X5 的 mipi 排插。
  2. 确认模组供电与 I2C 地址无冲突。

软件配置

在全屏终端中运行 sudo srpi-config

  1. 进入 3 Interface OptionsI6 IMU

rdk_x5_icm42688_srpiconfig_1.png

rdk_x5_icm42688_srpiconfig_2.png

  1. 选择 ICM42688 相关选项(以菜单显示为准)

rdk_x5_icm42688_srpiconfig_3.png

  1. 选择 Finish,确认后重启

rdk_x5_bmi088_srpiconfig_9.png

rdk_x5_bmi088_srpiconfig_10.png

卸载方法

  1. 进入 srpi-config3 Interface OptionsI6 IMU
  2. 选择 UNSET
  3. 断电后取下模组

运行

1. 检查 IIO 设备

ls /sys/bus/iio/devices/

2. 读取传感器数据

以下示例中 iio:device1iio:device2 序号以实际注册结果为准,请先通过 name 节点确认:

cat /sys/bus/iio/devices/iio:device1/name
cat /sys/bus/iio/devices/iio:device2/name

预期示例输出:

root@ubuntu:~# cat /sys/bus/iio/devices/iio:device1/name
icm42688-gyro
root@ubuntu:~# cat /sys/bus/iio/devices/iio:device2/name
icm42688-accel

rdk_x5_icm42688_iio_cat_1.png

读取原始数据:

cat /sys/bus/iio/devices/iio:device2/in_accel_x_raw
cat /sys/bus/iio/devices/iio:device1/in_anglvel_x_raw

rdk_x5_icm42688_iio_cat_2.png

rdk_x5_icm42688_iio_cat_3.png

能正确读出 name 与各轴 *_raw 数值,即表示 ICM42688 工作正常。

3. 使用 Input 事件接口读取数据

上文我们通过 IIO 节点确认了 ICM42688 驱动注册正常。若你的应用需要 SLAM、防抖(EIS)、AR/VR、多传感器融合 等能力,通常还要求 IMU 数据带硬件采样时间戳,而不能只用应用层读取时刻。

ICM42688 驱动与 BMI088 一样,除 IIO sysfs 外,还提供 Linux Input EVENT 接口:经 /dev/input/eventX 以流式方式推送每帧六轴数据及硬件时间戳。板端示例程序 sample_imu_input 演示了如何读取并校验这套数据。

数据格式说明

一帧 IMU 数据由驱动拆为 9 个 EV_MSC 事件(code = 0x04)+ EV_SYN / SYN_REPORT 结束信号 组成。应用侧收满 9 个字段后组帧解析:

顺序内容说明
0–2ACC X/Y/Z加速度原始值(16 位有符号 LSB)
3–5GYRO X/Y/Z陀螺仪原始值(16 位有符号 LSB)
6–7时间戳高/低 32 位拼为 64 位纳秒时间戳,表示硬件采样时刻
8中断计数驱动中断累计次数
注意区分两种时间

input_event.ev.time 是内核收到事件的时间;IMU 硬件采样时间戳在 MSC 字段的 ev.value 中,由驱动打包。

ICM42688 与 BMI088 使用同一套 Input 中断上报协议,sample_imu_input 无需区分型号,只需打开正确的 event 节点。

1. 查找 IMU 对应的 event 节点

/proc/bus/input/devices 中查找 ICM42688 注册的 Input 设备。设备名以驱动实际注册为准,一般为 icm42688-sensor(若 grep 无结果,可先用 cat /proc/bus/input/devices 查看 Name= 字段):

grep -A5 icm42688-sensor /proc/bus/input/devices

在输出中找到 H: Handlers=eventX,即对应 /dev/input/eventX。示例:

H: Handlers=event2

则运行时使用 /dev/input/event2event 编号因系统而异,务必以本机 grep 结果为准。

2. 运行示例程序

示例程序预置在板端以下路径:

/app/platform_samples/sample_imu/sample_imu_input/sample_imu_input

进入目录并运行(将 eventX 替换为上一步得到的实际节点):

cd /app/platform_samples/sample_imu/sample_imu_input
./sample_imu_input /dev/input/eventX

默认打开 /dev/input/event1。启动后持续输出,晃动模组观察数值变化;Ctrl + C 退出并查看统计信息。

3. 查看输出

ACC(ax,ay,az) | GYRO(gx,gy,gz) | TS:1234567890 ns | Lost: 0 | EventCount: 10 | up_count: 100 | lower_count: -
字段含义
ACC / GYRO六轴原始 LSB
TS硬件采样时间戳(ns)
Lost丢帧累计(相邻帧时间戳间隔 > 3.5 ms 时增加)
up_count驱动中断计数

4. 自行开发参考

  1. open Input 设备 → 循环 read input_event
  2. EV_MSC(code 0x04)按序缓存 9 个 ev.value
  3. SYN_REPORT 到达且字段齐全时,解析六轴、拼接时间戳。

参考实现:

板端位置 :/app/multimedia_samples/sample_imu/sample_imu_input/sample_imu_input.c

源码位置 :/source/hobot-multimedia-samples/debian/app/multimedia_samples/sample_imu/sample_imu_input/sample_imu_input.c

常见问题排查

  • device 序号与示例不同:以 ls /sys/bus/iio/devices/cat .../name 结果为准,将命令中的 device1/device2 替换为实际节点。
  • 读取为空或报错:确认 srpi-config 已启用 ICM42688 并已重启;检查 I2C 接线与地址。
  • sample_imu_input 无输出:确认 srpi-config 已启用 ICM42688 并已重启;用 grep -A5 icm42688-sensor /proc/bus/input/devices 确认 event 路径;IIO 能读但 Input 无数据时,检查是否完成重启且驱动版本支持 EVENT 接口。

如需双目 IMU 相机等融合应用,请参阅 双目 IMU 相机