logo头像

学如逆水行舟

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

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

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

一. 实验前的准备

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

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

首先,我们可以先将红外收接传感器连接到树莓派,方便我们测试红外线的收接功能,连线如下:

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

接着,我们需要在树莓派上安装红外驱动库lirc和Python-lirc,在树莓派终端执行如下指令:

1
2
3
4
5
6
7
sudo apt update

sudo apt install lirc

sudo apt-get install liblircclient-dev

sudo apt-get install python3-lirc

之后,需要对红外接口IO进行配置,在树莓派终端执行:

1
sudo nano /boot/config.txt

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

1
2
3
# Uncomment this to enable the lirc-rpi module

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

将第二行的注释去掉,并修改如下:

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

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

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

1
sudo nano /etc/lirc/lirc_options.conf

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

1
2
3
driver = devinput

device = auto

修改如下:

1
2
3
driver = default

device = /dev/lirc0

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

二.红外信号的收接

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

1
mode2 -d /dev/lirc0

需要注意,如果提示无法初始化lirc0,则需要先停止服务后在执行上面的指令,使用如下指令来停止服务:

1
sudo service lircd stop

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

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

1
irrecord -l

终端将输出如下信息:

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

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

1
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 to finish recording)”,即表示按键间隔时间已经分析完成,我们可以开始正式录制。这时开始输入我们需要录制的键,比如KEY_0,之后终端提示如下:

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

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

1
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文件夹后,执行如下指令即可:

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

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

则你需要将后一串一样的十六进制数删除,否则无法正常使用,删除后的文件如下:

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

1
2
3
sudo service lircd restart 

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

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

1
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文件如下,可以进行简单的测试:

1
2
3
4
5
6
7
8
9
10
11
# 导入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)

示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#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