STM32系列-F103ZET6单片机的智能送餐小车
一、开发板介绍
STM32F103系列单片机,有着144个的引脚和丰富的IO口资源。并且还含有多个定时器,并且可以按需选择不同的时钟工作频率,大部分定时器还支持PWM输出与输入捕获等功能。使用此款单片机,可以让本系统完美的运行。
引脚图如下:
二、功能介绍
1、通过驱动模块对电机驱动从而控制小车行进的方向;
2、通过红外循迹模块让小车能够沿着地上黑线行进;
3、通过超声波避障模块让小车遇到障碍物停止前进;
4、在地上贴放RFID卡片,通过感应模块感应所在位置ID;
5、当送餐车到达目的地后,通过压力传感器检测压力的变化,判断餐品是否已经被取走,然后选择是否返回,进行返回路线的选择。
6、通过PC端,实现对小车当前所在位置段的显示,以及对小车路线的选择和运行状态的开关的改变。
三、功能实现
1.整体构成
在硬件设计部分,主要使用Keil5作为开发工具,C语言作为设计语言来实现对每一个模块的开发,根据不同的功能需求进行规范的模块化程序编写。在软件设计部分,则使用Qt Creator作为开发工具,C++语言作为设计语言,以高内聚低耦合为原则,进行上位机界面以及业务逻辑的开发。由红外巡线传感器、超声波测距、电机驱动、舵机、RFID、ESP8266 WIFI模块、压力传感器组成。
2.红外巡线模块
采用定时器中断事件,定时检测路线状况从而进行行进方向的改变。
//巡线结果获取并判断
void driveDirctionChange(void)
{
if(LinewalkingFlag==1&&RoutePointFlag==0\
&&ArriveFlag==0&&RadarStopFlag==0&&ManualControl==0)
drive_now=Linewalking_Cheak_Results(); //获得巡线控制状态
if(distance<35)
{
u3_printf("7:barrier");
RadarStopFlag=1;
drive_now=BRAKE;
}
else
{
RadarStopFlag=0;
}
}
3.TB6612FNG电机驱动模块
使用TB6612FNG电机驱动进行小车电机的转速控制,主要通过改变定时器频率,输出不同的PWM波形进行转速控制。
//小车行进方向改变
void moveTurn(u32 powerLeft,u32 powerRight)
{
GPIO_WriteBit(GPIOG,GPIO_Pin_2,Bit_SET); //左前进
GPIO_WriteBit(GPIOG,GPIO_Pin_4,Bit_RESET);
GPIO_WriteBit(GPIOG,GPIO_Pin_8,Bit_SET); //右前进
GPIO_WriteBit(GPIOC,GPIO_Pin_7,Bit_RESET);
TIM_SetCompare3(TIM2,powerLeft); //左
TIM_SetCompare4(TIM2,powerRight); //右
}
4.ESP8266 WIFI模块
使用ESP8266模块进行WIFI通信,在通信之前首先得建立连接,然后切换至透传模式,开始与上位机进行通信。
//WIFI连接
void atk_8266_wifi_connect(void)
{
while(atk_8266_send_cmd("AT+CWMODE=1","OK",1000));
printf("choose STA success");
while(atk_8266_send_cmd("AT+RST","OK",1000));
printf("RST success");
delay_ms(5000);
if(!atk_8266_consta_check())
{
while(atk_8266_send_cmd("AT+CWJAP=\"wifi\",\"123456789\"",\"OK",20000));
printf("connect wifi success");
}
printf("wifi already connect");
while(atk_8266_send_cmd("AT+CIPMUX=0","OK",2000));
printf("single connection success");
while(atk_8266_send_cmd("AT+CIPSTART=\"TCP\",\"192.168.8.100\",8080",\
"OK",2000));
printf("connect server success");
while(atk_8266_send_cmd("AT+CIPMODE=1","OK",2000));
printf("passthrough success");
while(atk_8266_send_cmd("AT+CIPSEND","OK",200));
printf("begin send Message success");
u3_printf("helloworld");
}
5.PC端Qt上位机
通过Qt上位机给外接在单片机上的ESP8266模块发送操作指令,接收到指令后单片机对ESP8266接收到的数据进行解析,进而让单片机对外设完成相应的控制。因为基于传输层进行数据通信,缺少通信规则,所以本次上位机中进行了大量的数据处理,制定了一套简单的通信规则。
void CarControl::onCarControlReceiveMessage(int carNum, QString data)
{
if (data.length() <= 0)
{
return;
}
ReceiveFormat recv;
QStringList list = data.split(":");
if(list.size()<2)
{
return;
}
recv.type=list.at(0).toInt();
recv.content=list.at(1);
recv.content.replace("\n","");
switch(recv.type)
{
case CommunicationState://小车与上位机通信状态
{
qDebug()<<"CommunicationState"<<recv.content;
ui->communicationStatus_lb->setText(recv.content);
break;
}
case ControlStatu://控制状态
{
qDebug()<<"ControlStatu"<<recv.content;
ui->controlStatu_lb->setText(recv.content);
break;
}
case MealDeliveryStatus://小车送餐状态
{
qDebug()<<"MealDeliveryStatus"<<recv.content;
ui->MealDeliveryStatus_lb->setText(recv.content);
break;
}
}
}