Реклама ⓘ
Главная » Arduino
Призовой фонд
на апрель 2024 г.
1. 100 руб.
От пользователей

Похожие статьи:


Реклама ⓘ

Arduino Uno. Подключение ИК-приемника

В сегодняшней статье будет рассматриваться подключение ИК приемника 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);
  }
}

Пульт используется какой-то китайский, при нажатии "+" серва вращается в одну сторону, при нажатии "-", в другую.

Прикрепленные файлы:

Теги:

Опубликована: Изменена: 12.08.2014 0 0
Я собрал 0 1
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 4.7 Проголосовало: 1 чел.

Комментарии (24) | Я собрал (0) | Подписаться

0
Никита #
А это нормально, что при такой схеме ИК приемник начинает хорошо так греться? Приемник новый, из упаковки достал, подключил как на схеме
Ответить
+1
Rough #
Проверьте распиновку по даташиту Вашего приемника, у разных приемников бывает разная распиновка.
Ответить
0
CRImier #
Работает? Даташит тут, если что. Там как раз упоминаются две вариации, у которых поменяли местами землю и питание.
Отредактирован 27.08.2014 17:45
Ответить
0
G-spy #
При компиляции выдает ошибку
C:\Program Files\Arduino\libraries\RobotIRremote\IRremoteTools.cpp:5: error: 'TKD2' was not declared in this scope
Как исправить?
Ответить
0
Rough #
Гугл подсказал следующее: http://forum.arduino.cc/index.php/topic,188236.0.html
Пост №5:
Removing the files - libraries\RobotIRremote\IRremoteTools.cpp and libraries\RobotIRremote\IRremoteTools.h solved the problem. They are example files which somehow are getting included. You can move those two files to some other location as backup.
Ответить
0
кто-то #
А вы скачивали библиотеку?
Ответить
-1
Alex #
Для совсем не понимающих подскажите что имеется ввиду. Как решить error: 'TKD2' was not declared in this scope
Ответить
0
Rough #
Удалите файлы libraries\RobotIRremote\IRremoteTools.cpp и libraries\RobotIRremote\IRremoteTools.h
Ответить
0
lel #
Перенеси скобку
Ответить
0
Tetragonchik #
А ниче что TSOP не по феншую подключен? Где фильтровочные резистор 33 Ω < R1 < 1 kΩ и конденсатор C1 > 0.1 µF?
Ответить
0
Rough #
Да, по хорошему ставить надо, но в таком варианте тоже работает.
Ответить
0
Kolobok #
Странно только, что в двухбайтобую int записывается 4-х байтовое значение...
А так все понятно, спасибо
Ответить
0
Alex #
Почему несколько разных кодов выдает датчик при нажатии на одну кнопку пульта?
Ответить
0
NoNickName #
1й HEX-код - код кнопки, а 2й HEX-код (0xFFFFFFFF) пишется при удержании той же кнопки
Ответить
0
BS #
Сделал по первой схеме на ардуино нано и w138m2 - что не нажму выводит 2 нуля.
Уже разобрался скачал библиотеку с гита https://github.com/shirriff/Arduino-IRremote, прошил образцом из неё и всё заработало.
Ответить
0
LevchiK_2004 #
У меня тоже самое, попробуйте другой пульт. Я попробовал другой - всё работает.
Ответить
+1
Vladimir #
Спасибо большое, все получилось. Приемник был выпаян из старого барахла, даташит не нагуглися но распиновка подошла из статьи. Пульт был использован от какой то старой допотопной видео-камеры.

Все коды кнопок были выведены в сериал консоль. Через константы были прописаны все коды кнопок а так же было добавлено событийность кнопок: кнопка нажата, кнопка удерживается и кнопка отпущена. Так больше свободы манипуляции для действий и предотвращение от ложных срабатываний)

Может кому пригодится: http://pastebin.com/A5ywDP2Y

void serialEvent() - можно выбросить а так же все что этом if - "if(stringComplete) {" это был тест приема данных из USB порту.

int lastPozTimeOutSet = 200; - таймаут был добавлен для событийности так как при удерживании какой либо кнопки "if (irrecv.decode(&results))" выполняется очень много раз.

По кнопке "BTN_ONOFF" включается или выключается питание на пине №2, зажигает у меня лампу на 220v через реле)
Ответить
0
Никита #
У меня при нажатии любой кнопки выполняется первая команда. Подскажите, пожалуйста, в чем может быть проблема?
Ответить
0
Oleg #
Вопрос не про приемник, но про библиотеку
Rough, Можешь подсказать как отправить пачку импульсов? Не один из описанных в ней протоколов не подходит. Мне нужно зажигать ик-диод на определенные интервалы, естественно на частоте 36-38-40 кГц. Можно это сделать через эту библиотеку?
Ответить
0
фе #
пишет
exit status 1
Ошибка компиляции для платы Arduino/Genuino Uno.
Ответить
0
равиль #
Здравствуйте! Приведите пожалуйста пример скетча, в котором при удержании кнопки светодиод горит, а при отпускании - гаснет.
Ответить
0
Макс #
Пример с сервомашинкой и IR классный - спасибо!
Из первого примера с монитором порта - выписал значения кнопок + и - для своего пульта. Эти значения залил во второй пример для сервы, И вот что получилось: эти значения не работают. Оказалось что с подключенной сервой значения конопок меняются.
Может кто нибудь объяснить почему?
Ответить
0
avexoid #
У меня другой ИК-приемник - с двумя ножками, он работает в паре с ИК-излучателем. Подскажите, пожалуйста, сехму их подсоединения.
Ответить
0
томик #
У меня почему то серво пожужжал в поисках середины и умер
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется напряжение?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Raspberry Pi 2
Raspberry Pi 2
Модуль измерения тока на ACS712 (30А) Осциллограф DSO138
вверх