Дистанционное управление: связь с Arduino через инфракрасное излучение

Добавлено 28 февраля 2017 в 04:40

Датчик инфракрасного (ИК, IR) излучения позволяет использовать Arduino для приема и декодирования сигналов с пульта дистанционного управления от телевизора.

Большинство ТВ пультов дистанционного управлению использует инфракрасное излучение, чтобы передавать телевизору закодированные сообщения. Длина волны этого инфракрасного свет равна, как правило, 930 и 950 нм, что делает его невидимым для людей. Когда вы нажимаете одну из кнопок на пульте дистанционного управления телевизором, пульт модулирует ИК сигнал широтно-импульсно модулированным (ШИМ) сигналом, уникальным для этой кнопки. Этот сигнал улавливается ИК приемником в телевизоре, который демодулирует сигнал и определяет, какая кнопка была нажата. Мы можем сделать что-то похожее с Arduino, если снабдим нашу плату ИК приемником.

ИК приемник имеет три вывода: два для питания устройства и один для выходного сигнала датчика. Приемник демодулирует ИК сигнал и выдает демодулированный ШИМ сигнал. Выходной вывод подключен к выводу 3 платы Arduino. Затем Arduino, проанализировав ШИМ сигнал, определяет, какая кнопка была нажата.

Эксперимент 1

В данном эксперименте мы будем использовать пульт дистанционного управления телевизором для включения и выключени двух светодиодов.

Необходимые комплектующие

Схема соединений

Соедините компоненты, как показано на рисунке ниже. Инфракрасный приемник подключен к выводу 3. Светодиоды подключены к выводам 4 и 5 через токоограничивающие резисторы 330 Ом.

Управление Arduino через IR ПДУ. Схема соединений
Управление Arduino через IR ПДУ. Схема соединений

Код для эксперимента 1

Для данного эксперимента мы воспользуемся библиотекой IRemote.h для Arduino. Перед написанием кода мы определили, что ИК приемник выдает код 2049, если на ПДУ была нажата кнопка 1, и код 2050, если была нажата кнопка 2. Нажатие кнопки 1 включит светодиоды. Нажатие кнопки 2 выключит их.

#include "IRremote.h"
 
int rec = 3; // вывод, к которому подключен выход TSOP4838
int led_1 = 4;
int led_2 = 5;

#define code1  2049 // код, принятый от кнопки 1
#define code2  2050 // код, принятый от кнопки 2


 
IRrecv ir_rec(rec);
 
decode_results result;
 
void setup()
{
  Serial.begin(9600);   
  ir_rec.enableIRIn();  
  pinMode(led_1, OUTPUT);
  pinMode(led_2, OUTPUT);
 
}
 
void loop() 
{
  if (ir_rec.decode(&result)) 
  {
    unsigned int val = result.value;
    switch(val) 
    {
       case code1:
          digitalWrite(led_1,HIGH);
          digitalWrite(led_2,HIGH);
          break;
       case code2:
          digitalWrite(led_2,LOW);
          digitalWrite(led_1,LOW);
          break;       
    } 
      
    Serial.println(val); 
    ir_rec.resume();                   // принять следующее значение
  }
}

Эксперимент 2

В этом эксперименте мы будем включать и выключать светодиоды по отдельности с помощью ТВ ПДУ.

Необходимые комплектующие

Схема соединений

Схема соединений точно такая же, как и в эксперименте 1.

Код для эксперимента 2

В этом эксперименте вместе с кнопками 1 и 2 мы будем использовать кнопку включения/выключения на пульте дистанционного управления. Вывод ИК датчика при нажатии кнопки включения соответствует коду 2060. Нажатие кнопки 1 включает светодиод 1, нажатие кнопки 2 включает светодиод 2, нажатие кнопки включения/выключения выключает оба светодиода.

#include "IRremote.h"
 
int rec = 3; // вывод, к которому подключен выход TSOP4838
int led_1 = 4;
int led_2 = 5;

#define code1  2049 // код, принятый от кнопки 1
#define code2  2050 // код, принятый от кнопки 2
#define code3  2060 // код, принятый от кнопки включения/выключения



 
IRrecv ir_rec(rec);
 
decode_results result;
 
void setup()
{
  Serial.begin(9600);   
  ir_rec.enableIRIn();  
  pinMode(led_1, OUTPUT);
  pinMode(led_2, OUTPUT);
 
}
 
void loop() {
  if (ir_rec.decode(&result)) 
  {
    unsigned int val = result.value;
    switch(val) 
    {
       case code1:
          digitalWrite(led_1,HIGH);// включаем светодиод 1, если нажата кнопка 1
          digitalWrite(led_2,LOW);
          break;
       case code2:
          digitalWrite(led_2,HIGH);// включаем светодиод 2, если нажата кнопка 2
          digitalWrite(led_1,LOW);
          break;
       case code3:
          digitalWrite(led_2,LOW);// выключаем оба светодиода, если нажата кнопка вкл/выкл
          digitalWrite(led_1,LOW);
          break;   
    } 
      
    Serial.println(val); 
    ir_rec.resume();                   // принять следующее значение
  }
}

Видео

Вот и всё! Надеюсь, статья оказалась полезной. Оставляйте комментарии!


На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.


Сообщить об ошибке