В сегодняшней статье будет рассматриваться подключение ИК приемника TSOP34836 к плате Aduino UNO. Для этих целей можно применить любой имеющийся у вас приемник, совместимый с вашим пультом по частоте. Назначение выводов показано на рисунке.
1. Vout – выход приемника.
2. GND – «земля», общий провод.
3. Vcc – питание.
Передача данных от ИК пульта к приемнику осуществляется по протоколу RC5, представляющий из себя последовательность импульсов. Подключение осуществляется по следующей схеме.
А собрав, получаем примерно следующее:
Для обработки данных, передаваемых пультом, используем библиотеку IRremote, данная библиотека прикреплена к статье. Вставляем следующий код:
#include "IRremote.h" IRrecv irrecv(11); // Указываем пин, к которому подключен приемник decode_results results; void setup() { Serial.begin(9600); // Выставляем скорость COM порта irrecv.enableIRIn(); // Запускаем прием } void loop() { if (irrecv.decode(&results)) // Если данные пришли { Serial.println(results.value, HEX); // Отправляем полученную данную в консоль irrecv.resume(); // Принимаем следующую команду } }
Теперь в консоле COM - порта можно наблюдать код нажимаемой клавиши в HEX.
Вот и все, теперь можно использовать эту схему в ваших устройствах. Ниже приведен пример одного из практических применений ИК - приемника.
В качестве демонстрации будет показано, как с помощью ИК-пульта управлять сервомашинкой.
Схема устройства:
Вот так оно должно выглядеть:
Для работы устройства используем следующий код:
#include "Servo.h" #include "IRremote.h" IRrecv irrecv(11); decode_results results; Servo servoMain; int servPoz = 90; //Начальное положение сервы int lastPoz = 0; void setup() { irrecv.enableIRIn(); servoMain.attach(10); // Servo присоединен к 10 выводу servoMain.write(servPoz); } void loop() { if (irrecv.decode(&results)) { int res = results.value; Serial.println(res, HEX); if(res==0xFFFF906F)// Если нажата кнопка "+" { lastPoz=res; servPoz++; servoMain.write(servPoz); } else if(res==0xFFFFA857)// Если нажата кнопка "-" { servPoz--; lastPoz=res; servoMain.write(servPoz); } else if(res==0xFFFFFFFF)// Если кнопку удерживают { if(lastPoz==0xFFFF906F) servPoz++;// Удерживают "+" if(lastPoz==0xFFFFA857) servPoz--;// Удерживают "-" servoMain.write(servPoz); } irrecv.resume(); delay(100); } }
Пульт используется какой-то китайский, при нажатии "+" серва вращается в одну сторону, при нажатии "-", в другую.
Прикрепленные файлы:
- IR.rar (123 Кб)
- Arduino_IR_lib.rar (23 Кб)
Комментарии (22) | Я собрал (0) | Подписаться
Для добавления Вашей сборки необходима регистрация
C:\Program Files\Arduino\libraries\RobotIRremote\IRremoteTools.cpp:5: error: 'TKD2' was not declared in this scope
Как исправить?
Пост №5:
А так все понятно, спасибо
Уже разобрался скачал библиотеку с гита https://github.com/shirriff/Arduino-IRremote, прошил образцом из неё и всё заработало.
Все коды кнопок были выведены в сериал консоль. Через константы были прописаны все коды кнопок а так же было добавлено событийность кнопок: кнопка нажата, кнопка удерживается и кнопка отпущена. Так больше свободы манипуляции для действий и предотвращение от ложных срабатываний)
Может кому пригодится: http://pastebin.com/A5ywDP2Y
void serialEvent() - можно выбросить а так же все что этом if - "if(stringComplete) {" это был тест приема данных из USB порту.
int lastPozTimeOutSet = 200; - таймаут был добавлен для событийности так как при удерживании какой либо кнопки "if (irrecv.decode(&results))" выполняется очень много раз.
По кнопке "BTN_ONOFF" включается или выключается питание на пине №2, зажигает у меня лампу на 220v через реле)
Rough, Можешь подсказать как отправить пачку импульсов? Не один из описанных в ней протоколов не подходит. Мне нужно зажигать ик-диод на определенные интервалы, естественно на частоте 36-38-40 кГц. Можно это сделать через эту библиотеку?
exit status 1
Ошибка компиляции для платы Arduino/Genuino Uno.
Из первого примера с монитором порта - выписал значения кнопок + и - для своего пульта. Эти значения залил во второй пример для сервы, И вот что получилось: эти значения не работают. Оказалось что с подключенной сервой значения конопок меняются.
Может кто нибудь объяснить почему?