nRF52832-Bluefruit52蓝牙核心板板载MPU6050芯片,连接I2C总线上,SCL---P0.26,SDA---P0.25。
MPU-6050的角速度全格感测范围为±250、±500、±1000与±2000°/sec (dps),可准确追踪快速与慢速动作,并且,用户可程式控制的加速器全格感测范围为±2g、±4g±8g与±16g。产品传输可透过最高至400kHz的I2C。MPU-6050可在不同电压下工作,VDD供电电压介为2.5V±5%、3.0V±5%或3.3V±5%,逻辑接口VDDIO供电为1.8V± 5%(MPU6000仅用VDD)。MPU-6050的包装尺寸4x4x0.9mm(QFN),在业界是革命性的尺寸。其他的特征包含内建的温度感测器、包含在运作环境中仅有±1%变动的振荡器。
在很多领域均有应用,比如智能手机,平板设备,手持型游戏产品,游戏机,3D体感遥控器,可携式导航设备等等。配合蓝牙的使用场景更加广泛,比如无线鼠标,无线游戏手柄,无线3D遥控器,计步器,可穿戴设备等等。
在芯片的I2C驱动上,简单地说,MPU6050就是一个i2c从器件,就像一个微控制器,要使用它,你得了解寄存器,初始化,读取,写入等等。本次使用nRF52832作为主控芯片,使用硬件I2C驱动MPU6050,并且结合匿名四轴上位机,通过串口协议可以实时监测姿态解析的的数据,对后续在产品上的开发有很大参考意义。
MPU6050的驱动文件主要有3个,结合nRF52832芯片的串口例程,我们做了移植。
main主函数源码:
/**
* @brief Function for main application entry.
*/
int main(void)
{
int16_t AccValue[3],GyroValue[3];
uint8_t id;
float pitch,roll,yaw; //欧拉角
short aacx,aacy,aacz; //加速度传感器原始数据
short gyrox,gyroy,gyroz; //陀螺仪原始数据
nrf_gpio_cfg_output(LED_1); //配置管脚P0.17为输出,驱动指示灯D1
nrf_gpio_pin_set(LED_1); //设置指示灯D1初始状态为熄灭
uart_init(); //配置串口,禁止流控,波特率:115200
twi_master_init();
nrf_delay_ms(2000);
if(mpu6050_init(0x68) == false)
{
while (true)
{
printf("mpu6050 init fail\r\n");
nrf_delay_ms(500);
}
}
else
{
nrf_delay_ms(1000);
printf("mpu6050 init ok\r\n");
}
mpu6050_register_read(0x75U, &id, 1);
printf("mpu6050 id is %d \r\n",id);
while(mpu_dmp_init())
{
nrf_delay_ms(1000);
printf("mpu6050 init Error\r\n");
}
while (true)
{
if(mpu_dmp_get_data(&pitch,&roll,&yaw)==0)
{
MPU6050_ReadAcc(&aacx,&aacy,&aacz); //读取加速度传感器数据
MPU6050_ReadGyro(&gyrox,&gyroy,&gyroz); //读取陀螺仪数据
mpu6050_send_dat(aacx,aacy,aacz,gyrox,gyroy,gyroz);//用自定义帧发送加速度和陀螺仪原始数据
Uart_ReportIMU(aacx,aacy,aacz,gyrox,gyroy,gyroz,(int)(roll*100),(int)(pitch*100),(int)(yaw*10));
nrf_delay_ms(50);
}
}
#else
// This part of the example is just for testing the loopback .
while (true)
{
uart_loopback_test();
}
#endif
}
为了支持匿名四轴上位机,我们要对串口数据进行数据协议规范:
/***********************************************************************************
* 描 述 : 串口发送数据,数据格式为匿名四轴上位机软件(V2.6版本)数据格式
* 入 参 : fun:功能码
* : dat:数据缓存区地址,最多28字节
* : len:数据长度,最大28字节
* 返回值 : 无
**********************************************************************************/
void Uart_SendDat_ToPC(uint8_t fun,uint8_t *dat,uint8_t len)
{
uint8_t send_buf[32];
uint8_t i;
if(len>28)return; //最多28字节数据
send_buf[len+3]=0; //校验数置零
send_buf[0]=0x88; //帧头
send_buf[1]=fun; //功能码
send_buf[2]=len; //数据长度
for(i=0;i
/***********************************************************************************
* 描 述 : 发送加速度传感器数据和陀螺仪数据
* 入 参 : aacx,aacy,aacz:x,y,z三个方向上面的加速度值
* gyrox,gyroy,gyroz:x,y,z三个方向上面的陀螺仪值
* 返回值 : 无
**********************************************************************************/
void mpu6050_send_dat(short aacx,short aacy,short aacz,short gyrox,short gyroy,short gyroz)
{
uint8_t tx_buf[12];
tx_buf[0]=(aacx>>8)&0xFF;
tx_buf[1]=aacx&0xFF;
tx_buf[2]=(aacy>>8)&0xFF;
tx_buf[3]=aacy&0xFF;
tx_buf[4]=(aacz>>8)&0xFF;
tx_buf[5]=aacz&0xFF;
tx_buf[6]=(gyrox>>8)&0xFF;
tx_buf[7]=gyrox&0xFF;
tx_buf[8]=(gyroy>>8)&0xFF;
tx_buf[9]=gyroy&0xFF;
tx_buf[10]=(gyroz>>8)&0xFF;
tx_buf[11]=gyroz&0xFF;
Uart_SendDat_ToPC(0xA1,tx_buf,12);//自定义帧,0XA1
}
/***********************************************************************************
* 描 述 : 串口上传MPU6050姿态数据
* 入 参 : aacx,aacy,aacz:x,y,z三个方向上面的加速度值
* : gyrox,gyroy,gyroz:x,y,z三个方向上面的陀螺仪值
* : roll:横滚角.单位0.01度。 -18000 -> 18000 对应 -180.00 -> 180.00度
* : pitch:俯仰角.单位 0.01度。-9000 - 9000 对应 -90.00 -> 90.00 度
* : yaw:航向角.单位为0.1度 0 -> 3600 对应 0 -> 360.0度
* 返回值 : 无
**********************************************************************************/
void Uart_ReportIMU(short aacx,short aacy,short aacz,short gyrox,short gyroy,short gyroz,short roll,short pitch,short yaw)
{
uint8_t i,tx_buf[28];
for(i=0;i<28;i++)tx_buf[i]=0;//清0
tx_buf[0]=(aacx>>8)&0xFF;
tx_buf[1]=aacx&0xFF;
tx_buf[2]=(aacy>>8)&0xFF;
tx_buf[3]=aacy&0xFF;
tx_buf[4]=(aacz>>8)&0xFF;
tx_buf[5]=aacz&0xFF;
tx_buf[6]=(gyrox>>8)&0xFF;
tx_buf[7]=gyrox&0xFF;
tx_buf[8]=(gyroy>>8)&0xFF;
tx_buf[9]=gyroy&0xFF;
tx_buf[10]=(gyroz>>8)&0xFF;
tx_buf[11]=gyroz&0xFF;
tx_buf[18]=(roll>>8)&0xFF;
tx_buf[19]=roll&0xFF;
tx_buf[20]=(pitch>>8)&0xFF;
tx_buf[21]=pitch&0xFF;
tx_buf[22]=(yaw>>8)&0xFF;
tx_buf[23]=yaw&0xFF;
Uart_SendDat_ToPC(0xAF,tx_buf,28);//匿名四轴飞控显示帧,0xAF
}
完成MPU6050的移植和串口协议的编写后,我们即可使用keil进行编译下载。打开匿名四轴上位机V2.6版本,打开串口即可看到交互界面:
可以看到在我们移植文件中已经移植了MPU6050的DMP功能,可以直接解算出pitch,roll,yaw的欧拉角,是非常方便的。