Съдържание:

Универсално дистанционно за телевизия - Ardiuino, инфрачервено: 5 стъпки
Универсално дистанционно за телевизия - Ardiuino, инфрачервено: 5 стъпки

Видео: Универсално дистанционно за телевизия - Ardiuino, инфрачервено: 5 стъпки

Видео: Универсално дистанционно за телевизия - Ardiuino, инфрачервено: 5 стъпки
Видео: Сменяне На TV Канали Без Дистанционно Как 2024, Юли
Anonim
Универсално телевизионно дистанционно - Ardiuino, инфрачервено
Универсално телевизионно дистанционно - Ardiuino, инфрачервено

Здравейте! В тази инструкция ще ви покажа как да изградите и програмирате свое собствено универсално дистанционно, което ще работи с повечето неща, които използват инфрачервено дистанционно управление, и което също ще "слуша" и декодира инфрачервен сигнал, изпратен от различни други дистанционни управления.

Малко предистория на това, което ме вдъхнови да създам това дистанционно - аз, като повечето от вас, губя дистанционното си постоянно и това бедствие е доста разочароващо, така че решавам да го разреша! Вградих това дистанционно и дискретно го вградих в моята персонализирана рамка за легло (аз също съм дърводелец) - не мога да загубя дистанционното, ако е част от рамката на леглото ми!

Консумативи

Нещата, от които се нуждаете: -Arduino UNO или Nano - пробегът може да варира в зависимост от други табла

-Непояна дъска (или спояваща лента, ако искате да я направите по -постоянна)

-Съществени кабели с различни цветове и дължини

-Моментални бутони (5) (можете да добавите още бутони, но ще трябва да използвате цифрови щифтове, тъй като се използват всички аналогови щифтове освен 1 - ще трябва да се уверите, че правилно използвате издърпващите резистори или издърпайте резистори и премахнете бутоните)

-10K Ohm резистор (5) (ако искате повече бутони, ще ви трябват повече от тези)

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

-Инфрачервен светодиод

-Червен светодиод

-Инфрачервен сензор (използвах номер на част VS1838B, можете да използвате друг, просто проверете pin-out)

(По избор) Поялник, спойка, флюс за запояване.

Стъпка 1: Изграждане на веригата:

Изграждане на веригата
Изграждане на веригата

1). Винаги обичам да започвам с излагането на моите компоненти, тъй като това винаги задвижва оформлението на макета.

-Натиснете бутоните

-LEDS: Червеният светодиод и IR светодиодът са свързани в тандем, така че можете да видите какво прави инфрачервеният светодиод.

-Сензор

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

- Петте 10K резистора, които сме прикрепили към бутоните за натискане, се наричат „дърпащи“резистори. Издърпайте резисторите, за да се уверите, че когато не е натиснат бутон, съответният щифт на Arduino получава 0 волта (или поне близо до него). За повече информация относно резисторите за изтегляне (или издърпване) тук е подробно ръководство:

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

Тези резистори може да не са напълно необходими, но ако получавате „призрачни“натискания, това е повече от вероятно причинено от капацитивно свързване и резисторите за изтегляне предотвратяват това.

3). Кабелни проводници

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

Използвайте предоставената снимка за справка! не се страхувайте да го промените според вашите нужди!

Стъпка 2: Код:

#include const int RECV_PIN = 7; // ИК сензор за четене на щифт int Button1 = A4; // Най -отдалечен ляв int Button2 = A3; // 2 -ри отляво int Button3 = A2; // Среден бутон int4 = A1; // второ вдясно int Button5 = A0; // Най -далеч отдясно int LED = 3; // IR LED & Red LED int val = 0; // Промяна на стойността IRsend irsend; IRrecv unrecv (RECV_PIN); decode_results резултати;

void setup () {pinMode (Button1, INPUT); pinMode (Button2, INPUT); pinMode (Button3, INPUT); pinMode (Button4, INPUT); pinMode (Button5, INPUT); pinMode (LED, OUTPUT); Serial.begin (9600); unrecv.enableIRIn (); unrecv.blink13 (true);} void loop () {{{if (analogRead (Button1)> 900) irsend.sendNEC (0xFF02FD, 32); // използвайки аналогово четене вместо цифрово четене, за да се избегнат проблеми с капацитета в затворено пространство. също така помага за премахването на бутоните. // Наличието на аналогово четене на 900 позволява известно раздвижване в стойностите, което означава, че инфрачервеният сигнал ще бъде изпратен, дори ако към щифта не е приложено пълно 5V. // но 900 е достатъчно високо, за да не се чете погрешно поради закъснение на капацитивното свързване (100);} // RGB Strip On & off {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);}}} забавяне (100);} ако (unrecv.decode (& резултати)) // долната част на кода ви позволява да интерпретирате инфрачервени сигнали от различни дистанционни управления. {Serial.println (results.value, HEX); // ще генерира процедурата „NEC, Sony, Etc..“и телевизионен код „c90, a90, FF02FD“, ще трябва да добавите 0x към предната част на превключвателя за кода на телевизора (results.decode_type) {case DENON: Serial.println ("DENON"); прекъсване; калъф NEC: Serial.println ("NEC"); прекъсване; случай PANASONIC: Serial.println ("PANASONIC"); прекъсване; случай SONY: Serial.println ("SONY"); прекъсване; случай RC5: Serial.println ("RC5"); прекъсване; случай JVC: Serial.println ("JVC"); прекъсване; калъф SANYO: Serial.println ("SANYO"); прекъсване; калъф MITSUBISHI: Serial.println ("MITSUBISHI"); прекъсване; калъф SAMSUNG: Serial.println ("SAMSUNG"); прекъсване; калъф LG: Serial.println ("LG"); прекъсване; случай RC6: Serial.println ("RC6"); прекъсване; кутия DISH: Serial.println ("DISH"); прекъсване; случай SHARP: Serial.println ("SHARP"); прекъсване; регистър WHYNTER: Serial.println ("WHYNTER"); прекъсване; случай AIWA_RC_T501: Serial.println ("AIWA_RC_T501"); прекъсване; по подразбиране: регистър UNKNOWN: Serial.println ("UNKNOWN"); break;} unrecv.resume ();}}

Стъпка 3: Код в дълбочина: Изпращане на IR сигнали

Ще визирам кодови редове по техния номер - за да продължите, използвайте тази връзка:

pastebin.com/AQr0fBLg

Първо, трябва да включим IR Remote Library от z3t0.

Ето линк към библиотеката:

github.com/z3t0/Arduino-IRremote

Ако имате нужда от ръководство за това как правилно да изтеглите библиотека и да я инсталирате в IDE:

www.arduino.cc/en/guide/libraries

Ред 1 включва библиотеката.

След това трябва да декларираме няколко променливи, редове 2-12 правят това.

Използваме „cost int“, за да дефинираме променливи, които няма да се променят, всички, с изключение на една, попадат в тази категория.

Използваме „int“, за да дефинираме променливи, които ще се променят.

Трябва да използваме щифт с импулс с модулация (PWM) за нашия LED щифт - всеки щифт, който има "~" до него, ще бъде достатъчен, в моя код - използваме цифров пин 3.

След това трябва да направим някаква настройка - този код ще работи само веднъж, когато Arduino се включи или нулира.

Забележете, че ние дефинираме нашите входове и изходи (15-20), задействаме серийния монитор (21), активираме IR сензора (22) и казваме на Arduino да мига вградения светодиод всеки път, когато получим сигнал в сензора (23).

След това ще изградим нашия цикъл - този код ще се изпълнява многократно, като върви отгоре надолу шепа пъти в секунда.

На ред 25 използваме оператор if, който казва на Arduino „потърсете този конкретен критерий, ако този критерий е изпълнен, направете това конкретно нещо“. В този случай критерият е analogRead (Button1)> 900, или с други думи - "Arduino, Погледни бутона1, който по -рано определихме като щифт A4, ако полученият аналогов сигнал е по -голям от 900, моля, преминете към следващите ни инструкции, ако не, моля продължете ". Тук има малко за разопаковане, така че нека се потопим: аналоговият сигнал на Arduino е стойност, равна на или по -малка от 5V, като 5V е равно на 1023, а 0V е равно на 0. Всяко дадено напрежение между 0 и 5V може да бъде определено от число и с малко математика можем да разберем това число или обратно, напрежение. Разделете 1024 (включваме 0 като единица) на 5, което ни дава 204.8. Например, използваме числото 900, за да преведем това във напрежение, просто разделяме 900 на 204.8, което ни дава ~ 4.4V. Казваме на Arduino да търси напрежение по -голямо от ~ 4.4 волта и ако е така, изпълнете следващата ни инструкция.

Говорейки за следващите инструкции (ред 25), виждаме irsend.sendNEC (0xFF02FD, 32). Това казва „Arduino, изпратете модулиран импулс, който следва протокола NEC, по -специално сигнала FF02FD, и се уверете, че е дълъг 32 бита“. Това ще накара нашия IR LED да трепне по начин, който другите устройства могат да разберат. Помислете за това малко като азбука на Морз, но само с невидима светлина! Има много различни протоколи, всеки със стотици, ако не и хиляди отделни сигнали, и всеки със своя специфичен битов номер - нашето устройство ще може да разпознае голямо количество от тези сигнали, но ние ще се потопим в това по -късно!

На ред 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: Код в дълбочина: Получаване на IR сигнали

Код в дълбочина: Получаване на IR сигнали
Код в дълбочина: Получаване на IR сигнали

На ред 55 започваме да програмираме Arduino за интерпретиране на IR сигнали, изпратени от други дистанционни управления - това е необходимо, за да можете да разберете протоколите и сигналите, които вашите дистанционни управления използват. Първият ред на код на ред 55 е if (unrecv.decode (& results) прочетете това като "Arduino, потърсете IR код, ако намерите такъв, върнете истинска стойност, ако нищо не е намерено, върнете false. Когато е вярно, запишете информацията в "резултати" ".

Преминавайки към ред 56, имаме Serial.println (results.value, HEX), който казва "Ardunio, отпечатайте резултатите в серийния монитор във формат HEX". Hex, което означава шестнадесетичен, е начинът, по който можем да съкратим двоичен низ (само 0 и 1) в нещо малко по -лесно за въвеждане. Например 101010010000 е „a90“, кодът, използван за изключване и включване на телевизора, а 11111111000000001011111101 е 0xFF02FD, който контролира моята RGB лента. Можете да използвате горната диаграма, за да конвертирате двоичен файл в шестнадесетичен и обратно, или можете да използвате следната връзка:

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

До ред 57 имаме нова функция, наречена превключвател.

По същество случаят на превключване ни позволява да посочим различни инструкции въз основа на резултатите от дадена променлива (случай). прекъсването излиза от оператора switch и се използва в края на всеки оператор.

Тук използваме кутията за превключване, за да променим начина, по който печатаме в серийния монитор въз основа на протоколите, които Arduino усеща от различните дистанционни управления.

Стъпка 5: Заключение

Ако имате въпрос - моля не се колебайте да се свържете с мен тук! Щастлив съм да се опитам да ви помогна с каквото мога.

Надявам се, че сте научили нещо, което можете да използвате, за да направите живота си малко по -добър!

-RB

Препоръчано: