【传感器学习】光电反射传感器

这篇博客介绍了光电反射传感器的工作原理、模块特性、接口说明及使用方法,包括检测距离调节和应用实例。通过电位器可调整2~30cm的检测距离,适用于机器人避障等场景。还提供了详细的Arduino实验代码,帮助初学者实现红外避障功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

近期打算把兴趣拾起来,玩玩硬件,小白入门学习小笔记。

循迹参考原文吧,暂不介绍。

学习的博客:

光电反射传感器 红外对管模块_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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Clark-dj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值