Оглавление:

Универсальный пульт от телевизора - Ardiuino, инфракрасный порт: 5 шагов
Универсальный пульт от телевизора - Ardiuino, инфракрасный порт: 5 шагов

Видео: Универсальный пульт от телевизора - Ardiuino, инфракрасный порт: 5 шагов

Видео: Универсальный пульт от телевизора - Ardiuino, инфракрасный порт: 5 шагов
Видео: Как настроить ПУЛЬТ для Arduino?! Инфракрасный приемник датчик CHQ1838 VS1838B 38кГц 2024, Июль
Anonim
Универсальный ТВ-пульт - Ardiuino, инфракрасный
Универсальный ТВ-пульт - Ardiuino, инфракрасный

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

Немного предыстории того, что вдохновило меня на создание этого пульта - я, как и большинство из вас, постоянно теряю свои пульты, и эта беда очень расстраивает, поэтому я думаю, давайте решим ее! Я построил этот пульт и незаметно встроил его в каркас своей кровати (я тоже плотник) - я не могу потерять пульт, если он является частью каркаса моей кровати!

Запасы

Вещи, которые вам понадобятся: -Arduino UNO или Nano - пробег может отличаться от других плат

- Макетная плата без пайки (или паяльная плита, если вы хотите сделать ее более прочной)

-Перемычки разного цвета и длины.

-Мгновенные кнопки (5) (вы можете добавить больше кнопок, но вам нужно будет использовать цифровые контакты, так как используются все аналоговые контакты, кроме одного - вам нужно будет убедиться, что вы правильно используете подтягивающие резисторы, или подтянуть резисторы, и нажать кнопки)

-10 кОм резистор (5) (если вам нужно больше кнопок, вам понадобится их больше)

-470 Ом резистор (2)

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

-Красный светодиод

-Инфракрасный датчик (я использовал номер детали VS1838B, вы можете использовать другой, просто проверьте распиновку)

(Необязательно) Паяльник, припой, припой.

Шаг 1: Построение схемы:

Построение схемы
Построение схемы

1). Мне всегда нравится начинать с размещения компонентов, так как это всегда определяет макет на макетной плате.

-Нажмите на кнопки

-СВЕТОДИОДЫ: красный светодиод и ИК-светодиоды соединены тандемно, поэтому вы можете видеть, что делает ИК-светодиод.

-Датчик

2). Резисторы

- Пять резисторов 10 кОм, которые мы прикрепили к кнопкам, называются «понижающими» резисторами. Понижающие резисторы гарантируют, что, когда кнопка не нажата, соответствующий вывод Arduino получает 0 вольт (или, по крайней мере, близко к нему). Для получения дополнительной информации о понижающих (или повышающих) резисторах вот подробное руководство:

www.electronics-tutorials.ws/logic/pull-up…

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

3). Цепь проводов

4). 5V и заземляющие провода

Используйте предоставленное изображение для справки! не бойтесь менять его под свои нужды!

Шаг 2: Код:

# включить const int RECV_PIN = 7; // Вывод считывания ИК-датчика int Button1 = A4; // Крайний левый int Button2 = A3; // 2-я слева int Button3 = A2; // Средний int Button4 = A1; // 2-я справа int Button5 = A0; // Крайний правый int LED = 3; // ИК-светодиод и красный светодиод int val = 0; // Изменение значения IRsend irsend; IRrecv irrecv (RECV_PIN); decode_results результаты;

void setup () {pinMode (Button1, INPUT); pinMode (Кнопка2, ВХОД); pinMode (Button3, ВХОД); pinMode (Button4, ВХОД); pinMode (Button5, ВХОД); pinMode (светодиод, ВЫХОД); Serial.begin (9600); irrecv.enableIRIn (); irrecv.blink13 (true);} void loop () {{{если (analogRead (Button1)> 900) irsend.sendNEC (0xFF02FD, 32); // использование аналогового чтения вместо цифрового, чтобы избежать проблем с связанной емкостью. Кроме того, помогает ослабить кнопки. // Аналоговое считывание на 900 дает некоторое пространство для маневра в значениях, а это означает, что инфракрасный сигнал будет посылаться, даже если на вывод не поданы полные 5В. // но значение 900 достаточно велико, чтобы не было ошибочного чтения из-за задержки емкостной связи (100);} // Включение и выключение полосы RGB {if (analogRead (Button5)> 900) {for (int i = 0; i <3; i ++) // изменение значения в "i <3" изменит количество немедленных повторов сигнала. поэтому «i <2» повторит сигнал дважды. // вам может потребоваться поиграть с этим номером, если ваш телевизор не отвечает, обычно 1 или 3 работают больше всего, если нет, попробуйте нечетные числа. // вам также может потребоваться поиграть со значениями времени задержки внутреннего сигнала, например, для моего телевизора 10 работает, а 30 - нет. {irsend.sendSony (0xa90, 12); // Код мощности телевизора Sony, для моего телевизора код должен быть отправлен 3x3, поэтому 3 импульса, три отдельных времени задержки (10); // "задержка внутри сигнала" для (int i = 0; i <3; i ++) {irsend.sendSony (0xa90, 12); // «12» - это номер бита, разные протоколы вызывают разные номера бит. NEC - 32, Sony - 12, вы можете посмотреть задержку остальных (10); for (int i = 0; i 900) {for (int i = 0; i 900) {for (int i = 0; i 900) {for (int i = 0; i <3; i ++) {irsend.sendSony (0xc90, 12); // Задержка уменьшения громкости телевизора Sony (100);}}} delay (100);} if (irrecv.decode (& results)) // приведенная ниже часть кода позволяет интерпретировать инфракрасные сигналы от различных пультов дистанционного управления. {Serial.println (results.value, HEX); // он сгенерирует процедуру «NEC, Sony, Etc..» и ТВ-код «c90, a90, FF02FD», вам нужно будет добавить 0x перед переключателем ТВ-кода (results.decode_type) {case DENON: Serial.println ("ДЕНОН"); перерыв; case NEC: Serial.println ("NEC"); перерыв; case PANASONIC: Serial.println ("PANASONIC"); перерыв; case SONY: Serial.println ("СОНИ"); перерыв; корпус RC5: Serial.println ("RC5"); перерыв; case JVC: Serial.println ("JVC"); перерыв; case SANYO: Serial.println ("SANYO"); перерыв; корпус MITSUBISHI: Serial.println («MITSUBISHI»); перерыв; case SAMSUNG: Serial.println ("SAMSUNG"); перерыв; корпус LG: Serial.println («LG»); перерыв; корпус RC6: Serial.println ("RC6"); перерыв; case БЛЮДО: Serial.println ("БЛЮДО"); перерыв; case SHARP: Serial.println ("SHARP"); перерыв; case WHYNTER: Serial.println ("WHYNTER"); перерыв; case AIWA_RC_T501: Serial.println ("AIWA_RC_T501"); перерыв; по умолчанию: case UNKNOWN: Serial.println ("UNKNOWN"); break;} irrecv.resume ();}}

Шаг 3: Код в деталях: отправка ИК-сигналов

Я буду ссылаться на строки кода по их номерам - чтобы продолжить, используйте эту ссылку:

pastebin.com/AQr0fBLg

Во-первых, нам нужно включить удаленную библиотеку IR от z3t0.

Вот ссылка на библиотеку:

github.com/z3t0/Arduino-IRremote

Если вам нужно руководство о том, как правильно загрузить библиотеку и установить ее в IDE:

www.arduino.cc/en/guide/libraries

Строка 1 включает библиотеку.

Далее нам нужно объявить несколько переменных, это делают строки 2-12.

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

Мы используем int для определения переменных, которые будут меняться.

Мы должны использовать вывод с импульсной модуляцией (PWM) для нашего вывода светодиода - любого вывода, рядом с которым стоит символ «~», будет достаточно, в моем коде - мы используем цифровой вывод 3.

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

Обратите внимание, что мы определяем наши входы и выходы (15-20), запускаем последовательный монитор (21), включаем ИК-датчик (22) и говорим Arduino мигать встроенным светодиодом каждый раз, когда мы получаем сигнал в датчике (23).

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

В строке 25 мы используем оператор if, который сообщает Arduino: «Ищите этот конкретный критерий, если этот критерий соответствует, сделайте это конкретное действие». В этом случае критерием является analogRead (Button1)> 900, или другими словами - «Arduino, посмотрите на button1, который мы определили как контакт A4 ранее, если полученный аналоговый сигнал больше 900, переходите к нашим следующим инструкциям., если нет, продолжайте ". Здесь есть кое-что, что нужно распаковать, так что давайте углубимся: аналоговый сигнал на Arduino имеет значение, равное или меньшее 5 В, при этом 5 В равно 1023, а 0 В равно 0. Любое заданное напряжение от 0 до 5 В может быть определено следующим образом: число, и с помощью математики мы можем вычислить это число или, наоборот, напряжение. Разделите 1024 (мы включаем 0 как единицу) на 5, получаем 204,8. Например, мы используем число 900, чтобы перевести его в напряжение, мы просто делим 900 на 204,8, что дает нам ~ 4,4 В. Мы говорим Arduino искать напряжение выше ~ 4,4 вольт, и если оно есть, выполните нашу следующую инструкцию.

Говоря о следующих инструкциях (строка 25), мы видим irsend.sendNEC (0xFF02FD, 32). Это говорит: «Arduino, отправьте модулированный импульс, который следует протоколу NEC, в частности, сигнал FF02FD, и убедитесь, что его длина составляет 32 бита». Это заставит наш ИК-светодиод мигать так, как это могут понять другие устройства. Думайте об этом как о азбуке Морзе, но только с невидимым светом! Существует множество различных протоколов, каждый с сотнями, если не тысячами отдельных сигналов, и каждый со своим определенным битовым числом - наше устройство сможет распознавать большое количество этих сигналов, но мы рассмотрим это позже!

В строке 28 у нас есть первая задержка - она здесь, чтобы предотвратить непреднамеренное повторение сигналов, после нажатия кнопки и отправки ИК-сигнала у нас есть 100 миллисекунд, чтобы убрать палец с кнопки. Кажется, это не так уж и много времени, но на практике, похоже, все работает нормально. функция задержки сообщает Arduino «ничего не делать в течение X миллисекунд», и для справки, это 1000 миллисекунд в секунду.

Переходим к нашей следующей кнопке в строке 29, button5 (изначально у меня было 4 кнопки на этом пульте, добавлена пятая, поэтому мы вышли из строя). По сути, это то же самое, что и кнопка 1, но с несколькими ключевыми отличиями. Первое отличие, которое вы увидите, - это оператор for - по сути, это еще один цикл - цикл с другим, более крупным циклом, loopception. В частности, у нас есть «for (int i = 0; i <3; i ++)», читаем это как «Arduino, давайте начнем с 0, повторяем следующие инструкции, пока не дойдем до 3 раз». Функция for используется потому, что многие устройства запрограммированы на поиск повторяющегося сигнала, а в нашем случае - 3 раза. Вы можете просто заменить цифру 3 на другую цифру, если ваше устройство требует другого графика повторения. Еще одно ключевое отличие от button5 заключается в том, что он повторяется снова, 3 раза или 3x3. Другими словами, мы отправляем сигнал 3 раза, ждем 10 миллисекунд, отправляем его снова 3 раза, ждем еще 10 миллисекунд, а затем снова отправляем его 3 раза. Этот тип связи является обычным для включения и выключения устройств и может быть именно тем, что требует ваш телевизор или устройство - ключ к этому - поиграть со всеми переменными, пока вы не получите желаемый результат. Измените значение короткой задержки, измените значение для повтора, отправьте 6 пакетов вместо 3 и т. Д. Устройства намеренно запрограммированы с произвольными правилами сигналов, представьте, если бы ваш пульт от телевизора отправлял сигнал того же типа, что и ваша звуковая панель; Каждый раз, когда вы переключаете канал на телевизоре, звуковая панель отключается - поэтому существуют другие правила сигнала.

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

Шаг 4: Код в деталях: прием ИК-сигналов

Подробный код: прием ИК-сигналов
Подробный код: прием ИК-сигналов

В строке 55 мы начинаем программировать Arduino для интерпретации ИК-сигналов, отправляемых другими пультами - это необходимо, чтобы вы могли выяснить протоколы и сигналы, которые используют ваши пульты. Первая строка кода в строке 55: if (irrecv.decode (& results) прочтите это как «Arduino, найдите ИК-код, если вы его найдете, верните истинное значение, если ничего не найдено, верните ложь. Если истина, запись информацию в «результаты» ».

Переходя к строке 56, у нас есть Serial.println (results.value, HEX), в котором говорится: «Ardunio, распечатай результаты в последовательном мониторе в формате HEX». Hex, то есть шестнадцатеричный, - это способ сократить двоичную строку (только нули и единицы) до чего-то более простого для ввода. Например, 101010010000 - это «a90», код, используемый для включения и выключения моего телевизора, а 111111110000001011111101 - это 0xFF02FD, который управляет моей полосой RGB. Вы можете использовать приведенную выше диаграмму для преобразования двоичного кода в шестнадцатеричный и наоборот, или вы можете использовать следующую ссылку:

www.rapidtables.com/convert/number/hex-to-…

До строки 57 у нас есть новая функция, которая называется switch case.

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

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

Шаг 5: Заключение

Если у вас есть вопросы - обращайтесь ко мне здесь! Я рада помочь вам как можно лучше.

Надеюсь, вы узнали кое-что, что можно использовать, чтобы сделать свою жизнь немного лучше!

-RB

Рекомендуемые: