早上好啊大佬们,今天小白兔讲一讲非非非常常用的红外感应系列的模块——
红外循迹,红外避障,光电门。
下面我们就一个个来讲一下,先原理,后代码,如果大家想要直接使用代码,可以直接跳转到代码的部分即可。
红外循迹模块
大家在竞赛中是不是经常遇见那种 让小车按照指定的路线移动的题目,那种就是循迹,大多都是使用的红外循迹模块,通过检测地面路线,获得不同的返回值对小车移动进行修改。
运行原理
TCRT5000传感器的红外发射二极管不断发射红外线,当发射出的红外线没有被反射回来或被反射回来但强度不够大时,红外接收管一直处于关断状态,此时模块的输出端为高电平,指示二极管一直处于熄灭状态;被检测物体出现在检测范围内时,红外线被反射回来且强度足够大,红外接收管饱和,此时模块的输出端为低电平,指示二极管被点亮。
简而言之就是 ——
当检测处为 白色或其它浅色 时,指示二极管亮,输出信号为 0 ;当检测处为 黑色或其它深色 或者 检测距离过长 时,指示二极管灭,输出信号为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~