本文的主要实践方式参考了 树莓派学习手记——制作一个空调遥控器(红外接收、发射的实现),大部分内容都是直接参考,我会添加一些我遇到的坑以及需要注意的地方。

前言

前些日子,我发现广州的炎炎夏日已经开始到来了,但是房间里边的老空调的脾性又很特别,因为年代久远,它声音特别的响,而且控温也控制的不是特别好,还没有定时功能(后边发现其实是有的,只是我的那个万能遥控的问题… :-()。

除此之外,我还想着如果能远程操作它,我下班回到就能享受阵阵清爽,岂不美哉?

然后,我就开始了我有些曲折的捣鼓之路…

整体的思路

整体的思路其实是很清晰明了的,就是收集遥控的信号,把它们一个个的记录下来,然后在需要的时候发送出去就好了。

准备工作

以下是我准备的硬件设备,如果你手头上未必有这些,或者版本不一样,可能会行不通,当然,原理我觉得应该是可以互通的。

  • 树莓派3B
  • 红外发送管(参考型号TSAL6200)
  • 红外接收管(参考型号HS0038B)
  • 红外遥控器(只要是能控制你的设备的遥控器都行,像带红外遥控的手机)

走过的歪路

这里说一下我走过的歪路,因为不太懂电路这一块,所以,刚开始让我直接去对接红外接收/发送管的时候,我的内心是拒接的,你不能让我接我就接,毕竟我是真不懂…但后来发现这个才是正确的。

然后,我在挑选电子元器件的某宝店铺上发现了一个模块,它是自带NEC协议编码的,发送跟接收管都带上了,还带有一个芯片去转发编码。当时的我就在想,这个东西好啊,我只要学会了这个协议跟通信方式不就好了?硬件不会,软件上我还勉强可以学一下嘛!

结果买回来发现自己交了智商税…不是说这个模块不能用,只是在跟空调的对接上,它并不起作用,反而是我找了一个电视的遥控来测试,它有反应,就很气。

硬件链接

这里我也没有接上电阻(我同学跟我说,最好接一下,哈哈),也没接三极管进行信号放大。需要的同学,可以到上边提及的参考文中查看。反正下边这个图我也是从那里拿的 :->。

电路连接

安装软件

主要用到的软件其实就只有一个 lirc

1
2
3
4
# 更新
$ sudo apt update
# 安装
$ sudo apt install lirc

修改配置文件

修改系统配置文件,开放红外接口

1
$ sudo vi /boot/config.txt

找到 infrared module 部分,去除注释,17改18,18改17

1
2
3
# Uncomment this to enable infrared communication.
dtoverlay=gpio-ir,gpio_pin=18
dtoverlay=gpio-ir-tx,gpio_pin=17

调试时,我的系统内核是 Linux version 5.4.51-v7+ (dom@buildbot) (gcc version 4.9.3 (crosstool-NG crosstool-ng-1.22.0-88-g8460611)),是有效的。

按照参考文章而言,不同的内核可能会有一些差异,需要你自行搜索关键词 lirc lirc-rpi gpio-ir 查阅相关资料解决。

修改驱动配置

这里跟参考文章略有不同,原文修改的是文件 /etc/lirc/lirc_options.conf

1
$ sudo vi /etc/lirc/lirc_options.conf
1
2
3
4
5
6
7
# 把:
driver = devinput
device = auto

# 修改为:
driver = default
device = /dev/lirc1

但我使用的版本 lircd 0.9.0-pre1 却并不存在这个文件,找了一轮下来,发现不同的版本略有不同,我修改的内容是:

1
$ sudo vi /etc/lirc/hardware.conf
1
2
3
4
5
6
7
8
# 修改一下内容
# Arguments which will be used when launching lircd
LIRCD_ARGS="--uinput --listen"

DRIVER="default"

# usually /dev/lirc0 is the correct setting for systems using udev
DEVICE="/dev/lirc0"

重启lirc

1
2
$ sudo /etc/init.d/lirc stop
$ sudo /etc/init.d/lirc start

测试红外接收是否正常

1
mode2 -d /dev/lirc1

使用遥控器对准红外接收管随意按下按钮,如果屏幕上出现一些格式如下的输出则表示接收功能正常:

1
2
3
4
5
6
space 2640
pulse 820
space 2667
pulse 845
space 895
...

录入红外信号

这部分内容我建议你可以先按照我上边提及的参考文章来一遍,因为如果能够那样子完成的话,是一件很方便的事情,但是对于我而言,那样子并不生效。原因可能是我使用的lirc的版本问题,也有可能是我目前接触到的设备的问题,并不能按照原文那样子直接生成配置文件。

我采用的方式,是使用 mode2 工具,将遥控的红外信号一个一个的采集下来,存放到一个文件进行观察。

这里需要注意,采集信号的时候应该尽量避免干扰,像发送管的pin口跟接收管pin口接近,会产生干扰信号,所以需要在录入时,先拔掉发送管的线,再进行录入。

1
$ mode2 -m -d /dev/lirc1 > ~/device.lircd.conf

如果一切正常,我们将在 device.lircd.conf 文件内采集到一些这样子的内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
7795305

3478569-space

40 21745-pulse 2001748-space

1975060-space

3432 3543 841 896 845 919
821 894 845 2668 820 898
842 895 845 2643 845 897
......
# 如果这中间包含一些 xxx-space yyy-pluse 的信息,那么这次采集很有可能就是失败的
# 记住,请尽量在采集时避免周围的信号干扰,多试几次
796 2693 795 945 794 2692
794 2694 793 945 794 945
796 944 820 2667 795 2696
792 944 821 2667 819 2668
794 945 796 945 3444 3537

如果存在信号干扰,这组数字当中(从1975060-space开始到结束),则会混杂一些带有-space/-pulse这类的干扰信息,这是有问题的,按照下边的执行将其重新发送出去极有可能达不到预期效果。

接下来我们将采集到的信号按照以下格式存放至lirc的配置文件 /etc/lirc/lircd.conf 里边:

1
2
3
4
# 最好先备份以下原文件
$ sudo cp /etc/lirc/lircd.conf.b

$ sudo vi /etc/lirc/lircd.conf
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
begin remote

name device # 设备名称
flags RAW_CODES
eps 30
aeps 100

gap 38000

begin raw_codes

name on # 操作名称

3432 3543 841 896 845 919
821 894 845 2668 820 898
842 895 845 2643 845 897
......
796 2693 795 945 794 2692
794 2694 793 945 794 945
796 944 820 2667 795 2696
792 944 821 2667 819 2668
794 945 796 945 3444 3537

end raw_codes

end remote

重启lirc服务

1
$ sudo /etc/init.d/lirc restart

发送信号

接下来,我们将采集到的信号重新通过红外发送管发送出去。记得将发送管的线插回去

这里我们需要注意的是,如果电路那边没有添加三极管去做信号放大,那么我们测试时需要将发送管的距离以及对准的位置调整一下。

如果已经很接近了,但是仍旧没有信号,可以使用手机,打开摄像头,发送信号时,查看发送管有无紫色光闪烁,如果有,说明是有进行信号发送的操作的,只是可能接收端并没有识别出来。

1
$ irsend SEND_ONCE device on

如果一切正常,上边这条命令就能顺利的执行你对着红外接收管录入的那条指令给设备了,例如我录入的是开启空调。

这里说个题外话,空调是一种比较特殊的红外遥控设备,它不像电视一类的设备,开就是开,声音加就是加,是一条条单一的指令。而空调是一组场景的描述指令,例如开空调的指令,它里边包含了开机状态,制冷模式,制冷温度等信息的组合。

到此,我就顺利的控制到了我的空调,除此之外,我还使用上边的方式遥控过公司里边的风扇,似乎都是行得通的。

接入HomeKit

这里推荐以下我写的一个小工具 satoshi,目前仍在完善当中。使用它就可以通过一个配置文件轻松简单的将上边实现的空调映射到HomeKit里边去了。

只不过,因为该工具使用的库未能接入空调,苹果的HomeKit是有空调这个设备类型的,到了satoshi这里就只能模拟出一个开关来进行简单的控制空调的开关,比较鸡肋…同时,因为该工具依赖于lirc控制红外设备,所以必须在处理执行完以上lirc的部署后,才能顺利的通过HomeKit来操作设备。

以下仅做一些简单的介绍,详细的接入方式可参考文档,而且项目还处于初期,接口上可能会频繁变化。

首先下载好satoshi

生成配置文件

1
$ satoshi config init

修改配置文件

默认配置文件位于 ~/.satoshi/config.yaml

1
$ sudo vi ~/.satoshi.config.yaml

格式参考如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
satoshi:
devices: # 这部分是提供http接口
- id: '1'
type: aircon
switch_config:
on_lircd_cmd: 'aircon on'
off_lircd_cmd: 'aircon on'
siri: # 这部分是模拟HomeKit设备
- id: 2
type: switch
name: aircon
switch_config:
on_lircd_cmd: 'aircon on'
off_lircd_cmd: 'aircon on'

接下来,我们就可以在苹果手机上下载好家庭/Home这款软件,对设备进行接入了。

接入成功