STM32智能小车:红外寻迹之旅

嵌入式之路,贵在日常点滴

                                                                —阿杰在线送代码

目录

前言

一、TCRT5000循迹模块介绍

二、红外寻迹小车原理

三、寻迹小车设计注意事项

四、寻迹小车程序


前言

系列文章之红外寻迹篇(库函数版本)

在介绍循迹模块时,先介绍一个知识点:

黑色的东西吸收比较强,反射能力弱


一、TCRT5000循迹模块介绍

TCRT5000就是一个红外发射和接收器,不断发射和接收红外线。

产品用途:
1、电度表脉冲数据采样
2、传真机碎纸机纸张检测
3、障碍检测
4、黑白线检测

深色(黑色)的是发射端,白色(透明)的是接收端。中间蓝色的是可以调节灵敏度的旋钮。

TCRT5000光电传感器模块是基于TCRT5000红外光电传感器设计的一款红外反射式光电开关。传感器采用高发射功率红外光电二极管和高灵敏度光电晶体管组成,输出信号经施密特电路整形,稳定可靠。

总共有4个管脚,分别是VCC、GND、A0、D0。

A0是模拟信号输出,D0是TTL电平输出(即数字信号)。使用TCRT5000主要就是用来循迹,只需要连接VCC、GND、D0就可以了。

(1)工作电压 3.3V-5V,推荐工作电压为5V
(2)模块上的电位器是用来调节灵敏度的
(3)检测反射距离:1mm~25mm 适用
(4)输出形式 :数字开关量输出(0 和 1)
(5)设有固定螺栓孔,方便安装
(6)小板 PCB 尺寸:3.2cm x 1.4cm
(7)使用宽电压 LM393 比较器

二、红外寻迹小车原理

循迹模块我用的是红外传感器。黑线的检测原理是红外发射管发射光线到路面,红外光遇到白底则被反射,接收管接收到反射光,经施密特触发器整形后输出低电平,指示灯点亮;当红外光遇到黑线时则被吸收,接收管没有接收到反射光,经施密特触发器整形后输出高电平,输出指示灯熄灭。简单的说就是当红外寻迹模板遇见黑线时会产生一个高电平,遇见白线时会返回一个低电平。所以根据原理设计思路为当左侧红外传感器遇见黑线时左拐,右边红外传感器遇见黑线时右拐。这样就可以完成小车寻迹。

当然除了遇到黑线熄灭,当距离太远红外线反射后检测不到,此时指示灯也会熄灭。
那么如果要循迹,模块离地面要近,在没有遇到黑线时确保指示灯长亮,一旦指示灯熄灭就说明遇到黑线了。

三、寻迹小车设计注意事项

(1)因为硬件条件有限,反应速度不是很快会有一定的误差,所以小车的速度要尽量慢下来,从而弥补硬件的不足让小车有足够的反应时间。
(2)在设置两个红外传感器的IO口模式时要设置为浮空输入,这样才能通过程序读取IO口的状态来判断。
(3)在测试小车时尽量在光线较暗的条件下来测试小车,避免光线过亮影响测试。
(4)红外寻迹模块的OUT不能接在有上拉电阻的IO口。

四、寻迹小车程序

在这里,我利用的主控是STM32F103C8T6最小板,主芯片通过读取四路红外循迹模块判断小车偏离中心黑线的情况,主芯片根据小车偏离情况对电机的差速进行控制调整,通过左右电机的不同转速,实现寻黑线的功能。

通过GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)函数获得对应端口的电平。

我的原理图 红外对管依次连接 PB5 、PB4 、PB3 、PA15
注意:这里需要使用的PB3、PB4、PA15是单片机的'特殊引脚
打开数据手册:STM32F103x8B_DS_CH_V10,在引脚定义章节,说明了复位后的主功能和默认复用功能以及重定义功能。

在参考手册:STM32中文参考手册_V10, 在8.3.5 JTAG/SWD复用功能重映射中,说明了引脚使用情况。


怎么办呢? 

需要关闭JTAG-DP 启用SW-DP ,我们重映射配置应写为
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);

话不多说上代码

#include "xunji.h"

void xunji_init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;//定义一个结构体变量
	
    //使能GPIOA和GPIOB 	使能PC端口时钟 rcc.h-693
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB,ENABLE);
	
    //重映射配置关闭JTAG-DP 启用SW-DP从而可以使用PA15 PB3 PB4
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
	
	GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_IPD;//PA15 设置成下拉输入
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//IO口速度为50MHz
	GPIO_Init(GPIOA,&GPIO_InitStructure);//根据设定参数初始化GPIOE.5
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_4 | GPIO_Pin_3;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; // 设置成下拉输入
	GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB 5 4 3

}
#ifndef _XUNJI_H
#define _XUNJI_H
#include "stm32f10x.h"
#include "sys.h"

#define HW_1 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)//读取 PB5 电平
#define HW_2 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_4)//读取 PB4 电平
#define HW_3 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_3)//读取 PB3 电平
#define HW_4 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_15)//读取 PA15 电平

void xunji_init(void);

#endif
main.c

    //转弯时速度不适宜太快,这里我设置的占空比是1/4。小伙伴只需调试每个动作执行时间的长短
      来使你的车在寻迹时丝滑起来
	if(HW_1 == 0 && HW_2 == 0 && HW_3 == 0 && HW_4 == 0)
	{
		qian(500);
		delay_ms(50);
	} 
	if(HW_1 == 0 && HW_2 == 1 && HW_3 == 0 && HW_4 == 0)
	{
		zuo(500);
		delay_ms(150);
	}
	if(HW_1 == 1 && HW_2 == 0 && HW_3 == 0 && HW_4 == 0)
	{
		zuo(500);
		delay_ms(250);
	} 
	if(HW_1 == 1 && HW_2 == 1 && HW_3 == 0 && HW_4 == 0)
	{
		zuo(500);
		delay_ms(300);
	} 
	if(HW_1 == 0 && HW_2 == 0 && HW_3 == 1 && HW_4 == 0)
	{
		you(500);
		delay_ms(150);
	} 
	if(HW_1 == 0 && HW_2 == 0 && HW_3 == 0 && HW_4 == 1)
	{
		you(500);
		delay_ms(250);
	} 
	if(HW_1 == 0 && HW_2 == 0 && HW_3 == 1 && HW_4 == 1)
	{
		you(500);
		delay_ms(300);
	}

物联沃分享整理
物联沃-IOTWORD物联网 » STM32智能小车:红外寻迹之旅

发表评论