随着家里的电器越来越多,遥控器也越来越多,例如投影仪遥控、电视盒子遥控、HDMI 分线器遥控、NAS 存储遥控、音响遥控、电灯遥控、小夜灯遥控、空调遥控等等。所以当我想看一部电影时,需要用先打开投影仪,再打开电视盒子,然后打开 NAS 存储,接着打开 HDMI 分线器,跟着打开音响,甚至还要关上电灯。

一系列的操作简直烦不胜烦,然后就想是不是可以用一个遥控器,控制所有电器呢?毕竟大部分电器的遥控器,无非也就是按一下开关键而已。

所以计划用树莓派和红外模块来进行电器的整体控制。

1 红外模块

树莓派已经有了,那现在缺的是一个红外模块,所以先淘宝和各种论坛搜了一下,找到了这个不错的红外模块。

这个模块有接收和发送两个部分,另外让淘宝老板多加了一个红外发射器 D2,到货时,老板已经贴心的帮忙焊了上去。

但是我的树莓派加了一个合金的外壳,并且有散热风扇,如下:

另外看了一下树莓派阵脚的定义,如下(这个是扩展模块,每一列都是一样的,所以只看一列就可以了):

就会有两个问题:

  1. 插上这个模块,需要把外壳移除;
  2. 这个模块占用了 5v 正极,导致散热风扇也没法用;

所以大概看了一下红外模块的阵脚,发现其实它只用了以下几个阵脚:

  1. 3.3v:正极;
  2. GND:负极;
  3. P17:红外发射;
  4. P18:红外接收;
  5. P27:开关1;
  6. P22:开关2;

所以用排线把这几个阵脚对应连起来就可以了,这样好处就是解决了上面的两个问题,但是缺点是加了排线,导致整体看起来比较乱,不够精简。不过后面可以放到自制的盒子里面,把这些遮挡起来,就可以解决了。

具体的阵脚链接,大家可以参考:

2 测试模块

接线结束后,首先要测试一下模块是不是工作正常,如果整体工作正常,才能细化各部分逻辑。否则开发了半天,发现模块工作不正常,各种事情都要返工,就得不偿失了。

测试过程中,查了不少资料,也绕了不少弯路,主要问题总结如下:

  1. 很多资料比较老,在内核 4.19.x 以上版本,都不能跟资料介绍的那样正常工作;

    由于在内核 4.19.x 以上版本,移除了对 dtoverlay=lirc-rpi 的支持,改为 dtoverlay=gpio-ir 以及 dtoverlay=gpio-ir-tx 方式。所以如果查看资料中,是以 lirc-rpi 方式集成的,那就可以无视这个资料了;

  2. lirc 这个模块的最新版本,配置也跟之前老版本的不同,不需要 /etc/lirc/hardware.conf 等配置文件;

踩了好多坑,正确的姿势应该按照下面的步骤执行。

2.1 确认内核版本

uname -a
# 输出如下
# Linux raspberrypi 4.14.79-v7+ #1159 SMP Sun Nov 4 17:50:20 GMT 2018 armv7l GNU/Linux

对于输出内容的说明如下:

  • Linux:kernel name
  • raspberrypi:network node hostname
  • 4.14.79-v7+:kernel release
  • #1159 SMP Sun Nov 4 17:50:20 GMT 2018:kernel version
  • armv7l:machine hardware name
  • GNU/Linux:operating system

可以看到当前的内核版本为 4.14.79-v7+。打开 /boot/overlays/README 并搜索 lirc-rpi 后,发现:

Name:   lirc-rpi
Info:   This overlay has been deprecated and removed - see gpio-ir
Load:   <Deprecated>

lirc-rpi 已经被标记成已废弃,并且已经移除,使用 gpio-ir 来替换。

所以首先要先确认自己的内核版本,并查看 /boot/overlays/README,确定 lirc-rpi 在自己的系统上是否可用(如果可用的话,可以直接找相关的集成文档,这部分有很多资料,这里就不多说了)。

2.2 安装 lirc

lirc 是 Linux 下,提供红外信号编解码,以及收发能力的一个模块。有了这个模块,我们不需要去实现红外信号处理等很复杂的逻辑。

安装:

sudo apt-get install -y lirc

2.3 配置 gpio

首先,配置 gpio,让系统知道红外模块是通过哪几个引脚来进行控制的。

在前面,我们在接线的时候,提到:

  • P17:红外发射;

  • P18:红外接收;

所以需要将这两个引脚配置到系统中。

# 打开编辑 /boot/config.txt 文件
sudo vi /boot/config.txt

# 找到 dtoverlay 的声明位置,增加以下声明
dtoverlay=gpio-ir,gpio_pin=18
dtoverlay=gpio-ir-tx,gpio_pin=17

# 保存退出,并重启树莓派
sudo reboot

重启后,进入系统,执行 ls /dev 可以看到 lirc0lirc1 这两个设备,说明配置成功。

2.4 测试红外接收

停掉 lircd 服务:

sudo systemctl stop lircd.socket
sudo systemctl stop lircd.service

读取红外模块接收的内容:

mode2 --driver default --device /dev/lirc1

进入红外读取状态:

Using driver devinput on device /dev/lirc1
Trying device: /dev/lirc1
Using device: /dev/lirc1

然后用遥控器随便按一个键,会出现以下内容:

space 16777215
pulse 95
space 182
pulse 1616
space 221
pulse 766
space 76
pulse 443
space 277
pulse 149
space 387
pulse 908
space 168
pulse 94
space 348
pulse 741
space 80
pulse 738
space 485
pulse 82
space 152
pulse 344
space 74
pulse 132
space 4898
pulse 515
space 641
pulse 443
space 748
pulse 94
space 170
pulse 89
space 1894
pulse 383
space 647
pulse 86
space 256
pulse 179
space 797
pulse 89
space 944
pulse 198
space 1061
pulse 314
space 1883
pulse 257
space 1861
pulse 116
space 224
pulse 84
space 1884
pulse 454
space 1698
pulse 87
space 175
pulse 120
space 1932
pulse 476
space 1778
pulse 496
space 1802
pulse 96
space 2153
pulse 355
space 1953
pulse 375
space 591
pulse 545
space 1726
pulse 334
space 933
pulse 386
space 643
pulse 493
space 643
pulse 386
space 2091
pulse 239
space 641
pulse 340
space 798
pulse 486
space 1779
pulse 496
space 747
pulse 90
space 2209
pulse 308
space 1805
pulse 84
space 115
pulse 241
space 1751
pulse 87
space 175
pulse 174
space 719
pulse 471
space 1857
pulse 92
pulse 21981
space 61979
space 40451
pulse 89
space 143
pulse 96
space 221
pulse 904
space 121
pulse 1057
space 84
pulse 2610
space 303
pulse 1550
space 83
pulse 95
space 188
pulse 1004
space 2820
pulse 381
pulse 19764

2.5 测试红外发送

waiting for update

3 参考链接