最近手头有一个任务,使用MPU6050来测量加速度,就是物理上学的那个α,有一些小坑需要踩,在这里发出来,希望对大家有用。
硬件:Ardiuno Nano(Old)/MPU6050(IIC)
连线:参考下图
step1:陀螺仪数据的获取
我是用的是Ardiuno的库,在这里下载:GitHub - jrowberg/i2cdevlib: I2C device library collection for AVR/Arduino or other C++-based MCUs,下载之后找到Ardiuno的安装目录里的liararies文件夹,我的是D:\Ardiuno\libraries,将刚才下载的内容Ardiuno这个文件夹里的东西全部拖到liararies,完成I2Cdev库和MPU6050的库安装。
成功的话可以在Ardiuno开发软件的文件-示例里看到MPU6050,选择MPU6050_raw,如下图所示,直接上传到Ardiuno,打开串口监视助手,即可看到发送的加速度。
Step2:加速度数据处理
首先明白一个概念:加速度计的量程:
MPU6050的加速度均以重力加速度 g (就是那个物理的9.8m/s^2)为单位,加速度范围即能测量的最大加速度有:±2g、±4g、±8g、±16g,这个在刚才MPU6050的库里MPU6050.cpp文件里配置,如图,修改后缀MPU6050_ACCEL_FS_X即可。注意未修改时候,默认为±2g,即最大可以测量9.8*2m/s
void MPU6050::initialize() {
setClockSource(MPU6050_CLOCK_PLL_XGYRO);
setFullScaleGyroRange(MPU6050_GYRO_FS_2000);
setFullScaleAccelRange(MPU6050_ACCEL_FS_16); //配置量程16g
setSleepEnabled(false); // thanks to Jack Elston for pointing this one out!
}
然后是灵敏度:假设上面我们设置了量程为16g,由于寄存器输出的是有符号整数,所以最大范围为-32767到32767,怎么算的?2^16 = 65536,然尔符号位占据一位,所以2^15 = 32767.也就是说。32767代表了16g的加速度,而我们计算取的是1个单位,所以32767/16 = 2048,2048就是所谓的灵敏度。
综上所述,我们从寄存器里得到的原始数据,这里用Accx,Accy和Accz表示,按如下计算,理想情况我们知道,Z轴自带一个重力加速度,静止时应该有 Real_accx = Real_accy = 0.0 (m/s^2), Real_accz = 9.8(m/s^2), 注意这是理想状况,由于MPU6050本身会有误差,出来的数据不会是这样。
修改代码如下,输出加速度值
// these methods (and a few others) are also available
accx = (float)ax/2048*9.8;
accy = (float)ay/2048*9.8;
accz = (float)az/2048*9.8;
//accelgyro.getRotation(&gx, &gy, &gz);
#ifdef OUTPUT_READABLE_ACCELGYRO
// display tab-separated accel/gyro x/y/z values
Serial.print("Accx:");
Serial.println(accx);
Serial.print("Accy:");
Serial.println(accy);
Serial.print("Accz:");
Serial.println(accz);
得到的结果如下图所示,这里的z轴加速度为8.74,数据存在误差,下次更新说明如何校准
Step3:数据显示
自己做了一个简单的加速度计显示助手,可以将刚才Ardiuno发送的数据绘图和保存,如下图所示,操作一目了然,正确连接串口后,点击绘图即可。