智能送餐小车-STM32系列F103ZET6单片机控制

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;
        }
    }
}

作者:Jy-Dream

物联沃分享整理
物联沃-IOTWORD物联网 » 智能送餐小车-STM32系列F103ZET6单片机控制

发表评论