作者:jiujiang

循迹传感器实验

#实验目的:通过利用传感器发射红外线,遇到黑色线后被吸收而无法被反射被发现的原理,从而发现传感器循迹的原理和奥秘。
#传感器原理
传感器背面
  • 可见传感器背面有蓝色LED灯和黑色LED灯;
  • 蓝色LED灯负责发射红外线,黑色LED灯则负责接收发射后的红外线;
  • 当红外线被发射并照射到白色表面时,红外线被吸收和反射,此时黑色LED灯接收到反射的红外线,从而输出低电平;
  • 当遇到黑色表面时,由于红外线被吸收,黑色LED等无法接收到反射的红外线,从而输出高电平。
#接线效果如图:
接线示例
#实验代码
代码示例
#注:发现黑色线为高电压,没发现为低电平;

#!/usr/bin/env python
#coding:utf-8

'''
from JiuJiang
树莓酱的操作实例
https:://www.suhmeijiang.com
'''

import RPi.GPIO as GPIO  ##引入GPIO模块
import time              ##引入time库

detectPin = 18

GPIO.setmode(GPIO.BCM)   ##此处采用的BCM编码 因为T型扩展板也是BCM编码 方便统一
GPIO.setup(detectPin, GPIO.IN) ##设置18口为输入口

try:
    while True:
        status = GPIO.input(detectPin)
        if status == GPIO.HIGH:   ##高电平触发 发现黑色线
            print '发现黑色线,继续前进'
            time.sleep(1)        ##检测到预警提示持续时间
        else:
            print '路径丢失,重新规划路线'

        time.sleep(0.5)    ##检测频率

except KeyboardInterrupt:
    pass

GPIO.cleanup()
#视频效果如下:

GPIO之event_detected()系列函数

#函数列表

函数参数含义函数含义
add_event_detect( channel, status, bouncetime=300)传感器引脚,要检测的状态注册一个事件用于检测status是否发现
event_detected( channel)要检测的引脚检测引脚是否检测到status状态
add_event_callback( channel, callback)传感器引脚,回调函数发现指定status然后回调执行自定义方法
remove_event_detect( channel)要检测的引脚停止边缘检测
#注:status可选值 GPIO.RISING(电压升高), GPIO.FALLING(电压变低), GPIO.BOTH(电压升高或降低);bouncetime为抖动时间用于软件防抖,单位毫秒。
其中防抖时间可以理解为设置的单位时间内检测一次事件,从而实现单位时间内是否有一次事件触发的效果。
#实验参考:http://www.shumeijiang.com/2020/03/15/gpio之边沿检测/
#实验代码:
实验代码
#实验效果
  • 执行程序可见屏幕输出“开始检测”;
  • 因为设置挂起时间为4秒,如果在4秒内手指放在传感器触摸板上,可见回调自定义函数并输出“获取到响应1”;
  • 然后伴随挂起4秒结束,屏幕会输出“接下来的动作”;
  • 然后输出“检测到事件”

#!/usr/bin/env python
#coding:utf-8

'''
from JiuJiang
树莓酱的操作实例
http:://www.shumeijiang.com
'''

import RPi.GPIO as GPIO  ##引入GPIO模块
import time              ##引入time库

touchPin = 18

GPIO.setmode(GPIO.BCM)
GPIO.setup(touchPin, GPIO.IN)


def getRespose(self):
    print "获取到响应1"


GPIO.add_event_detect(touchPin, GPIO.RISING)  ##注册一个检测电压由低变高事件
GPIO.add_event_callback(touchPin, getRespose)  ##检测到事件触发回调getRespose 函数

print '开始检测'

while True:
    if GPIO.event_detected(touchPin):
        print "检测到事件"

    time.sleep(4)  ##进行挂起4秒
    print "接下来的动作"
#官方函数定义见如下截图:
#具体应用见文章:
1、https://www.shumeijiang.com/2021/09/02/四路红外避障传感器实验/
2、https://www.shumeijiang.com/2021/07/25/步进电机定位问题解决尝试

GPIO之wait_for_edge()函数

#函数:wait_for_edge(channel, status) 
#参数说明:
参数说明可选项
channel传感器引脚
status要检测的状态GPIO.RISING, GPIO.FALLING, GPIO.BOTH
其中GPIO.RISING表示电压由低变高;GPIO.FALLING表示电压由高变低;GPIO.BOTH表示两者都检测。
#实验案例参考:http://www.shumeijiang.com/2020/03/15/gpio之边沿检测/
#实验代码:
实验代码
执行代码可见效果:
1、代码执行可见屏幕输出“准备开始接收”,然后主线程进入阻塞状态,由于没有其他线程所以进程进入阻塞状态;
2、当用手指放置在传感器触摸板上,并持续放置时,可见屏幕输出“发现低电压变化高电压”,即检测到触摸动作;
3、当手指从传感器触摸板离开时,可见屏幕输出“发现高电压变化低电压”,即传感器感知到触摸结束。
#结论
  • 函数是阻塞形式;
  • 函数不需while循环检测,检测到即可触发进程继续进行;
  • 函数可检测电压由低变高,可检测电压由高变低,也可检测发现变压变化即触发。

!/usr/bin/env python
coding:utf-8
'''
from JiuJiang
树莓酱的操作实例
http:://www.shumeijiang.com
'''

import RPi.GPIO as GPIO  ##引入GPIO模块
import time              ##引入time库
touchPin = 18

GPIO.setmode(GPIO.BCM)
GPIO.setup(touchPin, GPIO.IN)
print '准备开始接收'

GPIO.wait_for_edge(touchPin, GPIO.RISING)
print '发现低电压变化高电压'

GPIO.wait_for_edge(touchPin, GPIO.FALLING)
print '发现高电压变化低电压'
#官方函数定义见如下截图:

GPIO之边缘检测

实验目的:应用一种新的电压检测方式,更精准更灵活的检测到传感器电压变化,从而获得传感器被触发或者被释放的状态。
边缘检测也是一种传感器状态检测的方式,不同的是通过内置的函数进行;比如wait_for_edge()或者event_detected(),它们和平常我们用的while循环有相同之处,都是用来检测传感器状态,不同的地方在与前者更精准,不会由于while内的time.sleep时无法获得CPU而导致状态获取失败,具体可见如下实验。
#接线效果如图
触摸开关传感器(默认低电压,触摸触发高电压)
#传统while获取方式(以触摸开关传感器为例):
while方式检测
while方式检测
#传统while检测会存在丢失现象,如果time.sleep(2)的时候主线程阻塞从而导致进程挂起,此时正好触发传感器,由于没有其他线程所以导致进程检测不到,出现结果丢失现象。
#wait_for_edge()函数,会在检测到指定的升高或者降低或者两者的状态时阻塞进程,直到检测到状态。

具体可见文章:http://www.shumeijiang.com/2020/03/15/gpio之wait_for_edge函数/
#event_detected()函数,不会阻塞进程,在while循环中检测到状态变化,不会影响主线程继续执行,而是通过其他线程同步检测到的状态,同时还能触发回调多个函数,同步触发其他任务。

具体可见文章:http://www.shumeijiang.com/2020/03/15/gpio之event_detected系列函数/

声音探测传感器实验

#实验目的:通过声音传感器探测到声音,从而发现提示信息。
#接线效果如图
接线示例
#实验代码
代码示例

#!/usr/bin/env python
#coding:utf-8

'''
from JiuJiang
树莓酱的操作实例
https:://www.suhmeijiang.com
'''

import RPi.GPIO as GPIO  ##引入GPIO模块
import time              ##引入time库

detectPin = 18

GPIO.setmode(GPIO.BCM)   ##此处采用的BCM编码 因为T型扩展板也是BCM编码 方便统一
GPIO.setup(detectPin, GPIO.IN) ##设置18口为输入口

try:
    while True:
        status = GPIO.input(detectPin)
        if status == GPIO.LOW:   ##触发低电平 表示检测到声音
            print '有声音'
            time.sleep(2)        ##检测到预警提示持续时间
        else:
            print '一切正常'

        time.sleep(0.5)    ##检测频率

except KeyboardInterrupt:
    pass

GPIO.cleanup()
#实验效果
1、执行代码 Python jiujiang.py;
2、没有声音时,可见屏幕持续输出”一切正常“;
3、当检测到声音时,屏幕输出”有声音“并持续两秒;
4、如果声音检测灵敏度不够可以旋转灵敏度调节按钮进行调节。
#视频效果如下:

人体红外传感器探测实验

#实验目的:通过人体红外传感器感测到人体经过,从而发出预警信息。
#接线效果如图
接线示例
#传感器说明
传感器去掉外罩后可见各引脚含义
传感器说明
#实验代码
代码示例

#!/usr/bin/env python
#coding:utf-8

'''
from JiuJiang
树莓酱的操作实例
https:://www.suhmeijiang.com
'''

import RPi.GPIO as GPIO  ##引入GPIO模块
import time              ##引入time库

detectPin = 18

GPIO.setmode(GPIO.BCM)   ##此处采用的BCM编码 因为T型扩展板也是BCM编码 方便统一
GPIO.setup(detectPin, GPIO.IN) ##设置检测引脚我输入状态

try:
    while True:
        status = GPIO.input(detectPin)
        print status
        if status == 1:  ##高电平触发报警
            print '报警 发现有人'
        else:
            pass
        time.sleep(1)

except KeyboardInterrupt:
    pass

GPIO.cleanup()
#实验效果
1、执行代码 Python jiujiang.py;
2、可见默认输出 低电平状态;
3、当有人经过或将传感器指向自己,则发现输出”报警 发现有人“;
4、将传感器指向没有人的地方,可见一定延迟后输出低电平状态。
#视频效果如下:

雨滴探测传感器检测下雨并预警实验

#实验目的:通过雨滴探测传感器探测到雨滴并超过阈值后,触发继电器进而触发七彩LED灯闪烁预警提示。
#接线效果如图
接线示例
#其他说明
1、继电器触发七彩LED接线以及操作参考文章:http://www.shumeijiang.com/2019/11/23/继电器实验/
2、雨滴探测模块接线以及操作参考文章:http://www.shumeijiang.com/2019/12/21/雨滴探测传感器/
#实验代码
代码示例

#!/usr/bin/env python
#coding:utf-8

'''
from JiuJiang
树莓酱的操作实例
https:://www.suhmeijiang.com
'''

import RPi.GPIO as GPIO  ##引入GPIO模块
import time              ##引入time库
import smbus             ##引入控制总线

ledPin = 17              ##继电器控制口
GPIO.setmode(GPIO.BCM)   ##此处采用的BCM编码 因为T型扩展板也是BCM编码 方便统一
GPIO.setup(ledPin, GPIO.OUT) ##设置BCM编码下指定引脚为输出状态

address = 0x48       ##雨滴传感器地址
A0 = 0x40            ##使用的端口地址
bus = smbus.SMBus(1) ##开启总线
threshold = 150      ##雨量触发预警的阈值 可自定义

try:
    while True:
        bus.write_byte(address, A0)       ##设置获取传感器哪个端口数
        value = bus.read_byte(address)    ##读取指定端口数据
        print ("雨量值:%1.3f " %(value))  ##输出检测值

        ##检测是否触发预警
        if value >= threshold:      ##检测是否触发预警
            GPIO.output(ledPin, GPIO.LOW)   ##没有触发预警则让继电器处于闭合状态
            continue
        else:
            print "开灯"   ##触发预警 亮灯闪烁
            GPIO.output(ledPin, GPIO.HIGH)  ##高电平开灯
            time.sleep(3)  ##预警持续时间

        time.sleep(1)   ##检测频率

except KeyboardInterrupt:
    pass

GPIO.cleanup()
#实验效果
1、执行代码 Python jiujiang.py;
2、可见屏幕输出255数值(根据探测板情况而定);
3、将水滴滴入探测板,会发现屏幕输出不同的雨滴值,如果雨滴值小于阈值,会听见咔的一声,继电器闭合通电,七彩LED灯开始闪烁。
4、预警闪烁持续3秒钟,然后继续监测;如果发现雨滴值大于阈值,则继电器关闭,LED灯预警熄灭。
#视频效果如下:

光敏传感器实验

#实验目的:通过传感器检测光的明亮程度,然后做出提示预警。
#接线效果如图
接线示例
#实验代码
代码示例

#!/usr/bin/env python
#coding:utf-8

'''
from JiuJiang
树莓酱的操作实例
https:://www.suhmeijiang.com
'''

import RPi.GPIO as GPIO  ##引入GPIO模块
import time              ##引入time库
import smbus             ##引入控制总线

GPIO.setmode(GPIO.BCM)   ##此处采用的BCM编码 因为T型扩展板也是BCM编码 方便统一

address = 0x48   ##传感器地址
A0 = 0x40        ##使用的端口地址
bus = smbus.SMBus(1)   ##开启总线


try:
    while True:
        bus.write_byte(address, A0)    ##设置获取传感器哪个端口数据
        value = bus.read_byte(address)   ##读取指定端口的数据
        print ("光亮度值:%1.3f " %(value)) ##范围为0~255
        time.sleep(1)    ##探测频率

except KeyboardInterrupt:
    pass
#实验效果
1、执行代码 Python jiujiang.py;
2、当有光亮照射时屏幕输出0~255之间数值(光照强度决定);
3、当用不透光物体遮挡时,可见屏幕输出数值变化;
4、由此得出结论当光照越强时数值越小,光照越弱时越接近255。
#视频效果如下: