Инфракрасный декодер пультов ду на arduino

Можете ли вы получить модуляцию сигнала инфракрасного пульта с помощью Arduino?

Позвольте мне предисловие, что я очень люблю электронику noob. Я порядочный с программированием.

У меня есть HD-телевизор RCA L40FHD41, который я купил в 2010 году. Я пробовал использовать много универсальный пульт с этим телевизором, но после попытки сотен кодов ничего не работает.

Я купил дешевый пульт дистанционного управления (RCA 276045 TV Remote Control), но он попал и промахнулся, когда он решил действительно работать.

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

У меня был фрагмент кода, который в основном воспринимал бы входной ИК-вход и выводил его через ИК-светодиод. Чтобы проверить, я указал ИК-светодиод на свой удаленный ресивер для ПК и нажал несколько кнопок на пульте дистанционного управления ПК. Это сработало.

Но когда я указал на ИК-светодиод на телевизоре и нажал кнопки на пульте телевизора, ничего не произошло. Я думаю, что телевизор использует разностную модуляцию. Я читал, что большинство стандартных IR использует 38Khz. Я хочу узнать, какая модуляция использует ТВ-пульт.

В любом случае, чтобы получить эту информацию, используя Arduino и ИК-приемник?

Редактировать: Кто-то сказал, что это может быть проблема декодирования. Это не может быть так, потому что я использовал еще один пример кода примера, чтобы получить тайминги и коды HEX для всех кнопок, и когда я нажимал одну и ту же кнопку несколько раз, он получал одинаковые результаты, последовательно. Ниже приведен пример вывода этой части образца кода: Кнопка питания

Код: 6A68351E (32 бита)

синхронизации [51]:

+4050, -3400 + 800, -1650 + 800, -1600 + 850, -1600 + 800, -1600 + 800, – 650 + 800, – 650 + 850, -1600 + 800, – 650 + 800, -1650 + 750, – 700 + 750, -1650 + 750, – 750 + 700, – 750 + 750, – 700 + 750, – 700 + 750, – 750 + 700, -1700 + 700, -1700 + 700, – 750 + 700, -1750 + 650, – 800 + 600, -1850 + 600, – 850 + 600, -1800 + 600

беззнаковое INT RAWDATA [51] = {4050, 3400, 800, 1650, 800, 1600, 850, 1600, 800, 1600, 800 650, 800 650, 850, 1600, 800, 650, 800, 1650, 750, 700, 750, 1650, 750, 750, 700, 750, 750 750, 700 1700, 700 1700, 700 750, 7001750, 650800, 6001850, 600850, 6001800, 600};

EDIT: У меня есть код, который работает, чтобы включить/выключить телевизор. Не уверен, что отличается от кода, который просто взял исходный вход и транслировал его.

Источник: https://electronics.stackovernet.com/ru/q/77979

Подключение инфракрасного приемника к Arduino

2015-12-08T15:04:44+0300

08.12.2015

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

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

 Начнем с аппаратной части, нам потребуется ИК-приемник который и будет принимать наши сигналы с отправленные с пульта (если на картинке нет вашего приемника то гуглим, иначе можем сжечь его неправильным подключением). GND это минус, Vs это +5 вольт и Vo это выход нашего приемника.

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

 Для работы ИК-приемником и возможно в будущем ИК-передатчиком нам потребуется библиотека IRremote и небольшой тестовый скетч при помощи котрого мы будем принимать коды нажатых кнопок.

 Устанавливаем библиотеку и загружаем в Arduino тестовый скетч, открываем монитор порта (Ctrl+Shift+M в программе Arduino), далее при нажатии кнопок на нашем ИК-пульте мы увидим коды кнопок которые принимает Arduino через ИК-приемник.

 Мы видим что наш ИК-пульт посылает сигналы в кодировке NEC и коды нажатых кнопок, а так же видим иногда текст “Received NEC: repeat; ignoring. ” это говорит о том что срабатывает защита от залипания кнопок (защита от дребезга кнопки или повторного нажатия в очень узкий промежуток времени).

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

 *Следует учесть что мои коды кнопок выглядят так FF40BF, а в коде мы будем писать так 0xFF40BF, то есть добаляем к нашему коду кнопки 0x перед самим кодом.

#include // библиотека для ИК int RECV_PIN = 6; // pin ИК приемника IRrecv irrecv(RECV_PIN); // создаем объект получения сигнала с заданного порта decode_results results; // переменная хранящая результат int LED = 8; // pin нашего светодиода void setup() { irrecv.enableIRIn(); // включаем ИК-приемник pinMode(LED, OUTPUT); // устанавливает режим работы – выход } void loop() { if (irrecv.decode(&results)) { // если есть сигнал if (results.value == 0xFF40BF) { // код моей кнопки “FF40BF”. У Вас он будет дугой! digitalWrite(LED, HIGH); // зажигаем светодиод } if (results.value == 0xFF32CD) { // код моей кнопки “FF32CD”. У Вас он будет дугой! digitalWrite(LED, LOW); // тушим светодиод } irrecv.resume(); // получаем следующее значение } }

 Теперь можно управлять с ИК-пульта чем вам вздумается

Источник: http://webstrannik.ru/podklyuchenie-infrakrasnogo-priemnika-k-Arduino.html

Универсальный пульт на Arduino

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

Пульт очень удобен в том, что на экране практически одни и те же кнопки используются для управления телевизором и плеером. Одно отличие в том, что кнопка “AV” в режиме управления телевизором меняется на кнопку “” (stop) при переходе в режим управления плеером. На картинках показано два режима, слева режим управления телевизором, справа — режим управления плеером.

Ну а сейчас я расскажу немного о создании такого пульта. Для устройства использовал пульт от телевизора ERGO и пульт от медиаплеера DUNE HD TV101W.

Для получения данных от пультов я использовал инфракрасный датчик TSOP1138 (аналог TSOP4838) на рабочей частоте 38 кГц и подключил его к плате Arduino по схеме:

Для начала нам потребуется прочитать коды кнопок пультов. Я воспользовался библиотекой IRremote и тестовым скетчем IRrecvDump.

Этот скетч на потребуется для определения кодировки передачи данных и считывания кода кнопок пультов.

После заливки скетча открываем «монитор порта» и, нажимая на кнопки пульта, смотрим на полученные данные.

На картинке пример сканирования кнопки включения от пульта телевизора и пульта плеера. Теперь формируем таблицу для кодов кнопок.

У меня получилось как на фото выше. Под надписью TV коды кнопок пульта от телевизора; под надписью Player — коды от пульта медиаплеера.

Теперь отключаем наш приемник инфракрасных сигналов от платы Arduino и подключаем к ней Bluetooth модуль HC-05 и инфракрасный светодиод по схеме на фото.

После этого переходим непосредственно к скетчу.

Скетч#include
IRsend irsend;
int y = 1; void setup()
{ Serial.begin(9600);
} void loop() { if (Serial.available() > 0) { int x = Serial.read(); if (x == 49) { y = 1; } if (x == 50) { y = 2; } if (y == 1) { // коды кнопок для пульта от телевизора if (x == 97) { irsend.sendNEC(0x807F08F7, 32); delay(40); } if (x == 98) { irsend.sendNEC(0x807FA857, 32); delay(40); } if (x == 99) { irsend.sendNEC(0x807F708F, 32); delay(40); } if (x == 100) { irsend.sendNEC(0x807FF00F, 32); delay(40); } if (x == 101) { irsend.sendNEC(0x807F30CF, 32); delay(40); } if (x == 102) { irsend.sendNEC(0x807FB04F, 32); delay(40); } if (x == 103) { irsend.sendNEC(0x807F9867, 32); delay(40); } if (x == 104) { irsend.sendNEC(0x807F58A7, 32); delay(40); } if (x == 105) { irsend.sendNEC(0x807FD827, 32); delay(40); } if (x == 106) { irsend.sendNEC(0x807F38C7, 32); delay(40); } if (x == 107) { irsend.sendNEC(0x807F48B7, 32); delay(40); } if (x == 108) { irsend.sendNEC(0x807FB847, 32); delay(40); } if (x == 109) { irsend.sendNEC(0x807F6897, 32); delay(40); } } if (y == 2) { //коды кнопок пульта от медиаплеера if (x == 97) { irsend.sendNEC(0xFDC23D, 32); delay(40); } if (x == 98) { irsend.sendNEC(0xFDE01F, 32); delay(40); } if (x == 99) { irsend.sendNEC(0xFD18E7, 32); delay(40); } if (x == 100) { irsend.sendNEC(0xFDE817, 32); delay(40); } if (x == 101) { irsend.sendNEC(0xFDA857, 32); delay(40); } if (x == 102) { irsend.sendNEC(0xFD6897, 32); delay(40); } if (x == 103) { irsend.sendNEC(0xFDA857, 32); delay(40); } if (x == 104) { irsend.sendNEC(0xFD6897, 32); delay(40); } if (x == 105) { irsend.sendNEC(0xFDE817, 32); delay(40); } if (x == 106) { irsend.sendNEC(0xFD18E7, 32); delay(40); } if (x == 107) { irsend.sendNEC(0xFD9867, 32); delay(40); } if (x == 108) { irsend.sendNEC(0xFD28D7, 32); delay(40); } if (x == 109) { irsend.sendNEC(0xFD20DF, 32); delay(40); } } }
}

В скетче вам потребуется отредактировать коды кнопок, а именно в строках:

if (x == 97) { irsend.sendNEC(0x807F08F7, 32); delay(40);

Значение 807F08F7 поменять на:

if (y == 1) { //коды кнопок для пульта от телевизора if (x == 97) { irsend.sendNEC(0x12345678, 32); delay(40); }

Где 12345678 — это код вашей кнопки.

После редактирования скетча по ваши коды кнопок заливаем скетч в плату Arduino и переходим к установке приложения на телефон.

[ Скачать приложение для android устройств «Универсальный пульт управления» ]

Включаем блютуз в телефоне, ищем наше устройство, создаем пару, потом запускаем приложение Pult на телефоне.

При запуске у нас появится экран с красным значком bluetooth в правом нижнем углу, что сигнализирует о том, что мы не подключены к нашему устройству.

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

Теперь мы снова вернулись на главный экран и уже можем управлять телевизором:

Для перехода в режим управления нам потребуется нажать кнопку с надписью «Player». Как я говорил раньше, у нас кнопка с надписью «AV» поменяется на кнопку ““:

Для отключения от нашего устройства просто зажмите кнопку «Power» на несколько секунд.

Ну и несколько фотографий моего готового устройства.

Получилось, вроде, неплохо. Жду комментарии к статье.

Источник: http://www.pvsm.ru/arduino/87813

Arduino шаг за шагом

Для реализации этого проекта нам понадобиться немного радиодеталей: ИК приемник (VS 1838B), пульт ДУ (подойдет любой, но я буду использовать пока пульт от набора ардуино), два резистора на 100-200 Ом, конденсатор 10 мкФ, три светодиода разных цветов, и макетные провода с макетной платой.

Теперь немного теории (без этого никуда). Инфракрасный пульт дистанционного управления — один из самых простых способов взаимодействия с электронными приборами.

Наверняка в каждом доме найдётся немало таких устройств: телевизор, музыкальный центр, видеоплеер, кондиционер.

А можно ли с помощью ПДУ (пульт дистанционного управления) управлять нашей Arduino Uno? Оказывается да! Для начала поставим скромную задачу: с помощью ПДУ зажигать и гасить светодиоды.

Для начала нам понадобиться любой ИК пульт (если у вас остались старые ИК ПДУ, то вот можно найти им применение).  Такие устройства ИК работают испуская на инфракрасном светодиоде импульсы ИК излучения определённой частоты (приблизительно от 38 до 40 кГц).

Соответственно приемник (в нашем случае это VS1838B) может принимать любой ИК излучение, но «ненужное» излучение (несущая) должно быть отфильтровано (иначе будут ложные срабатывания), и в итоге остаётся только «нужный» сигнал данных (который передается при нажатии на кнопку ПДУ).

Но вернемся к нашему приемнику ИК VS1838B. Важно его грамотно подключить. А для этого давайте сначала познакомимся с его выводами. Он имеет три вывода: если посмотреть на датчик со стороны приёмника ИК сигнала, как показано на рисунке, то слева будет — выход на контроллер, по центру — отрицательный контакт питания (земля), и справа — положительный контакт питания (2.7 — 5.5В).

 Далее собираем схему и давайте подключим библиотеку IRremote (ее можно будет загрузить с Яндекс диска по этой ссылке). Если кто еще не знает как это сделать, то вот здесь можно будет все наглядно посмотреть (ссылка на видео). Следующим этапом нам нужно убедиться, что наш ПДУ действительно подает сигналы на ИК приемник и все отображается в мониторе порта. Вообще для этого есть отдельный скетч (который можно загрузить из примера в библиотеке IRremote), но давайте сразу убьём обоих зайцев: возьмём готовый скетч (который мы в дальнейшем будем настраивать).

/*

 Arduino, ИК(IR) приемник и пульт управления

*/

// Подключаем библиотеку для работы с IR приемником

#include<\p>

#define LED_PIN

int IRRECV_PIN = 2;

// Для управления цветом светодиода используем 3 ШИМ порта

int bluePin = 9;

int greenPin = 10;

int redPin = 11;

// Выставляем, на каком порту весит выход IR приемника

IRrecv irrecv(IRRECV_PIN);

decode_results res;

void setup() {

  // Включаем последовательное соединение с ПК

  Serial.begin(9600);

  // Включаем IR приемник

  irrecv.enableIRIn();

  // НАстраиваем выходы для нашего RGB светодиода

  pinMode(bluePin, OUTPUT);

  pinMode(greenPin, OUTPUT);

  pinMode(redPin, OUTPUT);

}

void loop() {

  // Принимаем и декодируем сигнал

  if (irrecv.decode(&res)) {

    // Сохраняем полученное значение в переменной

    int value = res.value;

    // Выводим на монитор последовательного порта значения.

    Serial.println(value);

    // В зависимости от кода полученного сигнала, выполняем действия.

    // Для используемого пульта кнопки 1,2,3 – RGB свечение, 9 – выключение

    if (value == 26775){

      setColor(255, 0, 0);

    } else if (value == 12495){

      setColor(0, 255, 0);

    } else if (value == 6375){

      setColor(0, 0, 255);

    } else if (value == 31365){

      setColor(0, 0, 0);

    }

    // Даем команду получать следующее значение

    irrecv.resume();

  }

}

// Функция включения необходимого цвета на нашем RGB светодиоде

void setColor(int red, int green, int blue) {

  analogWrite(redPin, red);

  analogWrite(greenPin, green);

  analogWrite(bluePin, blue);

}

В вашем варианте коды от пульта могут быть другими, так что замените мои значения (от китайского ПДУ в базовом наборе ардуино) на те, которые вы сможете увидеть в мониторе порта. И собственно все! После замены перезагрузите скетч и попробуйте теперь с ИК ПДУ зажигать и гасить светодиоды. У меня это получилось так (посмотрите видео, где я не только демонстрирую работу ИК ПДУ но так же делюсь и дальнейшими планами по реализации этого проекта). 

Источник: http://arduinob.blogspot.com/2016/02/blog-post_27.html

ИК-приемник VS1838B и arduino

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

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

Приемник работает на частоте 38 кГц, данная частота является самой распространенной среди ИК-пультов, используемых в домашней технике.

Подключение ИК-датчика VS1838B к arduino

Для считывания ИК-сигнала и преобразования его к человеческому виду – числу, можно воспользоваться библиотекой IRremote, с ее помощью весь скетч займет всего несколько строк.
Ссылка на библиотеку: IRremote .

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

Ниже приведена фотография VS1838B с подписанными ножками:

Ногу, которая отвечает за передачу данных, будем подключать к пину 11 arduino. Так же для наглядности подключим к 13 пину светодиод, который будет включаться и выключаться при нажатии на кнопки на ИК-пульте.

Что использовалось в проекте:

Код скетча для ИК-приемника VS1838B

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

#include // подключаем библиотеку int ledPin = 13; // светодиод int reciverPin = 11; // пин, к котрому подключен ИК-приемник IRrecv irrecv(reciverPin); decode_results results; void setup() { Serial.begin(9600); irrecv.enableIRIn(); // запуск приемника pinMode(ledPin, OUTPUT); } void loop() { // постоянно считываем данные с приемника if (irrecv.decode(&results)) { // выводим в консольку, что получили, число в 16-ричном виде Serial.println(results.value, HEX); // проверяем сигналы – и если это те, что нам нужны, то вкл или выкл светодиод if(results.value == 0x926DC837) digitalWrite(13, HIGH); if(results.value == 0x926D48B7) digitalWrite(13, LOW); irrecv.resume(); // готовы принимать следующий сигнал } }

Пример работы ИК-датчика VS1838B и arduino можно посмотреть ниже на видео.

Источник: https://vk-book.ru/ik-priemnik-vs1838b-i-arduino/

Пульт управления на Arduino в мобильнике | Каталог самоделок

Благодаря Arduino можно собрать универсальный пульт дистанционного управления (ПДУ). Очень удобно, когда с одного устройства можно управлять телевизором и медиаплеером. Самое замечательное, что все функции управления будут доступны на своем телефоне Android.

Комплектующие для сборки пульта на Arduino:

  1. Плата Arduino Pro mini с процессором ATmega328.
  2. Bluetooth модуль HC-05;
  3. Инфракрасный приемник TSOP1138, TSOP2238, TSOP4838 (последние две цифры определяют несущую частоту в кГц).
  4. Инфракрасный диод — передатчик от ненужного ПДУ.

Считывание IR кодов с ПДУ

Для считывания кодов команд с какого-нибудь пульта управления, работающего на самой распространенной частоте 36 кГц, нам потребуется подключить инфракрасный приемник TSOP всего лишь тремя проводами к плате Arduino.

Диапазон работы инфракрасных ПДУ находится в пределах 30–60 кГц. В нашем случае приемник TSOP выбран на частоту 38 кГц, так как отклонение в 10% допускается. Всего лишь понадобиться поднести ближе пульт к датчику в случае плохого приема сигнала.

Электрическая схема подключения TSOP1138, TSOP2238, TSOP4838 к Arduino Pro mini

Монтажная схема подключения TSOP1138, TSOP2238, TSOP4838 к Arduino Pro mini

После сборки схемы скачиваем библиотеку IRremote для Arduino на компьютер.

Устанавливаем и открываем в ней пример скетча IRrecvDump.

В примере скетча меняем номер пина получателя в строке int RECV_PIN = 11 на int RECV_PIN = 4.

Загружаем измененный пример в плату Arduino. Открываем в программе Arduino IDE Монитор порта, наводим имеющийся пульт управления на приемник TSOP и смотрим, считывает ли собранная схема IR коды от какой-то кнопки на пульте.

В приведенном примере, оба пульта от телевизора и медиаплеера передают данные в кодировке NEC.

Все считанные данные от пультов надо занести в таблицу.

Во втором столбце данные для телевизионного пульта TV, в третьем для пульта медиаплеера Player.

После успешного считывания IR кодов, разбираем собранную схему подключения TSOP к Arduino.

Сборка пульта управления на Arduino

Подсоединяем к плате Arduino инфракрасный диод и Bluetooth модуль HC-05.

Монтажная схема универсального пульта на Arduino

Собранный универсальный пульт управления на Arduino

Скачиваем образец скетча Universal_IR_pult

Теперь надо по очереди переписать в скетче коды кнопок для своих пультов, в соответствии с составленной таблицей. Сначала переписываем для телевизора, начиная со строчки:

if (x == 97) {
irsend.sendNEC(0x807F08F7, 32);
delay(40);

а затем для медиаплеера:

if (x == 97) {
irsend.sendNEC(0xFDC23D, 32);
delay(40).
 

Если ваш пульт передает данные в кодировке SONY, RC5, RC6, PANASONIC, тогда меняем в скетче запись NEC на соответствующую.

Готовую программу загружаем в плату Arduino.

Для проверки передачи данных, открываем в программе Arduino IDE Монитор порта, отправляем в него «1» (задействовано управление телевизором). Отправляем «а» — должно вывестись значение 97.

Потом прописываем «2» (задействовано управление медиаплеером) и снова вводим «а» — ждем вывода 97.

Имитация передачи данных с телефона на Arduino

Установка приложения Pult на телефон Android

Скачиваем приложение Pult.apk и устанавливаем на любое устройство Android, телефон или планшет.

Главный экран приложения Pult.apk

После нажатия на красный значок Bluetooth, выводится окно со списком доступных Bluetooth устройств

После удачного соединения с Bluetooth модулем HC-05, значок Bluetooth должен поменять свой цвет на синий.

Главный экран приложения Pult для режима телевизора TV

Главный экран приложения Pult для режима мультиплеера Player

Источник: https://volt-index.ru/high-tech/pult-upravleniya-na-arduino-v-mobilnike.html

Arduino и пульт ДУ

До покупки Arduino у меня не было опыта общения с микроконтроллерами, прошу не оценивать слишком строго. Однако, с благодарностью приму любую конструктивную критику.    

Пульт ДУ и  IR-приемник остались у меня от древней ТВ-карты MediaForte. Схема подключения типична для таких приемников. (ее можно посмотреть тут )

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

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

Анализируя результат, можно понять следующее:

  1. В состоянии ожидания сигнал находится в высоком уровне. 
  2. Код клавиши состоит из 32 бит. Старшие два байта для данного пульта всегда одинаковые. А код клавиши определялся двумя младшими байтами.

     

  3. Каждый бит кодируется последовательностью из низкого затем высокого уровней: 0,55+0,55= 1,1мс соответствует “0” , а 0,5+1,7= 2,2мс – соответствует “1”.
  4. Перед началом передачи 32 битов кода идет последовательность:  8,9+4,5=  13,4мс. – “Сейчас начнется передача новой команды”
  5. Последовательность  8,9+2,3 = 11,2мс.

    означает “повтор предыдущей команды”

  6. Строка 71 и 72. Очевидно, что это низкий и высокий уровень во время ожидания между нажатиями кнопки.
  7. Возможно это было связанно с плохим контактом, но иногда я получал ложные переключения менее 1мс, которые влияли на конечный результат.

     

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

Теперь собственно программа: 

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

Функция – “обработчик прерывания” будет вызываться каждый раз, когда сигнал переходит из “высокого” уровня в “низкий”. 

Очень важно для такой функции быстро отработать и вернуть управление обратно. 

Если ваш контроллер кроме считывания команд с пульта ДУ занимается еще какими-нибудь полезными но “долгими” делами, логично организовать что-то вроде очереди сообщений (FIFO) и помещать коды кнопок туда. И опрашивать очередь уже в основном цикле программы. Тогда вы их не пропустите.  

Можно конечно сделать это все в виде библиотеки и “спрятать” в класс и обработчик и очередь сообщений. Но, на мой взгляд, оно того не стоит. Ведь для каждого пульта обработчик нужен свой.   

volatile unsigned long IR_KEY;   //код кнопки на пульте

void setup() {                

  Serial.begin(9600);

  pinMode(2, INPUT);    // ИК приемник подключим сюда        

  IR_KEY = 0;

  attachInterrupt(0,IRinterrupt,FALLING); // назначим прерывание 

}

void loop() {

 if(IR_KEY) {

   Serial.println(IR_KEY,HEX); //выводим код в терминал.

   IR_KEY = 0;

 }

}

/* обработчик прерывания*/

void IRinterrupt(){

  static unsigned long key, prevTime;

  unsigned long currTime, d;

  currTime = micros();

  d = currTime – prevTime;

  if(d < 1100) return;        // "дребезг"

  if(d < 1400){               // "0"

    key = key<\p>

Источник: https://sites.google.com/site/arduinoirc/

Дистанционное управление: связь с Arduino через инфракрасное излучение

Датчик инфракрасного (ИК, IR) излучения позволяет использовать Arduino для приема и декодирования сигналов с пульта дистанционного управления от телевизора.

Большинство ТВ пультов дистанционного управлению использует инфракрасное излучение, чтобы передавать телевизору закодированные сообщения. Длина волны этого инфракрасного свет равна, как правило, 930 и 950 нм, что делает его невидимым для людей.

Когда вы нажимаете одну из кнопок на пульте дистанционного управления телевизором, пульт модулирует ИК сигнал широтно-импульсно модулированным (ШИМ) сигналом, уникальным для этой кнопки. Этот сигнал улавливается ИК приемником в телевизоре, который демодулирует сигнал и определяет, какая кнопка была нажата.

Мы можем сделать что-то похожее с Arduino, если снабдим нашу плату ИК приемником.

ИК приемник имеет три вывода: два для питания устройства и один для выходного сигнала датчика. Приемник демодулирует ИК сигнал и выдает демодулированный ШИМ сигнал. Выходной вывод подключен к выводу 3 платы Arduino. Затем Arduino, проанализировав ШИМ сигнал, определяет, какая кнопка была нажата.

Эксперимент 1

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

Необходимые комплектующие

Схема соединений

Соедините компоненты, как показано на рисунке ниже. Инфракрасный приемник подключен к выводу 3. Светодиоды подключены к выводам 4 и 5 через токоограничивающие резисторы 330 Ом.

Управление Arduino через IR ПДУ. Схема соединений

Код для эксперимента 1

Для данного эксперимента мы воспользуемся библиотекой IRemote.h для Arduino. Перед написанием кода мы определили, что ИК приемник выдает код 2049, если на ПДУ была нажата кнопка 1, и код 2050, если была нажата кнопка 2. Нажатие кнопки 1 включит светодиоды. Нажатие кнопки 2 выключит их.

#include “IRremote.h” int rec = 3; // вывод, к которому подключен выход TSOP4838 int led_1 = 4; int led_2 = 5; #define code1 2049 // код, принятый от кнопки 1 #define code2 2050 // код, принятый от кнопки 2 IRrecv ir_rec(rec); decode_results result; void setup() { Serial.begin(9600); ir_rec.enableIRIn(); pinMode(led_1, OUTPUT); pinMode(led_2, OUTPUT); } void loop() { if (ir_rec.decode(&result)) { unsigned int val = result.value; switch(val) { case code1: digitalWrite(led_1,HIGH); digitalWrite(led_2,HIGH); break; case code2: digitalWrite(led_2,LOW); digitalWrite(led_1,LOW); break; } Serial.println(val); ir_rec.resume(); // принять следующее значение } }

Эксперимент 2

В этом эксперименте мы будем включать и выключать светодиоды по отдельности с помощью ТВ ПДУ.

Необходимые комплектующие

Схема соединений

Схема соединений точно такая же, как и в эксперименте 1.

Код для эксперимента 2

В этом эксперименте вместе с кнопками 1 и 2 мы будем использовать кнопку включения/выключения на пульте дистанционного управления. Вывод ИК датчика при нажатии кнопки включения соответствует коду 2060. Нажатие кнопки 1 включает светодиод 1, нажатие кнопки 2 включает светодиод 2, нажатие кнопки включения/выключения выключает оба светодиода.

#include “IRremote.h” int rec = 3; // вывод, к которому подключен выход TSOP4838 int led_1 = 4; int led_2 = 5; #define code1 2049 // код, принятый от кнопки 1 #define code2 2050 // код, принятый от кнопки 2 #define code3 2060 // код, принятый от кнопки включения/выключения IRrecv ir_rec(rec); decode_results result; void setup() { Serial.begin(9600); ir_rec.enableIRIn(); pinMode(led_1, OUTPUT); pinMode(led_2, OUTPUT); } void loop() { if (ir_rec.decode(&result)) { unsigned int val = result.value; switch(val) { case code1: digitalWrite(led_1,HIGH);// включаем светодиод 1, если нажата кнопка 1 digitalWrite(led_2,LOW); break; case code2: digitalWrite(led_2,HIGH);// включаем светодиод 2, если нажата кнопка 2 digitalWrite(led_1,LOW); break; case code3: digitalWrite(led_2,LOW);// выключаем оба светодиода, если нажата кнопка вкл/выкл digitalWrite(led_1,LOW); break; } Serial.println(val); ir_rec.resume(); // принять следующее значение } }

Видео

Вот и всё! Надеюсь, статья оказалась полезной. Оставляйте комментарии!

Оригинал статьи:

Arduino Mega 2560

Отладочная плата Arduino Mega 2560 построена на микроконтроллере ATmega2560.

Она имеет 54 цифровых входных/выходных выводов (15 из которых могут использоваться в качестве ШИМ выходов), 16 аналоговых входов, 4 порта UART (аппаратных последовательных порта), кварцевый резонатор 16 МГц, подключение USB, разъем питания, разъем ICSP и кнопку перезагрузки. Она содержит всё необходимое для работы с микроконтроллером;…

Набор перемычек (папа-папа)

Набор перемычек папа-папа. 40 штук по 15 см.

ИК приемник VISHAY TSOP4838

TSOP4838 является модулем ИК приемника для систем дистанционного управления. В своем составе содержит ИК фильтр, PIN-диод и предусилитель. Демодулированный выходной сигнал с ИК приемника может быть подан непосредственно на микроконтроллер/микропроцессор.

Источник: https://radioprog.ru/post/170

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

 ePN Cashback – сервис, который возвращает часть денег с покупок, сделанных в интернет магазинах, представленных в ePN Cashback

Обмен данными в инфракрасном диапазоне

Для обеспечения надежного приема и гарантированной защиты от помех используется модуляция сигнала и кодирование. Передача данных производится в близком к видимому инфракрасном спектре.

Длина волны в большинстве реализованных систем варьируется в пределах 800–950 нм. Самый простой способ избавиться от фонового шума — модулировать (заполнить) сигнал при передаче одной из стандартных частот: 30, 33, 36, 37, 38, 40, 56 кГц.

Именно на эти частоты настроены все современные интегральные приемники.

Для обеспечения достаточной дальности при передаче кодовой последовательности необходимо сформировать мощный сигнал. Ток через ИК-светодиод может достигать 1 А — такие токи вполне допустимы в импульсном режиме, при этом средняя рассеиваемая мощность не должна превышать предельно допустимую, указанную в документации.

Разработано большое количество специализированных микросхем (SAA3010, GS8489, KS51840 и т. п), генерирующих готовую кодовую последовательность и потребляющих минимальный ток в ждущем режиме, что немаловажно при питании от батарей. Эти микросхемы существенно упрощают схему пультов дистанционного управления (ПДУ).

Когда мы нажимаем кнопку пульта, микросхема передатчика активизируется и генерирует кодовую последовательность с заданным заполнением. Светодиод преобразуют эти сигналы в ИК-излучение. Излученный сигнал принимается фотодиодом, который снова преобразует ИК-излучение в электрические импульсы. Эти импульсы усиливаются и демодулируются микросхемой приемника. Затем они подаются на декодер.

Декодирование обычно осуществляется программно с помощью микроконтроллера.

Приемник ИК ПДУ должен восстанавливать данные с двухфазным кодированием и реагировать на большие быстрые изменения уровня сигнала независимо от помех. Ширина импульсов на выходе приемника должна отличаться от номинальной не более чем на 10 %. Приемник также должен быть нечувствительным к постоянным внешним засветкам.

Удовлетворить всем этим требованиям достаточно непросто. Старые реализации приемника ИК ДУ, даже с применением специализированных микросхем, содержали десятки компонентов. Такие приемники часто использовали резонансные контуры, настроенные на частоту заполнения.

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

В последнее время большое распространение получили трехвыводные интегральные приемники ИК ПДУ (SFH5110-xx, TSOP17xx, TFMS5хх0 и т. п.). В одном корпусе они объединяют фотодиод, предусилитель и формирователь. На выходе формируется обычный ТТЛ-сигнал без заполнения, пригодный для дальнейшей обработки микроконтроллером. Наиболее важный параметр при выборе приемника — частота заполнения.

Внутренний усилитель интегрального приемника имеет высокий коэффициент усиления, поэтому для исключения самовозбуждения и устранения влияния наводок по цепям питания необходимо использовать электролитический конденсатор емкостью не менее 4,7 мкФ, подключенный максимально близко к выводу VCC.

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

В качестве приемника ИК ПДУ применим микросхему TSOP31236. В одном корпусе она объединяют фотодиод, предусилитель и формирователь.

На выходе формируется обычный ТТЛ-сигнал без заполнения, пригодный для дальнейшей обработки микроконтроллером. Несущая частота 36 кГц, выход инверсный, т. е.

при отсутствии сигнала на пин приходит логическая “1”, при появлении сигнала он посылает логический “0”.

Библиотека IRremote

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

Файлы библиотеки вы можете найти в папке libraries/IrRemote сопровождающего книгу электронного архива. Для использования библиотеки в своих проектах поместим их в папку libraries каталога установки Arduino. Скетч для получения кода и отправки в последовательный порт представлен в примере.

#include<\p>

int RECV_PIN = 11;

IRrecv irrecv(RECV_PIN); decode_results results;

void setup()

{

Serial.begin(9600);

irrecv.enableIRIn(); // включить приемник

}

void loop()

{

if (irrecv.decode(&results))

{

Serial.println(results.value, HEX); irrecv.resume(); // получить следующее значение

}

}

Можно и передавать ИК-команды. Поддерживаемые протоколы: NEC, Sony SIRC, Philips RC5, Philips RC6. Передающий ИК-светодиод должен быть подключен к pin 3. Скетч для отправки ИК-кода представлен в примере.

#include IRsend irsend;

void setup()

{

Serial.begin(9600);

}

void loop()

{

if (Serial.read() != -1)

{

for (int i = 0; i < 3; i++)

{

irsend.sendSony(0xa90, 12); // Sony TV power code delay(100);

}

}

}

 

Скетч для получения кодов ИК-пульта

Первая задача — получить список кодов клавиш нашего пульта.

Определим список клавиш пульта для управления:

  — движение вперед;

  — движение назад;

  — поворот влево;

  — поворот вправо;

  — увеличение скорости при движении вперед/назад;

  — уменьшение скорости при движении вперед/назад;

  — круговое движение на месте влево;

  — круговое движение на месте вправо;

  — остановка робота.

Запускаем скетч из примера и получаем коды нужных клавиш для вашего пульта. Значения кодов выводятся в последовательный порт.

#include<\p>

// вход ИК-приемника int RECV_PIN = 2;

IRrecv irrecv(RECV_PIN); decode_results results; unsigned long ir_dt, old_ir; long ir_kod;

unsigned long ir_time1, ir_time2;

void setup()

{

// последовательный порт Serial.begin(9600);

// включить приемник irrecv.enableIRIn(); ir_time1=0;ir_time2=0;

// прерывания для ИК

// FALLING – вызов прерывания при изменении уровня напряжения

// с высокого (HIGH) на низкое (LOW) attachInterrupt(0, get_ir_kod, FALLING);

}

void loop()

{

// обработка кода нажатия if(ir_kod>0)

{

ir_go(ir_kod); Serial.println(ir_kod); ir_kod=0;

}

}

// получить код, переданный с ИК-пульта void get_ir_kod()

{

detachInterrupt(0); // отключить прерывание 0 if (irrecv.decode(&results))

{

if (results.value > 0 && results.value < 0xFFFFFFFF)

{

ir_dt = results.value; ir_time2=millis();

// прошла 1 сек?

if (ir_time2-ir_time1>1000)

{ir_kod = ir_dt;ir_time1=ir_time2;}

else

ir_kod = 0;

}

irrecv.resume();

}

// активировать процедуру прерывания 0 attachInterrupt(0, get_ir_kod, FALLING);

}

Оформим их в виде констант

// коды клавиш ИК-пульта (marmitek)

#define FORWARD 1936 // ↑

#define BACK 3984 // ↓

#define SPEED_UP 144 //ch+

#define SPEED_DOWN 2192 //ch-

#define LEFT 3472 // ←

#define RIGHT 1424 // →

#define CIRCLE_LEFT 3216 //vol+

#define CIRCLE_RIGHT 1168 //vol-

#define STOP 2320 // 0 – стоп

Определять поступление команды с пульта мы будем по прерыванию 0 (на digital pin2). По прерыванию запускается процедура get_ir_kod(), которая определяет код, поступающий с пульта, и записывает его в переменную ir_kod.

Процедура loop() проверяет переменную ir_kod, и в случае ненулевого значения переменной (получения кода с пульта) вызывает процедуру вывода действия ir_go().

На данном этапе — это вывод в последовательный порт предполагаемого по нажатию клавиши действия.

Данный скетч представлен в примере.

Результат команды с пульта выводитсяна монитор последовательного порта.

#include<\p>

// вход ИК-приемника int RECV_PIN = 2;

IRrecv irrecv(RECV_PIN); decode_results results; unsigned long ir_dt, old_ir; long ir_kod;

unsigned long ir_time1, ir_time2;

// коды клавиш ИК-пульта (marmitek)

#define FORWARD 1936

#define BACK 3984

#define SPEED_UP 144 //ch+

#define SPEED_DOWN 2192 //ch-

#define LEFT 3472

#define RIGHT 1424

#define CIRCLE_LEFT 3216 //vol+

#define CIRCLE_RIGHT 1168 //vol-

#define STOP 2320 //0

void setup()

{

// последовательный порт Serial.begin(9600);

// включить приемник irrecv.enableIRIn(); ir_time1=0;ir_time2=0;

// прерывания для ИК

// FALLING – вызов прерывания при изменении уровня напряжения

// с высокого (HIGH) на низкое (LOW) attachInterrupt(0, get_ir_kod, FALLING);

}

void loop()

{

// обработка кода нажатия if(ir_kod>0)

{

ir_go(ir_kod); ir_kod=0;

}

}

// получить код переданный с ИК-пульта void get_ir_kod()

{

detachInterrupt(0); // отключить прерывание 0

if (irrecv.decode(&results))

{

if (results.value > 0 && results.value < 0xFFFFFFFF)

{

ir_dt = results.value; ir_time2=millis();

// прошла 1 сек?

if (ir_time2-ir_time1>1000)

{ir_kod = ir_dt;ir_time1=ir_time2;} else

ir_kod = 0;

}

irrecv.resume();

}

// активировать процедуру прерывания 0 attachInterrupt(0, get_ir_kod, FALLING);

}

// действие по полученному коду void ir_go(kod)

{

switch(kod)

{

case FORWARD : // направление вперед Serial.print(“forward
“);

break;

case BACK : // направление назад Serial.print(“back
“);

break;

case SPEED_UP : // скорость++ Serial.print(“speed++
“); break;

case SPEED_DOWN : // скорость– Serial.print(“speed–
“); break;

case LEFT : // влево Serial.print(“left
“); break;

case RIGHT : // вправо Serial.print(“right
“); break;

case CIRCLE_RIGHT : // кружение вправо Serial.print(“circle_right
“); break;

case CIRCLE_LEFT : // кружение влево Serial.print(“circle_left
“); break;

case STOP : // стоп Serial.print(“stop
“); break;

default: break;

}

}

Источник: http://www.progdron.com/ru/arduino-shield/arduino-shield/398-ik-pult-distantsionnogo-upravleniya

Урок 35. Универсальный ИК-пульт дистанционного управления

В этом уроке мы создадим универсальный ИК-пульт дистанционного управления. Шесть кнопок универсального ИК-пульта позволяют запрограммировать себя на передачу команды любого* другого ИК-пульта. Код кнопок сохраняется в энергонезависимую область памяти Arduino – EEPROM. Это значит, что Вам не придётся программировать кнопки при каждом включении универсального ИК-пульта.

*Универсальный ИК-пульт может воспроизводить сигналы только тех ИК-пультов, которые передают данные одним информационным пакетом не длиннее 32 бит, а также имеют (или нет) одинаковые пакеты удержания (пакеты повторов).

Нам понадобится:

Для реализации проекта нам необходимо установить библиотеку:

  • iarduino_IR для работы с ИК-приёмопередатчиками.
  • EEPROM – входит в стандартный набор Arduino IDE.

О том как устанавливать библиотеки, Вы можете ознакомиться на странице Wiki – Установка библиотек в Arduino IDE.

Видео:

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

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

Алгоритм работы:

Отправка команд:

  • При нажатии на одну из 6 кнопок универсального ИК-пульта, он отправит команду, соответствующую нажатой кнопке.
  • Если нажатой кнопке команда не присвоена, то ИК-пульт издаст звуковой сигнал, сигнализирующий об ошибке.

Назначение команд кнопкам:

  • Для назначения команд кнопкам универсального ИК-пульта, нужно выполнить следующие действия:
    • Нажать на кнопку “запись команды” и, не отпуская её, нажать на ту кнопку универсального ИК-пульта, которой мы хотим присвоить команду с другого ИК-пульта.
    • Универсальный ИК-пульт издаст два коротких звуковых сигнала, сигнализируя о готовности принять данные.
    • Нажать на кнопку другого ИК-пульта, код которой мы хотим считать.
    • Как только код будет считан, универсальный ИК-пульт издаст короткий звуковой сигнал, сигнализирующий об успешной записи кода. Теперь можно отпустить все кнопки.
  • Можно присвоить одной кнопке – код одного пульта, а другой кнопке – код другого пульта.

    Так как для каждой кнопки, сохраняется не только код, но и протокол передачи данных.

Код программы:

#include // Подключаем библиотеку для работы с ИК-приёмником
#include // Подключаем библиотеку для работы с ИК-передатчиком
#include // Подключаем библиотеку для работы с EEPROM (энергонезависимой областью памяти)
// Указываем выводы к которым подключены модули:
const uint8_t PinButton1= 2; // Объявляем константу с указанием вывода к которому подключена кнопка 1
const uint8_t PinButton2= 3; // Объявляем константу с указанием вывода к которому подключена кнопка 2
const uint8_t PinButton3= 4; // Объявляем константу с указанием вывода к которому подключена кнопка 3
const uint8_t PinButton4= 5; // Объявляем константу с указанием вывода к которому подключена кнопка 4
const uint8_t PinButton5= 6; // Объявляем константу с указанием вывода к которому подключена кнопка 5
const uint8_t PinButton6= 7; // Объявляем константу с указанием вывода к которому подключена кнопка 6
const uint8_t PinButton7= 8; // Объявляем константу с указанием вывода к которому подключена кнопка 7 (запись)
iarduino_IR_RX IR_Read ( 9); // Объявляем объект IR_Read с указанием вывода к которому подключён ИК-приёмник
iarduino_IR_TX IR_Write (10); // Объявляем объект IR_Write с указанием вывода к которому подключён ИК-передатчик
const uint8_t PinBuzzer= 11; // Объявляем константу с указанием вывода к которому подключен зуммер
// Объявляем для хранения временных данных:
uint8_t ValButton= 0; // Объявляем переменную для хранения номера нажатой кнопки
uint32_t ValCode; // Объявляем переменную для хранения кода кнопки
char ValProtocol[26]; // Объявляем строку для хранения 25 символов протокола передачи данных + символ конца строки
void setup(){
// Инициируем работу с ИК-приёмником и ИК-передатчиком: IR_Read.begin(); // Инициируем работу с ИК-приёмником IR_Write.begin(); // Инициируем работу с ИК-передатчиком
// Конфигурируем выводы: pinMode(PinButton1, INPUT); // Конфигурируем вывод с подключенной кнопкой №1 в режим входа pinMode(PinButton2, INPUT); // Конфигурируем вывод с подключенной кнопкой №2 в режим входа pinMode(PinButton3, INPUT); // Конфигурируем вывод с подключенной кнопкой №3 в режим входа pinMode(PinButton4, INPUT); // Конфигурируем вывод с подключенной кнопкой №4 в режим входа pinMode(PinButton5, INPUT); // Конфигурируем вывод с подключенной кнопкой №5 в режим входа pinMode(PinButton6, INPUT); // Конфигурируем вывод с подключенной кнопкой №6 в режим входа pinMode(PinButton7, INPUT); // Конфигурируем вывод с подключенной кнопкой №7 в режим входа pinMode(PinBuzzer, OUTPUT); // Конфигурируем вывод с подключенным зуммером в режим выхода
}
void loop(){
// Проверяем состояние кнопок: if(digitalRead(PinButton1)){ ValButton=1;}else // Если нажата кнопка 1, записываем число 1 в переменную ValButton if(digitalRead(PinButton2)){ ValButton=2;}else // Если нажата кнопка 2, записываем число 2 в переменную ValButton if(digitalRead(PinButton3)){ ValButton=3;}else // Если нажата кнопка 3, записываем число 3 в переменную ValButton if(digitalRead(PinButton4)){ ValButton=4;}else // Если нажата кнопка 4, записываем число 4 в переменную ValButton if(digitalRead(PinButton5)){ ValButton=5;}else // Если нажата кнопка 5, записываем число 5 в переменную ValButton if(digitalRead(PinButton6)){ ValButton=6;}else // Если нажата кнопка 6, записываем число 6 в переменную ValButton {delay(100); ValButton=0;} // Если кнопки 1-6 не нажаты, записываем число 0 в переменную ValButton и подавляем дребезг
// Выполняем действия при нажатии на кнопку: if(ValButton){ // Если нажата кнопка 1-6
// Чтение данных: if(digitalRead(PinButton7)){ // Если нажата кнопка 7 (запись), то … myTone(100); delay(100); myTone(100); // Выводим два коротких звуковых сигнала, сигнализирующих о готовности считать данные while(digitalRead(PinButton7)){ // Входим в цикл while, пока не будет отпущена кнопка 7 (запись) if(IR_Read.check()){ // Если в буфере имеются данные, принятые с другого пульта
// Получаем данные, принятые с пульта strcpy(ValProtocol, IR_Read.protocol()); // Получаем протокол передачи данных пульта в строку ValProtocol ValCode = IR_Read.data; // Получаем код кнопки в переменную ValCode
// Записываем принятые данные в EEPROM for(uint8_t i=0; i((29-i)*8)));} // Последние 4 байта заполняем данными из переменной ValCode (это код кнопки) } myTone(100); // Выводим короткий звуковой сигнал, сигнализирующий об успешной записи } }
// Отправка данных: }else{ // Если не нажата кнопка 7, то …
// Читаем протокол передачи данных и код кнопки из EEPROM: for(uint8_t i=0; i

Источник: https://lesson.iarduino.ru/page/urok-35-universalnyy-ik-pult-distancionnogo-upravleniya/

Урок 5 – Управление Arduino с помощью пульта ДУ (IR). Библиотека IRremote

При создании проектов на Arduino. Часто возникает вопрос, с помощью чего управлять проектом. И желательно на расстоянии. Кнопки уже не модно.

Самый просто и доступный способ это управление с помощью пульта дистанционного управления и IR приемника . Реализовать можно различные проекты, например вытяжку с ик управлением.

Для урока я буду использовать вот такой набор и Arduino UNO.

Купить пульт с IR приемником всего за 100 руб. можно тут.

Приемники могут быть распаянные как в моем случае.

И вот такого плана.

Различий в подключении нет. Первый просто удобнее для тестирования и проверки работы. При подключении самое главное не перепутать ноги и подключить правильно. В противном случае приемник может сгореть.

Подключаем к Arduino UNO вот по такой схеме. К другим Ардуинкам подключается аналогично.

Для работы нам понадобиться библиотека IRremote. Скачать ее можно тут.

С библиотекой устанавливается ряд примеров. Нам понадобиться IrrecvDemo.

IRremote.h> int RECV_PIN = 11; IRrecv irrecv(RECV_PIN); decode_results results; void setup() { Serial.begin(9600); // In case the interrupt driver crashes on setup, give a clue // to the user what's going on. Serial.println(“Enabling IRin”); irrecv.enableIRIn(); // Start the receiver Serial.println(“Enabled IRin”); } void loop() { if (irrecv.decode(&results)) { Serial.println(results.value, HEX); irrecv.resume(); // Receive the next value } delay(100); }

После того как скетч загружен и IR приемник подключен можно проверить какой код соответствует той или иной кнопке пульта ДУ. Поднажимайте на кнопки и в мониторе последовательного порта (Ctrl+Shift+M) вы уведите следующее.

;FF18E7 FFFFFFFF FFA857 FF02FD FF18E7 FF38C7 FF4AB5 FF5AA5 FF10EF FF5AA5 FFFFFFFF FF10EF FF5AA5

У вас возник наверное вопрос что за повторяющая команда FFFFFFFF. Это команда выводиться когда вы долго удерживаете кнопку на пульте и на Ардуино приходить одинаковая команда.

В этом нет ни чего страшного, а иногда это даже полезно. На основе данной команды я сделал управление машинкой с помощью пульта ДУ. При этом машинка едет только тогда, когда нажата кнопка пульта.

Отпускаем и машина перестает ехать и поворачивать.

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

Схема подключения как и в примере выше. Коды кнопок моего пульта:

//FF10EF — стрелочка вправо //FF5AA5 — стрелочка влево

У вашего пульта команды будут другие. Код получается вот такой.

//FF10EF — стрелочка вправо //FF5AA5 — стрелочка влево #include “IRremote.h” IRrecv irrecv(11); // указываем вывод, к которому подключен приемник decode_results results; void setup() { irrecv.enableIRIn(); // запускаем прием } void loop() { if ( irrecv.decode( &results )) { // если данные пришли switch ( results.value ) { case 0xFF10EF: digitalWrite( 13, HIGH ); break; case 0xFF5AA5: digitalWrite( 13, LOW ); break; } irrecv.resume(); // принимаем следующую команду } delay(100); }

Вот так можно легко научить вашу Arduinо понимать команды с пульта.

Источник: http://portal-pk.ru/news/147-urok-4—upravlenie-arduino-s-pomoshchyu-pulta-du-ir.html

Ссылка на основную публикацию
Adblock
detector
",css:{backgroundColor:"#000",opacity:.6}},container:{block:void 0,tpl:"
"},wrap:void 0,body:void 0,errors:{tpl:"
",autoclose_delay:2e3,ajax_unsuccessful_load:"Error"},openEffect:{type:"fade",speed:400},closeEffect:{type:"fade",speed:400},beforeOpen:n.noop,afterOpen:n.noop,beforeClose:n.noop,afterClose:n.noop,afterLoading:n.noop,afterLoadingOnShow:n.noop,errorLoading:n.noop},o=0,p=n([]),h={isEventOut:function(a,b){var c=!0;return n(a).each(function(){n(b.target).get(0)==n(this).get(0)&&(c=!1),0==n(b.target).closest("HTML",n(this).get(0)).length&&(c=!1)}),c}},q={getParentEl:function(a){var b=n(a);return b.data("arcticmodal")?b:(b=n(a).closest(".arcticmodal-container").data("arcticmodalParentEl"),!!b&&b)},transition:function(a,b,c,d){switch(d=null==d?n.noop:d,c.type){case"fade":"show"==b?a.fadeIn(c.speed,d):a.fadeOut(c.speed,d);break;case"none":"show"==b?a.show():a.hide(),d();}},prepare_body:function(a,b){n(".arcticmodal-close",a.body).unbind("click.arcticmodal").bind("click.arcticmodal",function(){return b.arcticmodal("close"),!1})},init_el:function(d,a){var b=d.data("arcticmodal");if(!b){if(b=a,o++,b.modalID=o,b.overlay.block=n(b.overlay.tpl),b.overlay.block.css(b.overlay.css),b.container.block=n(b.container.tpl),b.body=n(".arcticmodal-container_i2",b.container.block),a.clone?b.body.html(d.clone(!0)):(d.before("
"),b.body.html(d)),q.prepare_body(b,d),b.closeOnOverlayClick&&b.overlay.block.add(b.container.block).click(function(a){h.isEventOut(n(">*",b.body),a)&&d.arcticmodal("close")}),b.container.block.data("arcticmodalParentEl",d),d.data("arcticmodal",b),p=n.merge(p,d),n.proxy(e.show,d)(),"html"==b.type)return d;if(null!=b.ajax.beforeSend){var c=b.ajax.beforeSend;delete b.ajax.beforeSend}if(null!=b.ajax.success){var f=b.ajax.success;delete b.ajax.success}if(null!=b.ajax.error){var g=b.ajax.error;delete b.ajax.error}var j=n.extend(!0,{url:b.url,beforeSend:function(){null==c?b.body.html("
"):c(b,d)},success:function(c){d.trigger("afterLoading"),b.afterLoading(b,d,c),null==f?b.body.html(c):f(b,d,c),q.prepare_body(b,d),d.trigger("afterLoadingOnShow"),b.afterLoadingOnShow(b,d,c)},error:function(){d.trigger("errorLoading"),b.errorLoading(b,d),null==g?(b.body.html(b.errors.tpl),n(".arcticmodal-error",b.body).html(b.errors.ajax_unsuccessful_load),n(".arcticmodal-close",b.body).click(function(){return d.arcticmodal("close"),!1}),b.errors.autoclose_delay&&setTimeout(function(){d.arcticmodal("close")},b.errors.autoclose_delay)):g(b,d)}},b.ajax);b.ajax_request=n.ajax(j),d.data("arcticmodal",b)}},init:function(b){if(b=n.extend(!0,{},a,b),!n.isFunction(this))return this.each(function(){q.init_el(n(this),n.extend(!0,{},b))});if(null==b)return void n.error("jquery.arcticmodal: Uncorrect parameters");if(""==b.type)return void n.error("jquery.arcticmodal: Don't set parameter \"type\"");switch(b.type){case"html":if(""==b.content)return void n.error("jquery.arcticmodal: Don't set parameter \"content\"");var e=b.content;return b.content="",q.init_el(n(e),b);case"ajax":return""==b.url?void n.error("jquery.arcticmodal: Don't set parameter \"url\""):q.init_el(n("
"),b);}}},e={show:function(){var a=q.getParentEl(this);if(!1===a)return void n.error("jquery.arcticmodal: Uncorrect call");var b=a.data("arcticmodal");if(b.overlay.block.hide(),b.container.block.hide(),n("BODY").append(b.overlay.block),n("BODY").append(b.container.block),b.beforeOpen(b,a),a.trigger("beforeOpen"),"hidden"!=b.wrap.css("overflow")){b.wrap.data("arcticmodalOverflow",b.wrap.css("overflow"));var c=b.wrap.outerWidth(!0);b.wrap.css("overflow","hidden");var d=b.wrap.outerWidth(!0);d!=c&&b.wrap.css("marginRight",d-c+"px")}return p.not(a).each(function(){var a=n(this).data("arcticmodal");a.overlay.block.hide()}),q.transition(b.overlay.block,"show",1*")),b.overlay.block.remove(),b.container.block.remove(),a.data("arcticmodal",null),n(".arcticmodal-container").length||(b.wrap.data("arcticmodalOverflow")&&b.wrap.css("overflow",b.wrap.data("arcticmodalOverflow")),b.wrap.css("marginRight",0))}),"ajax"==b.type&&b.ajax_request.abort(),p=p.not(a))})},setDefault:function(b){n.extend(!0,a,b)}};n(function(){a.wrap=n(document.all&&!document.querySelector?"html":"body")}),n(document).bind("keyup.arcticmodal",function(d){var a=p.last();if(a.length){var b=a.data("arcticmodal");b.closeOnEsc&&27===d.keyCode&&a.arcticmodal("close")}}),n.arcticmodal=n.fn.arcticmodal=function(a){return e[a]?e[a].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof a&&a?void n.error("jquery.arcticmodal: Method "+a+" does not exist"):q.init.apply(this,arguments)}}(jQuery)}var debugMode="undefined"!=typeof debugFlatPM&&debugFlatPM,duplicateMode="undefined"!=typeof duplicateFlatPM&&duplicateFlatPM,countMode="undefined"!=typeof countFlatPM&&countFlatPM;document["wri"+"te"]=function(a){let b=document.createElement("div");jQuery(document.currentScript).after(b),flatPM_setHTML(b,a),jQuery(b).contents().unwrap()};function flatPM_sticky(c,d,e=0){function f(){if(null==a){let b=getComputedStyle(g,""),c="";for(let a=0;a=b.top-h?b.top-h{const d=c.split("=");return d[0]===a?decodeURIComponent(d[1]):b},""),c=""==b?void 0:b;return c}function flatPM_testCookie(){let a="test_56445";try{return localStorage.setItem(a,a),localStorage.removeItem(a),!0}catch(a){return!1}}function flatPM_grep(a,b,c){return jQuery.grep(a,(a,d)=>c?d==b:0==(d+1)%b)}function flatPM_random(a,b){return Math.floor(Math.random()*(b-a+1))+a}