基于树莓派与QT Py的本地化物联网红外遥控器DIY指南
1. 项目概述与核心价值想没想过把家里那堆遥控器——电视的、机顶盒的、空调的、音响的——统统集成到一个你手机能打开的网页里而且这个控制中心完全在你家局域网里运行不依赖任何云服务不用担心厂商倒闭后设备变砖。今天分享的这个项目就是基于 Raspberry Pi Zero W 和一块小巧的 Adafruit QT Py Hat 扩展板亲手打造一个完全本地化、可高度定制的物联网红外遥控器。这个项目的核心思路非常清晰用 Raspberry Pi Zero W 搭建一个轻量级的 Web 服务器提供一个可以通过手机、平板或电脑浏览器访问的控制界面然后通过串口UART将用户从网页发出的指令发送给负责“脏活累活”的 QT Py 微控制器最后由 QT Py 驱动红外发射电路精准地模拟出传统遥控器的红外信号控制你的家电。听起来是不是有点像给传统家电装了个“智能大脑”没错它的本质就是利用开源硬件和软件桥接网络世界和红外物理控制。为什么不用 Raspberry Pi 直接发红外信号这里有个关键的技术考量。树莓派虽然功能强大但其 GPIO 引脚并不原生支持硬件 PWM脉冲宽度调制来生成红外载波通常是 38kHz 的方波。如果要用软件模拟即“位冲击” bit-bang会大量占用 CPU 资源在同时处理 Wi-Fi 网络请求时极易导致红外信号时序不准、发送失败或者网络响应卡顿。而 QT Py基于 SAMD21 微控制器这类单片机天生就是干实时控制这行的它的硬件外设可以轻松、稳定地生成精准的 PWM 信号专门负责红外信号的编码与发射让树莓派专心处理网络服务两者各司其职系统稳定性和可靠性大大提升。这个方案特别适合两类朋友一是智能家居的折腾爱好者厌倦了各种需要账号、依赖云、还有隐私担忧的智能设备想要一个完全自主可控的本地解决方案二是关注辅助技术的朋友或开发者。对于手部活动不便的用户来说按压实体遥控器的小按钮可能是件困难的事。而这个网页遥控器可以很好地与眼动追踪、语音识别或其他辅助开关设备集成通过网页这个通用接口让用户能以更适合自己的方式控制家电极大地提升了生活自主性。我最初也是因为后一个原因深入了这个领域。2. 硬件选型与核心设计思路拆解2.1 为什么是 Raspberry Pi Zero W 与 QT Py 的组合选择 Raspberry Pi Zero W 作为主控首要原因是其极致的性价比和完整的网络能力。它集成了 Wi-Fi 和蓝牙体型小巧功耗相对较低非常适合作为常年在线的小型服务器。虽然树莓派 3/4 系列性能更强但用于本项目实属“杀鸡用牛刀”Zero W 的性能已绰绰有余且成本和体积更有优势。这里有个细节推荐购买Raspberry Pi Zero WH预焊排针的版本虽然比 Zero W 贵几美元但省去了自己焊接 40 Pin 排针的麻烦对于不常焊接的朋友来说能避免损坏板子的风险这钱花得值。QT Py-SAMD21的选择则是功能与形式的平衡。SAMD21 是一颗 ARM Cortex-M0 内核的微控制器性能足以流畅运行红外编码库。QT Py 板型设计得非常紧凑通过其周边的焊盘而非传统的插针与 Hat 板连接使得整体结构异常轻薄。更重要的是这块 Hat 板是专为 QT Py 设计的将红外收、发电路以及和树莓派的通信接口都集成在了一块板子上实现了高度的一体化。2.2 QT Py Hat 电路设计精要这块开源 Hat 板是整个项目的硬件核心它的设计巧妙之处在于“分工”与“扩展”。红外发射电路驱动红外 LED 需要较大的电流可能高达 100mA 以上微控制器引脚无法直接提供。电路采用了经典的晶体管放大驱动方案。一个 NPN 晶体管PN2222作为低侧开关由 QT Py 的引脚控制。当引脚输出高电平时NPN 导通使得两个 PNP 晶体管PN2907的基极被拉低从而导通为两个并联的红外 LED 提供电流通路。这种设计允许使用 3.3V 逻辑电平控制却能驱动 LED 从 5V 电源取电获得更强的发射功率。红外接收电路采用了TSOP38438这类一体化红外接收头。它内部集成了光电二极管、前置放大、带通滤波和解调电路。它只对特定频率这里是 38kHz的红外信号敏感并直接输出解调后的数字信号给 QT Py极大地简化了接收端的软硬件设计。双 LED 设计板子上预留了两个红外 LED 的焊位建议搭配一个**窄角度20°和一个宽角度40°**的 LED。窄角度 LED 指向性强能量集中适合对准较远的设备宽角度 LED 覆盖范围广适合放在房间中央控制多个方向的设备。这种组合确保了遥控信号能有效覆盖不同布局的房间。通信接口Hat 板通过排针与树莓派 Zero W 的 GPIO 连接。核心通信链路是UART串口树莓派的 TX发送接 QT Py 的 RX树莓派的 RX 接 QT Py 的 TX。这是一种简单、可靠、对处理器开销极低的通信方式。板子上还预留了 I2C 和 SPI 接口的跳线焊点为未来扩展其他传感器或功能如通过 QT Py 读取模拟传感器留下了可能体现了设计的前瞻性。注意在焊接红外 LED 时千万不要将 LED 的塑料外壳紧贴电路板安装。务必留出足够的引脚长度约 5-7mm然后将 LED 向侧面弯折 90 度使其朝向板子前方。这样才能保证红外信号不会被板子或其他组件遮挡确保最佳的发射效果。2.3 物料清单与采购建议除了核心的树莓派 Zero WH 和 QT Py-SAMD21你需要准备以下主要部件。许多可以在 Adafruit 或 Digi-Key 找到红外组件红外 LED1个窄角如 IR333A1个广角如 IR333C/H0/L10。红外接收头TSOP38438或 Adafruit 的 TSOP38238通用性稍逊但多数情况可用。可选红外学习模块TSMP98000。用于未来实现“学习型遥控”功能当前版本的软件尚未启用但预留了硬件位置。半导体与电阻晶体管PN2222 NPN 1个PN2907 PNP 2个。电阻1kΩ 1个33Ω 2个可选用于限流后续解释。连接件40针2x20母座排针用于焊接在 Hat 板底部连接树莓派。电源与存储5V/2.5A 的 Micro USB 电源适配器以及至少 8GB 的 MicroSD 卡。工具电烙铁、焊锡、吸锡带或吸锡器、剪线钳。一个小型台钳或电路板固定架在焊接时非常有用能让你解放双手。关于那两颗可选的33Ω 电阻在早期使用 Arduino Yún 的方案中当红外 LED 全功率发射时偶尔会导致系统电压被拉低而重启。因此在原设计中加入了切断 PCB 走线、串入 33Ω 电阻进行额外限流的选项。但在 Raspberry Pi Zero W 的测试中其电源管理表现更稳定未发现此问题。因此除非你在使用中遇到树莓派因红外发射而重启的情况否则可以跳过安装这两个电阻的步骤。这是一个典型的“按需优化”设计。3. 硬件组装与焊接实操要点组装过程就像搭积木但顺序和细节决定成败。强烈建议先观看原作者提供的组装视频获得直观印象。以下是文字版的核心步骤与避坑指南3.1 焊接直插元件首先焊接所有通孔元件。顺序很重要电阻与晶体管先焊1kΩ 电阻和三个晶体管。晶体管外形一样务必对照 PCB 上的丝印PN2222 和 PN2907区分并放入正确位置。PCB 上元件轮廓的半圆缺口方向指示了晶体管的引脚方向通常是发射极 E必须对齐。红外 LED接着焊两个红外 LED。区分正负极是关键红外 LED 的短脚是阴极负极对应 PCB 上 LED 符号的直线平口一侧长脚是阳极正极。焊接时将 LED 直立插入但不要紧贴电路板预留约 5-7mm 的引脚长度。焊好后将 LED 本体轻轻向板子前方有元件标识的一面弯折 90 度使其“躺倒”并朝向板外。红外接收头与学习模块焊接TSOP38438接收头。它有三个引脚输出、地、电源。PCB 上通常有“OUT”、“GND”、“VS”标识对照焊接即可。TSMP98000学习模块如有也在此阶段焊接注意方向。实操心得焊接晶体管和 LED 这类对热敏感的元件时速度要快。使用尖头烙铁蘸取适量焊锡点到焊盘和引脚的结合处1-2秒即可完成。停留过久可能损坏元件。焊完后用剪线钳齐根剪掉元件面多余的引脚保持整洁。3.2 安装连接器与 QT Py焊接 40 针母座现在将 40 针2x20的母座排针从 Hat 板的背面无元件面插入让针脚从正面有元件面穿出。然后将板子翻过来在正面将排针焊接固定。确保排针与板子紧密贴合没有翘起。之所以最后焊这个是为了避免在焊接其他小元件时这个高大的排针碍事或不小心被烙铁碰到。焊接 QT Py 核心板这是最具挑战性的一步。QT Py 通过其四周的焊盘与 Hat 板连接。方法是先将 QT Py 对准 Hat 板上的焊盘确保每个焊盘都对齐。用镊子或手轻轻按住用烙铁和少量焊锡先固定对角线的两个焊盘。这一步不要追求焊点完美只要能让 QT Py 不掉下来就行。检查 QT Py 是否放正、是否平整。如果歪了可以重新熔化刚才的焊点进行调整。确认位置无误后再逐一焊接剩下的所有焊盘。焊接时烙铁头同时接触 QT Py 的焊盘和 Hat 板的焊盘送入焊锡形成光滑的圆锥形焊点。3.3 组装前的独立测试在将 Hat 板插到树莓派上之前务必先进行独立测试这是一个非常重要的安全步骤可以避免因 Hat 板短路等问题损坏宝贵的树莓派。测试方法仅通过 USB-C 线为焊接好的 QT Py Hat 组合体供电此时树莓派未连接。使用后续章节的测试程序检查红外接收和发射功能是否正常。只有确认 Hat 板工作无误后才能进行最终组装。4. 软件环境搭建与核心配置软件部分分为两大块QT Py 端的 Arduino 固件和树莓派端的 Python Web 服务。我们需要先让它们各自为战再联合作业。4.1 QT Py 固件IRLib2 库的部署与测试QT Py 的“大脑”是一段用 Arduino IDE 编写并上传的 C 程序。它的核心是IRLib2这个强大的红外库。安装 Arduino IDE 与 SAMD 支持首先确保你的电脑安装了 Arduino IDE。然后在“工具”-“开发板”-“开发板管理器”中搜索并安装 “Arduino SAMD Boards” 支持包这样才能识别和编程 QT Py-SAMD21。手动安装 IRLib2IRLib2 库无法通过库管理器一键安装需要手动部署。从 GitHub 仓库下载 IRLib2 的 ZIP 包。解压后你会得到一个名为IRLib2-master的文件夹里面包含5 个子文件夹IRLib2,IRLibFreq,IRLibProtocols,IRLibRecv,IRLibRecvPCI。关键步骤将这 5 个文件夹直接复制到你的 Arduino 草图库目录下通常是文档/Arduino/libraries/。最终的路径结构应该是文档/Arduino/libraries/ ├── IRLib2/ ├── IRLibFreq/ ├── IRLibProtocols/ ├── IRLibRecv/ └── IRLibRecvPCI/常见错误不要将整个IRLib2-master文件夹复制进去也不要只复制这5个子文件夹外的其他文件。必须确保这5个库文件夹并列位于libraries目录下。上传测试程序从项目 GitHub 仓库下载代码找到arduino_files文件夹。用 Arduino IDE 打开dumpFreq.ino程序。选择开发板Adafruit QT Py M0SAMD21。选择正确的端口。点击上传。上传成功后打开串口监视器波特率通常为 115200。进行接收测试拿起你的电视遥控器对准 Hat 板上的红外接收头按下任意键比如音量。串口监视器会滚动输出信息。如果一切正常你会看到类似这样的解码结果Decoded NECx(7): Value:E0E0E01F Adrs:0 (32 bits)这表示成功解码了一个 NEC 扩展协议协议号 7的信号其 32 位代码是E0E0E01F。请记录下你设备各个按键电源、音量、频道、输入源等对应的协议号和Value值后续配置网页界面时需要用到。进行发射测试接着上传record.ino程序。打开串口监视器用遥控器对准接收头按一个键如“静音”。然后在串口监视器的输入框里按一下回车QT Py 就会通过红外 LED 重新发送刚才录下的信号。此时如果你的电视或设备被静音了恭喜你发射电路也工作正常注意事项如果解码时发现频率显示为 56kHz 左右且协议无法识别那你的设备可能使用了较老的“松下旧协议”Panasonic Old, Protocol 5。标准的 38kHz 接收头TSOP38438可能无法可靠解码它。这就是为什么板上预留了TSMP98000这个“学习模块”的位置。它不关心载波频率能直接记录原始波形。虽然当前软件还未集成其学习功能但硬件已就位为未来升级留下了空间。4.2 树莓派 Zero W 系统初始化我们将把树莓派配置成“无头模式”Headless即无需显示器键盘鼠标完全通过 Wi-Fi 远程访问。使用 Raspberry Pi Imager 烧录系统这是官方推荐的最简单方法。下载 Raspberry Pi Imager 工具。关键配置CtrlShiftX在选择操作系统前按下CtrlShiftX打开高级选项菜单。这里必须配置几项启用 SSH勾选这是远程访问的钥匙。设置密码为默认的pi用户设置一个强密码。配置 Wi-Fi填入你的家庭 Wi-Fi SSID 和密码选择正确的国家代码如 CN。设置主机名起一个独特的名字如ir-remote-pi方便在网络上找到它。跳过首次运行向导建议勾选避免启动后需要连接显示器完成初始化。烧录与启动选择“Raspberry Pi OS Lite (32-bit)”这个无桌面版本以节省资源。选择你的 SD 卡点击写入。完成后将 SD 卡插入树莓派 Zero W上电启动。首次连接等待一两分钟让树莓派完成启动并连接到 Wi-Fi。在你的电脑上打开终端Linux/Mac或 PowerShell/SSH 客户端如 PuTTY for Windows。使用ssh piir-remote-pi.local命令连接将ir-remote-pi替换为你设置的主机名。输入你设置的密码。如果出现“主机密钥验证”提示输入yes。成功登录后你就进入了树莓派的命令行界面。4.3 部署 Web 服务与控制程序树莓派上的软件是一个用 Python 编写的简单 Web 服务器它提供网页界面并通过串口与 QT Py 通信。传输项目文件在树莓派上克隆或上传项目 GitHub 仓库中的raspberry_pi_files文件夹内容。你可以使用scp命令从本地电脑上传scp -r /本地路径/raspberry_pi_files/* piir-remote-pi.local:/home/pi/安装 Python 依赖树莓派 OS Lite 通常已预装 Python3。你需要安装pyserial库用于串口通信。sudo apt update sudo apt install python3-serial配置串口树莓派的硬件串口/dev/ttyAMA0默认用于蓝牙。我们需要将其重新分配给 GPIO 引脚使用。运行sudo raspi-config。选择Interface Options-Serial Port。当问到“是否要启用串口登录shell”时选择No。当问到“是否要启用串口硬件”时选择Yes。退出 raspi-config 并重启树莓派sudo reboot。测试串口通信重启后确保 QT Py Hat 已通过 USB-C 连接电源或仍连接电脑并且 Hat 板已插入树莓派 Zero W 的 GPIO 排针上。在树莓派终端运行一个简单的测试echo TEST /dev/ttyAMA0这条命令本身不会有可见输出。但你可以回到连接着 QT Py 的 Arduino IDE 串口监视器看看是否收到了乱码或“T”、“E”等字符。如果有说明串口通路基本正常。注意需要确保两边的波特率设置一致项目代码中通常设为 115200。5. 系统集成与网页遥控器配置实战硬件和基础软件就绪后最后一步是将它们整合并配置属于你自己的遥控器界面。5.1 启动 Web 服务器与理解通信流程进入存放树莓派程序的目录例如~/raspberry_pi_files。查看其中的 Python 脚本通常主服务器文件名为ir_server.py或类似。运行它python3 ir_server.py服务器启动后会监听某个端口如 8080。此时在同一个局域网内的任何设备浏览器中输入http://ir-remote-pi.local:8080或树莓派的 IP 地址如http://192.168.1.100:8080就能看到遥控器的网页界面了。核心通信流程如下你在手机浏览器点击网页上的“音量”按钮。浏览器通过 HTTP POST 请求将“音量”这个指令名称发送到树莓派的 Web 服务器。Python 服务器脚本接收到指令在它预定义的指令映射表中查找“音量”对应的红外编码信息包括协议号、32位代码等。服务器通过串口/dev/ttyAMA0将这条红外编码信息按照约定好的格式例如SEND,7,E0E0E01F\n发送给 QT Py。QT Py 的固件一直在监听串口。收到指令后它调用 IRLib2 库的函数根据协议号7和代码E0E0E01F生成对应的红外调制信号波形。QT Py 通过其控制的 GPIO 引脚驱动晶体管电路让红外 LED 闪烁出精确的红外信号。你的电视接收到这个红外信号执行音量增加操作。5.2 编辑配置文件匹配你的设备网页上那些漂亮的按钮需要你知道它们背后对应的红外码。这就是之前用dumpFreq程序测试并记录下来的数据。你需要编辑树莓派上的一个配置文件可能是commands.json或config.py中的一个字典。这个文件定义了“按钮名称”到“红外指令”的映射。格式通常类似这样{ television: { power: {protocol: 7, code: E0E0E01F}, vol_up: {protocol: 7, code: E0E0E01F}, vol_down: {protocol: 7, code: E0E0D02F}, mute: {protocol: 7, code: E0E0F00F}, input: {protocol: 7, code: E0E0D12E} }, cable_box: { power: {protocol: 2, code: 20DF10EF}, ch_up: {protocol: 2, code: 20DF00FF} } }你需要做的是为你的每个设备电视、机顶盒、音响等创建一个分组。为每个按键功能定义一个易于理解的名称。填入你之前测试得到的protocol协议号和code32位十六进制代码。保存配置文件并重启 Web 服务器。5.3 网页界面定制与优化基础的网页界面可能比较简陋。你可以通过编辑 HTML、CSS 和 JavaScript 文件来美化它使其更适合触摸屏操作或者为有辅助技术需求的用户进行优化。布局优化将常用的按钮如电源、音量、频道放大并放在显眼位置。可以按功能分区比如“电源区”、“音量区”、“导航区”、“数字键区”。视觉反馈在 JavaScript 中为按钮点击添加视觉反馈如按下变色并可以添加声音提示让用户明确知道指令已发送。宏命令你可以编写简单的“宏”功能。例如创建一个“看电影”按钮其背后是依次发送“电视电源开”、“机顶盒电源开”、“输入源切换至 HDMI1”三条红外指令。这只需要在服务器端的 Python 脚本中顺序发送多条串口指令即可实现。开机自启动为了让设备断电重启后能自动运行需要将 Web 服务器设置为系统服务。创建一个 systemd 服务文件如/etc/systemd/system/ir-remote.service[Unit] DescriptionIR Remote Web Server Afternetwork.target [Service] Typesimple Userpi WorkingDirectory/home/pi/raspberry_pi_files ExecStart/usr/bin/python3 /home/pi/raspberry_pi_files/ir_server.py Restarton-failure [Install] WantedBymulti-user.target然后启用并启动它sudo systemctl enable ir-remote.service sudo systemctl start ir-remote.service6. 常见问题排查与进阶技巧即使按照步骤操作也可能会遇到一些坑。这里记录了几个典型问题及其解决方法。6.1 红外信号无法解码或控制失灵问题现象可能原因排查步骤与解决方案dumpFreq程序无任何输出1. 红外接收头接线错误或损坏。2. 遥控器电池没电。3. 程序未正确上传或端口错误。1. 检查 TSOP38438 的 VCC、GND、OUT 引脚是否与 PCB 对应焊好。2. 换一个已知好用的遥控器测试。3. 确认 Arduino IDE 中选择了正确的开发板和端口重新上传程序。解码输出乱码或错误协议1. 环境光干扰如强烈的日光灯、太阳光。2. 遥控器距离太远或角度太偏。3. 设备使用了非标准或罕见协议。1. 在较暗的环境下测试避开直射光源。2. 将遥控器近距离10-20厘米正对接收头测试。3. 尝试 IRLib2 库中其他的解码示例程序看是否能识别。记录下原始波形数据可在社区求助。网页点击按钮设备无反应但服务器日志显示指令已发送1. 串口通信失败。2. QT Py 发射电路故障。3. 红外 LED 方向不对或被遮挡。4. 配置文件中协议或代码错误。1. 在树莓派运行sudo dmesg | grep tty检查串口设备。用cat /dev/ttyAMA0监听需先停止服务器在网页点击按钮看是否有数据流。2. 用手机摄像头大多数手机摄像头能看到红外光对准红外 LED点击网页按钮观察 LED 是否闪烁。不闪则检查晶体管焊接、LED 极性。3. 确保 LED 朝向被控设备且中间无遮挡。4. 仔细核对配置文件中的protocol和code值是否与dumpFreq输出的完全一致注意大小写。6.2 网络与系统服务问题无法通过主机名.local访问某些 Windows 网络可能不支持 mDNS即.local域名解析。直接使用树莓派的 IP 地址访问。在树莓派上运行hostname -I获取 IP。网页能打开但按钮点击无反应打开浏览器的开发者工具F12切换到“网络”Network选项卡点击按钮查看是否有 HTTP 请求发出以及服务器的响应是什么。可能是 JavaScript 错误或服务器 Python 脚本异常。服务器脚本启动后立即退出检查 Python 脚本的依赖是否全部安装pyserial。查看脚本日志或直接在前台运行python3 ir_server.py看具体的报错信息。常见问题是串口权限不足尝试sudo chmod 666 /dev/ttyAMA0或将自己的用户加入dialout组sudo usermod -a -G dialout pi。6.3 性能优化与扩展思路降低功耗如果常年插电可以忽略。若考虑电池供电可禁用树莓派 HDMI 输出在/boot/config.txt中添加hdmi_blanking1和hdmi_ignore_edid0xa5000080并启用 USB 电源管理。QT Py 本身功耗极低。增加控制距离红外信号是直线传播且易被遮挡。可以尝试使用多个红外发射板通过 GPIO 扩展或使用多个 QT Py Hat放置在房间不同角落由同一个树莓派控制实现无死角覆盖。集成到智能家居平台这个 Web 服务器本身就是一个 API 端点。你可以通过 Home Assistant 的 “RESTful Command” 或 “Shell Command” 集成将红外控制按钮接入 Home Assistant从而与家里的其他智能设备联动。例如对智能音箱说“打开电视”Home Assistant 可以先通过本设备发送红外信号开电视再控制智能插座打开机顶盒电源。开发学习功能这是最具潜力的扩展。利用板上预留的 TSMP98000 学习模块可以开发一个“学习模式”。网页上点击“学习”然后按下原遥控器按键QT Py 通过 TSMP98000 记录原始波形并存储之后即可原样复现。这需要修改 QT Py 固件和树莓派服务端实现一套完整的录制、存储、回放逻辑。这个项目从硬件焊接、软件配置到最终集成涉及了嵌入式开发、网络服务和前端交互的多个层面。它不仅仅是一个遥控器更是一个理解物联网系统如何从物理层红外光到应用层网页交互打通的绝佳范例。当你第一次用自己的手机网页关掉客厅的电视时那种“亲手创造”的成就感是购买任何成品都无法替代的。