github网址
https://github.com/billhsu/MiniQ
项目介绍
本项目包括遥控器和四旋翼两部分,遥控器是一个安卓app,四旋翼主要包括:
蓝牙模块:用于接收遥控器指令。
IMU:惯性测量单元(Inertial Measurement Unit),也就是MPU6050,用于获取当前四旋翼状态。
电机:通过对其输出PWM信号,控制其转速快慢。
控制指令解析部分
四旋翼通过一个蓝牙转串口模块获取控制指令,因此接收的指令数据流是在蓝牙模块对应的串口中断中处理,具体是在UARTs.c文件的void USART1_IRQHandler(void)中:
其中重要代码如下:
RX_dat=USART_ReceiveData(USART1);// & 0x7F;
//status = RX_dat;
if(recvStatus==0)
{
if(RX_dat==0xff) recvStatus=1;
}
else if(recvStatus==1)
{
if(RX_dat==0xaa) recvStatus=2;
else recvStatus=0;
}
else if(recvStatus==2)
{
recvCmd=RX_dat;
recvStatus=3;
}
else if(recvStatus==3)
{
recvLength=RX_dat;
recvStatus=4;
}
else if(recvStatus==4)
{
if(recvPos<recvLength)
{
recvData[recvPos]=RX_dat;
++recvPos;
}
if(recvPos==recvLength)
{
parseCmd(recvCmd,recvLength);
recvPos=0;
recvStatus=0;
}
}
RX_dat是本次中断接收到的一个字节,这部分通过状态机的方式对数据流进行解析,可以看出,一条完整的指令内容如下:
内容 | 字节数 |
---|---|
0xff | 1 |
0xaa | 1 |
指令类型 | 1 |
指令长度 | 1 |
指令内容 | n |