打造增强型Raspberry Pi-红外遥控篇

上一期介绍了怎么给Raspberry Pi加上一个液晶屏,这期该介绍红外遥控了。

需要的硬件:

  • 一个红外接收管,型号可以是TSOP1238/TSOP2238等可以3.3V电压下工作的38KHz红外接收管。
  • 一个红外遥控器,可以是电视机、机顶盒等的遥控器。但别拿空调遥控器这种自带状态逻辑的遥控器来折磨自己。

连接红外接收管:

不同的红外接收管连线可能不太一样,需要参考相应的Datasheet。以TSOP 1238为例的话,当红外线接收窗朝向自己时,从左到右三个引脚分别为:

1. GND,接地,RPi PIN 6
2. VS,电源,接3.3V电源,RPi PIN 17
3. OUT,数据输出,接GPIO 24,RPi PIN 18

由于Raspberry Pi的GPIO只能接收3.3V的输入,所以红外接收管的电源务必要接3.3V的供电。我自己用的红外接收管的型号是TSOP 1838(引脚顺序是OUT, GND, VS),按lirc_rpi项目页面的说法,这个管子应该在5V供电下才能正常工作,不过我还是只接了3.3V,发现也能用。

系统软件安装:

lirc_rpi项目为Linux内核提供了支持GPIO口的红外接收管的驱动,在最新的Raspbian系统中应该已经包含。如果你的系统中没有这个模块,也许需要自己重新编译内核。具体可以参考lirc_rpi项目主页。

然后需要安装用户态的服务进程:

sudo apt-get install lirc

加载lirc_rpi内核模块:

sudo modprobe lirc_rpi gpio_in_pin=24 gpio_out_pin=23

注意,在加载lirc_rpi时必须指定输入端口是GPIO 24,跟实际接线一致。输出端口设为GPIO 23,是因为我不需要这个输出端口,而目前我们GPIO 23口是空着的。

测试红外接收是否正常:

sudo mode2 -d /dev/lirc0

如果按遥控器上的键,屏幕上能显示出一串pluse和space值的话,多半就是正常了。

配置下/etc/lirc/hardware.conf:

...
LIRCD_ARGS="--uinput"
...
DRIVER="default"
...
DEVICE="/dev/lirc0"

让lirc学习一下你遥控器上的按键,在我的例子中,请至少学习5个按键,分别做为上(up)、下(down)、左(left)、右(right)、选择(sel):

sudo /etc/init.d/lirc stop
#学习按键
irrecord -n -d /dev/lirc0 ~/lircd.conf
#把学习后生成的配置文件作为lircd的配置文件
sudo mv ~/lircd.conf /etc/lirc/lircd.conf
sudo /etc/init.d./lirc start

配置完后,可以用irw命令测试遥控器是否工作正常。

配置~/.lircrc.conf文件,把按键与需要触发的行为进行关联:

begin
    prog = lcdmenu 
    button = up
    config = up
end
begin
    prog = lcdmenu
    button = right
    config = right
end
begin
    prog = lcdmenu
    button = left
    config = left
end
begin
    prog = lcdmenu
    button = down
    config = down
end
begin
    prog = lcdmenu
    button = sel
    config = sel
end

为Raspberry Pi添加液晶屏控制菜单,我参考了Github上的RaspberryPiLcdMenu,这个项目实现了使用一个带五个小按钮的液晶屏套件作为硬件基础来显示与操作一个菜单的系统,我没有这个套件,而且我是用红外遥控器而不是小按钮来操作,所以需要重写跟按钮有关的代码,通过lirc提供的接口去获取遥控器的按键信息,很容易,可以参考我已经实现好的代码,在Buttons.py中:

git clone https://github.com/lifanxi/rpimenu.git

RaspberryPiLcdMenu项目提供了一个很灵活的菜单配置系统可以很方便的添加新的菜单项,我给它添加了遥控fmd播放豆瓣FM的菜单功能项(参考lcdmenu.xml)。

一切就绪,启动lcdmenu.py程序:

sudo python lcdmenu.py

如果你的配置没有问题,这时就可以在液晶屏上看到定制后的菜单,并可以用遥控器来遥控操作了,按上下键选项不同的菜单项,向右键进入子菜单,向左退回上一级菜单,选择键用于根据屏幕提示确定某些特定的操作。

添加了Douban.fm的菜单

添加了Douban.fm的菜单

豆瓣FM播放中,可以显示曲名和播放进度

豆瓣FM播放中,可以滚动显示曲名和播放进度

一切调试完成后,您还可以把加载lirc_rpi模块和启动lcdmenu.py的命令加到Raspberry Pi的启动脚本中,这样系统一启动就可以让液晶显示和菜单自动生效,菜单操作中已经预设了关机、重启、设置IP地址等功能,这对于headless使用Raspberry Pi的同学来说,是一件非常方便的事情。

参考资料:

  1. 红外遥控器lirc配置
  2. RaspberryPiLcdMenu
  3. lirc_rpi项目
  4. 用Raspberry Pi打造真正的“豆瓣FM”