1. 项目切入点与整体设计选择
Part 1 做完,我手里的 iPad 已经能通过音频口输出一段红外载波,把 940nm 的红外发光管点亮。但坦白讲,那时候离“能做日常遥控器”还很远:亮归亮,发送出来的信号接收端不认,家里的电视、空调没有一个理它。到了 Part 2,目标就很具体了:把“发光”变成“发码”,让 iPad 真正取代茶几上那三四个遥控器。也就是说,要实现原遥控器信号的学习、识别、回放,并管理一组可以随时增删的设备码库。
1.1 从第1部分到第2部分:目标从“能亮”变成“能控”
红外遥控是生活里最容易被忽略但无处不在的协议。电视、空调、投影、风扇、机顶盒,几乎全是红外。iPad 做遥控器,一是屏幕足够大,可以按设备展示全键盘,不用来回翻找实体遥控器;二是不受实体按键数量限制,想加多少自定义按钮都行;三是整个链路 DIY,出了任何问题都能从底层查起。这种掌控感是成品智能遥控器给不了的,也是我一直愿意把这套东西折腾下去的原因。
第二部分的推进我按三条线走:硬件线负责把发射电路和接收电路调稳;软件线负责协议帧的构造、识别和回放;应用线负责码库和 UI。三条线最后合并成一条完整链路。这么划分是有讲究的——红外遥控最大的变量不在硬件,而在协议。同一台电视,信号源切到 HDMI 和切到本地播放时,遥控码可能完全不同;空调遥控器更是各品牌“各自为政”,有的帧长超过 100ms,有的一个命令要发送好几个字节。如果一上来就先做界面,很容易被协议细节拖到返工。先把协议链路验证通,再补 UI,反而是最快路径。
这个项目适合两类人。一类是想把闲置 iPad 或老手机重新利用起来的硬件玩家,另一类是想实打实理解红外遥控协议、接触音频波形处理的软件开发者。前者可以直接参考硬件电路和码库设计,后者可以重点看协议实现和问题排查部分。两边不冲突,本文尽量都覆盖到。
1.2 方案选型:为什么坚持音频口路线
我最终依然采用音频口方案,没有直接转投 ESP32+WiFi 的桥接系统,原因是 Part 1 已经在这条路上投了基础电路,而且音频方案的优点很实际:每一段载波都能直接在音频波形上看到,调试时“所见即所得”。比如你发一个 NEC 逻辑 1,示波器上能看到约 2.25ms 的载波包络,再对应 0.56ms 的静音,整个协议是透明的、可观察的。这对理解协议本身帮助很大,尤其是第一次接触红外遥控的新手。
当然,音频方案也有明显的短板,最大的问题是现代 iPad 大多只剩 USB-C 或 Lightning 口,3.5mm 耳机孔已经没了,必须借助外置音频适配器。适配器内部的 DAC 和滤波电路会对高频载波造成衰减,这个坑我在 Part 2 里花了不少时间才摸透。后面第 2 章我会专门讲怎么选适配器、怎么绕开高频衰减,这是所有用新 iPad 做音频口遥控器的人都绕不开的一关。
2. 硬件电路搭建:发射电路选型与参数计算
2.1 从音频波形到红外光:整条链路在做什么
先把原理掰开揉碎讲清楚。红外遥控的本质是发射端用“载波+数据”驱动 LED,接收端用光电二极管和前置放大器把载波解调成数据脉冲。载波通常是 38kHz,因为多数市售接收头(比如 VS1838B、TSOP38238)在 38kHz 附近灵敏度最高。数据位不是直接控制 LED 亮灭,而是控制“载波是否出现以及持续多久”。举个例子,NEC 协议里的逻辑 1,LED 并不是连续亮 2.25ms,而是以 38kHz 频率快速闪烁 2.25ms,再熄灭 0.56ms。接收头收到这段载波后,解调输出一个“低电平持续 2.25ms 再高电平 0.56ms”的数字信号,后面的解码器再根据高低电平宽度还原出位值。
音频口输出的是毫瓦级信号,直接推 LED 远远不够。iPad 耳机口输出电压大约在 0.5V 到 1V RMS,直接接 LED 的话,电流最多十几毫安,还想靠 38kHz 的载波传几米远,基本不可能。常规做法是用音频信号驱动一个 NPN 三极管,再由三极管控制 LED 的电流。电路其实很简单:音频信号经过一个 1kΩ 电阻接到三极管基极;LED 阳极接电源(5V),阴极串一个限流电阻后接到三极管集电极;发射极接地;基极和地之间再接一个 10kΩ 下拉电阻,防止音频口空闲时基极悬空,导致 LED 误亮。
限流电阻的取值可以直接用欧姆定律算。以 5V 供电、LED 正向压降 1.2V、三极管饱和压降 0.2V 为例,如果希望峰值电流 100mA,限流电阻就是 (5-1.2-0.2)/0.1=36Ω,实际选 33Ω 或 47Ω 都行。这里的关键是弄清楚“峰值电流”和“平均电流”的区别。红外遥控的数据是强占空比信号,平均电流远小于峰值,LED 不会烧,反而能靠大电流冲击获得更长的传输距离。想加长遥控距离,可以进一步减少限流电阻到 27Ω 甚至 22Ω,但这时候要留意三极管的功耗,如果手摸上去发烫,就需要换更大功率的管子,比如 S8050 换成 BD139。
2.2 新版 iPad 的音频输出难题:USB-C 适配器怎么选
Part 1 里如果用的还是老款带耳机孔的 iPad,直接从耳机座引出信号就行。但现在的 iPad 大多只有 USB-C 或者 Lightning 口。用 USB-C 转 3.5mm 的适配器,我实测下来有个关键坑:适配器内部的 DAC 和输出级几乎都会在 20kHz 以上开始滚降,有些廉价方案甚至在更低频率就开始滤波。38kHz 载波虽然人耳听不到,但也在 DAC 的负反馈环路里,输出幅度会被明显压低,严重时 LED 根本不亮,或者只能发出极微弱的光。
怎么选适配器?我的经验是注意看频响指标,尽量挑那些明确标注支持“32bit/384kHz”或“Hi-Res Audio”的型号,这类产品在 30kHz 以上通常还保有一定输出幅度。但指标只能作为参考,同型号产品在不同批次上的表现也可能有差异。更靠谱的办法是把适配器输出直接接到示波器上看:先用 App 生成连续 38kHz 正弦波,再比较 1kHz 信号和 38kHz 信号的实测幅度。如果 38kHz 的幅度比 1kHz 衰减超过 30%,就要考虑换型号或者改用其他方案。
如果你的适配器实在不理想,还有一条妥协路线:把载波频率从 38kHz 下调到 36kHz。很多接收头在 36kHz 到 38kHz 范围内都有兼容带宽,36kHz 信号在同一个 DAC 下衰减更小,虽然接收灵敏度会有细微损失,但通常不影响正常使用。如果再不行,就老老实实用外部单片机去生成 38kHz PWM,iPad 只负责协议和 UI,通过 WiFi 把命令帧转发给单片机。这相当于换了技术路线,稳定性和传输距离都会提升,但不在 Part 2 的主线范围内,我会在文末扩展部分简单提一下。
2.3 接收电路:让 iPad 拥有“学习”的能力
要让 iPad 能学习原遥控器的信号,必须加一个红外接收头。接收头不是简单的光电二极管,它内部集成了前置放大器、自动增益控制和带通滤波,输出已经是解调后的数据脉冲。正因为有这个模块,我们才能用很便宜的电路把各种协议的学习问题,统一简化成“测量一组高低电平的时长”。
接收头通常有 3 个引脚:电源、地、输出。空闲时输出为高电平,一旦检测到 38kHz 载波段,输出就被拉低。要把输出信号读进 iPad,理论上可以接到麦克风输入,但直接接会有电平匹配问题。接收头的输出通常是 3.3V 或 5V 的逻辑电平,而 iPad 麦克风输入的满幅电平比这个小得多,直接接很容易削波失真。我实测下来的简化做法是:输出脚串一个 10kΩ 电阻,再接一个 10kΩ 电阻到地,把 3.3V 逻辑电平分压到 1.65V 左右。虽然对部分设备来说这个幅值仍然偏高,但配合 App 里调低录音增益,就能在波形上得到干净的高低电平边界。App 用 48kHz 采样录音时,能清楚看到起始的引导码和后续的高低电平段,这就保留了原始协议的脉宽信息。
接收电路还有一个容易忽略的点:接收头对光非常敏感,强日光、节能灯甚至某些屏幕背光都可能让它误触发。学习模式里最好拉上窗帘,或者把 iPad 和原遥控器放在一个相对暗的环境里,等波形稳定后再采集。否则你采到的可能是噪声叠加后的“假协议”,存进码库之后回放时当然不工作。
3. 红外控制协议与编码实现
3.1 NEC 协议结构拆解
NEC 协议是被消费电子产品用得最多、也最适合新手分析的协议。一条完整的 NEC 帧包含:9