完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
在前一篇博客中讲了下一些题外话,从本篇开始讲讲重点的知识,说说无线飞鼠过程用到的模块 细说MPU6050
MPU6050集成了3轴加速度和3轴陀螺仪,是一款不错的传感器模块,可以用在很多方面,比如:四轴飞控、空中鼠标、两轮平衡车、GPS定位方面、游戏机、3D遥控器、平板设备等等,此模块给我们提供了强大的数据供应,由于将加速度和陀螺仪集成到了一起,免去了组合这两个模块时之间的轴差问题,减少了包装问题,这两年很火,成了DIY制作者的最爱。 二、 细节问题 在淘宝上买MPU6050时,要注意一下几点:
MPU6050数据是用IIC进行读取的,So必须学会IIC。类似于USB协议,不过和USB比起来可以说是小巫见大巫。
当时开始做这个东西的时候参考了原子、野火的各个例子,再次感谢你们。 代码块 MPU初始化: void MPU_Init() { ANBT_I2C_Configuration(); //IIC初始化 delay_ms(30); AnBT_DMP_MPU6050_Init(); //MPU6050 的DMP初始化 } 下边是读取陀螺仪的数据函数: void Read_Gyro_data(short *rxbuf) { unsigned long sensor_timestamp; unsigned char i = 0; short gyro[3], accel[3], sensors;//陀螺仪存放数组,加速度存放数组,返回状态量 unsigned char more; long quat[4]; //四元数存放数组 dmp_read_fifo(gyro, accel, quat, &sensor_timestamp, &sensors,&more); if(sensors & INV_WXYZ_QUAT) { rxbuf[0] = gyro[0]; rxbuf[1] = gyro[1]; rxbuf[2] = gyro[2]; printf("rnRead_Gyro_data gyro:rn"); for (i = 0; i < 3; i++) { printf(" %d ",gyro); } printf("rn"); } } 其实参考了圆点博士的开源代码的,看了下匿名四轴下位机协议,当初试了下自己获取的数据是否正确,很不错的,下面是匿名的协议: /* * 函数名:Data_Send_Status * 描述 :数据发送 传感器 的状态 根据匿名四轴最新上位机编写的显示姿态的程序 * 输入 :Pitch:俯仰角 Roll :横滚角 Yaw :航向角 gyro :陀螺仪 accel:加速度 * 输出 : * 调用 : */ void Data_Send_Status(float Pitch,float Roll,float Yaw,int16_t *gyro,int16_t *accel) { unsigned char i = 0; unsigned char j = 0; unsigned char _cnt = 0,sum = 0; unsigned int _temp; u8 data_to_send[12] = {0}; //发送数组,初始化为0 data_to_send[_cnt++] = 0xAA; // 帧头 170 data_to_send[_cnt++] = 0xAA; // 170 data_to_send[_cnt++] = 0x01; // 功能字 1 data_to_send[_cnt++] = 0; // 长度 0 //横滚角 _temp = (int)(Roll * 100); data_to_send[_cnt++] = BYTE1(_temp); // 高 8 位 data_to_send[_cnt++] = BYTE0(_temp); // 低8位 //俯仰角 _temp = 0 - (int)(Pitch * 100); data_to_send[_cnt++] = BYTE1(_temp); data_to_send[_cnt++] = BYTE0(_temp); //航向角 _temp = (int)(Yaw * 100); data_to_send[_cnt++] = BYTE1(_temp); data_to_send[_cnt++] = BYTE0(_temp); data_to_send[3] = _cnt - 4; //数据长度 //和校验 for(i = 0;i < _cnt;i++) sum += data_to_send; data_to_send[_cnt++] = sum; data_to_send[_cnt++] = ' |