Мазмуну:

Universal TV Remote - Ardiuino, Infrared: 5 кадам
Universal TV Remote - Ardiuino, Infrared: 5 кадам

Video: Universal TV Remote - Ardiuino, Infrared: 5 кадам

Video: Universal TV Remote - Ardiuino, Infrared: 5 кадам
Video: How to use Arduino as TV Remote Controller with Infrared 2024, Июль
Anonim
Универсалдуу ТВ пульту - Ардиуино, Инфракызыл
Универсалдуу ТВ пульту - Ардиуино, Инфракызыл

Салам! Бул көрсөтмөдө мен сизге инфрақызыл пультту колдонуучу нерселер менен иштей турган универсалдуу алыстан башкаруу пультуңузду кантип курууну жана программалоону көрсөтөм, жана башка ар кандай пульт аркылуу жөнөтүлгөн инфракызыл сигналды "угат" жана чечет.

Бул пультту курууга мени шыктандырган нерселердин бир аз маалыматы - мен, көпчүлүгүңүздөй эле, пультторумду дайыма жоготуп турам жана бул алаамат абдан капалантат, ошондуктан мен аны чечүүгө мүмкүндүк берет деп ойлойм! Мен бул пультту курдум жана этияттык менен аны керебетиме орнотуп койдум (мен дагы жыгач устасымын) - мен пультту жогото албайм, эгер бул менин керебетимдин бир бөлүгү болсо!

Жабдуулар

Сизге керектүү нерселер: -Arduino UNO же Nano - километр башка такталар менен айырмаланышы мүмкүн

-Солсуз нан (же аны туруктуу кылгыңыз келсе, solderable stripboard)

-Ар кандай түстөгү жана узундуктагы jumperwires

-Моменталдык баскычтар (5) (сиз дагы кнопкаларды кошо аласыз, бирок аналогдук пиндерден башкасынын баары колдонулгандыктан, санарип казыктарды колдонушуңуз керек болот - сиз резисторлорду туура колдонгонуңузду текшеришиңиз керек., же резисторлорду тартып, баскычтарды чыгарыңыз)

-10K Ohm каршылыгы (5) (эгер сиз көбүрөөк баскычтарды кааласаңыз, сизге дагы булар керек болот)

-470 Ом каршылыгы (2)

-инфракызыл LED

-Кызыл LED

-Инфракызыл сенсор (мен VS1838B бөлүкчөсүн колдонгом, сен башкасын колдонсоң болот, жөн эле пин-чыкканы текшер)

(Милдеттүү эмес) Паяльник, Лайк, Плюс Флюс.

1 -кадам: Районду куруу:

Райондун курулушу
Райондун курулушу

1). Мен ар дайым компоненттеримди коюу менен баштоону жакшы көрөм, анткени бул дайыма эле нан тактасындагы макетти айдайт.

-Баскычтарды басыңыз

-LEDS: Кызыл LED жана IR LED тандем менен туташтырылган, андыктан IR LED эмне кылып жатканын көрө аласыз.

-Сенсор

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

- Биз баскычтарга бекитилген 10K беш резистор "түшүрүү" каршылыгы деп аталат. Резисторлорду түшүрүү, баскыч басылбаган кезде, тиешелүү Arduino пини 0 Вольтту (же жок дегенде ага жакын) алаарын текшериңиз. Резисторлорду түшүрүү (же тартып алуу) жөнүндө көбүрөөк маалымат алуу үчүн бул жерде терең көрсөтмө бар:

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

Бул резисторлор таптакыр кереги жок болушу мүмкүн, бирок эгер сиз "арбак" түртүүгө дуушар болуп жатсаңыз, бул, сыягы, сыйымдуу бириктирүүдөн келип чыгат жана резисторлор ылдый түшөт.

3). Райондук зымдар

4). 5V жана Жерге зымдар

Маалымат үчүн берилген сүрөттү колдонуңуз! аны муктаждыктарыңызга өзгөртүүдөн коркпоңуз!

2 -кадам: Код:

#inc const rECV_PIN = 7; // IR сенсор окулган пин int Button1 = A4; // Алыскы сол int Button2 = A3; // 2ден солго int Button3 = A2; // Middle int Button4 = A1; // 2 -оңго int Button5 = A0; // Оңго эң алыс int int = 3; // IR LED & Red LED int val = 0; // Маанини өзгөртүү IRsend irsend; IRrecv irrecv (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); irrecv.enableIRIn (); irrecv.blink13 (true);} void loop () {{{if (analogRead (Button1)> 900) irsend.sendNEC (0xFF02FD, 32); // тутумдун сыйымдуулугуна байланыштуу көйгөйлөрдү болтурбоо үчүн санариптик окуу ордуна аналогдук окууну колдонуу. ошондой эле, баскычтарды чыгарууга жардам берет. // 900дө аналогдук окуунун болушу маанилерде бир аз кыймылдоого мүмкүнчүлүк берет, демек, пинге толук 5В колдонулбаса дагы, инфра сигналы жөнөтүлөт. // бирок 900, сыйымдуу кошулуунун кечигүүсүнөн улам ката окубай турганчалык бийик (100);} // RGB Strip On & off {if (analogRead (Button5)> 900) {for (int i = 0; i <3; i ++) // "i <3" маанисин өзгөртүү сигналдын дароо кайталанган санын өзгөртөт. ошондуктан "i <2" сигналды эки жолу кайталайт. // эгерде сыналгыңыз жооп бербесе, анда бул номер менен ойношуңуз керек болот, көбүнчө 1 же 3 көбү иштейт, эгер андай болбосо, так сандарды колдонуп көрүңүз. // сизге сигналдын кечигүү убактысынын мааниси менен ойноо керек болушу мүмкүн, мисалы, менин TV 10ум үчүн, бирок 30 эмес. {irsend.sendSony (0xa90, 12); // Sony TV кубат коду, менин сыналгым үчүн код 3x3 жөнөтүлүшү керек, андыктан 3 импульс, үч башка жолу кечигүү (10); // "intra signal delay" for (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 TV кубаттуулугун төмөндөтүү кечигүүсү (100);}}} кечигүүсү (100);} if (irrecv.decode (& results)) // коддун төмөндөгү бөлүгү ар кандай пульттогу инфра кызыл сигналдарды чечмелөөгө мүмкүндүк берет. {Serial.println (results.value, HEX); // ал "NEC, Sony, Etc.." жол -жобосун жана "c90, a90, FF02FD" сыналгы кодун жаратат, сизге TV Code которгучунун алдына 0x кошуу керек (results.decode_type) {case DENON: Serial.println ("DENON"); тыныгуу; иши NEC: Serial.println ("NEC"); тыныгуу; case PANASONIC: Serial.println ("PANASONIC"); тыныгуу; case SONY: Serial.println ("SONY"); тыныгуу; иши RC5: Serial.println ("RC5"); тыныгуу; case JVC: Serial.println ("JVC"); тыныгуу; case SANYO: Serial.println ("SANYO"); тыныгуу; case MITSUBISHI: Serial.println ("MITSUBISHI"); тыныгуу; case SAMSUNG: Serial.println ("SAMSUNG"); үзүү; иш LG: Serial.println ("LG"); тыныгуу; иши RC6: Serial.println ("RC6"); тыныгуу; case DISH: Serial.println ("DISH"); үзүү; учурда SHARP: Serial.println ("SHARP"); тыныгуу; case WHYNTER: Serial.println ("WHYNTER"); тыныгуу; case AIWA_RC_T501: Serial.println ("AIWA_RC_T501"); тыныгуу; демейки: иштин БЕЛГИСИ: Serial.println ("БЕЛГИСИЗ"); тыныгуу;} irrecv.resume ();}}

3 -кадам: Тереңдиктеги код: IR сигналдарын жөнөтүү

Мен коддун саптарына алардын линия номери боюнча кайрылам - бул шилтемени колдонуу үчүн:

pastebin.com/AQr0fBLg

Биринчиден, биз IR Remote Китепканасын z3t0 тарабынан киргизишибиз керек.

Бул жерде китепканага шилтеме бар:

github.com/z3t0/Arduino-IRremote

Эгерде сизге китепкананы туура жүктөө жана аны IDEге орнотуу боюнча көрсөтмө керек болсо:

www.arduino.cc/en/guide/libraries

1 -сапка китепкана кирет.

Андан кийин, биз бир нече өзгөрмөлөрдү жарыялашыбыз керек, 2-12-саптар муну жасашат.

Биз өзгөрбөс өзгөрмөлөрдү аныктоо үчүн "cost int" колдонобуз, бул категорияга киргендерден башкасы.

Биз өзгөрө турган өзгөрмөлөрдү аныктоо үчүн "int" колдонобуз.

Биз LED пин үчүн модуляциясы бар импульстуу (PWM) пин колдонушубуз керек - анын жанында "~" бар каалаган пин жетиштүү болот, менин кодумда - биз санарип пин 3 колдонобуз.

Андан кийин, биз кандайдыр бир жөндөөнү кылышыбыз керек - бул код Arduino күйгүзүлгөндө же баштапкы абалга келтирилгенде бир гана жолу иштейт.

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

Андан кийин, биз өзүбүздүн циклди түзөбүз - бул код кайра -кайра иштейт, секундадан бир нече жолу өйдөдөн ылдый карай.

25 -сапта биз if операторун колдонобуз, бул Arduinoго "бул критерийлерди издегиле, эгерде бул критерийлерге жооп берсе, муну кылгыла" деп айтат. Бул учурда, критерийлер analogRead (Button1)> 900, же башкача айтканда - "Arduino, биз мурда A4 пин катары аныктаган button1ди караңыз, эгер аналогдук сигнал 900дөн жогору болсо, анда кийинки көрсөтмөлөрүбүзгө өтүңүз., эгер андай болбосо, анда улантыңыз ". Бул жерде ачуу үчүн бир аз нерсе бар, андыктан чумкуй берели: Arduinoдогу аналогдук сигнал 5Вга барабар же андан аз, 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 -сапта бизде биринчи кечигүү бар - бул кокусунан кайталануучу сигналдарды болтурбоо үчүн бул жерде, баскыч басылганда жана IR сигналы жөнөтүлгөндө, манжабызды баскычтан алуу үчүн 100 миллисекундубуз бар. Бул көп убакытты талап кылбайт, бирок иш жүзүндө ал жакшы иштейт окшойт. кечигүү функциясы Arduinoго "X миллисекунд үчүн эч нерсе кылбагыла" дейт жана маалымдама үчүн алар секундасына 1000 миллисекунд.

29 -саптагы кийинки 5 -баскычка өтүү, 5 -баскыч (башында менде бул пульттун 4 баскычы бар болчу, бешинчиси кошулган, ошондуктан биз иштебей калдык). Бул, рух жагынан, 1 -баскыч менен бирдей, бирок бир нече негизги айырмачылыктар менен. Сиз көрө турган биринчи айырма - бул for for билдирүүсү - бул негизинен башка цикл - башка чоңураак цикл, loopception менен цикл. Тактап айтканда, бизде "for (int i = 0; i <3; i ++)" бар, муну "Arduino, 0ден баштайлы, төмөнкү көрсөтмөлөрдү 3 эсеге жеткенге чейин кайтала" деп окуйбуз. For функциясы колдонулат, анткени көптөгөн түзмөктөр кайталанган сигналды издөө үчүн программаланган, ал эми биздин учурда бул жерде 3 жолу. Эгер түзмөгүңүз башка кайталануу графигин талап кылса, 3 санын башка номерге алмаштырсаңыз болот. 5 -баскычтын дагы бир негизги айырмасы - бул кайра кайталанат, 3 жолу же 3x3. Башкача айтканда, биз сигналды 3 жолу жөнөтөбүз, 10 миллисекунд күтөбүз, кайра 3 жолу жөнөтөбүз, дагы 10 миллисекунд күтөбүз, анан кайра 3 жолу жөнөтөбүз. Байланыштын бул түрү түзмөктөрдү күйгүзүү жана өчүрүү үчүн кеңири таралган жана сиздин сыналгыңыз же түзмөгүңүз талап кылган нерсе болушу мүмкүн - мунун ачкычы каалаган натыйжага жеткенге чейин бардык өзгөрмөлөр менен ойноо. Кыска кечиктирүү маанисин өзгөртүү, кайталануучу маанини өзгөртүү, 3 партиянын ордуна 6 партия жөнөтүү, ж.б. Түзмөктөр атайылап сигнал эрежелери менен программаланган, телевизордун пульту сиздин үн тилкесиңизге окшош сигналды жөнөтсө, элестетип көрүңүз; сыналгыңыздагы каналды алмаштырган сайын, үн тилкесиңиз өчүп калат - ошондуктан сигналдын ар кандай эрежелери бар.

Кийинки үч баскыч, жок дегенде, жарым -жартылай, жогоруда сүрөттөлгөн, ошол эле принциптер менен программаланган - ошондуктан биз 55 -сапка чейин өтө алабыз.

4 -кадам: Тереңдиктеги код: IR сигналдарын алуу

Тереңдиктеги код: IR сигналдарын алуу
Тереңдиктеги код: IR сигналдарын алуу

55 -сапта, биз башка пульттон жөнөтүлгөн IR сигналдарын чечмелөө үчүн Arduino программалай баштайбыз - бул сиздин пульт колдонуп жаткан протоколдорду жана сигналдарды түшүнүү үчүн керек. 55 -саптагы коддун биринчи сабы - эгерде (irrecv.decode (& жыйынтыктары) муну "Arduino, IR кодун изде, эгерде аны тапсаң, чыныгы маанини кайтар, эгер эч нерсе табылбаса, жалганды кайтар. Чын болсо, жаз маалымат "жыйынтыктары" ".

56 -сапка өтүү менен бизде Serial.println (results.value, HEX) бар, бул "Ardunio, жыйынтыгын сериялык монитордо HEX форматында басып чыгар" дейт. Он алтылык дегенди билдирген он алтылык, биз экилик сапты (0 жана 1 -лерди) кыскартуунун бир аз оңой нерсесине айлантуунун жолу. Мисалы, 101010010000 "a90", сыналгымды өчүрүү жана күйгүзүү үчүн колдонулган код, жана 111111110000001011111101 - бул 0xFF02FD, ал менин RGB тилкесимди көзөмөлдөйт. Сиз экиликти он алтылыкка айландыруу үчүн жогорудагы диаграмманы колдоно аласыз жана тескерисинче, же төмөнкү шилтемени колдонсоңуз болот:

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

57 -сапка түшүп, бизде коммутатор деп аталган жаңы функция бар.

Негизи, которуштуруу иши берилген өзгөрмөнүн (иштин) жыйынтыгына жараша ар кандай көрсөтмөлөрдү көрсөтүүгө мүмкүндүк берет. тыныгуу switch операторунан чыгат жана ар бир билдирүүнүн аягында колдонулат.

Биз бул жерде которуу корпусун колдонобуз, биздин Arduino ар кандай пульттон сезген протоколдордун негизинде сериялык монитордо басып чыгарууну өзгөртүү үчүн.

5 -кадам: Жыйынтык

Суроолоруңуз болсо - бул жерден мага кайрылыңыз! Мен сизге колумдан келишинче жардам берүүгө аракет кылууга кубанычтамын.

Жашооңузду бир аз жакшыртуу үчүн колдоно турган нерсени үйрөндүңүз деп үмүттөнөм!

-RB

Сунушталууда: