风筝
发表于: 2018-8-13 22:20:08 | 显示全部楼层

通过红外(IR)传感器,Arduino开发板可以接收和解码电视遥控器的信号。


大多数的电视遥控器使用红外光将编码信息发送到电视机。红外光的波长通常在930和950nm之间,属于不可见光。当您按下电视遥控器上的其中一个键时,控制器将使用该键特定的脉冲宽度调制(PWM)信号调制IR信号。该信号被电视中的IR接收器拾取,接收器解调信号并确定按下哪个键。如果我们有一个红外接收器,我们可以用Arduino开发板完成类似的工作。


IR接收器有三个端子:其中两个端子用于供电,而剩余的一个用作传感器输出。接收器解调IR信号并输出​​解调的PWM信号。输出端子连接到Arduino引脚3,然后Arduino通过分析PWM信号确定按下了哪个键。


实验1

在这个实验中,我们将使用电视遥控器点亮和熄灭两个LED。


需要的硬件

●   电视遥控器

●   红外接收器

●   Arduino Mega2560开发板

●   LED指示灯

●   330欧姆电阻

●   面包板

●   连接导线


接线图

如下图所示连接组件。红外接收器连接到Arduino开发板的引脚3。LED通过330欧姆的限流电阻连接到引脚4和5。

Universal_Remote_Control_Fritzing-Jones.jpg


实验1的代码

在本实验中,我们使用IRremote.h库。在编写此代码之前,我们首先确定,如果按下遥控器的1键,IR接收器输出等于2049,如果按下2键,输出值为2050。按下1键可点亮两个LED。按下2键将熄灭两个LED指示灯。

  1. #include "IRremote.h"

  2. int rec = 3; // the pin where you connect the output pin of TSOP4838
  3. int led_1 = 4;
  4. int led_2 = 5;

  5. #define code1  2049 // code received from button 1
  6. #define code2  2050 // code received from button 2


  7. IRrecv ir_rec(rec);

  8. decode_results result;

  9. void setup()
  10. {
  11.   Serial.begin(9600);   
  12.   ir_rec.enableIRIn();  
  13.   pinMode(led_1, OUTPUT);
  14.   pinMode(led_2, OUTPUT);

  15. }

  16. void loop() {
  17.   if (ir_rec.decode(&result)) {
  18.     unsigned int val = result.value;
  19.     switch(val) {
  20.        case code1:
  21.           digitalWrite(led_1,HIGH);
  22.           digitalWrite(led_2,HIGH);
  23.           break;
  24.        case code2:
  25.           digitalWrite(led_2,LOW);
  26.           digitalWrite(led_1,LOW);
  27.           break;
  28.       
  29.     }
  30.       
  31.     Serial.println(val);
  32.     ir_rec.resume();                   // Receive the next value
  33.   }
  34. }
复制代码

实验2

在本实验中,我们将使用电视遥控器点亮和熄灭不同的LED指示灯。


需要的硬件

●   电视遥控器

●   红外接收器

●   Arduino Mega2560开发板

●   LED指示灯

●   330欧姆电阻

●   面包板

●   连接导线


接线图

接线图与实验1完全相同


实验2的代码

在本实验中,除1键和2键外,我们还将使用遥控器的电源键。按下遥控器电源键时,红外传感器的输出为2060。按下1键点亮LED 1,按下2键点亮LED 2,按下电源键将熄灭两个LED指示灯。

  1. #include "IRremote.h"

  2. int rec = 3; // the pin where you connect the output pin of TSOP4838
  3. int led_1 = 4;
  4. int led_2 = 5;

  5. #define code1  2049 // code received from button 1
  6. #define code2  2050 // code received from button 2
  7. #define code3  2060 // code received from power button




  8. IRrecv ir_rec(rec);

  9. decode_results result;

  10. void setup()
  11. {
  12.   Serial.begin(9600);   
  13.   ir_rec.enableIRIn();  
  14.   pinMode(led_1, OUTPUT);
  15.   pinMode(led_2, OUTPUT);

  16. }

  17. void loop() {
  18.   if (ir_rec.decode(&result)) {
  19.     unsigned int val = result.value;
  20.     switch(val) {
  21.        case code1:
  22.           digitalWrite(led_1,HIGH);// TURNS LED_1 ON WHEN BUTTON 1 IS PRESSED
  23.           digitalWrite(led_2,LOW);
  24.           break;
  25.        case code2:
  26.           digitalWrite(led_2,HIGH);// TURNS LED_2 ON WHEN BUTTON 2 IS PRESSED
  27.           digitalWrite(led_1,LOW);
  28.           break;
  29.        case code3:
  30.           digitalWrite(led_2,LOW);// TURNS  BOTH LEDS OFF WHEN POWER BUTTON IS PRESSED
  31.           digitalWrite(led_1,LOW);
  32.           break;
  33.       
  34.       
  35.     }
  36.       
  37.     Serial.println(val);
  38.     ir_rec.resume();                   // Receive the next value
  39.   }
  40. }
复制代码

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 714 | 回复: 1501



手机版|

GMT+8, 2024-12-22 15:12 , Processed in 0.050969 second(s), 8 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表