1. 项目概述与红外技术基础给树莓派加个红外遥控功能这事儿听起来挺酷但真动手配置起来不少朋友都卡在了驱动和软件配置上。尤其是在Raspbian升级到Buster版本之后网上很多老教程直接“失效”照着做十有八九会报错。核心原因在于内核的红外驱动从传统的lirc-rpi模块换成了更现代的gpio-ir驱动整个配置逻辑和文件结构都变了。我折腾了好几个项目从媒体中心到智能家居的万能遥控器踩遍了新旧版本交替的坑终于摸清了在最新系统上稳定配置LIRCLinux InfraRed Control的门道。这篇文章我就把从硬件连接到软件配置再到用Python3写控制脚本的完整流程以及那些教程里不会写的避坑细节给你一次性讲明白。无论你是想用树莓派控制电视、空调还是DIY一个智能红外网关这套方案都能让你快速上手。简单说说红外遥控是咋工作的。你手里的遥控器每个按键都对应一组独特的“脉冲密码”。当你按下按键时遥控器内部的LED会以特定的频率通常是38kHz闪烁把这组“密码”用红外光发出去。接收头比如我们用的VS1838b捕获到这束光经过内部解调输出对应的电脉冲信号给树莓派。树莓派通过GPIO口读取这些脉冲的“高电平”pulse和“低电平”space的持续时间LIRC再将这些时间序列解码成我们能够识别的按键符号。整个过程就像在用电报收发莫尔斯码只不过载体是看不见的红外光。2. 硬件准备与连接要点工欲善其事必先利其器。硬件部分很简单但连接错了轻则没反应重则可能损坏设备。你需要准备三样东西一个树莓派3B、4B、Zero系列都行、一个VS1838b红外接收头这是最常用、性价比最高的型号、几根母对母的杜邦线。2.1 认识VS1838b接收头这个黑色的小方块有三个引脚正面看有半球形凸起或“X”形标记的那一面朝向自己从左到右分别是输出OUT、地GND、电源VCC。它的工作电压是3.3V和树莓派GPIO口的逻辑电平完美匹配千万别接5V会烧输出脚是集电极开路输出内部已经接了上拉电阻所以直接连接到GPIO输入脚即可。2.2 正确的接线方案我强烈建议使用BCM编号来指代GPIO引脚因为这是软件层面通用的编号方式比物理引脚编号更可靠。我们选择GPIO 17BCM编号对应物理引脚第11针作为信号输入。接线如下VS1838b 输出脚左-树莓派 GPIO 17BCM。我用黄色线提醒自己这是信号线。VS1838b 地脚中-树莓派任一GND引脚。我用黑色线。VS1838b 电源脚右-树莓派 3.3V 电源引脚。我用红色线。注意务必确保电源是3.3V树莓派上标有“3V3”的引脚。接错到5V引脚会瞬间损坏接收头。接好后可以给接收头套个热缩管或者用胶固定一下避免短路。2.3 硬件连接检查清单动手前快速过一遍[ ] 树莓派已关机。[ ] 使用母对母杜邦线连接牢固。[ ] VS1838b正面有透镜的一面朝向预计的遥控器方向无遮挡。[ ] 3.3V和GND没有接反。[ ] 信号线连接到了正确的GPIO口BCM 17。硬件连接就这么简单。接下来才是重头戏软件配置。新旧系统的差异主要就在这里。3. 系统配置与LIRC驱动安装系统配置的核心就两个文件/boot/config.txt和/etc/lirc/lirc_options.conf。很多错误都源于对这两个文件的错误修改。我们假设你已经在树莓派上安装了最新的Raspbian Buster或Bullseye系统并已经通过SSH或桌面环境打开了终端。3.1 启用内核gpio-ir驱动首先我们需要告诉树莓派内核我们要使用哪个GPIO口来接收红外信号。这通过编辑/boot/config.txt文件实现。这个文件在启动时被读取用于加载硬件叠加层Device Tree Overlay。sudo nano /boot/config.txt使用方向键滚动找到类似[all]或文件末尾添加如下一行dtoverlaygpio-ir,gpio_pin17这行配置的意思是加载gpio-ir这个驱动叠加层并指定红外接收引脚为GPIO 17BCM编号。如果你用的是其他GPIO口比如18就把17改成18。重要提示你可能会在网上看到被注释掉的#dtoverlaylirc-rpi。在Buster及以后版本中绝对不要取消这行的注释也不要使用它。lirc-rpi是旧的驱动与新的gpio-ir驱动冲突会导致设备无法正常工作。我们的方案完全基于新的gpio-ir驱动。3.2 安装LIRC软件包接下来安装LIRC的用户态软件它负责与内核驱动通信并解码信号。sudo apt update sudo apt install lirc安装过程通常很顺利。但在某些较早的Buster镜像中安装后LIRC服务可能会启动失败并提示缺少lirc_options.conf文件。这是因为安装包提供的配置文件有一个.dist后缀。如果遇到这个问题或者安装后你想确认一下可以执行sudo systemctl status lircd如果看到“Active: failed”并提示找不到lirc_options.conf就需要手动处理一下配置文件。3.3 配置LIRC选项LIRC的主要配置文件是/etc/lirc/lirc_options.conf。我们需要确保它指向正确的驱动和设备。sudo nano /etc/lirc/lirc_options.conf找到以下两行关键配置driver default device /dev/lirc0确保它们就是如上所示。driver default会让LIRC自动选择与系统匹配的最佳驱动对于gpio-ir就是devinput驱动。device /dev/lirc0指定了红外设备节点。在gpio-ir驱动下正确的设备节点可能是/dev/input/event0或event1等但LIRC通过devinput驱动封装后仍然会使用/dev/lirc0这个抽象接口这样上层应用就不需要关心底层变化。实操心得在最新版本的Raspbian中lirc_options.conf文件通常已经正确生成无需修改。如果你发现这个文件不存在可以检查是否有/etc/lirc/lirc_options.conf.dist。如果有将其重命名即可sudo mv /etc/lirc/lirc_options.conf.dist /etc/lirc/lirc_options.conf。这个步骤在2021年10月后的系统更新中已基本不需要。3.4 重启并验证驱动加载完成上述配置后保存文件重启树莓派让config.txt的修改生效。sudo reboot重启后通过以下命令检查gpio-ir驱动是否成功加载以及设备节点是否存在# 检查内核模块是否加载 dmesg | grep gpio_ir # 你应该能看到类似 “gpio_ir_recv gpio_ir12: GPIO IR remote receiver on GPIO17” 的信息。 # 检查设备节点 ls -l /dev/lirc0 # 应该显示为一个字符设备文件例如 “crw-rw---- 1 root video 248, 0 ... /dev/lirc0”如果/dev/lirc0不存在但/dev/input/event*中有新的设备也属于正常情况这表示gpio-ir驱动以input子系统的方式工作了LIRC的devinput驱动会去读取它。不过为了兼容性LIRC服务通常会创建/dev/lirc0这个符号链接或节点。4. 测试红外信号接收硬件连好了软件也配置了现在来测试遥控器信号是否能被正确接收。这是验证整个链路是否畅通的关键一步。4.1 停止LIRC守护进程进行原始测试在测试时我们需要先停止lircd服务因为它会独占红外设备。我们使用mode2这个工具来显示原始的脉冲pulse和空格space时序。sudo systemctl stop lircd sudo mode2 -d /dev/lirc0现在拿起你的任意红外遥控器电视、空调、机顶盒的都行对准VS1838b接收头按下任意按键。如果一切正常终端会开始快速滚动输出类似下面的内容space 1637 pulse 959 space 400 pulse 959 ...每一行代表一个电平变化。“pulse”后的数字是本次高电平持续的微秒数“space”后的数字是低电平持续的微秒数。这一长串数字就是你的遥控器按键的“指纹”。常见问题1运行mode2后无任何输出。首先检查接线特别是信号线是否接在了GPIO 17或你指定的引脚。其次确认config.txt中的dtoverlay配置已保存并生效重启过。然后尝试使用--raw模式因为新驱动可能更兼容这种模式sudo mode2 --raw -d /dev/lirc0如果提示设备不支持--raw可以去掉--raw试试。如果还不行检查设备权限ls -l /dev/lirc0确保用户有读写权限。有时需要将用户加入video或input组sudo usermod -a -G video,input pi然后重新登录。4.2 使用更清晰的格式查看默认的mode2输出可能比较杂乱。可以加上-m参数以微秒为单位显示更规整的数值sudo mode2 -m -d /dev/lirc0输出会变成纯数字更容易被后续的录制工具解析1520 950 400 950 400 950 400 950 400 950 1200 950 ...4.3 重启LIRC服务并测试解码原始信号有了说明硬件和底层驱动是好的。接下来测试LIRC服务能否正常运行并解码。首先退出mode2按 CtrlC然后启动lircd服务并用irw工具监听解码后的按键事件。sudo systemctl start lircd sudo irw再次按下遥控器按键。如果配置了正确的遥控器配置文件irw会输出解码后的按键名。但初次使用我们还没有配置所以可能没输出或输出乱码。这没关系只要irw没有报错并且按遥控器时终端有反应比如光标闪烁或换行就说明LIRC服务运行正常只是还不知道如何解读你的遥控器信号。至此红外接收的底层通道已经完全打通。下一步就是“教”树莓派认识你的遥控器。5. 录制与配置自定义遥控器LIRC自带一个数据库里面有很多常见遥控器的配置但不可能涵盖所有型号尤其是一些山寨或小众设备。因此学会录制自己的遥控器配置是必备技能。5.1 使用irrecord录制新配置irrecord是LIRC配套的录制工具。它会引导你依次按下遥控器上的按键记录下它们的信号特征并生成一个.conf配置文件。这个文件通常放在/etc/lirc/lircd.conf.d/目录下。开始录制前确保lircd服务是停止的以免干扰sudo systemctl stop lircd然后运行irrecord。我建议将配置文件先保存在家目录测试成功后再移到系统目录cd ~ irrecord -d /dev/lirc0 MyRemote.conf程序会首先提示你输入一些配置名称如遥控器名称你可以按回车使用默认值。接着会进入一个“引导录制”模式让你按遥控器上的任意键来测定一些参数。请按照屏幕提示操作。关键步骤在于“正式录制按键”。程序会提示你依次输入按键名称然后你按下遥控器上对应的键。建议从最常用的键开始如KEY_POWER,KEY_VOLUMEUP,KEY_VOLUMEDOWN,KEY_CHANNELUP,KEY_CHANNELDOWN,KEY_0到KEY_9等。LIRC使用Linux内核的输入事件键码名你可以在网上搜索“Linux input event code names”找到列表。录制完成后会在当前目录生成MyRemote.conf文件。5.2 部署遥控器配置文件将生成的配置文件复制到LIRC的配置目录并重启服务sudo cp MyRemote.conf /etc/lirc/lircd.conf.d/ sudo systemctl start lircd现在再次运行irw按下你录制过的按键你应该能看到如下清晰的输出0000000000ff00ab KEY_POWER MyRemote.conf 0000000000ff00ac KEY_VOLUMEUP MyRemote.conf这表示LIRC已经成功识别了你的遥控器按键避坑技巧录制过程中的常见问题irrecord无反应或报错“Could not find gap”。这通常是因为环境光干扰或遥控器信号太弱。尝试在较暗的环境下操作确保遥控器离接收头近一些10-20厘米并且遥控器电池电量充足。录制的按键在irw中无法识别。检查MyRemote.conf文件格式是否正确。有时irrecord生成的头部信息如namebits可能有误。可以找一个已知可用的配置文件如/usr/share/lirc/remotes/下的文件参考其格式。更简单的方法是使用irrecord的--disable-namespace选项避免复杂的命名空间检查irrecord --disable-namespace -d /dev/lirc0 MyRemote.conf。多个遥控器冲突。如果你有多个.conf文件LIRC会加载目录下所有文件。irw输出的每一行末尾都标明了信号来源的配置文件便于区分。6. 使用Python3控制与集成应用让LIRC在命令行下工作只是第一步我们的最终目标是在自己的Python程序里响应遥控器事件。这里有个大坑必须使用Python3。因为从Buster开始系统默认的Python是Python3python-lirc包也只适配了Python3。用Python2会提示找不到lirc模块。6.1 安装Python3的LIRC客户端库首先安装必要的包sudo apt install python3-lirc这个包提供了lirc模块的Python3绑定。6.2 编写一个简单的Python监听脚本创建一个Python文件比如ir_listener.py#!/usr/bin/env python3 import lirc import time # 初始化LIRC客户端使用默认的socket路径 client lirc.Client() print(红外遥控监听器已启动。按下遥控器按键...) try: while True: # 非阻塞方式读取按键代码超时时间0.2秒 code client.nextcode(timeout0.2) if code: # code是一个列表例如 [KEY_VOLUMEUP] key code[0] print(f接收到按键: {key}) # 在这里添加你的业务逻辑 if key KEY_POWER: print(执行关机或待机操作...) # os.system(sudo shutdown -h now) elif key KEY_VOLUMEUP: print(音量增加) elif key KEY_VOLUMEDOWN: print(音量减少) time.sleep(0.01) # 短暂休眠降低CPU占用 except KeyboardInterrupt: print(\n程序退出。)这个脚本创建了一个LIRC客户端在一个循环中不断检查是否有新的红外按键事件。client.nextcode()方法会返回一个列表里面是识别出的按键名。你可以根据不同的按键名触发不同的函数实现控制逻辑。6.3 配置LIRC的运行时连接文件~/.lircrc默认情况下python-lirc会尝试从LIRC守护进程读取已经解码的按键事件。但有时我们需要一个更简单的映射这就是~/.lircrc文件的作用。它可以为不同应程序定义不同的按键行为但对于我们直接用Python库的情况通常不是必须的。上面脚本中的lirc.Client()默认会连接LIRC socket并读取全局按键事件。如果你希望Python脚本只响应特定遥控器的特定按键并且进行更复杂的处理可配置~/.lircrc。但更现代、更推荐的做法是像上面脚本那样在Python代码内部进行按键分发和处理这样更灵活依赖也更少。6.4 赋予Python脚本权限并测试保存脚本后赋予执行权限并运行chmod x ir_listener.py python3 ir_listener.py现在按下遥控器按键你应该能在终端看到对应的输出信息。恭喜你你已经成功用Python程序接管了红外遥控7. 红外发射功能配置可选除了接收树莓派还可以通过红外LED发射信号变身万能遥控器控制电视、空调等传统红外设备。这需要额外的硬件一个红外发射二极管IRED和一个NPN三极管如2N2222或一个电阻来驱动因为GPIO口的电流驱动能力有限。7.1 硬件连接发射电路一个简单的驱动电路如下树莓派 GPIO 18BCM-1kΩ电阻-NPN三极管2N2222的基极B。三极管的发射极E-树莓派GND。三极管的集电极C-红外发射二极管的负极短脚/平边。红外发射二极管的正极长脚-一个100Ω左右的限流电阻-树莓派3.3V或5V使用5V时限流电阻值需相应调整确保电流在20-50mA。警告直接连接GPIO到LED可能会烧毁GPIO口。务必使用三极管或专用驱动芯片如ULN2003进行电流放大。7.2 软件配置启用发射功能编辑/boot/config.txt在接收配置的下一行添加发射配置dtoverlaygpio-ir,gpio_pin17 dtoverlaygpio-ir-tx,gpio_pin18这里gpio_pin18指定了发射引脚。重要在测试阶段确保LIRC服务只使用一种模式接收或发射否则可能冲突。在最终使用Python控制时可以同时启用。7.3 使用irsend发送信号首先你需要有一个目标设备的遥控器配置文件.conf。你可以用irrecord录制或者从LIRC的数据库irdb.getmyremote.com或开源项目如lirc-remotes包中寻找。假设你有一个录制好的电视配置文件TV.conf放在/etc/lirc/lircd.conf.d/并且里面定义了一个KEY_POWER的编码。重启lircd服务后就可以使用irsend命令发送# 列出该配置文件中可发送的所有按键 irsend LIST TV.conf # 发送一次电源键信号 irsend SEND_ONCE TV.conf KEY_POWER如果一切正常你的电视应该会响应这个开机或关机命令。7.4 在Python中发送红外信号同样我们可以用Python来实现#!/usr/bin/env python3 import lirc client lirc.Client() # 发送一次KEY_POWER命令使用‘TV.conf’配置文件中定义的编码 client.send_once(TV.conf, KEY_POWER)这样你就可以用Python脚本编程控制所有红外设备了实现自动化场景比如“晚上10点自动关电视”。8. 故障排查与进阶技巧实录即使按照步骤操作也可能会遇到各种问题。这里把我遇到过的高频问题及解决方案整理出来。8.1 问题速查表问题现象可能原因排查步骤与解决方案mode2无任何输出1. 硬件连接错误或松动。2.config.txt配置未生效。3. 遥控器没电或不对准。4. 环境光干扰太强。1. 重新检查接线特别是VCC是否为3.3V。2. 确认config.txt修改已保存并执行了sudo reboot。3. 换电池近距离正对接收头测试。4. 在较暗环境下测试或给接收头加个遮光罩。mode2报错“cannot open /dev/lirc0”1. 设备节点不存在。2. 用户权限不足。1. 检查dtoverlay是否加载dmesg | grep gpio_ir。2. 将用户加入video和input组sudo usermod -a -G video,input pi注销后重新登录。irw无输出但mode2有1. LIRC服务 (lircd) 未运行或配置错误。2. 没有对应的遥控器配置文件 (.conf)。1. 运行sudo systemctl status lircd检查服务状态。重启服务sudo systemctl restart lircd。2. 确保你的.conf文件在/etc/lirc/lircd.conf.d/目录并且文件名以.conf结尾。Python脚本报错“ModuleNotFoundError: No module named lirc”使用了Python2解释器。务必使用python3命令运行脚本。检查脚本首行是否为#!/usr/bin/env python3。irsend发送失败提示“hardware does not support sending”1. 发射引脚未在config.txt中正确启用。2. 发射硬件电路有问题。3. LIRC版本或配置问题。1. 确认dtoverlaygpio-ir-tx,gpio_pin18已添加且未注释。2. 用万用表检查发射电路确保LED在发送信号时会微弱发光肉眼可能看不见可用手机摄像头观察。3. 尝试停止lircd后用mode2测试接收功能是否正常以排除软件配置问题。8.2 性能优化与稳定性建议降低CPU占用在Python监听循环中即使使用timeout参数频繁调用nextcode()也可能占用CPU。更高效的方式是使用lirc的set_blocking(False)或事件循环如select模型但这需要更复杂的代码。对于简单应用加上一个小的time.sleep(0.01)足够。应对信号干扰日光灯、LED灯都可能发出红外干扰。给VS1838b套上一个黑色的热缩管或者用电工胶带包裹只留前端透镜可以显著提高抗干扰能力。多遥控器支持LIRC可以同时加载多个.conf文件。irw的输出会包含来源文件名。在Python中你可以通过client.nextcode()返回的原始代码而不仅仅是按键名来判断信号来自哪个遥控器实现更复杂的多设备控制逻辑。系统服务化如果你希望Python控制脚本开机自启最好将其制作成systemd服务而不是简单扔进rc.local。这样可以更好地管理日志、依赖和生命周期。红外遥控作为一项经典技术在智能家居和物联网DIY项目中依然有不可替代的价值。它成本低廉、协议成熟是控制老旧家电的完美桥梁。通过树莓派和LIRC我们不仅实现了接收与发射更重要的是获得了一个可编程的红外控制中心。你可以将本文的代码与Home Assistant、Node-RED等平台结合实现“语音控制空调”、“离家自动关闭所有红外设备”等高级场景。
树莓派红外遥控配置指南:从驱动到Python控制全流程
1. 项目概述与红外技术基础给树莓派加个红外遥控功能这事儿听起来挺酷但真动手配置起来不少朋友都卡在了驱动和软件配置上。尤其是在Raspbian升级到Buster版本之后网上很多老教程直接“失效”照着做十有八九会报错。核心原因在于内核的红外驱动从传统的lirc-rpi模块换成了更现代的gpio-ir驱动整个配置逻辑和文件结构都变了。我折腾了好几个项目从媒体中心到智能家居的万能遥控器踩遍了新旧版本交替的坑终于摸清了在最新系统上稳定配置LIRCLinux InfraRed Control的门道。这篇文章我就把从硬件连接到软件配置再到用Python3写控制脚本的完整流程以及那些教程里不会写的避坑细节给你一次性讲明白。无论你是想用树莓派控制电视、空调还是DIY一个智能红外网关这套方案都能让你快速上手。简单说说红外遥控是咋工作的。你手里的遥控器每个按键都对应一组独特的“脉冲密码”。当你按下按键时遥控器内部的LED会以特定的频率通常是38kHz闪烁把这组“密码”用红外光发出去。接收头比如我们用的VS1838b捕获到这束光经过内部解调输出对应的电脉冲信号给树莓派。树莓派通过GPIO口读取这些脉冲的“高电平”pulse和“低电平”space的持续时间LIRC再将这些时间序列解码成我们能够识别的按键符号。整个过程就像在用电报收发莫尔斯码只不过载体是看不见的红外光。2. 硬件准备与连接要点工欲善其事必先利其器。硬件部分很简单但连接错了轻则没反应重则可能损坏设备。你需要准备三样东西一个树莓派3B、4B、Zero系列都行、一个VS1838b红外接收头这是最常用、性价比最高的型号、几根母对母的杜邦线。2.1 认识VS1838b接收头这个黑色的小方块有三个引脚正面看有半球形凸起或“X”形标记的那一面朝向自己从左到右分别是输出OUT、地GND、电源VCC。它的工作电压是3.3V和树莓派GPIO口的逻辑电平完美匹配千万别接5V会烧输出脚是集电极开路输出内部已经接了上拉电阻所以直接连接到GPIO输入脚即可。2.2 正确的接线方案我强烈建议使用BCM编号来指代GPIO引脚因为这是软件层面通用的编号方式比物理引脚编号更可靠。我们选择GPIO 17BCM编号对应物理引脚第11针作为信号输入。接线如下VS1838b 输出脚左-树莓派 GPIO 17BCM。我用黄色线提醒自己这是信号线。VS1838b 地脚中-树莓派任一GND引脚。我用黑色线。VS1838b 电源脚右-树莓派 3.3V 电源引脚。我用红色线。注意务必确保电源是3.3V树莓派上标有“3V3”的引脚。接错到5V引脚会瞬间损坏接收头。接好后可以给接收头套个热缩管或者用胶固定一下避免短路。2.3 硬件连接检查清单动手前快速过一遍[ ] 树莓派已关机。[ ] 使用母对母杜邦线连接牢固。[ ] VS1838b正面有透镜的一面朝向预计的遥控器方向无遮挡。[ ] 3.3V和GND没有接反。[ ] 信号线连接到了正确的GPIO口BCM 17。硬件连接就这么简单。接下来才是重头戏软件配置。新旧系统的差异主要就在这里。3. 系统配置与LIRC驱动安装系统配置的核心就两个文件/boot/config.txt和/etc/lirc/lirc_options.conf。很多错误都源于对这两个文件的错误修改。我们假设你已经在树莓派上安装了最新的Raspbian Buster或Bullseye系统并已经通过SSH或桌面环境打开了终端。3.1 启用内核gpio-ir驱动首先我们需要告诉树莓派内核我们要使用哪个GPIO口来接收红外信号。这通过编辑/boot/config.txt文件实现。这个文件在启动时被读取用于加载硬件叠加层Device Tree Overlay。sudo nano /boot/config.txt使用方向键滚动找到类似[all]或文件末尾添加如下一行dtoverlaygpio-ir,gpio_pin17这行配置的意思是加载gpio-ir这个驱动叠加层并指定红外接收引脚为GPIO 17BCM编号。如果你用的是其他GPIO口比如18就把17改成18。重要提示你可能会在网上看到被注释掉的#dtoverlaylirc-rpi。在Buster及以后版本中绝对不要取消这行的注释也不要使用它。lirc-rpi是旧的驱动与新的gpio-ir驱动冲突会导致设备无法正常工作。我们的方案完全基于新的gpio-ir驱动。3.2 安装LIRC软件包接下来安装LIRC的用户态软件它负责与内核驱动通信并解码信号。sudo apt update sudo apt install lirc安装过程通常很顺利。但在某些较早的Buster镜像中安装后LIRC服务可能会启动失败并提示缺少lirc_options.conf文件。这是因为安装包提供的配置文件有一个.dist后缀。如果遇到这个问题或者安装后你想确认一下可以执行sudo systemctl status lircd如果看到“Active: failed”并提示找不到lirc_options.conf就需要手动处理一下配置文件。3.3 配置LIRC选项LIRC的主要配置文件是/etc/lirc/lirc_options.conf。我们需要确保它指向正确的驱动和设备。sudo nano /etc/lirc/lirc_options.conf找到以下两行关键配置driver default device /dev/lirc0确保它们就是如上所示。driver default会让LIRC自动选择与系统匹配的最佳驱动对于gpio-ir就是devinput驱动。device /dev/lirc0指定了红外设备节点。在gpio-ir驱动下正确的设备节点可能是/dev/input/event0或event1等但LIRC通过devinput驱动封装后仍然会使用/dev/lirc0这个抽象接口这样上层应用就不需要关心底层变化。实操心得在最新版本的Raspbian中lirc_options.conf文件通常已经正确生成无需修改。如果你发现这个文件不存在可以检查是否有/etc/lirc/lirc_options.conf.dist。如果有将其重命名即可sudo mv /etc/lirc/lirc_options.conf.dist /etc/lirc/lirc_options.conf。这个步骤在2021年10月后的系统更新中已基本不需要。3.4 重启并验证驱动加载完成上述配置后保存文件重启树莓派让config.txt的修改生效。sudo reboot重启后通过以下命令检查gpio-ir驱动是否成功加载以及设备节点是否存在# 检查内核模块是否加载 dmesg | grep gpio_ir # 你应该能看到类似 “gpio_ir_recv gpio_ir12: GPIO IR remote receiver on GPIO17” 的信息。 # 检查设备节点 ls -l /dev/lirc0 # 应该显示为一个字符设备文件例如 “crw-rw---- 1 root video 248, 0 ... /dev/lirc0”如果/dev/lirc0不存在但/dev/input/event*中有新的设备也属于正常情况这表示gpio-ir驱动以input子系统的方式工作了LIRC的devinput驱动会去读取它。不过为了兼容性LIRC服务通常会创建/dev/lirc0这个符号链接或节点。4. 测试红外信号接收硬件连好了软件也配置了现在来测试遥控器信号是否能被正确接收。这是验证整个链路是否畅通的关键一步。4.1 停止LIRC守护进程进行原始测试在测试时我们需要先停止lircd服务因为它会独占红外设备。我们使用mode2这个工具来显示原始的脉冲pulse和空格space时序。sudo systemctl stop lircd sudo mode2 -d /dev/lirc0现在拿起你的任意红外遥控器电视、空调、机顶盒的都行对准VS1838b接收头按下任意按键。如果一切正常终端会开始快速滚动输出类似下面的内容space 1637 pulse 959 space 400 pulse 959 ...每一行代表一个电平变化。“pulse”后的数字是本次高电平持续的微秒数“space”后的数字是低电平持续的微秒数。这一长串数字就是你的遥控器按键的“指纹”。常见问题1运行mode2后无任何输出。首先检查接线特别是信号线是否接在了GPIO 17或你指定的引脚。其次确认config.txt中的dtoverlay配置已保存并生效重启过。然后尝试使用--raw模式因为新驱动可能更兼容这种模式sudo mode2 --raw -d /dev/lirc0如果提示设备不支持--raw可以去掉--raw试试。如果还不行检查设备权限ls -l /dev/lirc0确保用户有读写权限。有时需要将用户加入video或input组sudo usermod -a -G video,input pi然后重新登录。4.2 使用更清晰的格式查看默认的mode2输出可能比较杂乱。可以加上-m参数以微秒为单位显示更规整的数值sudo mode2 -m -d /dev/lirc0输出会变成纯数字更容易被后续的录制工具解析1520 950 400 950 400 950 400 950 400 950 1200 950 ...4.3 重启LIRC服务并测试解码原始信号有了说明硬件和底层驱动是好的。接下来测试LIRC服务能否正常运行并解码。首先退出mode2按 CtrlC然后启动lircd服务并用irw工具监听解码后的按键事件。sudo systemctl start lircd sudo irw再次按下遥控器按键。如果配置了正确的遥控器配置文件irw会输出解码后的按键名。但初次使用我们还没有配置所以可能没输出或输出乱码。这没关系只要irw没有报错并且按遥控器时终端有反应比如光标闪烁或换行就说明LIRC服务运行正常只是还不知道如何解读你的遥控器信号。至此红外接收的底层通道已经完全打通。下一步就是“教”树莓派认识你的遥控器。5. 录制与配置自定义遥控器LIRC自带一个数据库里面有很多常见遥控器的配置但不可能涵盖所有型号尤其是一些山寨或小众设备。因此学会录制自己的遥控器配置是必备技能。5.1 使用irrecord录制新配置irrecord是LIRC配套的录制工具。它会引导你依次按下遥控器上的按键记录下它们的信号特征并生成一个.conf配置文件。这个文件通常放在/etc/lirc/lircd.conf.d/目录下。开始录制前确保lircd服务是停止的以免干扰sudo systemctl stop lircd然后运行irrecord。我建议将配置文件先保存在家目录测试成功后再移到系统目录cd ~ irrecord -d /dev/lirc0 MyRemote.conf程序会首先提示你输入一些配置名称如遥控器名称你可以按回车使用默认值。接着会进入一个“引导录制”模式让你按遥控器上的任意键来测定一些参数。请按照屏幕提示操作。关键步骤在于“正式录制按键”。程序会提示你依次输入按键名称然后你按下遥控器上对应的键。建议从最常用的键开始如KEY_POWER,KEY_VOLUMEUP,KEY_VOLUMEDOWN,KEY_CHANNELUP,KEY_CHANNELDOWN,KEY_0到KEY_9等。LIRC使用Linux内核的输入事件键码名你可以在网上搜索“Linux input event code names”找到列表。录制完成后会在当前目录生成MyRemote.conf文件。5.2 部署遥控器配置文件将生成的配置文件复制到LIRC的配置目录并重启服务sudo cp MyRemote.conf /etc/lirc/lircd.conf.d/ sudo systemctl start lircd现在再次运行irw按下你录制过的按键你应该能看到如下清晰的输出0000000000ff00ab KEY_POWER MyRemote.conf 0000000000ff00ac KEY_VOLUMEUP MyRemote.conf这表示LIRC已经成功识别了你的遥控器按键避坑技巧录制过程中的常见问题irrecord无反应或报错“Could not find gap”。这通常是因为环境光干扰或遥控器信号太弱。尝试在较暗的环境下操作确保遥控器离接收头近一些10-20厘米并且遥控器电池电量充足。录制的按键在irw中无法识别。检查MyRemote.conf文件格式是否正确。有时irrecord生成的头部信息如namebits可能有误。可以找一个已知可用的配置文件如/usr/share/lirc/remotes/下的文件参考其格式。更简单的方法是使用irrecord的--disable-namespace选项避免复杂的命名空间检查irrecord --disable-namespace -d /dev/lirc0 MyRemote.conf。多个遥控器冲突。如果你有多个.conf文件LIRC会加载目录下所有文件。irw输出的每一行末尾都标明了信号来源的配置文件便于区分。6. 使用Python3控制与集成应用让LIRC在命令行下工作只是第一步我们的最终目标是在自己的Python程序里响应遥控器事件。这里有个大坑必须使用Python3。因为从Buster开始系统默认的Python是Python3python-lirc包也只适配了Python3。用Python2会提示找不到lirc模块。6.1 安装Python3的LIRC客户端库首先安装必要的包sudo apt install python3-lirc这个包提供了lirc模块的Python3绑定。6.2 编写一个简单的Python监听脚本创建一个Python文件比如ir_listener.py#!/usr/bin/env python3 import lirc import time # 初始化LIRC客户端使用默认的socket路径 client lirc.Client() print(红外遥控监听器已启动。按下遥控器按键...) try: while True: # 非阻塞方式读取按键代码超时时间0.2秒 code client.nextcode(timeout0.2) if code: # code是一个列表例如 [KEY_VOLUMEUP] key code[0] print(f接收到按键: {key}) # 在这里添加你的业务逻辑 if key KEY_POWER: print(执行关机或待机操作...) # os.system(sudo shutdown -h now) elif key KEY_VOLUMEUP: print(音量增加) elif key KEY_VOLUMEDOWN: print(音量减少) time.sleep(0.01) # 短暂休眠降低CPU占用 except KeyboardInterrupt: print(\n程序退出。)这个脚本创建了一个LIRC客户端在一个循环中不断检查是否有新的红外按键事件。client.nextcode()方法会返回一个列表里面是识别出的按键名。你可以根据不同的按键名触发不同的函数实现控制逻辑。6.3 配置LIRC的运行时连接文件~/.lircrc默认情况下python-lirc会尝试从LIRC守护进程读取已经解码的按键事件。但有时我们需要一个更简单的映射这就是~/.lircrc文件的作用。它可以为不同应程序定义不同的按键行为但对于我们直接用Python库的情况通常不是必须的。上面脚本中的lirc.Client()默认会连接LIRC socket并读取全局按键事件。如果你希望Python脚本只响应特定遥控器的特定按键并且进行更复杂的处理可配置~/.lircrc。但更现代、更推荐的做法是像上面脚本那样在Python代码内部进行按键分发和处理这样更灵活依赖也更少。6.4 赋予Python脚本权限并测试保存脚本后赋予执行权限并运行chmod x ir_listener.py python3 ir_listener.py现在按下遥控器按键你应该能在终端看到对应的输出信息。恭喜你你已经成功用Python程序接管了红外遥控7. 红外发射功能配置可选除了接收树莓派还可以通过红外LED发射信号变身万能遥控器控制电视、空调等传统红外设备。这需要额外的硬件一个红外发射二极管IRED和一个NPN三极管如2N2222或一个电阻来驱动因为GPIO口的电流驱动能力有限。7.1 硬件连接发射电路一个简单的驱动电路如下树莓派 GPIO 18BCM-1kΩ电阻-NPN三极管2N2222的基极B。三极管的发射极E-树莓派GND。三极管的集电极C-红外发射二极管的负极短脚/平边。红外发射二极管的正极长脚-一个100Ω左右的限流电阻-树莓派3.3V或5V使用5V时限流电阻值需相应调整确保电流在20-50mA。警告直接连接GPIO到LED可能会烧毁GPIO口。务必使用三极管或专用驱动芯片如ULN2003进行电流放大。7.2 软件配置启用发射功能编辑/boot/config.txt在接收配置的下一行添加发射配置dtoverlaygpio-ir,gpio_pin17 dtoverlaygpio-ir-tx,gpio_pin18这里gpio_pin18指定了发射引脚。重要在测试阶段确保LIRC服务只使用一种模式接收或发射否则可能冲突。在最终使用Python控制时可以同时启用。7.3 使用irsend发送信号首先你需要有一个目标设备的遥控器配置文件.conf。你可以用irrecord录制或者从LIRC的数据库irdb.getmyremote.com或开源项目如lirc-remotes包中寻找。假设你有一个录制好的电视配置文件TV.conf放在/etc/lirc/lircd.conf.d/并且里面定义了一个KEY_POWER的编码。重启lircd服务后就可以使用irsend命令发送# 列出该配置文件中可发送的所有按键 irsend LIST TV.conf # 发送一次电源键信号 irsend SEND_ONCE TV.conf KEY_POWER如果一切正常你的电视应该会响应这个开机或关机命令。7.4 在Python中发送红外信号同样我们可以用Python来实现#!/usr/bin/env python3 import lirc client lirc.Client() # 发送一次KEY_POWER命令使用‘TV.conf’配置文件中定义的编码 client.send_once(TV.conf, KEY_POWER)这样你就可以用Python脚本编程控制所有红外设备了实现自动化场景比如“晚上10点自动关电视”。8. 故障排查与进阶技巧实录即使按照步骤操作也可能会遇到各种问题。这里把我遇到过的高频问题及解决方案整理出来。8.1 问题速查表问题现象可能原因排查步骤与解决方案mode2无任何输出1. 硬件连接错误或松动。2.config.txt配置未生效。3. 遥控器没电或不对准。4. 环境光干扰太强。1. 重新检查接线特别是VCC是否为3.3V。2. 确认config.txt修改已保存并执行了sudo reboot。3. 换电池近距离正对接收头测试。4. 在较暗环境下测试或给接收头加个遮光罩。mode2报错“cannot open /dev/lirc0”1. 设备节点不存在。2. 用户权限不足。1. 检查dtoverlay是否加载dmesg | grep gpio_ir。2. 将用户加入video和input组sudo usermod -a -G video,input pi注销后重新登录。irw无输出但mode2有1. LIRC服务 (lircd) 未运行或配置错误。2. 没有对应的遥控器配置文件 (.conf)。1. 运行sudo systemctl status lircd检查服务状态。重启服务sudo systemctl restart lircd。2. 确保你的.conf文件在/etc/lirc/lircd.conf.d/目录并且文件名以.conf结尾。Python脚本报错“ModuleNotFoundError: No module named lirc”使用了Python2解释器。务必使用python3命令运行脚本。检查脚本首行是否为#!/usr/bin/env python3。irsend发送失败提示“hardware does not support sending”1. 发射引脚未在config.txt中正确启用。2. 发射硬件电路有问题。3. LIRC版本或配置问题。1. 确认dtoverlaygpio-ir-tx,gpio_pin18已添加且未注释。2. 用万用表检查发射电路确保LED在发送信号时会微弱发光肉眼可能看不见可用手机摄像头观察。3. 尝试停止lircd后用mode2测试接收功能是否正常以排除软件配置问题。8.2 性能优化与稳定性建议降低CPU占用在Python监听循环中即使使用timeout参数频繁调用nextcode()也可能占用CPU。更高效的方式是使用lirc的set_blocking(False)或事件循环如select模型但这需要更复杂的代码。对于简单应用加上一个小的time.sleep(0.01)足够。应对信号干扰日光灯、LED灯都可能发出红外干扰。给VS1838b套上一个黑色的热缩管或者用电工胶带包裹只留前端透镜可以显著提高抗干扰能力。多遥控器支持LIRC可以同时加载多个.conf文件。irw的输出会包含来源文件名。在Python中你可以通过client.nextcode()返回的原始代码而不仅仅是按键名来判断信号来自哪个遥控器实现更复杂的多设备控制逻辑。系统服务化如果你希望Python控制脚本开机自启最好将其制作成systemd服务而不是简单扔进rc.local。这样可以更好地管理日志、依赖和生命周期。红外遥控作为一项经典技术在智能家居和物联网DIY项目中依然有不可替代的价值。它成本低廉、协议成熟是控制老旧家电的完美桥梁。通过树莓派和LIRC我们不仅实现了接收与发射更重要的是获得了一个可编程的红外控制中心。你可以将本文的代码与Home Assistant、Node-RED等平台结合实现“语音控制空调”、“离家自动关闭所有红外设备”等高级场景。