Mündəricat:

Universal TV Uzaqdan - Ardiuino, İnfraqırmızı: 5 addım
Universal TV Uzaqdan - Ardiuino, İnfraqırmızı: 5 addım

Video: Universal TV Uzaqdan - Ardiuino, İnfraqırmızı: 5 addım

Video: Universal TV Uzaqdan - Ardiuino, İnfraqırmızı: 5 addım
Video: Elektronik cihazları smartfonunuzla idarə edin - Smart IR Remote | Tech-Tips #22 2024, Iyul
Anonim
Universal TV Uzaqdan - Ardiuino, İnfraqırmızı
Universal TV Uzaqdan - Ardiuino, İnfraqırmızı

Salam! Bu təlimatda, sizə infraqırmızı uzaqdan istifadə edən bir çox şeylə işləyəcək və eyni zamanda digər müxtəlif uzaqdan idarəetmə vasitələri ilə göndərilən bir infraqırmızı siqnalın "qulaq asması" və deşifr etməsi üçün öz universal pultunuzu necə quracağınızı və proqramlaşdıracağınızı göstərəcəyəm.

Bu pultu qurmağım üçün mənə ilham verən bir az məlumat - mən də çoxunuz kimi pultlarımı daim itirirəm və bu fəlakət olduqca sinir bozucudur, ona görə də onu həll etməyə imkan verirəm! Mən bu pultu düzəltmişəm və ehtiyatla özümün hazırladığım yataq çərçivəsinə yerləşdirmişəm (mən də ağac emalı işçisiyəm) - yataq çərçivəmin bir hissəsidirsə pultu itirə bilmərəm!

Təchizat

Ehtiyac duyacağınız şeylər: -Arduino UNO və ya Nano - yürüş digər lövhələrə görə dəyişə bilər

-Lehimsiz çörək taxtası (və ya daha daimi etmək istəyirsinizsə lehimlənə bilən lövhə)

-Fərqli rəng və uzunluqdakı tellər

-Minariya düymələri (5) (daha çox düymə əlavə edə bilərsiniz, ancaq analog pinlərdən 1 -dən başqa hamısı istifadə edildiyi üçün rəqəmsal sancaqlar istifadə etməlisiniz - çəkmə rezistorlarından düzgün istifadə etdiyinizə əmin olmalısınız. və ya rezistorları aşağı çəkin və düymələri çıxarın)

-10K Ohm rezistor (5) (daha çox düymə istəyirsinizsə, bunlardan daha çoxuna ehtiyacınız olacaq)

-470 Ohm müqavimət (2)

-İnfraqırmızı LED

-Qırmızı LED

-İnfraqırmızı Sensor (VS1838B hissə nömrəsini istifadə etdim, başqa birini istifadə edə bilərsiniz, sadəcə çıxışı yoxlayın)

(İsteğe bağlı) Havya, Lehim, Lehim Akısı.

Addım 1: Dövrün qurulması:

Dövrün qurulması
Dövrün qurulması

1). Həmişə komponentlərimi yerləşdirməklə başlamağı sevirəm, çünki bu həmişə çörək taxtasındakı düzeni idarə edir.

-Düymələri basın

-LEDS: Qırmızı LED və İQ LED tandemdə bağlanır, buna görə də IR LED -in nə etdiyini görə bilərsiniz.

-Sensor

2). Rezistorlar

- Düymələrə bağladığımız beş ədəd 10K rezistora "aşağı çək" dirənçləri deyilir. Rezistorları aşağı çəkin, bir düyməyə basılmadıqda, müvafiq Arduino pininin 0 Volt (və ya ən azından ona yaxın) əldə etdiyinə əmin olun. Rezistorların aşağı salınması (və ya çəkilməsi) haqqında daha çox məlumat üçün burada dərin bir bələdçi var:

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

Bu rezistorlar tamamilə lazım olmaya bilər, ancaq "xəyal" itələmələri alırsınızsa, ehtimal ki, kapasitiv birləşmə və müqavimətçilərin aşağı salınması bunun qarşısını alır.

3). Dövrə telləri

4). 5V və Topraklama Telləri

İstinad üçün təqdim olunan şəkildən istifadə edin! ehtiyaclarınız üçün dəyişdirməkdən qorxmayın!

Addım 2: Kod:

#daxil edin const int RECV_PIN = 7; // IR sensoru ox pin pin But Button1 = A4; // En Uzaq Sol int Button2 = A3; // soldan 2 -ci int Button3 = A2; // Orta int Button4 = A1; // sağda 2 -ci int Button5 = A0; // Sağdan ən uzaqda int LED = 3; // IR LED və Qırmızı LED int val = 0; // Dəyişən dəyər IRsend irsend; IRrecv irrecv (RECV_PIN); decode_results nəticələri;

void setup () {pinMode (Button1, INPUT); pinMode (Button2, INPUT); pinMode (Button3, INPUT); pinMode (Button4, INPUT); pinMode (Button5, INPUT); pinMode (LED, Çıxış); Serial.begin (9600); irrecv.enableIRIn (); irrecv.blink13 (doğru);} void loop () {{{if (analogRead (Button1)> 900) irsend.sendNEC (0xFF02FD, 32); // əsir tutum problemlərinin qarşısını almaq üçün rəqəmsal oxumaq əvəzinə analoji oxumadan istifadə etmək. həmçinin düymələri çıxarmağa kömək edir. // 900 -də analoqun oxunması, dəyərlərdə bir az tərpənmə otağına imkan verir, yəni pinə tam 5V tətbiq olunmasa belə infra siqnalı göndəriləcək. // lakin 900, kapasitif bağlama gecikməsi səbəbindən səhv oxunmayacaq qədər yüksəkdir (100);} // RGB Strip On & off {if (analogRead (Button5)> 900) {for (int i = 0; i <3; i ++) // "i <3" dəki dəyəri dəyişdirmək, siqnalın dərhal təkrarlanma sayını dəyişəcək. buna görə "i <2" siqnalı iki dəfə təkrarlayacaq. // Televizorunuz cavab vermirsə, ümumiyyətlə bu nömrə ilə oynamağınız lazım ola bilər, ümumiyyətlə ən çox 1 və ya 3 işləyir, əgər cavab vermirsə, tək ədədləri sınayın. // intra siqnal gecikmə vaxtı dəyərləri ilə də oynamağınız lazım ola bilər, məsələn, mənim TV 10 -da işləyir, amma 30 yox. {irsend.sendSony (0xa90, 12); // Sony TV -nin güc kodu, televizorum üçün kodun 3x3 göndərilməsi lazımdır, buna görə 3 zərbə, üç ayrı dəfə gecikmə (10); // "int siqnal gecikməsi" üçün (int i = 0; i <3; i ++) {irsend.sendSony (0xa90, 12); // "12" bit nömrəsidir, fərqli protokollar fərqli bit nömrələri tələb edir. NEC 32, Sony 12, digərlərinə baxa bilərsiniz gecikmə (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 gücü Səs Azaltma gecikməsi (100);}}} gecikmə (100);} if (irrecv.decode (& nəticələr)) // kodun aşağı hissəsi müxtəlif uzaqdan idarə olunan infraqırmızı siqnalları şərh etməyə imkan verir. {Serial.println (results.value, HEX); // "NEC, Sony, Etc.." prosedurunu və "c90, a90, FF02FD" televiziya kodunu yaradacaq, TV Kod açarının önünə 0x əlavə etməlisiniz (results.decode_type) {case DENON: Serial.println ("DENON"); fasilə; iş NEC: Serial.println ("NEC"); fasilə; hal PANASONIC: Serial.println ("PANASONIC"); fasilə; hal SONY: Serial.println ("SONY"); fasilə; halda RC5: Serial.println ("RC5"); fasilə; halda JVC: Serial.println ("JVC"); fasilə; halda SANYO: Serial.println ("SANYO"); fasilə; halda MITSUBISHI: Serial.println ("MITSUBISHI"); fasilə; hal SAMSUNG: Serial.println ("SAMSUNG"); fasilə; korpus LG: Serial.println ("LG"); fasilə; halda RC6: Serial.println ("RC6"); fasilə; halda YEMƏK: Serial.println ("DISH"); fasilə; hal SHARP: Serial.println ("SHARP"); fasilə; hal WHYNTER: Serial.println ("WHYNTER"); fasilə; iş AIWA_RC_T501: Serial.println ("AIWA_RC_T501"); fasilə; standart: hal BİLİNMƏZ: Serial.println ("BİLİNMƏZ"); fasilə;} irrecv. resume ();}}

Addım 3: Dərinlikdəki Kod: IR Siqnallarının Göndərilməsi

Kod nömrələrini satır nömrələrinə görə istinad edəcəyəm - davam etmək üçün bu linki istifadə edin:

pastebin.com/AQr0fBLg

Birincisi, IR Uzaq Kitabxanasını z3t0 ilə daxil etməliyik.

Kitabxanaya keçid budur:

github.com/z3t0/Arduino-IRremote

Kitabxananı düzgün yükləmək və IDE -yə necə yükləmək barədə bələdçiyə ehtiyacınız varsa:

www.arduino.cc/az/guide/libraries

1 -ci sətirə kitabxana daxildir.

Sonra, bir neçə dəyişən elan etməliyik, 2-12-ci sətirlər bunu edir.

Dəyişməyəcək dəyişənləri təyin etmək üçün "cost int" istifadə edirik, hamısı bu kateqoriyaya aiddir.

Dəyişəcək dəyişənləri təyin etmək üçün "int" istifadə edirik.

LED pinimiz üçün modulyasiya (PWM) olan nəbzli bir pin istifadə etməliyik - yanında "~" olan hər hansı bir pin kifayətdir, kodumda - rəqəmsal pin 3 istifadə edirik.

Sonra, bir az qurma etməliyik - bu kod Arduino işə salındıqda və ya sıfırlandıqda yalnız bir dəfə işləyəcək.

Diqqət yetirin ki, giriş və çıxışlarımızı (15-20) müəyyənləşdiririk, seriyalı monitoru (21) işə salırıq, İQ sensoru işə salırıq (22) və sensora siqnal gəldiyimiz zaman Arduinoya göyərtədəki LED-in yanıb-sönməsini söyləyirik (23).

Sonra, döngümüzü quracağıq - bu kod dəfələrlə işləyəcək, saniyədə bir neçə dəfə yuxarıdan aşağıya doğru gedəcək.

25 -ci sətirdə bir if ifadəsini istifadə edirik, bu Arduinoya "bu xüsusi meyarları axtarın, əgər bu meyarlar yerinə yetirilirsə, bu xüsusi işi edin" deyir. Bu halda, meyarlar analogRead (Button1)> 900 və ya başqa sözlə - "Arduino, əvvəllər A4 pin olaraq təyin etdiyimiz düymə1 -ə baxın, alınan analoq siqnal 900 -dən böyükdürsə, növbəti təlimatlarımıza keçin., yoxsa, irəliləyin ". Buradan açmaq üçün bir az şey var, buna görə də dalmağa icazə verin: Arduino -dakı analoq siqnal 5V -ə bərabər və ya ondan az olan bir dəyərdir, 5V 1023 -ə bərabərdir və 0V 0 -a bərabərdir. bir ədəd və bir az riyaziyyatla bu rəqəmi və ya əksinə bir gərginliyi anlaya bilərik. 1024 -ü (vahid olaraq 0 daxil edirik) 5 -ə bölün, bu bizə 204.8 verir. Məsələn, 900 rəqəmini istifadə edərək onu gərginliyə çevirmək üçün 900 -ü 204.8 -ə bölməklə ~ 4.4V veririk. Arduinoya ~ 4.4 voltdan böyük bir gərginlik axtarmasını və əgər varsa, növbəti təlimatımızı verdiyini söyləyirik.

Növbəti təlimatlardan (xətt 25) danışarkən irsend.sendNEC (0xFF02FD, 32) görürük. Bu "Arduino, NEC protokolunu, xüsusən FF02FD siqnalını izləyən modulyasiya edilmiş bir nəbz göndərin və 32 bit uzunluğunda olduğundan əmin olun" deyir. Bu, IR LED -inizi digər cihazların anlaya biləcəyi şəkildə titrəyəcək. Bir az Morze Kodu kimi düşünün, ancaq görünməz işıqla! Orada hər birinin yüzlərlə, hətta minlərlə fərdi siqnalları olan və hər birinin öz xüsusi bit nömrəsi olan bir çox fərqli protokol var - cihazımız bu siqnalların böyük bir hissəsini tanıya biləcək, ancaq daha sonra buna daxil olacağıq!

28 -ci sətirdə ilk gecikməyimiz var - bu, istəmədən təkrarlanan siqnalların qarşısını almaq üçün buradadır, düyməyə basıldıqda və İQ siqnalı göndərildikdə, barmağımızı düymədən çıxarmaq üçün 100 milisaniyəyə sahibik. bu çox vaxt kimi görünmür, amma praktikada yaxşı işləyir. gecikmə funksiyası Arduinoya "X milisaniyə üçün heç bir şey etmədiyini" bildirir və istinad üçün saniyədə 1000 milisaniyəyə bərabərdir.

Növbəti düymənin 29 -cu sətirinə keçərkən, düymə5 (əvvəlcə bu pultda 4 düyməyim vardı, beşincisi əlavə olundu, buna görə də sıradan çıxmışıq). Bu, ruh baxımından, düymə 1 ilə eynidir, lakin bir neçə əsas fərqlə. Görəcəyiniz ilk fərq for ifadəsidir - bu mahiyyətcə başqa bir döngədir - başqa bir daha böyük döngədə olan loopception. Xüsusilə "for (int i = 0; i <3; i ++)" ə sahibik, bunu "Arduino, 0 -dan başlayaq, 3 dəfə çatana qədər aşağıdakı təlimatları təkrar edək" olaraq oxuyun. For funksiyası bir çox cihazın təkrar siqnal axtarmaq üçün proqramlaşdırıldığı üçün istifadə olunur və bizim vəziyyətimizdə burada 3 dəfə. Cihazınız fərqli bir təkrarlama cədvəli tələb edərsə, sadəcə 3 sayını fərqli bir nömrəyə dəyişə bilərsiniz. Düymənin 5 başqa bir əsas fərqi, təkrar 3 dəfə və ya 3x3 olaraq təkrarlanmasıdır. Başqa sözlə, siqnalı 3 dəfə göndəririk, 10 millisaniyə gözləyirik, yenidən 3 dəfə göndəririk, başqa 10 milisaniyəni gözləyirik və sonra yenidən 3 dəfə göndəririk. Bu cür ünsiyyət cihazları açmaq və söndürmək üçün yaygındır və sadəcə televizorunuzun və ya cihazınızın tələb etdiyi şey ola bilər - bunun açarı istənilən nəticəni əldə edənə qədər bütün dəyişənlərlə oynamaqdır. Qısa gecikmə dəyərini dəyişdirin, təkrar dəyərini dəyişdirin, 3 əvəzinə 6 dəstə göndərin. Cihazlar qəsdən ixtiyari siqnal qaydaları ilə proqramlaşdırılıb, televizorunuzun pultunuzun səs çubuğunuzla eyni tipli bir siqnal göndərdiyini təsəvvür edin; TV -də hər dəfə kanalı dəyişəndə səs çubuğunuz bağlanır - buna görə fərqli siqnal qaydaları var.

Növbəti üç düymə, heç olmasa qismən yuxarıda təsvir olunan eyni prinsiplərlə proqramlaşdırılmışdır - beləliklə, 55 -ci sətrə qədər keçə bilərik.

Addım 4: Dərinlikdəki Kod: IR Siqnallarının Alınması

Dərinlikdəki kod: IR Siqnallarının Alınması
Dərinlikdəki kod: IR Siqnallarının Alınması

55 -ci sətirdə, digər uzaqdan idarəetmə vasitələri ilə göndərilən IR siqnallarını şərh etmək üçün Arduino proqramlaşdırmağa başlayırıq - bu, pultlarınızın istifadə etdiyi protokolları və siqnalları anlamaq üçün lazımdır. 55 -ci sətirdəki ilk kod xətası, əgər (irrecv.decode (& nəticələr) bunu "Arduino, IR kodunu axtarın, əgər tapsanız, həqiqi bir dəyər qaytarın, əgər heç bir şey tapmasanız, yalan deyin. Doğru olduqda qeyd edin. məlumatları "nəticələr" ə çevirin.

56 -cı sətrə keçdikdə Serial.println (results.value, HEX) yazırıq ki, burada "Ardunio, nəticələri monitor monitorunda HEX formatında çap et" yazılır. Onaltılıq mənasını verən hex, ikili bir sətri (yalnız 0 və 1 -lər) yazmaq üçün bir az daha asan bir şeyə qısaltmağın bir yoludur. Məsələn, 101010010000 "a90" dır, televizorumu söndürmək və açmaq üçün istifadə olunan kod və 111111110000001011111101, RGB şeridimi idarə edən 0xFF02FD -dir. İkili ikili hexə çevirmək və ya əksinə yuxarıdakı cədvəldən istifadə edə bilərsiniz və ya aşağıdakı bağlantıdan istifadə edə bilərsiniz:

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

57 -ci sətirdə, keçid qutusu adlanan yeni bir funksiyamız var.

Əslində, bir keçid qutusu, müəyyən bir dəyişənin (vəziyyətin) nəticələrinə əsaslanaraq fərqli təlimatlar təyin etməyə imkan verir. fasilə switch ifadəsindən çıxır və hər ifadənin sonunda istifadə olunur.

Buradakı keçid qutusundan, Arduino -nun müxtəlif uzaqdan idarəetmə vasitələrindən hiss etdiyimiz protokollara əsaslanaraq serial monitorda necə çap etdiyimizi dəyişdirmək üçün istifadə edirik.

Addım 5: Nəticə

Bir sualınız varsa - zəhmət olmasa mənimlə buradan əlaqə saxlayın! Sənə bacardığım qədər kömək etməyə çalışmaqdan xoşbəxtəm.

Ümid edirəm ki, həyatınızı bir az da yaxşılaşdırmaq üçün istifadə edə biləcəyiniz bir şey öyrəndiniz!

-RB

Tövsiyə: