实验13.实现体感控制平衡小车
一、实验目的:通过体感控制平衡小车实验,学习如何利用mpu6050姿态传感器和NRF24L01无线模块进行无线发送、接收与mpu6050姿态相关的指令,实现体感控制平衡小车。
二、实验过程及分析:本实验首先学习与姿态信息相关的一些准备知识,接着利用mpu6050姿态传感器获取mpu6050的姿态信息,根据姿态信息制定相应的指令,然后利用NRF24L01无线模块进行无线发送指令,小车接收到指令执行相应操作,最终实现体感控制平衡小车。
学习要点:与姿态信息相关的一些准备知识;获取mpu6050的姿态信息;根据姿态信息制定相应的指令,NRF24L01无线模块发送指令;小车接收到指令执行相应操作。
与姿态信息相关的一些准备知识:主要就是要知道与姿态相关的三个角度的具体含义,直接看下面几张生动形象的图就可以了,一目了然
俯仰角(Pitch)
横滚角(Roll)
航向角( Yaw)
姿态图
获取mpu6050的姿态信息:关于利用mpu6050读取姿态信息的详细介绍可看我前面的贴子 实验5.传感器驱动实验(读取mpu6050原始数据) 和实验6.多传感器数据融合实验。这里只介绍本次实验所要用到的关键代码。
读取MPU6050内置DMP的姿态信息关键代码:
Stm32控制板程序
float DirF_DirB(void)
{
unsigned long sensor_timestamp;
unsigned char more;
long quat[4];
dmp_read_fifo(gyro, accel, quat, &sensor_timestamp, &sensors, &more);
if (sensors & INV_WXYZ_QUAT )
{
q0=quat[0] / q30;
q1=quat[1] / q30;
q2=quat[2] / q30;
q3=quat[3] / q30;
Pitch = asin(-2 * q1 * q3 + 2 * q0* q2)* 57.3; //俯仰角
printf("%f,%f,\r\n",Pitch,Yaw);
return Pitch;//得到俯仰角
}
}
根据姿态信息制定相应的指令,RF24L01无线模块发送指令:
关键代码:
Stm32控制板程序
while(1)
{
DirF_DirB();
if(NRF24L01_TxPacket(tmp_buf)==TX_OK)
{
if(DirF_DirB()>20) tmp_buf[1]=F;
else if(DirF_DirB()<-20) tmp_buf[1]=B;
else tmp_buf[1]=S;
}
小车接收到相应指令执行相应操作:
关键代码:
小车程序
void NRF24L01(void)
{ unsigned char S,F,B;
u8 mode=0,count;
u8 tmp_buf[33];
if(mode==0)//RX模式
{
RX_Mode();
while(1)
{
if(NRF24L01_RxPacket(tmp_buf)==0)//一旦接收到信息,则显示出来.
{
// printf("%d\r\n",tmp_buf[1]);
if(tmp_buf[1]==S) {Flag_Qian=0,Flag_Hou=0;}
if(tmp_buf[1]==F){Flag_Qian=1,Flag_Hou=0;}
if(tmp_buf[1]==B){Flag_Qian=0,Flag_Hou=1;}
}else delay_us(100);
};
}
}
三.实验现象:实现了体感控制平衡小车
四.实验总结:通过本次实验学习了与姿态信息相关的知识,然后利用mpu6050和nrf24l01制定和发送相应指令,最后实现了体感控制平衡小车。