一、设计简介
本毕业设计项目是基于STM32单片机的循迹避障灭火蓝牙控制智能小车源代码程序,包含原理图手机APP。
详细资料以及源码,百度网盘下载https://pan.baidu.com/s/1E0-kvjAzGwKixbP9sWxv4w?pwd=4ajc
二、功能设计
1. 循迹功能
- 硬件:使用红外循迹模块TCRT5000。
- 功能描述:智能小车能够通过检测地面上的黑线或白线(取决于模块类型及其配置)来自动沿特定路径行驶。
- 实现方法:通过GPIO引脚读取TCRT5000的输出,根据输出状态调整小车的行驶方向。
2. 避障功能
- 硬件:使用超声波测距模块SR04和SG90舵机控制。
- 功能描述:当小车前方有障碍物时,能够自动转向避开。
- 实现方法:定期通过SR04测量前方距离,当距离小于设定阈值时,调整小车行驶方向。
3. 灭火功能
- 硬件:使用火焰传感器的灭火装置(如风扇模拟)。
- 功能描述:当检测到火焰时,小车能够自动停止并启动灭火装置。
- 实现方法:通过火焰传感器检测火焰,当检测到火焰时,灭火装置对准火焰并启动。
4. 蓝牙控制功能
- 硬件:使用蓝牙通讯模块HC05。
- 功能描述:通过手机APP发送指令,控制小车的行驶、停止、转向等。
- 实现方法:在STM32上配置UART串口与HC05通信,接收APP发送的指令并解析执行。
5. 智能小车整体控制
- 硬件:使用TB6612电机驱动模块控制小车电机。
- 功能描述:综合循迹、避障、灭火和蓝牙控制等功能,实现小车的智能化行驶和灭火任务。
- 实现方法:根据各个传感器的输入和蓝牙指令,通过算法决策小车的行驶路径和动作。
6. 手机APP功能
- 功能描述:提供用户界面,用于发送控制指令给智能小车,并接收小车的状态反馈。
- 实现方法:使用APPinventor开发工具,编写蓝牙通信和控制逻辑。
三、所需硬件连接
- STM32单片机:例如STM32F103C8T6。
- 红外循迹模块TCRT5000:连接到GPIO引脚。
- 火焰传感器:连接到GPIO引脚。
- 蓝牙通讯模块HC05:通过UART串口通信连接到STM32。
- 超声波测距SR04:触发trig引脚和回声引脚echo连接到GPIO引脚。
- TB6612电机驱动:PWM和DIR引脚连接到STM32。
- SG90舵机:PWM引脚连接到STM32。
四、软件环境
Keil5 MDK:stm32单片机源代码程序编写及下载代码
ST-Link 驱动程序:用于下载程序到 STM32。
五、所需硬件以及传感器模块
1.1 stm32f103c8t6(1个)
STM32F103C8T6单片机是一款非常用的单片机型号,可以方便灵活的进行嵌入式系统开发。首先,它的处理器基于Cortex-M3内核,最高工作频率达72MHz。STM32F103C8T6拥有64KB闪存和20KB SRAM,非常适合中小型单片机开发项目。
具有非常丰富的外设接口,如串口USART、SPI通信、I2C通讯、CAN通讯和USB,在与单片机外设通信方面非常方便。有多个GPIO通用IO口,定时器,中断系统,灵活配置为输入,输出、模拟输入或PWM输出,可以连接各类传感器和模块。
内部集成的12位逐次逼近型ADC和DAC,支持高精度模拟信号处理。STM32F103C8T6还支持低功耗模式,适合电池供电的应用场景。结合强大的STM32开发生态,包括库函数和工具链,可以让开发者很方便的完成单片机项目的开发。
1.2 红外循迹模块TCRT5000(1个)
1、模块介绍
TCRT5000是一种红外线传感器模块,也被称为寻迹模块。它由一个红外线发射器和一个红外线接收器组成,能够发射红外线信号并接收被反射回来的红外线信号。通过检测接收器接收到的红外线信号强度变化,可以判断是否有物体遮挡在传感器前方,从而实现循迹功能。
2、工作原理
- 发射红外线:TCRT5000的红外线发射二极管不断发射红外线。
- 接收反射信号:当红外线照射到物体并被反射回来时,红外线接收器会接收到反射回来的信号。
- 判断遮挡:根据接收器接收到的红外线信号强度变化,可以判断是否有物体遮挡在传感器前方。如果信号强度足够大,说明有物体反射了红外线;如果信号强度较弱或没有信号,说明前方没有物体或物体无法反射红外线。
3、电气特性
- 供电电压:一般为3.3V或5V。
- 输出信号:数字信号,可以直接与单片机(如STM32、Arduino等)进行连接和控制。
- 引脚说明:
- VCC:电源正极,接供电电压。
- GND:电源负极,接地。
- DO:数字信号输出引脚,用于输出检测到的信号状态(高电平或低电平)。
- AO(可选):模拟信号输出引脚,不同距离输出不同电压(在循迹功能中通常不使用)。
4、应用与功能实现
- 循迹功能:TCRT5000常用于机器人等自动化设备中,可以用来识别黑线、白线或其他颜色的线路,以便机器人根据线路进行自动导航。在具体应用中,通常会将多个TCRT5000模块组成阵列,以增加线路识别的精度和稳定性。
- 接线与配置:将TCRT5000模块的VCC和GND分别连接到单片机的电源和地引脚,将DO引脚连接到单片机的输入引脚。在单片机上配置相应的GPIO引脚来读取DO引脚的电平状态。
- 代码实现:通过编写单片机程序来读取TCRT5000模块的输出信号,并根据信号状态调整机器人的行驶方向。例如,当检测到前方有黑线时,可以控制机器人沿着黑线行驶;当检测到前方没有黑线时,可以控制机器人转向或停止。
5、注意事项
- 环境光干扰:TCRT5000对环境光的抗干扰能力较弱,因此在使用过程中要尽量避免强光照射到模块上,以免影响识别效果。
- 红外线传输距离:由于红外线传输距离有限,模块与被识别物体的距离也会对识别效果产生影响。因此,需要根据具体情况调整模块的距离和位置。
- 模块稳定性:在使用多个TCRT5000模块组成阵列时,需要确保每个模块的稳定性和一致性,以提高整体识别精度和稳定性。
1.3 电机驱动模块TB6612(1个)
TB6612电机驱动是一款功能强大的电机驱动芯片,以下是对其功能的详细介绍:
1、基本特性
TB6612是一款双通道、高效率的H桥DC brushed motor driver(直流有刷电机驱动器),也可以用于步进电机的控制。它集成了两组H-bridge(H桥)结构,允许独立控制两个电机的正反转和速度。
2、控制功能
- 双向控制:TB6612可以驱动两个电机,每个电机都可以独立控制方向,支持正反转。
- 速度控制:通过PWM(脉冲宽度调制)信号,可以精确控制电机的速度。PWM信号的占空比决定了电机的转速,占空比越大,转速越快。
- 方向控制:通过控制输入端口的高低电平信号,可以实现对电机正反转的控制。
3、保护功能
- 电流控制:TB6612内置电流检测和保护功能,可以根据需求设定电流限制,防止电机过热或损坏。
- 集成保护:具有过流、过热和短路保护机制,当检测到异常情况时,会自动切断输出,保护芯片和电机不受损害。
4、接口与通信
- 接口丰富:TB6612通常配备有I2C和GPIO接口,方便与微控制器进行通信和控制。
- 易于连接:需要连接的引脚包括VCC(电源)、GND(地)、IN1~IN4(输入脉冲)、DIR(方向控制)等,连接简单方便。
1.4 SG90舵机(1个)
SG90舵机是一种典型的小型直流电动舵机,也被称为伺服电机。以下是对其功能的详细介绍:
1、基本特性
- 尺寸与重量:SG90舵机体积小巧,尺寸为21.5mmX11.8mmX22.7mm,重量仅为9克,非常适合用于空间和重量要求严格的应用场景。
- 工作电压:其工作电压范围为4.8V至6V,这使得SG90舵机能够兼容多种电源供应,提高了使用的灵活性。
2、控制功能
- 角度控制:SG90舵机可以通过接收PWM(脉冲宽度调制)信号来控制其旋转角度。PWM信号的频率通常为50Hz,即周期为20毫秒。在这个周期内,通过控制高电平的时长,就能够控制舵机旋转的角度。例如,高电平为0.5毫秒时,舵机旋转到0度;高电平为2毫秒时,旋转到135度;高电平为1.5毫秒时,旋转到90度。这种控制方式使得SG90舵机能够实现精确的角度定位。
- 方向控制:SG90舵机不仅可以控制旋转角度,还可以控制旋转方向。通过改变PWM信号的占空比或相位,可以实现舵机的正反转。
- 速度控制:虽然SG90舵机通常用于位置控制,但也可以通过调整PWM信号的占空比来在一定程度上控制其旋转速度。不过,需要注意的是,速度控制通常不如角度控制精确。
3、应用领域
- 模型控制:SG90舵机广泛用于遥控汽车、飞机、船只等模型的转向、加速和刹车等控制。
- 机器人控制:在机器人领域,SG90舵机可以控制机器人的头部旋转、臂部移动等关节运动,是机器人机电控制系统中的重要组成部分。
- 相机云台:SG90舵机还可以用于控制相机的运动,例如实现云台的左右旋转和上下移动,为摄影和摄像提供稳定的拍摄平台。
- 自动化系统:在一些自动化系统中,SG90舵机可以用来控制小型机械臂或手指的运动,实现精确的物体抓取和放置等操作。
4、工作原理
SG90舵机的工作原理基于PWM信号控制。当系统通过SG90 PWM信号控制电子控制板时,电机内部的电机轴会向上或向下旋转,从而产生转动机械上的输出轴,输出一定的转角位置。位置反馈器会读取输出轴的角度位置信息,并将该信息反馈给电子控制板,从而实现闭环控制。这种控制方式使得SG90舵机能够保持稳定的旋转角度和速度。
综上所述,SG90舵机具有体积小、重量轻、控制精确等优点,在模型控制、机器人控制、相机云台和自动化系统等领域有着广泛的应用前景。
1.5超声波测距传感器HY-SRF05(1个)
超声波测距模块SRF05是SR04的升级版,具有更好的准确率和灵敏度,SRF05和SR04是完全兼容的,测量距离从3米增加达四米,具有5个管脚。
1.6 蓝牙串口通讯模块HC06(1个)
HC-05和HC-06是现在使用较多的两种蓝牙模块。
HC05 与 HC06 的区别
(1)HC05AT 设置时需要将发送新行勾上,而 HC06 则不需要勾上。
(2)HC05 主机为快闪,从机为慢闪;HC06 主机为慢闪,从机为快闪。二者正 好相反.
(3)HC05 需要按按钮不放进入 AT 设置,HC06 不需要
六、原理图及设计流程图
七、程序代码
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "PWM.h"
#include "CAR.h"
#include "Serial.h"
#include "Servo.h"
#include "Ultrasound.h"
#include "Track.h"
#include "FireSensor.h"
#include "FanBuzzer.h"
uint16_t Data1; //定义串口数据变量
static int i=0; //自动循迹标志位
int main(void)
{
Car_Init(); //函数初始化
Serial_Init();
Servo_Init();
Ultrasound_Init();
Infrared_Init();
Servo_SetAngle(90);
FireSensor_Init();
FanBuzzer_Init();
while (1)
{
if(FireSensor_Get()==0) //火焰侦测,低电平有效
{
Car_Stop(); //停车
FanBuzzer_ON(); //蜂鸣器LED报警打开
Delay_ms(1000);
}
else
{
FanBuzzer_OFF(); //蜂鸣器LED报警关闭
}
if(i==1){ //自动循迹标志位开
//自动循迹功能
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8)==0&& //三个红外循迹模块同时低电平停车
GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7)==0&&
GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_6)==0)
{
Go_Ahead();
}else if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8)==0&& //右侧红外高电平右转调整
GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7)==0&&
GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_6)==1){
Self_Right();
}else if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8)==0&&
GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7)==1&&
GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_6)==0){
Go_Ahead();
}else if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8)==0&&
GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7)==1&&
GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_6)==1){
Self_Right();
}else if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8)==1&&
GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7)==0&&
GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_6)==0){
Self_Left();
}else if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8)==1&&
GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7)==0&&
GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_6)==1){
Car_Stop();
}else if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8)==1&&
GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7)==1&&
GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_6)==0){
Self_Left();
}else if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8)==1&&
GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7)==1&&
GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_6)==1){
Car_Stop();
}
}
//自动避障功能
uint16_t a = Test_Distance(); //超声模块a方向距离检测
Serial_SendString("Obstacle distance ");
Serial_SendNumber(a,3);
Serial_SendString("cm\n");
if(a<15){ //距离小于15cm
Car_Stop(); //停车
Servo_SetAngle(0); Delay_ms(1000); //舵机旋转90度
uint16_t b= Test_Distance(); //超声模块b方向距离检测
Serial_SendString("Obstacle distance ");
Serial_SendNumber(b,3);
Serial_SendString("cm\n");
if(b>15){ //b方向距离大于15,执行右转并直行
Servo_SetAngle(90); //舵机旋转90度
Delay_ms(1000);
Self_Right(); //左转
Delay_ms(1500);
Go_Ahead(); //直行
}
else {
Servo_SetAngle(180); //如果b方向小于15舵机旋转90度
Delay_ms(1000);
uint16_t c= Test_Distance(); //超声模块c方向距离检测
Serial_SendString("Obstacle distance ");
Serial_SendNumber(c,3);
Serial_SendString("cm\n");
if(c>15){ //c方向距离大于15,执行左转并直行
Servo_SetAngle(90); //舵机旋转90度
Delay_ms(1000);
Self_Left(); //左转
Delay_ms(1500);
Go_Ahead(); //直行
}else{ //否则后退然后右转
Servo_SetAngle(90); //舵机旋转90度
Go_Back(); //后退
Delay_ms(3000);
Self_Right(); //右转
Delay_ms(1500);
Go_Ahead(); //直行
}
}
}
Delay_ms(100);
}
}
//蓝牙通信
void USART1_IRQHandler(void)
{
if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET) //判断串口标志位
{
Data1=USART_ReceiveData(USART1); //串口数据接收
if(Data1==0x30)Car_Stop(); //小车依据相应蓝牙数据指令,执行相应操作
if(Data1==0x31)Go_Ahead();
if(Data1==0x32)Go_Back();
if(Data1==0x33)Turn_Left();
if(Data1==0x34)Turn_Right();
if(Data1==0x35)Self_Left();
if(Data1==0x36)Self_Right();
if(Data1==0x37)Servo_SetAngle(0);
if(Data1==0x38)Servo_SetAngle(90);
if(Data1==0x39)Servo_SetAngle(180);
if(Data1==0x40) i=1; //自动循迹功能打开
if(Data1==0x41) i=0; //自动循迹功能关闭
USART_ClearITPendingBit(USART1, USART_IT_RXNE); //清除串口标志位
}
}