树莓派基础实验22:红外遥控传感器实验
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树莓派基础实验22:红外遥控传感器实验相关的知识,希望对你有一定的参考价值。
参考技术A红外接收头的主要功能为IC化的一种受光元件,其内部是将光电二极管(俗称接收管)和集成IC共同组合封装而成,其IC设计主要以类比式控制,一般主要接收38KHZ的频率的红外线,而对其他频率段的红外信号不敏感。这样,遥控器发出载波在38KHZ的频率,接收管接受遥控器发送过来的信息,从而构成通讯。
★Raspberry Pi主板*1
★树莓派电源*1
★40P软排线*1
★红外接收模块*1
★红外遥控器模块*1
★RGB LED模块*1
★面包板*1
★跳线若干
在本实验中,我们将使用PWM脉宽调制技术来控制RGB的亮度。详情可以查看前面的实验: 树莓派基础实验2:RGB-LED实验 。
我们使用lirc库读取遥控器按钮返回的红外信号,并将它们转换为按钮值,然后使用pylirc来简化从远程控制中读取值的过程。在本实验中,使用遥控器顶部的9个按钮来控制RGB LED模块的颜色。每行代表一种颜色,每列代表亮度。
第1步: 连接电路。
第2步: 安装lirc库,配置详情这里不作介绍。
检查该模块是否已加载,你应该看到“/dev/lirc0”。
然后使用“irw”命令测试,按遥控器上的按钮,看屏幕上是否打印按钮名称,如下图所示:
python lirc模块,有关LIRC的更多信息,请参见 http://www.lirc.org
lirc模块的函数及功能介绍如下:
第3步: 编写控制程序。遥控器上的前三行按钮中的每一行代表一种颜色,即从上到下一次控制红色、绿色和蓝色。每列代表关灯、亮和暗。例如,按第一行的第二个按钮,是控制红色灯亮。
你可以使用遥控器共生产27种颜色,包括关闭所有led灯。
一起玩转树莓派(13)——雨滴检测传感器
一起玩转树莓派(13)——雨滴检测传感器
在本系列的前几篇博客中,我们有进行过温度传感器和光强传感器的实验。通过这些传感器,加上简单的编程技术,我们很容易获取这些环境数据。通过各种丰富的传感器,用树莓派可以非常容易的打造一款”简易气象站“。对于一个小型的气象站来说,除了需要收集温度和光照强度数据外,当前的天气状况也是必不可少的。本篇博客,我们将通过雨滴检测传感器实验来获取雨势信息。
一、雨滴检测传感器
本次实验使用的雨滴检测传感器模块如下图所示:
可以看到,此元件组由一个检测板和控制模块组成,两部分分开连接,便于将检测板放置到合适的检测位置,且检测板面积大,易于进行雨滴检测。
此传感器模块工作电路图如下所示:
在使用时,先将检测板的两个引脚与模块的只有两个引脚一侧的引脚相连(可以将检测板理解为两根不想交的导线,有雨水落下时,导线会联通)。
观察控制模块,可以看到其上封装了两个LED,其中一个LED是电源指示灯,当接通电源后会发光,另一个LED是信号灯,没有雨水的时候信号灯不亮,检测板上有雨水的时候信号灯亮。在检测是否下雨时,可以将检测板倾斜放置,有雨水流过即可改变电平信号的输出。控制模块中还自带一个调节电阻,调节此电阻可以设置传感器的灵敏度。控制模块的另一侧有4个引脚,分别为AO,DO,GND和VCC。其中,AO为模拟信号输出,可以通过这个引脚输出的信号来判断雨量的大小。DO引脚为数字信号输出,可以用这个引脚输出的信号判断检测板上是否有雨水,没有水滴时此引脚输出高电平,有水滴时此引脚输出低电平。
二、实验连线与编码
本次实验,我们将使用GPIO引脚直接获取雨滴检测模块的数字信号,并通过PCF8591来读取雨滴检测模块的模拟信号。首先,连线如下:
PCF8591与树莓派连接:
PCF8591 | 树莓派 |
---|---|
SDA | SDA |
SCL | SCL |
VCC | 5V电源 |
GND | GND |
雨滴检测模块:
雨滴检测模块 | 树莓派 | PCF8591 |
---|---|---|
VCC | 5V | |
GND | GND | |
AO | AIN0 | |
DO | GPIO17(BCM编码) |
完成了基础的连线,我们就可以开始编码工作了。关于PCF8591的使用,我们之前的博客有过详细的介绍,但是如果每次使用到数模转换时,都编写一遍PCF8591的控制代码会非常的麻烦,而且这也不是我们要核心关注的功能点,对于本实验来说,我们更多需要关注的是如何处理雨滴检测模块的数据,而不是DA转换相关逻辑,因此我们可以编写一套通用的PCF8591驱动代码,之后再使用到有模拟信号输出的元件时,直接使用此驱动即可。
需要注意,要使用PCF8591,不要忘记打开树莓派的I2C接口,接线完成后,使用如下指令可以查看设备地址:
sudo i2cdetect -y 1
完整代码如下:
#coding:utf-8
import smbus #在程序中导入“smbus”模块
# /dev/i2c-1
bus = smbus.SMBus(1) #创建一个smbus实例
# 初始化驱动模块 定义PCF元件地址
def init(addr):
global address
address = addr
# 读取某个通道的数据
def read(chn):
global address
if chn == 0:
#发送一个控制字节到设备 表示要读取AIN0通道的数据
bus.write_byte(address,0x40)
if chn == 1:
#发送一个控制字节到设备 表示要读取AIN1通道的数据
bus.write_byte(address,0x41)
if chn == 2:
#发送一个控制字节到设备 表示要读取AIN2通道的数据
bus.write_byte(address,0x42)
if chn == 3:
#发送一个控制字节到设备 表示要读取AIN3通道的数据
bus.write_byte(address,0x43)
bus.read_byte(address) # 空读一次,消费掉无效数据
return bus.read_byte(address) # 返回某通道输入的模拟值A/D转换后的数字值
def write(val):
global address
temp = val
temp = int(temp)
# 进行写数据操作
bus.write_byte_data(address, 0x40, temp)
实现水滴检测的代码如下:
#coding:utf-8
import pcf8591 as PCF
import RPi.GPIO as GPIO
import time
DO = 11
# 设置使用的引脚编码模式
GPIO.setmode(GPIO.BOARD)
GPIO.setup(DO, GPIO.IN)
PCF.init(0x48)
while True:
print(\'------------分割线-------------\')
rainDO = GPIO.input(DO)
print(\'是否检测到水滴:%s\'%(\'否\' if rainDO else \'是\'))
# 读取AIN0的模拟数据
rainAO = PCF.read(0)
print(\'雨水程度%d\'%(255 - rainAO))
time.sleep(2)
在树莓派上运行上面程序,即可检测水滴情况。
以上是关于树莓派基础实验22:红外遥控传感器实验的主要内容,如果未能解决你的问题,请参考以下文章