毕业设计之-题⽬:基于stm32的WiFi监控⼩车
⽂章⽬录
1 背景
2 系统设计⽅案
2.1 实现功能
2.1.1 硬件部分:
2.1.2 软件部分:
2.1.3 WIFI通信功能:
2.2 系统架构
2.2.1 WiFi 通信
2.2.2 电机驱动
2.2.3 摄像头
2.2.4 舵机
2.2.5 PWM舵机控制
2.2.6 红外循迹模块
3 软件设计
4 测试效果
5 部分关键代码
6 最后
1 背景
近⼏年,⼈们的⽣活正在逐渐向智能化转变, 嵌⼊式技术及⼀些新技术的快速发展, 使⼈们⽣活和⼯作变得越来越智能化 。智能⼩车可以在所处的环境中通过传感器⾃ ⾏进⾏判断和分析,在⽆⼈操作的情况下⾃ 主完成任务。
设计的智能⼩车通过WIFI实现远程⽆线控制,同时具有避障及温度采集功能, 实现了⼩车的智能化, 可以作为研究智能汽车或者其他移动机器⼈的基础模型,具有较⼤的研究空间。
2 系统设计⽅案
2.1 实现功能
学长设计的⼩车能够实现⽆线控制, 避障, 循迹等功能, 由硬件, 软件,⽆线传输三⼤部分组成,现对以上三部分功能进⾏具体的叙述。
2.1.1 硬件部分:
输出 PWM 控制电机; 检测障碍物, 检测距离为 10cm;串⼝通信, 需要通过串⼝对智能⼩车进⾏调试, 串⼝波特率设置为 115200;对接收到的命令进⾏处理和判断;通过温度传感器检测环境温度; 连接WIFI 模块及控制 WIFI模块;通过uCOS-II实现多个任务同时执⾏。
2.1.2 软件部分:
操作界⾯功能;通过SOCKET编程实现联⽹,可以连接到 WIFI模块;接收STM32开发板传输的数据和发送指令数据;利⽤摄像头进⾏拍照, 在⼩车⾏驶过程中接收⼩车传输的图⽚信息并显⽰;实现⼩车的模式切换, 模式 1 为⽆线控制⾏驶模式,模式2为⾃动⾏驶模式。2.1.3 WIFI通信功能:
与 PC 端进⾏联⽹连接;实现PC 与单⽚机之间的数据交换功能。
2.2 系统架构
⼩车采⽤ STM32F103 开发板,与 51 单⽚机相⽐, STM32可以搭载⼩型系统且速度更快,设计⽅案如下图所⽰。
STM32开发板作为本设计的控制中⼼, 使⽤ PWM 输出波形驱动电机转动, 通过内部定时器达到控制⽅向的效果, 同时将接收到的数据及命令经过处理器判断和计算从IO⼝输出。
利⽤温度传感器采集温度信息通过串⼝传输到 WIFI模块,在PC 端显⽰;
利⽤红外传感器实现探测障碍和循迹功能。
WIFI模块是 PC 端和开发板进⾏数据交互的媒介, PC 端的操作指令由WIFI模块进⾏发送,开发板和 PC 端之间设置了相应的数据协议,由此判断接收到的是哪种类型的命令,⼩车根据命令执⾏相应的操作。
在这⾥插⼊图⽚描述
2.2.1 WiFi 通信
WIFI通信模块作为 STM32和 PC 端通信的中介, 两端都通过 WIFI模块进⾏数据交互, 该模块选⽤ ESP8266芯⽚ [5] , 其特点就是如果断开连接, 再次连接, 模块会连接到最近⼀次连接过的热点。
ESP8266⽀持三种模式, 分别为 STA 模式, AP模式, STA+AP 模式。
这⾥学长使⽤ AP 模式, 使其他⽹ 络能 够连接到ESP8266。 本设计使⽤ ESP8266的 AP模式,使其他⽹络能够连接到 ESP8266,与STM32的引脚连接如表所⽰。
在这⾥插⼊图⽚描述
在这⾥插⼊图⽚描述
2.2.2 电机驱动
在这⾥插⼊图⽚描述
为了实现PC 端能够控制⼩车的速度以及满⾜直流电机的驱动 电 压, 本设计选⽤ L298N 电 机驱动 模块给直流 电 机供电 。
电机状态与STM32输⼊如表2。 电机驱动共有两个电源输⼊接⼝,⼀个是5V,另⼀个是12V,在使⽤时12V的接⼝输⼊电压要⼤于
7V,5V的接⼝就可以向单⽚机供电。
在这⾥插⼊图⽚描述
2.2.3 摄像头
ov7670是OmniVision公司⽣产的⼀款感光整列,30W像素。
在这⾥插⼊图⽚描述
为什么要⽤带FIFO的模块呢?因为stm32速度⽐较慢,带FIFO可已将摄像头拍摄的数据暂时存在FIFO⾥,然后我们的stm32再慢慢的将拍摄的数据读出来,通过串⼝发送到串⼝上位机显⽰。
FIFO,即first in first out的缩写。在这⾥,FIFO的速度很快,可以将摄像头的数据暂时存起了。以便我们慢速的CPU将获得的数据慢慢取出来并处理,达到⼀个类似⽔库的作⽤。
2.2.4 舵机
在这⾥插⼊图⽚描述
舵机的输⼊线共有三条, 红⾊中间, 是电源线, ⼀边⿊⾊的是地线, 这辆根线给舵机提供最基本的
能源保证, 主要是电机的转动消耗。电源有两种规格, ⼀是 4.8V, ⼀是 6.0V, 分别对应不同的转矩标准, 即输出⼒矩不同, 6.0V 对应的要⼤⼀些, 具体看应⽤条件; 另外⼀根线是控制信号线, Futaba 的⼀般为⽩⾊, JR 的⼀般为桔黄⾊。
另外要注意⼀点, SANWA 的某些型号的舵机引线电源线在边上⽽不是中间, 需要辨认。但记住红⾊为电源, ⿊⾊为地线, ⼀般不会有错。
2.2.5 PWM舵机控制
舵机的控制信号为周期是 20ms 的脉宽调制( PWM) 信号, 其中脉冲宽度从0.5ms-2.5ms, 相对应舵盘的位置为 0-180 度, 呈线性变化。 也就是说, 给它提供⼀定的脉宽, 它的输出轴就会保持在⼀个相对应的⾓度上, ⽆论外界转矩怎样改变, 直到给它提供⼀个另外宽度的脉冲信号, 它才会改变输出⾓度到新的对应的位置上。
2.2.6 红外循迹模块
采⽤TCRT5000红外反射传感器,⼀种集发射与接收于⼀体的光电传感器,它由⼀个红外发光⼆极管和⼀个NPN红外光电三极管组成。检测反射距离1mm-25mm适⽤,传感器特设M3固定安装孔,调节⽅向与固定⽅便易⽤,使⽤宽电压LM393⽐较器,信号⼲净,波形好,驱动能⼒强,超过15mA。可以
应⽤于机器⼈避障、机器⼈进⾏⽩线或者⿊线的跟踪,可以检测⽩底中的⿊线,也可以检测⿊底中的⽩线,是寻线机器⼈的必备传感器。流⽔线计件、电度表脉冲数据采样、传真机碎纸机纸张检测等众多场合。
在这⾥插⼊图⽚描述
3 软件设计
⼩车控制是通过 stm32单⽚机控制驱动电路和给舵机送控制信号, 然⽽这些控制信号的命令⼜是电脑等终端设备通过⽆线路由器串⼝传送给单⽚机的, 所以在程序中我们需要设计到串⼝的使⽤、 定时器使⽤、 I/O ⼝的使⽤。
系统主程序模块主要完成对系统中各模块电路的初始化等⼯作, 主要包括对定时器、 串⼝中断、 外部中断的初始化, 同时执⾏电脑等终端设备所发送的命令, 等待外部中断以及根据所需要的功能进⾏相应操作。 软件总体设计及程序流程如下图
在这⾥插⼊图⽚描述
4 测试效果
在这⾥插⼊图⽚描述
在这⾥插⼊图⽚描述
在这⾥插⼊图⽚描述
5 部分关键代码
主程序
#include "stm32f10x.h"
#include "bsp_SysTick.h"
#include "bsp_led.h"
#include <string.h>
#include <stdlib.h>
#include "bsp_pwm_output.h"
#include "infrared.h"
#include "delay.h"
//全局变量
unsigned int Task_Delay[NumOfTask];
/**
* @brief  主函数
* @param  ⽆
* @retval ⽆
*/
int main(void)
{
//初始化systick
SysTick_Init();                                            //⽤于延时等操作
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;
TIMx_PWM_Init();            //PWM波初始化
infrared_Initial();        //红外初始化
while(1)
{
if((infrared_Scan(infrared_5_GPIO_PORT,infrared_5_GPIO_PIN)==INFRARED_ON)&&\
(infrared_Scan(infrared_6_GPIO_PORT,infrared_6_GPIO_PIN)==INFRARED_ON))//前⽅有障碍,必须两边同时检测到才能触发,否则均认为是误触
{
DelayS(3);        //延迟3秒
if((infrared_Scan(infrared_5_GPIO_PORT,infrared_5_GPIO_PIN)==INFRARED_ON)&&\
(infrared_Scan(infrared_6_GPIO_PORT,infrared_6_GPIO_PIN)==INFRARED_ON))//仍旧有障碍
{
TIMx_Mode_Config(500,0,0,500);//右转500ms
DelayMs(500);
}
else
{
TIMx_Mode_Config(500,0,0,500);//直⾏500ms
DelayMs(500);
}
}
else
{
if((infrared_Scan(infrared_3_GPIO_PORT,infrared_3_GPIO_PIN)==INFRARED_ON))//循迹,右侧内部传感器见到⿊线,说明车⾝⽅向偏右
TIMx_Mode_Config(0,0,600,0);//轻微左转
else if((infrared_Scan(infrared_2_GPIO_PORT,infrared_2_GPIO_PIN)==INFRARED_ON))//循迹,左侧内部传感器见到⿊线,说明车⾝⽅向偏左
TIMx_Mode_Config(600,0,0,0);//轻微右转
else if((infrared_Scan(infrared_4_GPIO_PORT,infrared_4_GPIO_PIN)==INFRARED_ON))//循迹,右侧外部传感器见到⿊线,说明车⾝⽅向偏左
TIMx_Mode_Config(0,0,900,0);//剧烈左转
else if((infrared_Scan(infrared_1_GPIO_PORT,infrared_1_GPIO_PIN)==INFRARED_ON))//循迹,左侧外部传感器见到⿊线,说明车⾝⽅向偏左
TIMx_Mode_Config(900,0,0,0);//剧烈右转
else
TIMx_Mode_Config(500,0,500,0);//直⾏
}
}
}
PWM程序
#include "bsp_pwm_output.h"
/**
* @brief  配置TIM3复⽤输出PWM时⽤到的I/O
* @param  ⽆
* @retval ⽆
*/
static void TIMx_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* 设置TIM3CLK 为 72MHZ */
//  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
macTIM_APBxClock_FUN (macTIM_CLK, ENABLE);
/* GPIOA and GPIOB clock enable */
macTIM_GPIO_APBxClock_FUN (macTIM_GPIO_CLK, ENABLE);
/*GPIOA Configuration: TIM3 channel 1 as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin =  macTIM_CH1_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;            // 复⽤推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(macTIM_CH1_PORT, &GPIO_InitStructure);
/*GPIOB Configuration: TIM3 channel 2 as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin =  macTIM_CH2_PIN;
GPIO_Init(macTIM_CH2_PORT, &GPIO_InitStructure);
/*GPIOB Configuration: TIM3 channel 3 as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin =  macTIM_CH3_PIN;
GPIO_Init(macTIM_CH3_PORT, &GPIO_InitStructure);
/*GPIOB Configuration: TIM3 channel 4 as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin =  macTIM_CH4_PIN;
小型汽车图片
GPIO_Init(macTIM_CH4_PORT, &GPIO_InitStructure);
}
/**
* @brief  配置TIM3输出的PWM信号的模式,如周期、极性、占空⽐
* @param  ⽆
* @retval ⽆
*/
/*
* TIMxCLK/CK_PSC --> TIMxCNT --> TIMx_ARR --> TIMxCNT 重新计数
*                    TIMx_CCR(电平发⽣变化)
* 信号周期=(TIMx_ARR +1 ) * 时钟周期
* 占空⽐=TIMx_CCR/(TIMx_ARR +1)
*/
void TIMx_Mode_Config(u16 CCR1_Val,u16 CCR2_Val,u16 CCR3_Val, u16 CCR4_Val) {
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
TIM_OCInitTypeDef  TIM_OCInitStructure;