Инфракрасный пульт дистанционного управления — один из самых простых способов взаимодействия с электронными приборами. Так, практически в каждом доме есть несколько таких устройств: телевизор, музыкальный центр, видеоплеер, кондиционер.
Для приема сигнала с пульта нам потребуется специальный ИК-датчик. Вообще, мы можем детектировать инфракрасное излучение обычным фотодиодом/фототранзистором, но в отличие от него, наш ИК-датчик воспринимает инфракрасный сигнал только на частоте 38 кГц (иногда 40кГц). Именно такое свойство позволяет датчику игнорировать много посторонних световых шумов от ламп освещения и солнца.
Для этого урока воспользуемся популярным ИК-датчиком VS1838B, который обладает следующими характеристиками:
несущая частота: 38 кГц;
напряжение питания: 2,7 — 5,5 В;
потребляемый ток: 50 мкА.
Можно использовать и другие датчики, например: TSOP4838, TSOP1736, SFH506.
Датчик имеет три вывода (три ноги). Если посмотреть на датчик со стороны приёмника ИК сигнала, как показано на рисунке,
то слева будет — выход на контроллер,
по центру — отрицательный контакт питания (земля),
и справа — положительный контакт питания (2.7 — 5.5В)
#include <IRremote.h>
int RECV_PIN = 8; //Пин подключения ИК-приемника
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup()
{
Serial.begin(9600); //Начало сообщения с монитором порта
irrecv.enableIRIn(); //Старт ИК-приемника
}
void loop()
{
if (irrecv.decode(&results)) //Если есть результат принятия
{
Serial.println(results.value); //Сообщить на монитор порта
irrecv.resume(); //Получить следующее значение с ИК-приемника
}
}
Загружаем программу на Ардуино. После этого, пробуем получать команды с пульта. Открываем монитор последовательного порта (Ctrl+Shift+M), берём в руки пульт, и направляем его на датчик. Нажимая разные кнопочки, наблюдаем в окне монитора соответствующие этим кнопкам коды
#include <IRremote.h>
#include <Servo.h>
Servo servoPrivod; //Создаем объект типа Servo (для работы с сервоприводом)
int grad = 0; //Угол поворота сервопривода
int RECV_PIN = 8; //Пин подключения ИК-приемника
IRrecv irrecv(RECV_PIN); //Инициализация ИК-приемника
decode_results results; //Структура результата
void setup()
{
irrecv.enableIRIn(); //Старт приема
servoPrivod.attach(9); //Подключаем сервопривод к выходу 9
}
void loop()
{
if (irrecv.decode(&results)) //Если получили результат
{
if (results.value == 16712445)
{ //Нажали кнопку «+» на пульте
if (grad + 15 > 180) grad = 180; //Увеличим угол поворота
else grad = grad + 15;
}
else if (results.value == 16750695)
{ //Нажали кнопку «–» на пульте
if (grad - 15 < 0) grad = 0; //Уменьшим угол поворота
else grad = grad - 15;
}
servoPrivod.write(grad); //Передать на сервопривод угол поворота
irrecv.resume(); //Получение следующего значения
}
}