一块儿玩转树莓派(19)——红外遥控控制实验

2021年11月26日 阅读数:3
这篇文章主要向大家介绍一块儿玩转树莓派(19)——红外遥控控制实验,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

一块儿玩转树莓派(19)——红外遥控控制实验

红外遥控是生活中很是常见的电子器具,电视机,空调,音响等电器均可以经过遥控器进行控制。本篇博客,咱们尝试来经过红外发生器和红外信号接受器来进行红外控制实验,在树莓派上经过红外遥控的按键来处理LED灯的控制。python

一. 实验前的准备

本次实验,咱们将使用一个红外遥控器来LED灯,须要准备的元件有:红外遥控器,红外收接器和一个双色LED灯。分别以下图所示:git

红外遥控只要安装了电池,以后咱们点击任意按键的时候就会触发红外信号,红外收接模块能够收接此红外信号,双色LED咱们已经十分熟悉了,后面只需根据红外信号来控制LED的亮灭便可。github

首先,咱们能够先将红外收接传感器链接到树莓派,方便咱们测试红外线的收接功能,连线以下:数组

树莓派 红外收接器
5V VCC
GND GND
GPIO27(BCM编码) DO

接着,咱们须要在树莓派上安装红外驱动库lirc和Python-lirc,在树莓派终端执行以下指令:编辑器

sudo apt update

sudo apt install lirc

sudo apt-get install liblircclient-dev

sudo apt-get install python3-lirc 



以后,须要对红外接口IO进行配置,在树莓派终端执行:测试

sudo nano /boot/config.txt


nano是Linux系统下的一个文本编辑器,打开此配置文件后,咱们须要找到下面两行配置项:this

# Uncomment this to enable the lirc-rpi module

#dtoverlay=lirc-rpi,gpio_out_pin=17,gpio_in_pin=18,gpio_in_pull=up


将第二行的注释去掉,并修改以下:编码

dtoverlay=lirc-rpi,gpio_in_pin=27,gpio_in_pull=up


须要注意,这里咱们采用了树莓派的GPIO27引脚(BCM编码)做为红外信号的收接引脚,并默认设置为上拉电阻。本实验中,咱们不需发出红外信号,所以红外信号的输出引脚能够不用配置。修改完成后,使用Control + x来退出编辑器,退出时会询问是否保存修改,按Y键保存便可。url

下面,咱们还须要对lirc的硬件接口进行配置,在树莓派终端使用以下指令打开配置文件:spa

sudo nano /etc/lirc/lirc_options.conf


在配置文件中找到以下两行:

driver = devinput

device = auto


修改以下:

driver = default

device = /dev/lirc0


以后,重启树莓派,咱们就能够测试红外收接功能了。

二.红外信号的收接

树莓派重启完成后,在终端输入以下指令来测试红外信号:

mode2 -d /dev/lirc0


须要注意,若是提示没法初始化lirc0,则须要先中止服务后在执行上面的指令,使用以下指令来中止服务:

sudo service lircd stop


若是成功进入测试模式,你能够尝试使用红外遥控器对这树莓派按下一些按键,终端上出现以下图所示的输出,则代表已经能够成功收接到红外信号。

仅仅可以收接到信号对咱们来讲是不够的,这些信号咱们并不能友好的进行识别,要将这些信号识别为有意义的按键,咱们还须要信号进行编码。首先,在终端执行下面指令来查看全部可用的编码:

irrecord -l


终端将输出以下信息:

可用的编码很是多,本次实验咱们能够选3个来使用,例如咱们选择KEY_0,KEY_1和KEY_2这三个编码来绑定到咱们的遥控器对应的0,1和2按键上。

下面咱们来进行编码的烧录,在终端执行以下指令:

irrecord -d /dev/lirc0 ~/lircd.conf


以后终端会输出不少描述文案,以下图所示:

若是你有兴趣,能够阅读下这些介绍文案,而后直接回车便可。

若是是第一次进行编码的烧录,终端会提示“Enter name of remote(only ascii, no spaces)”的文件,咱们须要为烧录文件取一个名字,须要注意名字只能有ascii字符且不能有空格。输入完成名字后回车,终端会输出“Press RETURN now to start recording.”的提示,咱们再次按回车,便可进入烧录阶段。

烧录的过程有些繁琐,刚开始须要分析出遥控的按键间隔,咱们能够随便按遥控上的按键,每次按键终端会输出一个“.”,注意必定要有耐心,一下一下的按,不要按住不松。按满一行后,终端会提示“Please keep on pressing btns like described above”,继续以前的操做便可,直到终端出现“Please enter the name for the next btn(press <ENTER> to finish recording)”,即表示按键间隔时间已经分析完成,咱们能够开始正式录制。这时开始输入咱们须要录制的键,好比KEY_0,以后终端提示以下:

这时咱们点按遥控器上的“0”键便可,以后按照相同的方式再录制KEY_1和KEY_2。所有录制完成后,再按回车便可。主要特别注意,这时终端会提示要进行保存验证,应尽快按住遥控器上任意一个按键不松,直到终端提示录制成功,以下图所示:

录制完成后,会在当前文件夹下生成*.lircd.conf的录制文件,将其拷贝到/etc/lirc/lircd.conf.d文件夹下,以下:

sudo cp 0_1_2.lircd.conf /etc/lirc/lircd.conf.d/0_1_2.lircd.conf


还有一个细节须要注意,在/etc/lirc/lircd.conf.d文件夹下默认存在一个名为devinput.lircd.conf的文件,默认会读取这个文件的配置,将其更名为devinput.lircd.dist便可。进入/etc/lirc/lircd.conf.d文件夹后,执行以下指令便可:

sudo mv devinput.lircd.conf devinput.lircd.dist


你也能够打开录制的*.lircd.conf文件看一下,若是每一个录制的键后面有两串十六进制数,以下图所示:

则你须要将后一串同样的十六进制数删除,不然没法正常使用,删除后的文件以下:

如今,不出意外的话,咱们已经能够正常处理这3个按键信号了,在终端输入以下指令开启守护进程:

sudo service lircd restart 

lircd --nodaemon --device /dev/lirc0 --driver default


另外开一个终端,输入以下指令来测试遥控按键:

sudo irw


此时,按遥控器上的0,1和2按键,终端已经能够正常的响应了,以下图所示:

三.在Python中使用lirc驱动库

你还记得咱们以前的安装的python3-lirc库吧,下面是该用到它的时候了,首先建立一个Python文件,咱们暂且命名为19.infrared.py,在树莓派终端将/etc/lirc/irexec.lircrc文件更名为lircrc,须要注意,就是lircrc文件,没有后缀名。下面咱们须要根据需求进行一些配置,打开此文件,在其中配置Python程序要处理的红外按键,以下图所示:

如图中所示,经过begin和end组的方式来配置要处理的信号,其中prog须要配置为要处理此信号的Python程序,这里填咱们的程序文件名便可,button用来设置要处理的按键,config用来配置传递到Python程序中的数据。更多配置方式能够经过以下连接获得:

https://github.com/tompreston/python-lirc

配置完成后,修改19.infrared.py文件以下,能够进行简单的测试:

# 导入lirc库
import lirc
# 进行初始化 这里设置blocking为False会避免阻塞,不接收的信号直接抛弃
sockid = lirc.init("19.infrared.py", blocking=False)
while True:
    #获取按键信息
    btn = lirc.nextcode()
    if len(btn):
        print(btn)

lirc.deinit()

运行上面代码,在红外遥控器上按0,1或者2,能够看到程序会打印出一个数组,其中存放的就是咱们的按键值。

如今,原理上说,你已经可使用红外遥控和红外收接器作很是多的事情了,你能够将全部须要使用的按钮都录入,而后只作一个带LCD屏幕的计算器,或者经过遥控器控制电灯开关,温度气压计的数据上传等等。咱们本次实验使用双色LED做为示例,抛砖引玉,但愿你能发挥更多创造力。

双色LED有3个引脚,关于双色LED灯的实验在本系列很早的一篇博客中即有介绍,若是你感受陌生,能够往前翻一翻,这里咱们直接连线:

双色LED 树莓派
GND GND
S GPIO17(BCM编码,对应物理编码11)
- GPIO18(BCM编码,对应物理编码12)

示例代码以下:

#coding:utd-8

# 导入lirc 和 GPIO库
import lirc
import RPi.GPIO as GPIO
# 初始化lirc
sockid = lirc.init("19.infrared.py", blocking=False)

#初始化GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(11, GPIO.OUT)
GPIO.setup(12, GPIO.OUT)

# 灭灯
def clear():
    GPIO.output(11, GPIO.LOW)
    GPIO.output(12, GPIO.LOW)

# 设置红灯亮
def red():
    GPIO.output(11, GPIO.HIGH)
    GPIO.output(12, GPIO.LOW)

# 设置绿灯亮
def green():
    GPIO.output(11, GPIO.LOW)
    GPIO.output(12, GPIO.HIGH)

clear()

# 监听红外信号
while True:
    btn = lirc.nextcode()
    if len(btn):
        command = btn[0]
        if command == '0':
            clear()
        if command == '1':
            red()
        if command == '2':
            green()
lirc.deinit()

运行代码,尝试下使用红外遥控器来控制灯的颜色和开关吧!

四. 休息一下吧

本系列博客到此,咱们已经介绍了不少丰富多彩的传感器,你是否有想过组合使用这些传感器来创造出一些好玩的东西,如今你又具有了使用红外遥控远程控制程序的能力,尝试将你的想法实现一下吧!

专一技术,懂的热爱,愿意分享,作个朋友

QQ:316045346