В каждом доме можно найти с десяток различный пультов дистанционного управления. Все они, как правило, работают в инфракрасном (ИК) диапазоне. Мастеря какую-либо «микропроцессорную штучку», да еще и на платформе Arduino, невольно возникает мысль воспользоваться готовым «ИК пультиком» для управления создаваемой конструкцией.
Вся беда в том, что существует масса различных протоколов кодирования данных в дистанционном управлении. На помощь приходит сообщество Arduino: за нас уже потрудились и создали универсальную библиотеку, которая позволяет определять протокол и декодировать сообщение, принятое ИК приемником.
Для приема сигнала я использовал обычный ИК-приемник. Брал «из того, что было»: в магазине был 136АА71 — по внешнему виду похож на более распространенные; некоторые сомнения возникали в частоте модуляции (36КГц) — вдруг мои пульты все как один работают на 38КГц? Но, опасения были напрасны: практически все пульты успешно «считываются» приобретенным устройством. Рекомендуют включать ИК-приемник через RC-фильтр по питанию и подтягивать резистором выход к VCC — я этого не делал. Схема включения проста: подаем +5V на VCC, выход приемника подключаем к pin11 Arduino (можно и к другому — просто для меня так было удобно). Цоколевку приемника видно из рисунка, если словами, то: если смотрим спереди на излучатель выводами вниз, то (слева — направо): 1 — GND, 2 — VCC, 3 — OUT
Немного доделанный пример из библиотеки позволяет управлять двумя выходами с помощью четырех кнопок ТВ пульта (я использовал цветные на пульте ДУ от телевизора LG).
#include <IRremote.h> //подключаем библиотеку int RECV_PIN = 11; //к 11 выводу подключен выход ИК-приемника int ch1 = 10; //первый управляемый канал (например светодиод) int ch2 = 12; //второй канал IRrecv irrecv(RECV_PIN); //определяем вход decode_results results; //результат декодирования void setup() { Serial.begin(9600); irrecv.enableIRIn(); // "запускаем" прием pinMode(ch1, OUTPUT); pinMode(ch2, OUTPUT); digitalWrite(ch1, HIGH); // мигнем светодиодами каналов digitalWrite(ch2, HIGH); // чтоб было видно, что все ОК delay(500); // wait for a second digitalWrite(ch1, LOW); // turn the LED off digitalWrite(ch2, LOW); // turn the LED off } void loop() { if (irrecv.decode(&results)) { Serial.println(results.value, HEX); //"показываем" принятый код if (results.value == 0x20DF8679) { //код синей клавиши пульта digitalWrite(ch2, LOW); } //выключаем второй канал if (results.value == 0x20DF8E71) { //green digitalWrite(ch1, LOW); } // turn the LED off if (results.value == 0x20DFC639) { //yellow digitalWrite(ch2, HIGH); } // turn the LED on if (results.value == 0x20DF4EB1) { //red digitalWrite(ch1, HIGH); } // turn the LED on irrecv.resume(); // Receive the next value } delay(100); }
Конечно, коды клавиш у всех пультов разные, для этого в скетче и оставлен вывод принятого кода по последовательному каналу. Т.е. действуем так: собираем схему, запускаем программу и смотрим монитор последовательного порта. Нажимаем выбранные для управления кнопки и смотрим в мониторе их код. Меняем скетч: прописываем обнаруженные коды в соответствующих местах (например, вместо 0x20DF8679 пишем свой код и т.д.) Перезаливаем скетч в Arduino и пользуемся системой ДУ для двух каналов. Скетч легко расширить на произвольное число кнопок/каналов управления.
Вопрос не про приемник, но про библиотеку Rough , Можешь подсказать как отправить пачку импульсов? Не один из описанных в ней протоколов не подходит. Мне нужно зажигать ик-диод на определенные интервалы, естественно на частоте 36-38-40 кГц. Можно это сделать через эту библиотеку?
Скорей всего можно. Стоит обратить внимание на методы mark() и space() — см ..\Arduino\libraries\IRremote\IRremote.cpp строка void IRsend::mark(int time) и далее…
А это нормально, что при такой схеме ИК приемник начинает хорошо так греться? Приемник новый, из упаковки достал, подключил как на схеме
Нет, это не нормально 🙂