【Follow me第二季第4期】 任务二 IMU
[复制链接]
imu在电子设备上属于比较常见的传感器了吧,手机已经是必备,像现在带空间音频的耳机,如果要把效果做好的话,其实也需要加imu。arduino nano rp2040 connect板卡上搭载的是st的六轴imu(加速度三轴,角速度三轴),能够满足最低限度的朝向计算(相对高精度的还得加上地磁的三轴)。
硬件资源
ST的六轴IMU LSM6DSOXTR通过I2C接到RP2040的GPIO12和GPIO13脚上,意味着如果我们要从0开始写驱动的话,需要使用I2C去读写寄存器的方法,读出当前的IMU信息。另外,中断脚也接到了RP2040的GPIO24上,此脚用于通知2040新的数据已准备好,一般是一个脉冲波形,主控在接收到这个脉冲后,需要立即从imu中读出数据并取消中断状态,以便进行下一次imu状态检测。
软件编码
由于arduino已经封装了此imu模块,因此我们并不需要实现底层接口,仅仅需要引用对应的头文件并按照头文件提供的接口将数据读出并打印即可,具体代码如下:
#include <WiFiNINA.h>
#include <Arduino_LSM6DSOX.h>
float Ax, Ay, Az;
float Gx, Gy, Gz;
void setup() {
Serial.begin(9600);
while (!Serial);
// IMU
if (!IMU.begin()) {
Serial.println("Failed to initialize IMU!");
while (1);
}
Serial.print("Accelerometer sample rate = ");
Serial.print(IMU.accelerationSampleRate());
Serial.println("Hz");
Serial.println();
Serial.print("Gyroscope sample rate = ");
Serial.print(IMU.gyroscopeSampleRate());
Serial.println("Hz");
Serial.println();
}
void imuHandle() {
bool needUpdate = 0;
if (IMU.accelerationAvailable()) {
IMU.readAcceleration(Ax, Ay, Az);
needUpdate = 1;
}
if (IMU.gyroscopeAvailable()) {
IMU.readGyroscope(Gx, Gy, Gz);
needUpdate = 1;
}
if(needUpdate) {
Serial.print("Ax: ");
Serial.print(Ax);
Serial.print(", Ay: ");
Serial.print(Ay);
Serial.print(", Az: ");
Serial.print(Az);
Serial.print(", Gx: ");
Serial.print(Gx);
Serial.print(", Gy: ");
Serial.print(Gy);
Serial.print(", Gz: ");
Serial.print(Gz);
Serial.println();
}
}
void loop() {
imuHandle();
}
总结
由于不清楚arduino封装的数据单位,因此也不太敢把这数据转化成四元素信号并最终转化成直先角,这部分需要后续做进一步的编码才清楚。
|