近期打算把兴趣拾起来,玩玩硬件,小白入门学习小笔记。
循迹参考原文吧,暂不介绍。
学习的博客:
光电反射传感器 红外对管模块_Seven-CSDN博客_红外对管模块
特别推荐:(十分详细)【雕爷学编程】Arduino动手做(45)---红外避障传感器_雕爷学编程-CSDN博客_红外避障传感器
目录
模块描述
可通过电位器旋钮调节检测距离,有效距离范围 2~30cm,检测角度35度,工作电压为 3.3V-5V。
该传感器的探测距离可以通过电位器调节、具有干扰小、便于装配、使用方便等特点,
可以广泛应用于机器人避障、避障小车、流水线计数及黑白线循迹等众多场合。
部件
两个灯管:白色灯管为发射管,发射红外光;黑色灯管为接收管,接受反射回来的红外光
两个指示灯:电源指示灯、输出指示灯
具有3mm的螺丝孔,便于固定、安装;电路板尺寸:32C*14mm(长*宽)
每个模块在发货已经将阈值比较电压通过电位器调节好,非特殊情况,请勿随意调节电位器。
模块接口说明
- VCC 外接 3.3V-5V 电压(建议3.3V)
- GND 外接 GND
- OUT 接开发板或单片机的GPIO口(输出0 或 1)
使用时
- 发射管(白色灯管)发射出一定频率的红外线,当检测方向遇到障碍物(反射面)时,红外线反射回来被接收管(黑色灯管)接受,经过比较器电路处理后,输出指示灯会亮起,同时输出数字信号(低电平信号)。
- 传感器主动红外线反射探测,因此目标的反射率和形状是探测距离的关键。其中黑色探测距离小,白色大;小面积物体距离小,大面积距离大。
两个指示灯,三种状态
通电时,电源指示灯常亮,
- 距离较远、未感应到障碍物时,输出指示灯灭,OUT引脚输出高电平
- 距离近,感应到障碍物时,输出指示灯亮,OUT端口输出低电平
- 距离近,遇到黑色障碍物时,黑色灯管接收不到,输出指示灯灭,OUT引脚输出高电平
检测距离调节
检测距离2~30mm,可以通过电位器进行调节,顺时针调节电位器,检测距离增加;逆时针调节电位器,检测距离减少。
实验视频
光电反射传感器-2021-11-11 11:40:58_哔哩哔哩_bilibili
【光电反射传感器-2021-11-11 11:40:58-哔哩哔哩】
光电反射传感器-2021-11-11 11:40:58
代码
红外避障,简单实现左边检测到往右边转,右边检测到往左边转
以下程序不可以直接复制粘贴,具体需要按照自己端口进行配置。
#!/usr/bin/python
# coding=utf-8
#本段代码实现树莓派智能小车的红外避障效果
#代码使用的树莓派GPIO是用的BOARD编码方式。
import RPi.GPIO as GPIO
import time
import sys
# 对应我的左右传感器输出口Out分别对应扩展板的G12 G16
SensorRight = 16
SensorLeft = 12
# 机器人的运动控制
PWMA = 18
AIN1 = 22
AIN2 = 27
PWMB = 23
BIN1 = 25
BIN2 = 24
# 按键控制 Gpin5绿色灯(绿色接在管脚5) Rpin6红色灯
BtnPin = 19
Gpin = 5
Rpin = 6
#智能小车运动函数
def t_up(speed,t_time):
L_Motor.ChangeDutyCycle(speed)
GPIO.output(AIN2,False)#AIN2
GPIO.output(AIN1,True) #AIN1
R_Motor.ChangeDutyCycle(speed)
GPIO.output(BIN2,False)#BIN2
GPIO.output(BIN1,True) #BIN1
time.sleep(t_time)
def t_stop(t_time):
L_Motor.ChangeDutyCycle(0)
GPIO.output(AIN2,False)#AIN2
GPIO.output(AIN1,False) #AIN1
R_Motor.ChangeDutyCycle(0)
GPIO.output(BIN2,False)#BIN2
GPIO.output(BIN1,False) #BIN1
time.sleep(t_time)
def t_down(speed,t_time):
L_Motor.ChangeDutyCycle(speed)
GPIO.output(AIN2,True)#AIN2
GPIO.output(AIN1,False) #AIN1
R_Motor.ChangeDutyCycle(speed)
GPIO.output(BIN2,True)#BIN2
GPIO.output(BIN1,False) #BIN1
time.sleep(t_time)
def t_left(speed,t_time):
L_Motor.ChangeDutyCycle(speed)
GPIO.output(AIN2,True)#AIN2
GPIO.output(AIN1,False) #AIN1
R_Motor.ChangeDutyCycle(speed)
GPIO.output(BIN2,False)#BIN2
GPIO.output(BIN1,True) #BIN1
time.sleep(t_time)
def t_right(speed,t_time):
L_Motor.ChangeDutyCycle(speed)
GPIO.output(AIN2,False)#AIN2
GPIO.output(AIN1,True) #AIN1
R_Motor.ChangeDutyCycle(speed)
GPIO.output(BIN2,True)#BIN2
GPIO.output(BIN1,False) #BIN1
time.sleep(t_time)
# 不能打开就动,先按键才可以动
def keysacn():
val = GPIO.input(BtnPin)
# 按键按下
while GPIO.input(BtnPin) == False:
val = GPIO.input(BtnPin)
# 等待按键弹上来,检测按键为高电平
while GPIO.input(BtnPin) == True:
time.sleep(0.01)
val = GPIO.input(BtnPin)
# 等待按键按下
if val == True:
GPIO.output(Rpin,1)
while GPIO.input(BtnPin) == False:
GPIO.output(Rpin,0)
else:
GPIO.output(Rpin,0)
def setup():
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM) # 按物理位置给GPIOs编号
GPIO.setup(Gpin, GPIO.OUT) # 设置绿色Led引脚模式输出
GPIO.setup(Rpin, GPIO.OUT) # 设置红色Led引脚模式输出
GPIO.setup(BtnPin, GPIO.IN, pull_up_down=GPIO.PUD_UP) # 设置输入BtnPin模式,拉高至高电平(3.3V)
GPIO.setup(SensorRight,GPIO.IN)
GPIO.setup(SensorLeft,GPIO.IN)
GPIO.setup(AIN2,GPIO.OUT)
GPIO.setup(AIN1,GPIO.OUT)
GPIO.setup(PWMA,GPIO.OUT)
GPIO.setup(BIN1,GPIO.OUT)
GPIO.setup(BIN2,GPIO.OUT)
GPIO.setup(PWMB,GPIO.OUT)
if __name__ == '__main__':
setup()
# 如果按键没有按下就会一直等待
keysacn()
# 按键按下退出等待
L_Motor= GPIO.PWM(PWMA,100)
L_Motor.start(0)
R_Motor = GPIO.PWM(PWMB,100)
R_Motor.start(0)
# 异常控制
try:
while True:
# 输入左右红外
SR_2 = GPIO.input(SensorRight)
SL_2 = GPIO.input(SensorLeft)
if SL_2 == True and SR_2 == True:
print "t_up"
t_up(50,0)
elif SL_2 == True and SR_2 ==False:
print "Left"
t_left(50,0)
elif SL_2==False and SR_2 ==True:
print "Right"
t_right(50,0)
else:
t_stop(0.3)
t_down(50,0.4)
t_left(50,0.5)
except KeyboardInterrupt: # 当按下Ctrl+C时,将执行子程序destroy()。
GPIO.cleanup()