用Arduino捕获红外信号,打造手机万能遥控器 1. 项目概述从物理遥控器到手机里的万能钥匙家里遥控器越来越多电视、空调、机顶盒、风扇……每个都得单独找有时候旧的坏了还配不到。作为一个喜欢折腾硬件的开发者我一直在想能不能把这些物理遥控器都“数字化”集成到一部手机上特别是对于那些本身就带红外发射器俗称红外炮的手机这想法理论上完全可行。这个项目的核心就是用一块最常见的Arduino开发板作为“信号翻译官”抓取任意红外遥控器发出的原始脉冲信号解析其编码格式然后通过一款名为IRplus的手机应用将这些信号“教”给手机让手机变身成为万能遥控器。整个过程涉及硬件信号捕获、原始数据解析、配置文件编辑和软件集成算是一个软硬件结合的典型小项目非常适合用来理解红外通信的基本原理和动手实践。无论你是想统一管理家里的遥控器还是为你的智能家居项目添加一个低成本的红外控制中枢或者单纯对“逆向工程”遥控信号感兴趣这个方案都提供了一个清晰、可复现的路径。接下来我将拆解从硬件连接到最终可用的手机遥控器的每一个步骤并分享我在实际操作中踩过的坑和总结的技巧。2. 核心原理与硬件选型解析2.1 红外遥控通信是如何工作的在动手之前有必要先搞明白我们到底在复制什么。红外遥控并非直接发送“开机”这个指令而是发送一串由红外光脉冲组成的“密码”。这套密码系统主要包含三个层面载波频率为了减少环境光干扰并提高发射效率红外信号通常会被调制在一个特定频率的载波上。最常见的频率是38kHz这也是绝大多数红外接收头如TSOP1838的默认接收频率。你可以把它理解为通信的“频道”发射和接收必须调谐到同一个频道才能听懂对方的话。编码协议这定义了“密码”的编排规则。不同的厂商采用不同的协议比如常见的NEC、Sony SIRC、RC-5、RC-6等。协议规定了信号如何开始引导码、如何表示逻辑“0”和“1”通过脉冲和间隔的不同时长组合、如何结束以及如何校验。原始脉冲序列这是最底层的物理信号即一长串代表高低电平持续时间以微秒为单位的数值。无论什么协议最终都是由这样的“开-关-开-关…”脉冲序列构成的。我们通过Arduino捕获的正是这一串最原始的“波形”数据。我们的复制策略正是绕过对具体协议的识别和解码直接捕获并重现这串原始的脉冲序列。这种方法被称为“Raw Code”复制其最大优势是通用性强无论遥控器使用何种冷门或自定义协议只要其载波频率在接收头范围内我们都能原样抓取和重放。2.2 硬件清单与选型考量项目所需硬件非常简单主控板Arduino UNO。这是最经典的选择兼容性好资料丰富。实际上任何具有至少一个数字输入引脚和串口通信功能的Arduino板如Nano、Leonardo都可以胜任。我选择UNO是因为其引脚布局清晰方便用杜邦线连接。红外接收头TSOP1838。这是关键部件。型号中的“38”代表其中心接收频率为38kHz。务必确认你购买的是“接收头”三个引脚而不是“发射管”两个引脚。市面上还有TSOP382、VS1838等兼容型号通常可以互换。如果遇到无法接收的情况需要查证具体型号的引脚定义和载波频率。连接线若干杜邦线公对公。用于连接电路。被复制对象任意红外遥控器。电视、空调、风扇遥控器等。发射终端具备红外发射功能的智能手机。这是项目的最终载体。需要明确并非所有手机都配备红外发射器。近年来除了部分小米、华为的旧款机型带有此功能的手机已不多见。在开始项目前请务必确认你的手机是否有此硬件通常位于手机顶部或查阅手机规格说明书。注意红外接收头非常脆弱引脚接反特别是VCC和GND反接或输入电压过高极易导致器件瞬间烧毁。在连接电路前请务必通过搜索引擎查找你手中接收头型号的官方数据手册Datasheet以确认引脚排列。通常面对接收头的球面接收窗从左至右引脚顺序为输出OUT、地GND、电源VCC。但不同封装可能有差异切勿凭猜测连接。3. 软件环境搭建与信号捕获实战3.1 开发环境与核心库配置首先需要在电脑上准备好编程环境。安装Arduino IDE从Arduino官网下载并安装适合你操作系统的IDE版本。安装过程很简单一路下一步即可。安装IRremote库这是本项目最核心的库它封装了红外信号的接收、解码和发送功能。打开Arduino IDE点击“工具” - “管理库…”在库管理器中搜索“IRremote”。你会看到好几个同名或类似库请选择由Arduino-IRremote作者可能是Arduino或z3t0等维护的版本进行安装。这个库社区支持活跃功能完整。3.2 烧录信号捕获程序并连接电路库安装好后我们使用库自带的示例程序来捕获原始信号。打开示例程序在IDE中点击“文件” - “示例” - “IRremote” - “IRrecvDumpV2”。这个程序的功能是持续监听红外信号并将捕获到的详细信息通过串口打印出来。选择开发板与端口用USB线将Arduino UNO连接至电脑。在“工具”菜单中“开发板”选择“Arduino Uno”“端口”选择新出现的那个通常是COMx或/dev/ttyUSBx。编译与上传点击上传按钮向右的箭头将程序烧录到Arduino中。接下来进行硬件连接。请再次确认你的红外接收头引脚定义。以下以最常见的TSOP1838引脚顺序为OUT、GND、VCC为例接收头OUT引脚-Arduino数字引脚11这是IRrecvDumpV2示例程序默认的接收引脚。接收头GND引脚-Arduino的GND引脚。接收头VCC引脚-Arduino的5V引脚。连接完成后整个捕获系统就准备好了。此时Arduino板上的接收头会开始工作。3.3 捕获原始红外信号数据打开Arduino IDE的“串口监视器”工具 - 串口监视器将右下角的波特率设置为115200。拿起你想要复制的遥控器将其红外发射头对准Arduino板上的红外接收头距离几厘米到十几厘米均可避免强光直射按下任意一个按键比如“电源”键。串口监视器会瞬间刷出一大段数据。这串数据包含了协议分析、解码结果但对我们最重要的是这一行unsigned int rawData[67] {8950, 4450, 550, 550, 600, 500, 600, 550, 550, 550, 600, 1650, 600, 1600, 600, 1650, 550, 1650, 600, 1600, 600, 550, 550, 550, 600, 500, 600, 550, 550, 1650, 600, 1600, 600, 1650, 550, 550, 600, 1600, 600, 1650, 550, 1650, 600, 1600, 600, 1650, 550, 1650, 600, 500, 600, 550, 550, 550, 600, 500, 600, 550, 550, 550, 600, 500, 600, 1650, 550};这行rawData数组里面以逗号分隔的几十个甚至上百个数字就是该按键对应的原始红外脉冲时序数据。每个数字代表一个高电平或低电平持续的微秒数。数组的第一个数字通常是引导码的高电平时长。实操心得确保信号质量捕获时如果数据杂乱或出现UNKNOWN协议可能是信号弱或干扰大。尝试① 拉近遥控器与接收头的距离。② 确保遥控器电池电量充足。③ 避免在日光灯、强太阳光等有强烈红外干扰的环境下操作。④ 按下遥控器按键的时间稍长一点1-2秒确保完整信号被捕获。一串干净、稳定的rawData是成功复制的基础。4. 在IRplus中构建遥控器界面4.1 创建遥控器布局模板接下来我们需要在手机上用IRplus应用创建一个“空壳”遥控器界面。安装IRplus在Google Play商店搜索“IRplus Remote”进行安装。它是目前功能最强大、支持Raw Code导入的红外遥控应用之一。新建遥控器打开IRplus点击右下角的“”号或菜单中的“添加”。由于我们是导入自定义原始码不需要它自带的数据库所以可以在品牌列表中选择一个通用的协议比如NEC这只是一个占位符后续会被我们的数据覆盖。其他设置保持默认点击保存。编辑界面现在你得到了一个只有几个默认按钮的遥控器。点击菜单进入“编辑”模式。在这里你可以拖动按钮长按按钮并拖动调整位置。编辑按钮点击某个按钮可以修改其显示的标签如“Power”、“Vol”。删除按钮将按钮拖到屏幕顶部的垃圾桶图标上。添加按钮从底部或侧边的控件栏中将“新按钮”拖到布局网格上。你可以根据原遥控器的样式大致排列好所有需要的按键如电源、音量加减、频道加减、数字键等。按钮的标签和位置现在可以随意设置关键是按钮的数量和顺序要与你计划复制的按键对应好。4.2 导出布局配置文件编辑好布局后保存退出编辑模式。接下来是关键一步导出这个“空壳”的配置文件。在IRplus主界面点击菜单选择“导出”。选择“导出为文件”。系统会提示你选择保存位置你可以将其保存在手机内部存储的容易找到的目录下比如“Download”文件夹。文件后缀名通常是.irplus或.lirc。通过USB数据线将手机连接到电脑将这个导出的配置文件复制到电脑上。我们将在这个文件里“注入”刚才捕获的原始信号数据。5. 数据嫁接将原始信号嵌入配置文件5.1 理解WINLIRC格式IRplus导出的配置文件遵循一种名为WINLIRC的格式。这是一种文本格式用于定义遥控器的按钮和其对应的红外码。对于我们使用的Raw Code模式文件中对一个按钮的定义通常类似这样begin remote name My_Duplicate_Remote flags RAW_CODES eps 30 aeps 100 gap 45000 begin raw_codes name KEY_POWER 8950 4450 550 550 600 500 600 550 ... (后续数字省略) name KEY_VOLUMEUP 9000 4400 600 500 600 550 550 550 ... (后续数字省略) end raw_codes end remote我们需要做的就是把从串口监视器里捕获的那一串用大括号{}包裹、以逗号分隔的rawData数组转换成用空格分隔、并放入对应按钮name下的数字序列。5.2 数据处理与文件编辑实战提取并清洗数据从串口监视器中复制unsigned int rawData[XX] { ... };这一整行。将其粘贴到一个纯文本编辑器如VS Code、Notepad甚至Windows自带的记事本中。删除unsigned int rawData[XX] {和结尾的};只保留大括号内部的内容例如8950, 4450, 550, 550, 600, 500, ... , 550。使用文本编辑器的“查找和替换”功能将所有的逗号,可能包含空格替换为一个空格 。替换后数据应该变成8950 4450 550 550 600 500 ... 550。务必检查首尾没有多余的逗号或空格。注入配置文件用文本编辑器打开从手机复制出来的.irplus配置文件。找到文件中begin raw_codes和end raw_codes之间的部分。这里应该已经有一些示例按钮对应你在IRplus里创建的按钮。将第一个按钮比如你命名为“POWER”的按钮下的那行示例数字序列整体替换成你处理好的第一组原始数据即遥控器电源键的数据。严格保持格式确保每个数字之间只有一个空格并且该行数据紧跟在name BUTTON_NAME的下一行并且前面有固定的缩进通常是空格或制表符。参照文件中已有的格式即可。重复这个过程将你捕获的每一个按键的原始数据按顺序替换到配置文件中对应的按钮下。避坑指南数据对齐与备份顺序对应务必记录好你捕获数据的顺序与IRplus中按钮的对应关系。建议在电脑上先列一个清单例如1. 电源键数据 - “KEY_POWER”2. 音量数据 - “KEY_VOLUP”。替换时逐一核对防止张冠李戴。备份原文件在编辑配置文件前先复制一份备份。错误的编辑可能导致IRplus无法识别该文件。检查数据长度有时捕获的数据数组长度会略有波动。只要数据是完整、稳定的一次捕获结果直接使用即可。WINLIRC格式对Raw Code的长度没有固定要求。保存编辑后的配置文件。6. 导入与测试完成手机遥控器克隆6.1 导入配置文件至手机将编辑好的配置文件从电脑复制回手机存储的原目录或者任何IRplus能够访问的目录。在手机IRplus应用中为了干净导入建议先删除之前创建的测试遥控器进入菜单 - “删除遥控器”选择并确认删除。导入新配置点击菜单 - “导入” - “从文件”然后在文件浏览器中找到并选择你刚才编辑好的配置文件。如果一切格式正确IRplus会成功导入并显示你自定义布局的遥控器界面。6.2 功能测试与问题排查现在到了最激动人心的测试环节。用你的手机对准原来那台被控制的设备比如电视点击屏幕上对应的按钮比如“电源”。理想情况设备应声而动电视开机或关机。恭喜你克隆成功常见问题与排查如果设备没有反应请按以下步骤排查问题现象可能原因排查与解决思路手机按键无任何反应1. 手机无红外硬件。2. IRplus未获得红外权限。3. 配置文件格式错误导入失败。1.确认手机硬件这是前提。可尝试用其他红外遥控APP测试。2. 检查手机设置中IRplus的权限。3. 重新检查配置文件格式特别是begin/end raw_codes区块的缩进和空格。可先导入一个未修改的导出文件测试导入功能是否正常。手机有发射指示如屏幕闪紫光但设备不响应1.原始信号捕获不完整或错误最常见。2. 载波频率不匹配。3. 发射功率不足或角度问题。1.重点检查重新捕获原始信号确保遥控器对准、距离近、环境光干扰小。对比两次捕获的rawData开头部分是否一致。2. 大部分设备是38kHz但极少数可能用其他频率如40kHz。TSOP1838只对38kHz最佳。可尝试更换接收头型号或查阅设备说明书。3. 将手机红外发射头几乎贴住设备的红外接收窗进行测试排除角度和距离问题。部分按键有效部分无效1. 配置文件内数据与按钮名称对应错误。2. 捕获某些按键时信号质量差。1. 逐一核对配置文件确保每个按钮下的数据是来自正确的物理按键。2. 对无效的按键单独重新捕获数据并替换配置文件中的对应部分。设备响应错误如按开机键却调音量配置文件内数据与按钮绑定错误。检查配置文件确认数据与按钮标签的对应关系是否正确。终极调试技巧逻辑分析仪视角如果以上步骤都无法解决可以尝试用最“笨”但最可靠的方法验证用Arduino将捕获的信号原样发回去。修改Arduino代码将捕获的rawData数组用irsend.sendRaw(rawData, sizeof(rawData)/sizeof(rawData[0]), 38)函数发送需连接一个红外发射管到指定引脚。如果这样设备能响应说明数据本身是正确的问题出在IRplus配置或手机发射环节。如果这样也不能响应那一定是数据捕获环节出了问题。这个方法隔离了手机APP这个变量是定位问题的利器。7. 项目扩展与进阶应用思考完成基础克隆后这个项目还可以玩出更多花样打造智能红外网关将Arduino换成NodeMCUESP8266或ESP32这类带Wi-Fi的开发板。捕获并存储所有遥控码后你可以编写一个简单的Web服务器程序。这样你就可以通过手机浏览器或任何联网设备在家庭局域网内控制这些红外设备甚至集成到Home Assistant等智能家居平台中实现语音控制、场景联动。学习协议解码除了使用Raw CodeIRremote库本身支持解析多种常见协议。你可以修改代码直接读取解码后的协议类型如NEC和按键码一个16进制数。这种方式得到的数据量小更适合存储和网络传输。通过串口观察不同协议解码后的结果能更深入地理解红外通信的编码逻辑。创建万能学习型遥控器结合一个OLED屏幕和几个按键你可以用Arduino做一个独立的、可学习多个遥控器按键的物理万能遥控器。将捕获的Raw Code数据存入EEPROM或SD卡需要时调出并发射。信号分析与模拟对于连续按压如音量长按或复杂协议如空调遥控器一次发送模式、温度、风速等多个参数其信号可能由多个帧组成。通过分析串口输出的原始波形你可以研究这些信号的规律并尝试用程序模拟出完整的控制序列。这个项目从硬件连接到软件配置完整地走通了一条“物理信号-数字数据-手机应用”的路径。它不仅仅是一个复制遥控器的技巧更是一个理解无线通信底层原理、练习软硬件调试能力的绝佳入门实验。最大的成就感莫过于看着自己“调教”好的手机成功掌控家中那些老设备的那一刻。