自制 Arduino 电视遥控器:3D 打印外壳、电池供电、支持三大品牌协议
项目起因
女友电视遥控器损坏,两人均为工程师,决定封锁期间合作自制。技能互补:硬件焊接/3D 建模/固件编程全流程自主完成,兼作学习红外通信协议的实战演练。
功能定义
精简为 6 个核心命令:电源开关、信号源切换、频道+/–、音量+/–。采用 Arduino UNO + IRremote 库实现。
硬件设计
主控与电源
- Arduino UNO(最终焊接成 Shield 形态)
- 9V 方块电池 + 9V 转 DC 插头转接头
- 极致省电策略:
– 关闭 ADC/SPI/TWI/Timer1/USART 外设
– 关闭板载 LED(PWM 引脚 13 模拟写 0)
– 拆焊板载 PWR LED(非推荐操作,但显著降低静态功耗)
– 5 秒无操作进入SLEEP_MODE_PWR_DOWN,按键中断唤醒
按键电路
- 6 个 PCB 轻触开关,利用 Arduino 内部上拉(
INPUT_PULLUP),无需外部电阻 - 软件消抖:检测到按下 → 延时 40ms 复测确认
红外发射电路
- IR LED 接 PWM 引脚 3(IRremote 库硬性要求)
- 两个 47Ω 电阻并联等效 23.5Ω,提供约 150mA 驱动电流,增强发射距离
- 原型板焊接成 Shield,通过排针/排母与 UNO 结合
3D 打印外壳
- SolidWorks 设计,Cura 切片,Anycubic Mega Zero 打印(PLA)
- 两体结构:底座含电池仓、UNO 固定柱(3×M2.5);盖板镂空按键位、正面 IR 窗口、按键旁刻字符号
- 4×M3 螺丝合箱,IR LED 伸出原型板对准窗口,三微柱限位防侧移
固件核心逻辑
- 编译时通过宏切换协议:
#define LG_TV / SAMSUNG_TV / SONY_TV - 各品牌 6 个命令的十六进制码预存常量
- 主循环轮询 6 个按键,消抖后调用
irsend.sendNEC()/sendSAMSUNG()/sendSony() - 记录
last_time,超时 5000ms 进入睡眠,attachInterrupt配置电源键(引脚 2)低电平唤醒
完整代码
#include
#include
#include
#define OnOff 1
#define Source 0
#define CH_plus 4
#define CH_minus 5
#define Vol_plus 6
#define Vol_minus 7
#define Interrupt_Pin 2
#define SONY_TV // 取消注释切换品牌
//#define LG_TV
//#define SAMSUNG_TV
#ifdef SONY_TV
unsigned long on_off_code = 2704; // 0xA90
unsigned long vol_plus_code = 1168; // 0x490
// ... 其余 4 个码
#endif
IRsend irsend;
unsigned long debounce_time, last_time;
void setup() {
analogWrite(13,0);
pinMode(OnOff,INPUT_PULLUP); // ... 其余 5 键同理
pinMode(Interrupt_Pin,INPUT_PULLUP);
power_adc_disable(); power_spi_disable(); power_timer1_disable();
power_usart0_disable(); power_twi_disable();
}
void loop() {
checkButton(OnOff, on_off_code);
checkButton(Source, source_code);
checkButton(CH_plus, ch_plus_code);
checkButton(CH_minus, ch_minus_code);
checkButton(Vol_plus, vol_plus_code);
checkButton(Vol_minus, vol_minus_code);
if (millis() - last_time > 5000) going_to_sleep();
}
void checkButton(int pin, unsigned long code) {
if (!digitalRead(pin)) {
debounce_time = millis();
while (millis() - debounce_time < 40);
if (!digitalRead(pin)) {
#ifdef LG_TV irsend.sendNEC(code, 32); #endif
#ifdef SAMSUNG_TV irsend.sendSAMSUNG(code, 32); #endif
#ifdef SONY_TV irsend.sendSony(code, 12); #endif
last_time = millis();
}
}
}
void going_to_sleep() {
sleep_enable();
attachInterrupt(digitalPinToInterrupt(Interrupt_Pin), wake_up, LOW);
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_cpu();
}
void wake_up() { sleep_disable(); detachInterrupt(digitalPinToInterrupt(Interrupt_Pin)); }
原理图与源文件
- Fritzing 原理图:
remote_sketch_r4f8a47oWX.fz - 外壳 STEP/STL 文件见项目附件
制造工艺
- 集成二维码、RFID与体温验证的门禁控制系统
- 树莓派无需 LIRC 捕获红外遥控指令:Python UART 方案
- PiCy:打造您的微型树莓派机器人
- Arduino Nano 与 MPU-6050 构建实时陀螺仪游戏
- ESP32-CAM 运动检测安防相机,推送照片到 Discord
- 智能存钱罐:Arduino Nano 控制硬币识别器实现余额显示
- Unopad:基于 Arduino 的无缝 Ableton Live MIDI 控制器
- Arduino + HC-05 蓝牙控制 LED:MIT App Inventor 手机 App 开发全攻略
- 自制简易红外避障传感器:IR LED + 光电二极管 + Arduino
- 打造功能完整的 Arduino 驱动 3D 打印机械臂:分步指南
- 现代工业远程生产控制的5大核心优势
- Millport SmartLathez 1740 CNC车床:精密与动力的结合