本网页已闲置超过3分钟,按键盘任意键或点击空白处,即可回到网页
最热资讯


亲,“电路城”已合并升级到更全、更大、更强的「新与非网」。点击查看「新与非网」
本文简单的介绍了如何自制一个电视遥控器,且该遥控器只有6条命令,即ON / OFF切换,信号源选择,Ch +,Ch-,Vol +,Vol-。
硬件组件:
原理图:
制造步骤:
步骤一:电子组装
整个电路都嵌入在原型板上,旨在适合Arduino UNO接头连接器。通过使用烙铁,对按钮进行了焊接。在底部,两个47ohm电阻器并联焊接,以实现通过IR LED的所需电流。
使用焊锡丝,在原型板上进行了迹线连接,将按钮引脚和IR LED连接到公引脚接头。
开发板就像是一个屏蔽板,该屏蔽板使用引脚连接器安装在Arduino UNO上,可确保所有正确的连接。
步骤二:外壳CAD和CAM
外壳的设计时为容纳电池,Arduino UNO +原型板组件,只在顶部露出按钮,而正面露出IR LED。
外壳由两部分组成,这些部分使用SolidWorks CAD软件进行设计,使用Ultimaker Cura切片软件进行预处理,最后使用Anycubic Mega Zero 3D打印机在PLA中进行3D打印。
盖子的设计是为了露出按钮,除每个按钮外,盖子上还刻有一个符号,以显示每个按钮的功能。
机箱的基座和盖子使用4个M3螺钉组装。
附件:(代码)
#include <IRremote.h>
#include <avr/sleep.h>
#include <avr/power.h>
//引脚定义
//IR LED必须连接到Arduino PWM引脚3
#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 //仅Arduino Uno上的针脚2或3
//电视型号定义
//#define LG_TV
//#define SAMSUNG_TV
#define SONY_TV
//代码定义
#ifdef LG_TV
unsigned long on_off_code = 551489775; // HEX 20DF10EF
unsigned long vol_plus_code = 551502015; //HEX 20DF40BF
unsigned long vol_minus_code = 551534655; //HEX 20DFC03F
unsigned long ch_plus_code = 551485695; //HEX 20DF00FF
unsigned long ch_minus_code = 551518335; //HEX 20DF807F
unsigned long source_code = 551538735; //HEX 20DFD02F
#endif
#ifdef SAMSUNG_TV
unsigned long on_off_code = 3772793023; // HEX E0E040BF
unsigned long vol_plus_code = 3772833823; //HEX E0E0E01F
unsigned long vol_minus_code = 3772829743; //HEX E0E0D02F
unsigned long ch_plus_code = 3772795063; //HEX E0E048B7
unsigned long ch_minus_code = 3772778743; //HEX E0E008F7
unsigned long source_code = 3772809343; //HEX E0E0807F
#endif
#ifdef SONY_TV
unsigned long on_off_code = 2704; //HEX A90
unsigned long vol_plus_code = 1168; //HEX 490
unsigned long vol_minus_code = 3216; //HEX C90
unsigned long ch_plus_code = 144; //HEX 090
unsigned long ch_minus_code = 2192; //HEX 890
unsigned long source_code = 2640; //HEX A50
#endif
//启用调试
//#define DEBUG
//
IRsend irsend; //创建IR对象
unsigned long debounce_time;
unsigned long last_time;
void setup() {
analogWrite(13,0); //内置led的转弯
//noInterrupts(); //屏蔽中断
//CLKPR = _BV(CLKPCE); //启用时钟预分频器设置
//CLKPR = _BV(CLKPS0); //设置时钟预分频器=2-->8 MHz
//interrupts();
pinMode(OnOff,INPUT_PULLUP);
pinMode(Source,INPUT_PULLUP);
pinMode(CH_plus,INPUT_PULLUP);
pinMode(CH_minus,INPUT_PULLUP);
pinMode(Vol_plus,INPUT_PULLUP);
pinMode(Vol_minus,INPUT_PULLUP);
pinMode(Interrupt_Pin,INPUT_PULLUP);
//节电
power_adc_disable(); //禁用所有ADC
power_spi_disable(); //禁用 SPI
power_timer1_disable(); //分解计时器1(0代表millis(),2代表irremote.h)
power_usart0_disable(); //禁用串行
power_twi_disable(); //禁用TWI
#ifdef DEBUG
Serial.begin(9600);
#endif
}
void loop() {
//检查开关
if (!digitalRead(OnOff)) {
debounce_time = millis();
while (millis() - debounce_time < 40 ) {
;
}
if (!digitalRead(OnOff)) {
#ifdef LG_TV
irsend.sendNEC(on_off_code, 32);
#endif
#ifdef SAMSUNG_TV
irsend.sendSAMSUNG(on_off_code, 32);
#endif
#ifdef SONY_TV
irsend.sendSony(on_off_code, 12);
#endif
last_time = millis(); //上次按下按钮时
#ifdef DEBUG
Serial.println("OnOff");
#endif
}
}
//检查源
if (!digitalRead(Source)) {
debounce_time = millis();
while (millis() - debounce_time < 40 ) {
;
}
if (!digitalRead(Source)) {
#ifdef LG_TV
irsend.sendNEC(source_code, 32);
#endif
#ifdef SAMSUNG_TV
irsend.sendSAMSUNG(source_code, 32);
#endif
#ifdef SONY_TV
irsend.sendSony(source_code, 12);
#endif
last_time = millis(); //上次按下按钮时
#ifdef DEBUG
Serial.println("Source");
#endif
}
}
//检查Chu plus
if (!digitalRead(CH_plus)) {
debounce_time = millis();
while (millis() - debounce_time < 40 ) {
;
}
if (!digitalRead(CH_plus)) {
#ifdef LG_TV
irsend.sendNEC(ch_plus_code, 32);
#endif
#ifdef SAMSUNG_TV
irsend.sendSAMSUNG(ch_plus_code, 32);
#endif
#ifdef SONY_TV
irsend.sendSony(ch_plus_code, 12);
#endif
last_time = millis(); //上次按下按钮时
#ifdef DEBUG
Serial.println("CH+");
#endif
}
}
//检查Chu减号
if (!digitalRead(CH_minus)) {
debounce_time = millis();
while (millis() - debounce_time < 40 ) {
;
}
if (!digitalRead(CH_minus)) {
#ifdef LG_TV
irsend.sendNEC(ch_minus_code, 32);
#endif
#ifdef SAMSUNG_TV
irsend.sendSAMSUNG(ch_minus_code, 32);
#endif
#ifdef SONY_TV
irsend.sendSony(ch_minus_code, 12);
#endif
last_time = millis(); //上次按下按钮时
#ifdef DEBUG
Serial.println("CH-");
#endif
}
}
//检查航班
if (!digitalRead(Vol_plus)) {
debounce_time = millis();
while (millis() - debounce_time < 40 ) {
;
}
if (!digitalRead(Vol_plus)) {
#ifdef LG_TV
irsend.sendNEC(vol_plus_code, 32);
#endif
#ifdef SAMSUNG_TV
irsend.sendSAMSUNG(vol_plus_code, 32);
#endif
#ifdef SONY_TV
irsend.sendSony(vol_plus_code, 12);
#endif
last_time = millis(); //上次按下按钮时
#ifdef DEBUG
Serial.println("Vol+");
#endif
}
}
//check Vol_minus
if (!digitalRead(Vol_minus)) {
debounce_time = millis();
while (millis() - debounce_time < 40 ) {
;
}
if (!digitalRead(Vol_minus)) {
#ifdef LG_TV
irsend.sendNEC(vol_minus_code, 32);
#endif
#ifdef SAMSUNG_TV
irsend.sendSAMSUNG(vol_minus_code, 32);
#endif
#ifdef SONY_TV
irsend.sendSony(vol_minus_code, 12);
#endif
last_time = millis(); //上次按下按钮时
#ifdef DEBUG
Serial.println("Vol-");
#endif
}
}
if (millis()-last_time > 5000) { //按钮已10秒未按下
#ifdef DEBUG
Serial.println("Going to sleep...");
#endif
going_to_sleep(); //进入睡眠模式
#ifdef DEBUG
Serial.println("Waking up...");
#endif
}
}
//睡眠模式功能
void going_to_sleep() {
sleep_enable(); //启用睡眠模式
attachInterrupt(digitalPinToInterrupt(Interrupt_Pin), wake_up, LOW); //唤醒中断-->将中断引脚配置为有线NOR!!!
set_sleep_mode(SLEEP_MODE_PWR_DOWN); //完全睡眠模式
sleep_cpu(); //激活睡眠模式
}
//唤醒功能
void wake_up() {
sleep_disable(); //禁用睡眠模式
detachInterrupt(digitalPinToInterrupt(Interrupt_Pin)); //删除中断
}
Broadlink智能遥控拆解——替代红外遥控器
2013-08-22
黑科技的遥控器之Apple TV 4完美拆解
2015-09-25
电脑也可以遥控?从此告别鼠标,用遥控器来控制电脑是种什么样的体验?
2017-10-11
用无线路由器作“遥控器”,互联网控制智能小车制作全过程!
2017-10-09
对遥控装置进行逆向工程——为什么每个工程师都应该学习Python
2018-03-23
【项目实录】万能电视遥控器,可以控制风扇和灯(附电路图)
2019-07-12
【项目教程】自制堪比商业产品的Arduino遥控器(附电路图及源代码)
2019-07-05
[项目展示]112通道船模遥控器(附项目开源资料)
2019-08-06
通过PS4遥控器控制基于树莓派4B打造的漫游机器人
2020-03-18
基于Arduino 的可编程遥控器
2021-06-10
讨论