继上一篇文章使用树莓派(Raspberry Pi)实现智能家居(1/4)介绍了树莓派的一些基本参数和用途之后,下面让挨踢小茶带大家看看如何使用树莓派实现智能家居吧。
首先想象一下,您心目中的智能家居是怎样的?能够用APP控制台灯,电视,空调,门窗……?甚至用语音来进行控制?其实参考世面上已经在销售的产品以及在Kickstarter和Indiegogo上正在众筹的产品,你可能会有一些新的看法和思路。但是在挨踢小茶心目中,智能家居需要做的不仅仅是一款能用APP控制的智能插座,或者能代替各种遥控器的遥控终端,而是一个像Google Next一样,能像您的一个私人管家,可以自动、无时无刻、让您无法察觉的为您服务。比如说,在我每天固定8点钟起床的时候,可以自动为我打开窗帘,煮好咖啡……在我每天固定7点钟下班回家的时候,可以为我提前打开空调,打开电视机和我喜欢的电视节目。当然每个人的心中都有不一样的诉求,这个就因人而异了。
好废话不多说了,下面来介绍一下技术实现方法。实现目标是利用APP和语音来控制红外开关。
首先了解一下需要用到的GPIO接口。
树莓派的GPIO口
不同版本的GPIO引脚定义略有不同,具体可以查看下面这张表格。
需要用到的部件:
- 树莓派一个
- 红外接收模块
- 红外发射模块
- 杜邦线若干
- 红外插座
- 红外遥控器
- 面包板(选用)
大部分部件都可以在某宝上购得……
安装必须的软件
升级树莓派版本
sudo apt-get update && sudo apt-get dist-upgrade
sudo apt-get upgrade
安装LIRC - Linux Infrared Remote Control,LIRC是开源的用来控制树莓派接收和发射红外信号的软件
sudo apt-get install lirc
编辑你的 /etc/modules文件,加入以下代码
lirc_dev
lirc_rpi gpio_in_pin=23 gpio_out_pin=22
修改/etc/lirc/hardware.conf文件,如下(黑色字体部分为需要修改的地方)
LIRCD_ARGS="--uinput"
# Don't start lircmd even if there seems to be a good config file
# START_LIRCMD=false# Don't start irexec, even if a good config file seems to exist.
# START_IREXEC=false# Try to load appropriate kernel modules
LOAD_MODULES=true# Run "lircd --driver=help" for a list of supported drivers.
DRIVER="default"# usually /dev/lirc0 is the correct setting for systems using udev
DEVICE="/dev/lirc0"
MODULES="lirc_rpi"# Default configuration files for your hardware if any
LIRCD_CONF=""
LIRCMD_CONF=""
安装红外接收器
根据下图所示的引脚对应关系将红外接收模块接到树莓派上(不同版本的接线方式不一样,具体请查看第一张图中的GPIO引脚定义做相应的更改)。在这个地方,挨踢小茶因为购买了劣质的杜邦线,导致红外接收模块一致无法正常工作,这个问题排错了2个星期才最终得到解决……
另外请注意红外接收器的电压数,大部分是3V的。插的时候理论上可以支持热插拔,但保险起见建议将树莓派关机断电之后进行操作。
对于大部分红外接收器来说,接法是
vcc 连 pin1 (3.3v)
gnd 连 pin6(ground)
data连 pin12(gpio18)
调试红外接收器
开机后,加载lirc模块
sudo modprobe lirc_rpi
然后结束lrcd进程
sudo kill $(pidof lircd)
启动测试
sudo mode2 -d /dev/lirc0
红外接收器已经打开,处于监听状态。这个时候,利用任何红外发射器(可以是电视遥控器或其他遥控器)对红外接收模块按任意按钮,就可以在树莓派终端上看到类似如下的代码,看到这个代码便证明红外接收模块是正常工作的。如果没有看到,请检查你的接线、电压、以及通过lsusb查看是否加载了相应模块。
pulse 1681
space 4816
pulse 1695
space 4784
pulse 1333
space 3638
配置红外发射器
首先清除接收器指令
sudo kill $(pidof lircd)
列出接收器常用的指令,挑选其中自己需要的指令,记住便可
sudo irrecord --list-namespace
一般常用的指令可能是这些
KEY_UPKEY_DOWNKEY_LEFTKEY_RIGHTKEY_ESCKEY_ENTERKEY_SPACE
sudo kill $(pidof lircd)
irrecord -d /dev/lirc0 ~/lircd.conf
按照指示,请先按enter二次,再按住你的遥控器任意键,直到屏幕上的...................跑完。
跑完后,你刚刚按住的那个键,请一直重覆按,直到屏幕上的...................跑完。
接下来就是设定了,请先输入
KEY_UP
然后按遥控器上按你要设定为 上 的那个键,然后再按ENTER。
再输入
KEY_DOWN
然后按遥控器上按你要设定为 下 的那个键,然后再按ENTER。
重覆上述动作,一直到你设定完成,最后按enter离开。
以上步骤完成了红外信号录入的动作,之后你将可以在/home/pi/lircd.conf文件中看到你刚才录入的红外信号。
配置红外发射器
首先关闭树莓派将红外发射器接到对应的GPIO口上,对于大部分红外接收器来说,接法是
vcc 连pin2(5v)
gnd连pin6(ground)
data连pin11(gpio17)
更改LIRC配置文件,将xxx替代为你自定义的名字。
sudo cp ~/lircd.conf /etc/lirc/xxx.conf
编辑/etc/lirc/xxx.conf文件,将name ***/lircd.conf 更改为 name xxx,这里的xxx需要与上面的一致
进行测试,将xxx替代为前面定义的文字,并且执行定义好的按钮KEY_UP, KEY_DOWN等
sudo irsend SEND_ONCE xxx KEY_UP
sudo irsend SEND_ONCE xxx KEY_DOWN
sudo irsend SEND_ONCE xxx KEY_LEFT
sudo irsend SEND_ONCE xxx KEY_RIGHT
sudo irsend SEND_ONCE xxx KEY_ENTER
现在可以使用家庭电视遥控器或其他红外遥控器的按钮录入树莓派,然后最后用irsend命令来测试这个红外信号是否成功发射!
至此,已经可以用树莓派的CLI对家里的一些设备做一些简单的控制啦!不过前提是,这个家庭设备需要和插座之间再接一个红外插座,通过控制这个红外插座的开合,来对家庭设备做间接的控制。
如果使用APP或者语音来控制呢?可以参考后面的两篇文章使用树莓派(Raspberry Pi)实现智能家居(3/4),使用树莓派(Raspberry Pi)实现智能家居(4/4)。
文章评论
楼主,想问一下我执行到sudo mode2 -d /dev/lirc0时,然后过了很久才会出现
space 24
pulse 55
space 72
pulse 57
space 21
pulse 56
space 23
pulse 55
而且我都没有按遥控器他都出来了,这是什么原因呢
@小白 之前也遇到过,尽量将红外接收器放在少干扰的地方,并且尝试调整方向。
@挨踢小茶 旁边没有红外发射器,没有按都会出现这种内容,楼主可以用QQ联系你吗?
@小白 有的时候一些其他的设备也会发出类似红外频谱的,所以最好先尝试换一个地方,调整方向,让他不会自动出现这些代码。
还有就是我之前出现这个情况是因为使用了面包板,而面包板的接触不好,你可以尝试换线缆,并且采取直接连接的形式。
service irsend 显示:
inactive
not found(no such file or directory)
这个怎么解决?怎么开启?
现在执行sudo irsend SEND_ONCE xxx KEY_UP 显示错误:
irsend: could not connect to socket
irsend: connect refused
那个,博主能加下我么?
楼主,请问一下接红外线这里,modules文件lirc_rpi gpio_in_pin=23 gpio_out_pin=22这里的23、22对应的是哪些引脚啊,还有我对照这你的来做,为什么加载lirc模块sudo modprobe lirc_rpi时无法发现lirc_rpi这个设备呢,而且我红外接收头也已经接上去了。 :shock:
@小白 有具体的报错信息吗?
sudo irsend SEND_ONCE xxx KEY_UP
到这一步了始终无法成功,
显示
irsend: could not connect to socket
irsend: no such file or directory
楼主知道这是为什么?
@哥特人 检查一下,irsend服务有没有正常开启
@挨踢小茶 我也遇到过这样子的问题,请问一下irsend服务怎么开启啊,怎么检测他有没有正常开启??
@小白 手上没有测试机器,可以这样开启。
sudo /etc/init.d/lirc start
@挨踢小茶 楼主,我是利用实验室的电视机遥控器进行红外录入的,主要想利用树莓派终端的指令进行控制实验室的电视机,然后按照你的教程其他一切都顺利,就是到了最后一步sudo irsend SEND_ONCE xxx KEY_UP时始终无法成功,而且我也已经改了名字了,都是提示irsend: could not connect to socket
irsend: No such file or directory这样的错误,也使用了sudo /etc/init.d/lirc start开启了irsend服务,网上查了很多方法还是不行,楼主请多多指教一下
@小白 我总算知道为什么了,第一,这里的引脚gpio写错了,是18和17,改过来,第二,这里有一点没讲,就是初始化错误,lirc是不会去自动找到设备的,boot/config有要改的,自己百度,很多,lirc.conf和lircmd.conf配置要加入include"自己的信号文件路径"这句话,最后出来运行这两句:killall lircd
lircd -d /dev/lirc0
@哥特人 谢谢你的提醒。
你们用的是哪个版本?不同版本的引脚定义不太一样的,这个我可能要声明在文章里。
@挨踢小茶 pi3 B 型号,用的是2017-1-11raspbain。
顺便说一下,后面第三章的HTTP那里也是页面无法运行成功,显示错误:the site can not be touched,这个还没搞清楚是为什么?
@哥特人 哥特人,求回复一下
@哥特人 18跟17是上面lirc默认的两个引脚,加上去也可以。如果引脚写错的话执行sudo mode2 -d /dev/lirc0 是没有space pulse之类的输出的,请问一下boot/config是要改什么呢,还有lirc.conf和lircmd.conf配置文件include自己的信号文件是修改/etc/lirc/的还是原本没有复制之前的,可以具体点吗,谢谢
@哥特人 我可以加QQ邮箱联系一下你吗,哥特人