stm32教程:红外循迹模块 & 红外避障模块 & 光电门模块

早上好啊大佬们,今天小白兔讲一讲非非非常常用的红外感应系列的模块——

红外循迹,红外避障,光电门。

下面我们就一个个来讲一下,先原理,后代码,如果大家想要直接使用代码,可以直接跳转到代码的部分即可。

红外循迹模块

大家在竞赛中是不是经常遇见那种 让小车按照指定的路线移动的题目,那种就是循迹,大多都是使用的红外循迹模块,通过检测地面路线,获得不同的返回值对小车移动进行修改。

运行原理

TCRT5000传感器的红外发射二极管不断发射红外线,当发射出的红外线没有被反射回来或被反射回来但强度不够大时,红外接收管一直处于关断状态,此时模块的输出端为高电平,指示二极管一直处于熄灭状态;被检测物体出现在检测范围内时,红外线被反射回来且强度足够大,红外接收管饱和,此时模块的输出端为低电平,指示二极管被点亮。

简而言之就是 ——


当检测处为 白色或其它浅色 时,指示二极管,输出信号为 

当检测处为 黑色或其它深色 或者 检测距离过长 时,指示二极管,输出信号为1;

注:模块上那个蓝色小方块是电位器,可以通过它调整模块的灵敏度

接口说明:

(1) VCC 外接3.3V-5V电压(可以直接与5v单片机和3.3v单片机相连)
(2) GND 外接GND
(3) AO    输出模拟信号

(4) DO    输出数字信号

这里我的接线是 ——

(1) VCC 接 VCC
(2) GND 接 GND

(3) AO 不接线

(4) DO 接 PB12

代码编写:

步骤:

打开GPIO;

配置GPIO模式为浮空输入;

读取GPIO口的输入值。

xunji.c

#include "stm32f10x.h"                  // Device header

void xunji_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	GPIO_SetBits(GPIOB, GPIO_Pin_12);
}

int xunji_Get(void)
{
	return GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12);
}

xunji.h

#ifndef __XUNJI_H
#define __XUNJI_H

void xunji_Init(void);
int xunji_Get(void);

#endif

main.c

#include "stm32f10x.h"                  // Device header
#include "OLED.h"
#include "Delay.h"
#include "xunji.h"

int main()
{
	OLED_Init();//函数定义初始化
	xunji_Init(); //红外循迹初始化
	
	OLED_ShowString(0, 0, "xunji:", OLED_8X16);
	OLED_Update(); //更新显示
	while(1)
	{
		if (xunji_Get() == 0)
		{
			OLED_ShowNum(0, 16, 1, 2, OLED_8X16);
		}
		else
		{
			OLED_ShowNum(0, 16, 0, 2, OLED_8X16);
		}
		
		OLED_Update(); //更新显示
	}
	
}

红外避障模块

运行原理

红外避障模块包含一个红外发射器和一个红外接收器。发射器发射出一定频率的红外线,当这些红外线遇到障碍物时,会被反射回来并被接收器接收。接收到的反射红外线信号会被模块内部的电路处理。这个电路通常包括一个比较器,如LM393,它比较接收到的信号强度与一个预设的阈值。如果接收到的红外信号强度超过了这个阈值,比较器输出一个低电平信号,同时绿色指示灯会亮起,表示检测到障碍物。

注:模块上那个蓝色小方块是电位器,可以通过它调整模块的灵敏度

接口说明:

(1) VCC 外接3.3V-5V电压(可以直接与5v单片机和3.3v单片机相连)
(2) GND 外接GND
(3) OUT 输出信号

这里我的接线是 ——

(1) VCC 接 VCC
(2) GND 接 GND

(3) OUT 接 PB13

代码编写:

和上面循迹模块是一样的。

步骤:

打开GPIO;

配置GPIO模式为浮空输入;

读取GPIO口的输入值。

bizhang.c

#include "stm32f10x.h"                  // Device header

void bizhang_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	GPIO_SetBits(GPIOB, GPIO_Pin_13);
}

int bizhang_Get(void)
{
	return GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_13);
}

bizhang.h

#ifndef __BIZHANG_H
#define __BIZHANG_H

void bizhang_Init(void);
int bizhang_Get(void);

#endif

 main.c

#include "stm32f10x.h"                  // Device header
#include "OLED.h"
#include "Delay.h"
#include "bizhang.h"

int main()
{
	OLED_Init();//函数定义初始化
	bizhang_Init(); //红外循迹初始化
	
	OLED_ShowString(0, 0, "bizhang:", OLED_8X16);
	OLED_Update(); //更新显示
	while(1)
	{
		if (bizhang_Get() == 0)
		{
			OLED_ShowNum(0, 16, 1, 2, OLED_8X16);
		}
		else
		{
			OLED_ShowNum(0, 16, 0, 2, OLED_8X16);
		}
		
		OLED_Update(); //更新显示
	}
	
}

光电门模块

运行原理

光电门模块包含一个发射器,发射出一束光,这束光直线传播,直到遇到障碍物。在光电门的另一端是接收器,由一个光敏元件组成。当发射器发出的光束被物体遮挡时,接收器便无法接收到发射器发出的光,从而产生一个电信号。

接口说明:

(1) VCC 外接3.3V-5V电压(可以直接与5v单片机和3.3v单片机相连)
(2) GND 外接GND
(3) AO    输出模拟信号

(4) DO    输出数字信号

这里我的接线是 ——

(1) VCC 接 VCC
(2) GND 接 GND

(3) AO 不接线

(4) DO 接 PB14

代码编写:

步骤:

打开GPIO;

配置GPIO模式为浮空输入;

读取GPIO口的输入值。

photogate.c

#include "stm32f10x.h"                  // Device header

void photogate_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	GPIO_SetBits(GPIOB, GPIO_Pin_14);
}

int photogate_Get(void)
{
	return GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_14);
}

photogate.h

#ifndef __PHOTOGATE_H
#define __PHOTOGATE_H

void photogate_Init(void);
int photogate_Get(void);

#endif

main.c

#include "stm32f10x.h"                  // Device header
#include "OLED.h"
#include "Delay.h"
#include "photogate.h"

int main()
{
	OLED_Init();//函数定义初始化
	photogate_Init(); //红外循迹初始化
	
	OLED_ShowString(0, 0, "photogate:", OLED_8X16);
	OLED_Update(); //更新显示
	while(1)
	{
		if (photogate_Get() == 0)
		{
			OLED_ShowNum(0, 16, 1, 2, OLED_8X16);
		}
		else
		{
			OLED_ShowNum(0, 16, 0, 2, OLED_8X16);
		}
		
		OLED_Update(); //更新显示
	}
	
}

尾声

如果需要本篇中的工程文件,可以私信小白兔。

那么这一期就到这了,Bye,Bye~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值