亲,“电路城”已合并升级到更全、更大、更强的「新与非网」。点击查看「新与非网」

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

自制电视遥控器

发布时间:2021-05-23
分享到:

自制电视遥控器

发布时间:2021-05-23
分享到:

本文简单的介绍了如何自制一个电视遥控器,且该遥控器只有6条命令,即ON / OFF切换,信号源选择,Ch +,Ch-,Vol +,Vol-。

硬件组件:

  • Arduino UNO
  • 9v 电池
  • 9v 插孔连接器
  • 红外发射器
  • 机械螺丝 M3、M2.5
  • 螺母 M3、M2.5
  • 通孔电阻器 47ohm
  • 原型板 2.54mm
  • PCB按钮

原理图:

制造步骤:

步骤一:电子组装

整个电路都嵌入在原型板上,旨在适合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打印。

  • 使用3个M2.5螺钉将Arduino UNO固定在基座上,这些螺钉安装在从基座内部伸出的对准孔中。
  • 固定Arduino之后,IR LED将从原型板外部伸出,以使其与专用孔对准,并在组装外壳的两个部分时将其保持在适当的位置,并添加了三个微型接线柱,以避免LED导线的横向移动。
  • 将电池压装到专用空间中。

盖子的设计是为了露出按钮,除每个按钮外,盖子上还刻有一个符号,以显示每个按钮的功能。

机箱的基座和盖子使用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)); //删除中断
}

加入微信技术交流群

技术交流,职业进阶

关注与非网服务号

获取电子工程师福利

加入电路城 QQ 交流群

与技术大牛交朋友

讨论