CC3200和MPU6050的迷你四轴飞行器控制原理

摘要: 多旋翼飞行器具有较好的发展前景,也是近年来的热门研究方向。本文讨论的四轴飞行器是一种四旋翼飞行器。首先介绍四轴飞行器的飞行控制原理;其次逐个阐述了基于CC3200单片机和MPU6050加速度计/陀螺仪的迷你四轴飞行器的各个关键模块,从软件和硬件的角度分别描述了各模块的实现和整合;最后,分析了该四轴飞行器的试飞结果以及该飞行器的一些不足。

引言

本文主要介绍了一种迷你四轴飞行器的控制原理,不同于市面上的大多数四轴飞行器,本文所讨论的四轴飞行器以WiFi网络作为控制器与飞行器的通信媒介,这将使四轴飞行器的易用性得到提高。

四轴飞行器原理简介

四轴飞行器,又称四旋翼飞行器、四旋翼直升机,是一种多旋翼飞行器。四轴飞行器的4个螺旋桨都是电机直连的简单机构,十字形的布局允许飞行器通过改变电机转速获得旋转机身的力,从而调整自身姿态。四轴飞行器可以完成垂直运动、俯仰运动、滚转运动、平移运动、偏航运动等动作。

1.1垂直运动

图1 平衡姿态
图1 平衡姿态

四轴飞行器的每个电机驱动一只旋翼,如图1所示,4只电机用圆形表示,机身框架由图中的十字结构表示。图1中,因有两对电机转向相反,可以平衡其对机身的反扭矩,当同时增加4个电机的输出功率,旋翼转速增加使得总的拉力增大,当总拉力足以克服整机的重量时,四轴飞行器便离地垂直上升;反之,同时减小4个电机的输出功率,四轴飞行器则垂直下降,直至平衡落地,实现了沿z轴的垂直运动。当外界扰动量为零时,旋翼产生的升力等于飞行器的自重时,飞行器便保持悬停状态。保证4个旋翼转速同步增加或减小是保持垂直运动的关键。

1.2俯仰运动、滚转运动

图2 倾斜姿态
图2 倾斜姿态

倾斜姿态如图2所示,电机1、电机2的转速上升,电机3、电机4的转速下降。为了不因为旋翼转速的改变引起四轴飞行器整体扭矩及总拉力改变,旋翼1与旋翼3转速改变量的大小应相等,旋翼2与旋翼4转速改变量的大小应相等。由于旋翼1、旋翼2的升力上升,旋翼3、旋翼4的升力下降,产生的不平衡力矩使机身绕y轴旋转,发生俯仰运动。同理,当电机1、电机4的转速下降,电机2、电机3的转速上升时,机身便绕x轴向旋转,实现飞行器的滚转运动。

1.3平移运动

四轴飞行器在作出俯仰、滚转运动时,由于机体倾斜,旋翼提供的升力将产生水平分量,使得机体可以作出前、后、左、右平移运动。

1.4偏航运动

偏航运动如图3所示。四轴飞行器偏航运动可以借助旋翼产生的反扭矩来实现。旋翼转动过程中由于空气阻力作用会形成与转动方向相反的反扭矩,为了克服反扭矩影响,可使4个旋翼中的2个正转、2个反转,且对角线上的各个旋翼转动方向相同。

图3 偏航运动
图3 偏航运动

反扭矩的大小与旋翼转速有关,当4个电机转速相同时,4个旋翼产生的反扭矩则相互平衡,则四轴飞行器不发生转动;当4个电机转速不完全相同时,不平衡的反扭矩会引起四轴飞行器转动。在图3中,当电机1和电机3的转速上升、电机2和电机4的转速下降时,旋翼1和旋翼3对机身的反扭矩大于旋翼2和旋翼4对机身的反扭矩,机身便在富余反扭矩的作用下绕z轴转动,实现飞行器的偏航运动,转向与电机1、电机3的转向相反。因为电机的总升力不变,飞机不会发生垂直运动。

能够作出以上几种动作,使得四轴飞行器具备了较高的灵活性和较好的操控性。

四轴飞行器硬件设计与实现

本文所讨论的迷你四轴飞行器以自身的PCB板为机架,由CC3200无线微控制器负责飞控算法、电机控制和无线通信,由MPU6050加速度计/陀螺仪负责获取姿态数据,由4只720空心杯电机和螺旋桨提供升力,由MOS管驱动电机,由锂电池和LDO稳压器提供电源。

2.1迷你四轴飞行器总体设计

图4 迷你四轴飞行器外观
图4 迷你四轴飞行器外观

该飞行器PCB尺寸为10 cm×10 cm,层数为两层。整体外观如图4所示。

为降低硬件开发复杂度,CC3200和MPU6050均使用成品模块。为节约空间、降低负重,PCB上的阻容器件均采用0603封装,其他器件采用小型贴片封装。

2.2CC3200模块

CC3200是TI公司推出的一款单芯片无线微控制器,为SimpleLink、WiFi和物联网提供解决方案。CC3200由应用微控制器、WiFi网络处理器和电源管理子系统组成。

应用微控制器采用ARM CortexM4内核,运行频率为80 MHz,具有256 KB RAM,浮点运算能力较强,满足飞控算法性能要求;有2个UART接口、1个I2C接口、4个通用定时器,通道支持16位脉宽调制 (PWM) 模式,4通道12位模/数转换器 (ADC),多达27个独立可编程、复用通用输入/输出(GPIO)引脚,硬件接口完全满足四轴飞行器的功能需求。

WiFi网络处理器子系统特有WiFi InternetOnaChip专用ARM MCU,完全解除应用微控制器的WiFi和互联网协议处理负担。ROM中固化有WiFi以及互联网协议、802.11 b/g/n射频、基带、媒介访问控制(MAC)、WiFi驱动器和请求方TCP/IP堆栈。

电源管理子系统集成DCDC转换器,支持2.1~3.6V宽范围的电源电压,并具备高级低功耗模式。

本文所使用的CC3200模块已集成必要的外围电路和时钟,扩展出GPIO和外设接口,仅需提供电源即可运行。PCB中引出CC3200模块的2路UART和1路JTAG进行调试,1路I2C总线与MPU6050传感器通信,4路PWM用于控制电机,2路GPIO控制指示灯。

2.3MPU6050模块

MPU6050为整合性6轴运动处理组件,相较于多组件方案,避免了组合陀螺仪与加速器时之轴间差的问题,减少了大量的封装空间。MPU6050的角速度全格感测范围为±250°/sec、±500°/sec、±1 000°/sec与±2000°/sec (dps),可准确追踪快速与慢速动作,并且,用户可程式控制的加速器全格感测范围为±2g、±4g、±8g与±16g,产品传输可通过最高至400 kHz的I2C总线接口实现。MPU6050可在不同电压下工作,VDD供电电压为2.5 V±5%、3.0 V±5%或3.3V±5%。MPU6050的封装尺寸为4×4×0.9 mm3(QFN)。MPU6050还包含内建的温度感测器、在运作环境中仅有±1%变动的振荡器。

MPU6050模块已集成必要的外围电路,扩展出I2C接口,仅需提供电源并进行配置即可使用。

2.4电机及其驱动电路

四轴飞行器采用转速高达45 000 r/min的720空心杯电机提供动力。电机由SI2302场效应管驱动,场效应管由CC3200 PWM控制。

2.5电源设计

四轴飞行器的电源由锂电池提供。锂电池容量为500 mAh、放电系数为20C,最大放电电流为10 A,可支持飞行器飞行5 min。电池输出分两路,一路直接通过MOS管加在电机上为电机供电,另一路通过XC6206 LDO稳压到3.3 V,为CC3200和MPU6050供电。

2.6遥控器设计

四轴飞行器使用Android手机通过WiFi与CC3200建立连接并通信。手机端遥控APP将在3.2节介绍。

四轴飞行器软件设计与实现

3.1四轴飞行器端固件

四轴飞行器端固件主要实现如下功能:

① 初始化CC3200应用控制器。
② 初始化并配置MPU6050传感器。
③ 初始化网络处理器并建立WLAN AP和TCP Server Socket,等待遥控连接。
④ 进入主循环,处理传感器数据,生成姿态数据并根据姿态和遥控指令计算出每个电机的PWM输出值。

main()函数框架如下(略去部分代码):

void main(){
BoardInit();//初始化CC3200
PinMuxConfig();//配置引脚
InitPWMModules();//初始化PWM
I2C_IF_Open(I2C_MASTER_MODE_FST);//初始化I2C
mpu_setup();//初始化和配置MPU6050
……
//初始化网络子系统,建立WLAN AP和TCP Server Socket
osi_TaskCreate( WlanAPMode, \\
(const signed char*)"wireless LAN in AP mode", \\
OSI_STACK_SIZE, NULL, 1, NULL );
//主循环,处理传感器数据,生成姿态数据并实现飞控算法
osi_TaskCreate( GestureCtrl, \\
(const signed char*)"gesture ctrl", \\
OSI_STACK_SIZE, NULL, 1, NULL );
……
}

主要飞控算法函数Gesture_ctrl()框架如下(略去部分代码):

void Gesture_ctrl(int accelerato, float offsetX, float offsetY){
MakeOut_xyz();//根据传感器返回的数据计算x、y、z三个轴向的倾角
UpdatePID(offsetX, offsetY);//计算调节量
//把几个轴向的调节量加在相应的电机上
moto1 = accelerato + pid_rol.out - pid_pit.out - pid_yaw.out;
moto2 = accelerato - pid_rol.out - pid_pit.out + pid_yaw.out;
moto3 = accelerato - pid_rol.out + pid_pit.out - pid_yaw.out;
moto4 = accelerato + pid_rol.out + pid_pit.out + pid_yaw.out;
//将运算结果输出给PWM控制器
UpdateDutyCycleMoto1(moto1);
UpdateDutyCycleMoto2(moto2);
UpdateDutyCycleMoto3(moto3);
UpdateDutyCycleMoto4(moto4);
}

其中,UpdatePID(offsetX, offsetY)根据倾角、遥控指令(offsetX, offsetY)和PID算法,求出x、y、z三个轴向上的调节量pid_rol.out、pid_pit.out和pid_yaw.out。offsetX、offsetY 为遥控器命令指定的目标姿态,PID算法将改变电机输出,使机体姿态调整到目标姿态。PID算法公式为:uk=Kp×ek+Ki∑kj=0ej+Kd(ek-ek-1)

其中,u为调节量;e为当前姿态的姿态角较目标姿态的偏差,即offsetX + x或offsetY + y(x、y为当前姿态倾角);Kp为比例相系数;Ki为积分项系数,积分项为e的累加和;Kd为微分项系数,角度的微分即角速度,所以微分项可由MPU6050的陀螺仪输出直接得到。

网络通信的简要代码如下(略去部分代码):

int BsdTcpServer(unsigned shortusPort){
……
//填充TCP Server Socket地址
sLocalAddr.sin_family = SL_AF_INET;
sLocalAddr.sin_port = sl_Htons((unsigned short)usPort);
sLocalAddr.sin_addr.s_addr = 0;
//创建TCP Server Socket
iSockID = sl_Socket(SL_AF_INET,SL_SOCK_STREAM, 0);
//绑定TCP socket
sl_Bind(iSockID, (SlSockAddr_t *)&sLocalAddr, iAddrSize);
//监听TCP连接
sl_Listen(iSockID, 0);
//设置Socket操作为非阻塞模式
sl_SetSockOpt(iSockID, SL_SOL_SOCKET, SL_SO_NONBLOCKING,&lNonBlocking, sizeof(lNonBlocking));
iNewSockID = SL_EAGAIN;
while( iNewSockID < 0){
//接受TCP连接请求
iNewSockID = sl_Accept(iSockID, ( struct SlSockAddr_t *)&sAddr,(SlSocklen_t*)&iAddrSize);
}
return iNewSockID;
}
void TcpLoopRecive(void *pvParameters){
……
while(1){
//接收TCP包
sl_Recv(iNewSockID, g_cBsdBuf, 16, 0);
//解析遥控指令
if(g_cBsdBuf[0] == 0xAA){
accelerato = g_cBsdBuf[1] + ((int)g_cBsdBuf[2] << 8);
memcpy(&offsetX, g_cBsdBuf + 3, 4);
memcpy(&offsetY, g_cBsdBuf + 7, 4);
}
}
}

3.2遥控器端APP设计

遥控器APP运行在Android手机系统中,主要功能是建立与CC3200的TCP连接,为用户提供操作界面,获取用户输入,并通过TCP Seruer Socket将输入传给CC3200。用户界面如图5所示,该界面能够获取用户的“方向”和“油门”输入。

图5 遥控APP界面
图5 遥控APP界面

结语

按照本文的方案设计出的四轴飞行器,在试飞中可以根据遥控器指令,作出悬停、垂直运动、水平运动等动作,验证了本方案的可行性。同时,四轴飞行器方案在飞行稳定性、遥控距离、电源稳定性方面,还有很大的提升空间。

文章来源:单片机与嵌入式系统应用