Пульт на ардуино

В данной статье рассмотри подключение инфракрасного пульта дистанционного управления к arduino. Инфракрасный пульт управления, рассмотренный в статье, можно преобрести на таких сайтах, как Aiexpress.com. Комплект включает в себя:

  1. инфракрасный пульт управления;
  2. инфракрасный приемник (датчик);
  3. плата с подтягивающими резисторами и индикатором питания.

Рассмотрим подключение ИК приемника от пульта к arduino uno:

  • Gnd — Gnd;
  • Vcc — 5v/3.3v;
  • Out — 11 pin.

Простейший скетч (программа) для взаимодействия arduino с ИК пультом выглядит следующим образом:

Для работы с инфракрасным пультом используется библиотека IRremote, которая зачастую уже присутствует в Arduino IDE, если же ее нет, то можно скачать здесь. Данный скетч позволяет выводить в монитор порта значения сигналов, поступающих с инфракрасного пульта в шестнадцатиричной системе исчисления. На основе полученных значений уже можно писать более сложную программу.

v.01 Arduino Универсальный пульт IR Remote Control Record Send IR code Bluetooth ANDROID

СообщениеАндрюино » 23 июл 2016, 14:14

Пульт ДУ функция обучения от других пультов Remote Control.
На Arduino нажав на "обычную кнопку" запускаем режим записи "кодов кнопок ИК пульта",
направив на (ИК) приёмник, любой (ИК) пульт, и нажав на (ИК) пульте любую кнопку,
Arduino запишет ("код кнопок ИК пульта" + "(ИК)протокол пульта" + "значение Bits кнопок ИК пульта")
в ячейки энергонезависимой памяти EEPROM, и перейдёт к записи следующих (ИК) кодов (всего 8 (ИК) кодов).

Для Управления по Bluetooth.
Отправив соответствующие команду на Serial вход "RX" Arduino, Например с помощью Bluetooth модуля HC-05
с ANDROID телефона, Arduino в зависимости от пришедшей Bluetooth команды, сначала! проверит
какой был записанный "(ИК) протокол пульта" например
("NEC" или "SONY" или "RC5" или "RC6" или "JVC" или "PANASONIC")
и отправит через (ИК) передатчик, записанный в соответствующий ячейки "код кнопок ИК пульта"
и параметр "Bits", только через требуемый "(ИК)протокол пульта".
———————
Отмечу отправка (ИК) сигнала сложнее чем приём (ИК) сигнала.
Так как у разных производителей протоколы (ИК) сигнала могут отличатся.
Поэтому, кроме "кода кнопок ИК пульта", надо знать и
("(ИК)протокол пульта" и "значение Bits кнопок ИК пульта").

Библиотека IRremote способна правильно распознать 95% протоколов (ИК) пультов,
которые понадобятся для отправки (ИК) сигнала.

Так как самой важной частью является правильно распознать "(ИК)протокол пульта",
очень важно какой (ИК)приёмник мы используем.

Например с (ИК) приёмниками частотой 38 KHz купленные в одном магазине,
библиотека IRremote не могла распознать протоколы "JVC" и "PANASONIC".
А с купленные в другом магазине (ИК)приёмники с частотой 38 KHz,
с маркировкой ( VS1838B ),
библиотека IRremote распознала все "(ИК)протоколы" разных пультов.
Для меня это загадка.
Всё наглядно покажу в видео уроке.

Для отправки (ИК) сигнала, использовал передатчик частотой 38 KHz.
ВАЖНО !!! (PIN 3;) выход ИК передатчика ((PIN 3;)на другой PIN изменить нельзя).

Для управления по Bluetooth можно использовать например ANDROID телефон.
Я написал программы для ANDROID телефона, ссылки на программы смотрите
ниже в описании.
——
Главное преимущество:
1. Работает почти со всеми "(ИК)пультам.
2. Настройки будут сохранятся даже после отключения питания.
3. Фильтр / Проверка, от "инфракрасного мусора" перед записью в EEPROM.

****
Скачать sketch.
v.01 Arduino Универсальный пульт IR Remote Control Record Send IR code Bluetooth ANDROID
http://yadi.sk/d/M7aqIykSLjk4H

phpBB [video]

«Общение» с библиотекой, обрабатывающей данные с мобильного устройства, осуществляется через общие переменные:

, , , , , , — переменные типа integer, в которых хранятся текущие показания осей аналоговых джойстиков ПДУ (значения от -100 до 100)

, , , , , — переменные типа boolean (1 или 0), в которых хранится состояние кнопок F1-F6 (1 — нажата, 0 — отпущена)

При работе в текстовом режиме эти переменные необходимо «подцепить» из библиотеки с помощью спецификатора .

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

externint bluetooth_X, bluetooth_Y, bluetooth_Z, bluetooth_W, bluetooth_aX, bluetooth_aY,bluetooth_aZ;extern bool bluetooth_F1, bluetooth_F2, bluetooth_F3, bluetooth_F4, bluetooth_F5, bluetooth_F6;   void setup(){ BTinit();//другие команды}   void loop(){// ваш основной код}  

Так как USB-Serial конвертер и Bluetooth-модуль общаются с основным микроконтроллером через один и тот же интерфейс (UART0), работа с Bluetooth ПДУ невозможна одновременно с USB. Даже просто при подключении питания от USB линии передачи информации UART0 переключаться с Bluetooth-модуля на USB-Serial конвертер. Таким образом, дистанционное управление контроллером через Bluetooth возможно только при питании контроллера от батареек или внешнего питания через клеммный разъем.

При работе в визуальной среде этот код генерируется автоматически при использовании любого из блоков, расположенных в группе блоков «Bluetooth ПДУ»:

Управление двумоторной тележкой с помощью двух джойстиков — вертикальная ось левого джойстика (Y) напрямую управляет скоростью левого двигателя, вертикальная ось правого джойстика (Y) напрямую управляет скоростью правого двигателя.

Состояние кнопки-переключателя F4 управляет светодиодом («фарами»), а нажатие на F1 включает на 1 секунду зуммер.

externint bluetooth_X, bluetooth_Y, bluetooth_Z, bluetooth_W, bluetooth_aX, bluetooth_aY,bluetooth_aZ;extern bool bluetooth_F1, bluetooth_F2, bluetooth_F3, bluetooth_F4, bluetooth_F5, bluetooth_F6;   void setup(){ BTinit(); pinMode( OUT1 , OUTPUT );}   void loop(){ startMotor(1, bluetooth_Y); startMotor(2, bluetooth_W); led ( OUT1 , bluetooth_F4 );if(bluetooth_F1){ tone(OUT2,440,1000);}}

Добрый день.

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

Например я в неё уже тыкаюсь вторую неделю и никак не могу перепрыгнуть, а другие, кто тоже тыкался бросили эту затею и не пытаются.

Думаю тут можно выкладывать разные хитрости.

Расскажу о текущей проблеме.

Есть на руках:

Arduino Nano

Инфракрасный приёмник

Инфракрасный светодиод.

Видеодвойка DAEWO с затёртой маркировкой.

Пульт от триколора

Пульт от DAEWO с тремя работающими кнопками.

Все пульты работают на 455 Кгц если верить их кварцам.

Наша задача. Считать код с любой кнопки

Запомнить её и послать на телевизор.

============================

Родной пульт от телевизора работает.

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

Приступаем к практике.

Решил сильно не в даваться в сторонние разработки, а придумать свой протокол.

В итоге, после долгих мучений, понял что всё это долго. И решил ограничится записью и трансляцией сигнала «как есть».

Подключили приёмник. Считали значения

Получился массив

byte z1[]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,1,1,1,0,0,1,1,1,0,0,1,1,1,0,0,1,1,1,0,0,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; Далее, решил отправить сигнал на светодиод. Подключил светодиод. В крутил код отправки. void digit_blink() { //ситает массив и передаёт его на выход. i=0; while(i < 230){ digitalWrite(13,z1[i]); i=i+1; }

Уверенность такого метода (как думалось) заключена в том, что не нужно мучится с частотой отправки, так как запись данных происходит с частотой ардуино, следовательно, последовательность отправки будет на той же частоте. И телевизору будет абсолютно всё равно. Он поймёт сигнал, как будто это его родной пульт.

Опробовал. Телевизор никак не замигал.

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

Скачал библиотеку Irremote. И залил файл Irecord.

Нажал кнопку, записал RAW значения кнопки пульта. Отпустил кнопку. Пошёл процесс отправки. Телевизор не мигает.

Подумал. А что если телевизор требует эти килогерцы?

Посмотрел на код. Понял, что отправка была на 38 Кгц.

Пришёл к выводу что телевизор имеет какую-то свою частоту.

И сделал цикл с перебором частоты.

void loop() { int khz = 38; // 38kHz carrier frequency for the NEC protocol // unsigned int irSignal[] = {9000, 4500, 560, 560, 560, 560, 560, 1690, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 1690, 560, 1690, 560, 560, 560, 1690, 560, 1690, 560, 1690, 560, 1690, 560, 1690, 560, 560, 560, 560, 560, 560, 560, 1690, 560, 560, 560, 560, 560, 560, 560, 560, 560, 1690, 560, 1690, 560, 1690, 560, 560, 560, 1690, 560, 1690, 560, 1690, 560, 1690, 560, 39416, 9000, 2210, 560}; //AnalysIR Batch Export (IRremote) — RAW int irSignal[] = {8000,3900, 550,450, 550,1400, 600,1400, 600,1400, 550,450, 550,1400, 600,1400, 600,1400, 550,3900, 550,450, 550,400, 600,400, 600,400, 600,400, 550,450, 550,1400, 600,1400, 600}; // UNKNOWN DFE63E22 //irsend.sendRaw(irSignal, sizeof(irSignal) / sizeof(irSignal[0]), khz); //Note the approach used to automatically calculate the size of the array. for (i = 0; i < 500; i = i + 1) { int khz = i; // 38kHz carrier frequency for the NEC protocol irsend.sendRaw(irSignal, sizeof(irSignal) / sizeof(irSignal[0]), khz); //Note the approach used to automatically calculate the size of the array. Serial.print(i); Serial.println(); delay(100); } }

Прогнал все мыслимые частоты, не реагирует.

У меня светодиод был подключен на прямую к ардуино. Подумал. А что если светодиоду не хватает миллиамперов? И напряжения?

Подключил через оптопару. (тот-же транзистор, но без гальванической развязки). Почитал деятелей советующих повышенные питания. Дал питание 7 вольт 350 миллиампер. Светодиод замигал в камеру телефона так, как будто хотел прожечь матрицу насквозь.

Направил на телевизор — 0 эммоций.

Вопрос: И что теперь делать?

Добавить комментарий

Закрыть меню