Ардуино и пульт дистанционного управления

Недавно, лежа на диване и лениво переключая каналы телевизора, я подумал, если я могу управлять телевизором с помощью инфракрасного пульта дистанционного управления, то почему бы не использовать аналогичный механизм в своих проектах Arduino. Оказалось, что подключить инфракрасный приемник к этой популярной плате очень просто.

Список необходимых деталей

Схема подключения

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

Как видите, подключение простое. Подаем питание (5В) и подключаем напрямую к входным контактам ИК-приемник и модуль реле.

Загрузка программы

Для того чтобы Ардуино реагировала на нажатие кнопок ПДУ нам нужно воспользоваться библиотекой  IRremote. Мы можем найти ее в  менеджере библиотек. Выбираем последнюю версию и нажимаем «установить».

Чтение кодов кнопок ПДУ

Когда мы нажимаем кнопку на пульте дистанционного управления, он через инфракрасный светодиод отправляет специально закодированный уникальный код кнопки.

Прежде чем мы начнем управлять светодиодами или реле, нам нужно знать коды каждой кнопки ПДУ (или, по крайней мере, тех кнопок которыми мы хотим управлять).

В этом нам поможет пример из библиотеки. Чтобы запустить его, выберите  Файл  >  Примеры  >  IRremote  >  IRrecvDump  и загрузите скетч. Теперь откройте  монитор последовательного порта и по очереди  нажимайте кнопки на пульте дистанционного управления. На мониторе должно появиться что-то вроде этого:

Нас интересует шестизначное шестнадцатеричное число. Я пометил образец кода на скриншоте красной рамкой.

Выберем две кнопки на пульте дистанционного управления CH + и CH- и, используя этот метод, определим соответствующие коды:  0xFFE21D (CH +) и  0xFFA25D(CH-). Код кнопки начинается с 0x  — это говорит о том, что это число в шестнадцатеричной системе исчисления. Часто это обозначение используется в листингах программ.

Имея коды кнопок, перейдем к самой программе управления.

#include <IRremote.h>
#define IRRECV 11 // Номер контакта ИК-приемника
#define RELAY 8 // Номер контакта реле

 

Директива  #include сообщает IDE Arduino, что мы будем использовать библиотеку IRremote. Две последующие директивы (#define) вводят метки IRRECV и RELAY. С этого момента мы можем писать в программном коде  IRRECV и RELAY, в IDE Arduino будет заменять IRRECV  на 11 и RELAY на 8.

Кто-то может задать резонный вопрос: зачем использовать такие метки, если мы можете написать просто числа в программном коде?

А все просто. Наш модуль реле подключен к контакту 8. Если в будущем мы захотим изменить номер контакта для реле, то достаточно будет исправить номер в директиве #define, и нам не придется искать все места, где мы использовали данный номер.

IRrecv irrecv (IRRECV);

В следующей строке мы создаем объект irrecv. Это тип IRrecv (инфракрасный приемник), определенный в библиотеке IRremote. Теперь irrecv становится связующим звеном между нашей программой и кодом, содержащимся в библиотеке IRremote. Этот код знает, как декодировать сообщения, полученные инфракрасным приемником.

void setup() {
irrecv.enableIRIn();
pinMode(RELAY, OUTPUT);
}

Функция setup() подготавливает Arduino к работе. Две строки — первая включает ИК-приемник, вторая настраивает контакт, к которому мы подключили реле, в режим вывода.

При нажатии кнопки на пульте дистанционного управления последовательность сигналов отправляется через светодиод, встроенный в пульт дистанционного управления. Наша Arduino, оснащенная ИК-приемником и кодом из библиотеки, может преобразовывать заданную последовательность ИК-импульсов в соответствующий код.

Когда код из библиотеки IRremote распознает полную последовательность импульсов, он преобразует ее в читаемый вид. Arduino остается сопоставить код кнопки. В нашей программе мы используем следующие функции  readIRCode:

unsigned long readIRCode() {
decode_results results;
unsigned long resultValue = results.value;
irrecv.resume();
return resultValue;
}

decode_results — это тип переменной, определенный библиотекой IRremote. Создаем переменную results, которая через поле value позволяет читать последний считанный код кнопки. Мы сохраняем код во вспомогательной переменной resultValue и вызываем irrecv.resume() заставляя библиотеку IRremote прослушивать последующие импульсы.

Далее код на усмотрение: в основном цикле  у нас будет только структура if, которая проверяет, является ли считанный код кодом одной из кнопок CH+ или CH-, и если да, мы включаем или выключаем модуль реле.

Поскольку единовременно может быть считана только одна кнопка, то в коде будет выполнена только одна из команд в условии if. Если код кнопки не совпадает с CH+ или CH-, никакой код выполняться не будет.

Добавить комментарий

Ваш электронный адрес не будет опубликован.


*