stm32单片机毕业设计——循迹避障灭火蓝牙控制智能小车源代码程序+红外循迹模块TCRT5000+火焰传感器+蓝牙通讯模块HC05+超声波测距sr04+TB6612电机驱动+sg90舵机+手机APP

一、设计简介

本毕业设计项目是基于STM32单片机的循迹避障灭火蓝牙控制智能小车源代码程序,包含原理图手机APP。

详细资料以及源码,百度网盘下载icon-default.png?t=O83Ahttps://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开发工具,编写蓝牙通信和控制逻辑。

三、所需硬件连接

  1. STM32单片机:例如STM32F103C8T6。
  2. 红外循迹模块TCRT5000:连接到GPIO引脚。
  3. 火焰传感器:连接到GPIO引脚。
  4. 蓝牙通讯模块HC05:通过UART串口通信连接到STM32。
  5. 超声波测距SR04:触发trig引脚和回声引脚echo连接到GPIO引脚。
  6. TB6612电机驱动:PWM和DIR引脚连接到STM32。
  7. 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、工作原理

  1. 发射红外线:TCRT5000的红外线发射二极管不断发射红外线。
  2. 接收反射信号:当红外线照射到物体并被反射回来时,红外线接收器会接收到反射回来的信号。
  3. 判断遮挡:根据接收器接收到的红外线信号强度变化,可以判断是否有物体遮挡在传感器前方。如果信号强度足够大,说明有物体反射了红外线;如果信号强度较弱或没有信号,说明前方没有物体或物体无法反射红外线。

3、电气特性

  1. 供电电压:一般为3.3V或5V。
  2. 输出信号:数字信号,可以直接与单片机(如STM32、Arduino等)进行连接和控制。
  3. 引脚说明
    • VCC:电源正极,接供电电压。
    • GND:电源负极,接地。
    • DO:数字信号输出引脚,用于输出检测到的信号状态(高电平或低电平)。
    • AO(可选):模拟信号输出引脚,不同距离输出不同电压(在循迹功能中通常不使用)。

4、应用与功能实现

  1. 循迹功能:TCRT5000常用于机器人等自动化设备中,可以用来识别黑线、白线或其他颜色的线路,以便机器人根据线路进行自动导航。在具体应用中,通常会将多个TCRT5000模块组成阵列,以增加线路识别的精度和稳定性。
  2. 接线与配置:将TCRT5000模块的VCC和GND分别连接到单片机的电源和地引脚,将DO引脚连接到单片机的输入引脚。在单片机上配置相应的GPIO引脚来读取DO引脚的电平状态。
  3. 代码实现:通过编写单片机程序来读取TCRT5000模块的输出信号,并根据信号状态调整机器人的行驶方向。例如,当检测到前方有黑线时,可以控制机器人沿着黑线行驶;当检测到前方没有黑线时,可以控制机器人转向或停止。

5、注意事项

  1. 环境光干扰:TCRT5000对环境光的抗干扰能力较弱,因此在使用过程中要尽量避免强光照射到模块上,以免影响识别效果。
  2. 红外线传输距离:由于红外线传输距离有限,模块与被识别物体的距离也会对识别效果产生影响。因此,需要根据具体情况调整模块的距离和位置。
  3. 模块稳定性:在使用多个TCRT5000模块组成阵列时,需要确保每个模块的稳定性和一致性,以提高整体识别精度和稳定性。

1.3 电机驱动模块TB6612(1个)

TB6612电机驱动是一款功能强大的电机驱动芯片,以下是对其功能的详细介绍:

1、基本特性

TB6612是一款双通道、高效率的H桥DC brushed motor driver(直流有刷电机驱动器),也可以用于步进电机的控制。它集成了两组H-bridge(H桥)结构,允许独立控制两个电机的正反转和速度。

2、控制功能

  1. 双向控制:TB6612可以驱动两个电机,每个电机都可以独立控制方向,支持正反转。
  2. 速度控制:通过PWM(脉冲宽度调制)信号,可以精确控制电机的速度。PWM信号的占空比决定了电机的转速,占空比越大,转速越快。
  3. 方向控制:通过控制输入端口的高低电平信号,可以实现对电机正反转的控制。

3、保护功能

  1. 电流控制:TB6612内置电流检测和保护功能,可以根据需求设定电流限制,防止电机过热或损坏。
  2. 集成保护:具有过流、过热和短路保护机制,当检测到异常情况时,会自动切断输出,保护芯片和电机不受损害。

4、接口与通信

  1. 接口丰富:TB6612通常配备有I2C和GPIO接口,方便与微控制器进行通信和控制。
  2. 易于连接:需要连接的引脚包括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);			//清除串口标志位
	}
}

八、实物图片

 、九、资料内容清单

百度网盘资料下载链接icon-default.png?t=O83Ahttps://pan.baidu.com/s/1E0-kvjAzGwKixbP9sWxv4w?pwd=4ajc

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值