İçindekiler:

Evrensel TV Uzaktan Kumandası - Ardiuino, Kızılötesi: 5 Adım
Evrensel TV Uzaktan Kumandası - Ardiuino, Kızılötesi: 5 Adım

Video: Evrensel TV Uzaktan Kumandası - Ardiuino, Kızılötesi: 5 Adım

Video: Evrensel TV Uzaktan Kumandası - Ardiuino, Kızılötesi: 5 Adım
Video: Arduino IR Kumanda ile LED Kontrolü 2024, Temmuz
Anonim
Evrensel TV Uzaktan Kumandası - Ardiuino, Kızılötesi
Evrensel TV Uzaktan Kumandası - Ardiuino, Kızılötesi

Merhaba! Bu talimatta size, kızılötesi uzaktan kumanda kullanan çoğu şeyle çalışacak ve ayrıca çeşitli diğer uzaktan kumandalar tarafından gönderilen bir kızılötesi sinyali "dinleyecek" ve kodunu çözecek kendi evrensel uzaktan kumandanızı nasıl oluşturacağınızı ve programlayacağınızı göstereceğim.

Bana bu uzaktan kumandayı inşa etmem için neyin ilham verdiğine dair biraz arka plan - ben, çoğunuz gibi, uzaktan kumandalarımı sürekli kaybediyorum ve bu felaket oldukça sinir bozucu, bu yüzden çözelim! Bu uzaktan kumandayı yaptım ve özel yapım karyolama gizlice yerleştirdim (aynı zamanda ahşap işçisiyim) - Karyolamın bir parçasıysa uzaktan kumandayı kaybedemem!

Gereçler

İhtiyacınız olan şeyler: -Arduino UNO veya Nano - kilometre, diğer kartlara göre değişebilir

-Lehimsiz breadboard (veya daha kalıcı hale getirmek isterseniz lehimlenebilir stripboard)

-Çeşitli renk ve uzunluklarda jumper teller

-Anlık basma düğmeleri (5) (daha fazla düğme ekleyebilirsiniz, ancak analog pimlerin 1'i dışında tümü kullanıldığından dijital pimler kullanmanız gerekir - çekme dirençlerini doğru şekilde kullandığınızdan emin olmanız gerekir., veya dirençleri aşağı çekin ve basmalı düğmeleri serbest bırakın)

-10K Ohm direnç (5) (daha fazla buton istiyorsanız, bunlardan daha fazlasına ihtiyacınız olacak)

-470 Ohm direnç (2)

-Kızılötesi LED

-Kırmızı LED

-Kızılötesi Sensör (VS1838B parça numarasını kullandım, başka bir tane kullanabilirsiniz, sadece pin çıkışını kontrol edin)

(Opsiyonel) Havya, Lehim, Lehim Flux.

Adım 1: Devreyi Kurmak:

Devreyi Kurmak
Devreyi Kurmak

1). Her zaman bileşenlerimi düzenleyerek başlamayı severim, çünkü bu her zaman devre tahtasındaki düzeni yönlendirir.

-Butonlar

-LED'LER: Kırmızı LED ve IR LED birbiri ardına kablolanmıştır, böylece IR LED'in ne yaptığını görebilirsiniz.

-Sensör

2). dirençler

- Basmalı butonlara taktığımız beş adet 10K dirence "pull down" dirençler denir. Dirençleri aşağı çekin, bir düğmeye basılmadığında, karşılık gelen Arduino pininin 0 Volt (veya en azından buna yakın) aldığından emin olun. Aşağı çekme (veya yukarı çekme) dirençleri hakkında daha fazla bilgi için burada ayrıntılı bir kılavuz bulunmaktadır:

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

Bu dirençler tamamen gerekli olmayabilir, ancak "hayalet" itmeler alıyorsanız, bunun nedeni büyük olasılıkla kapasitif kuplaj ve aşağı çekme dirençleri bunu önler.

3). Devre telleri

4). 5V ve Topraklama Kabloları

Referans için sağlanan resmi kullanın! Yine de ihtiyaçlarınıza göre değiştirmekten korkmayın!

Adım 2: Kod:

#include const int RECV_PIN = 7; // IR sensörü pin okuma int Düğme1 = A4;// En Soldaki int Düğme2 = A3; // soldan 2. int Button3 = A2; // Orta int Düğme4 = A1; // 2. sağa int Düğme5 = A0; // En sağda int LED = 3; // IR LED & Kırmızı LED int val = 0; // Değer değiştiriliyor IRsend irsend; IRrecv geri dönüş(RECV_PIN); decode_results sonuçları;

geçersiz kurulum() {pinMode(Button1, INPUT); pinMode(Button2, INPUT); pinMode(Button3, INPUT); pinMode(Button4, INPUT); pinMode(Button5, INPUT); pinMode(LED, ÇIKIŞ); Seri.başla(9600); irrecv.enableIRIn(); irrecv.blink13(true);} void loop() {{{if (analogRead(Button1)>900)irsend.sendNEC(0xFF02FD, 32); // sabit kapasitans sorunlarını önlemek için dijital okuma yerine analog okuma kullanma. ayrıca, düğmelerin kaldırılmasına yardımcı olur. // 900'de analog okumaya sahip olmak, değerlerde bir miktar kıpırdama odasına izin verir, yani, pine tam 5V uygulanmasa bile infra sinyali gönderilir. //ancak 900, kapasitif kuplaj gecikmesi(100);}//RGB Strip On&off {if (analogRead(Button5)>900) {for (int i = 0; i < 3; i++) nedeniyle hatalı okunmayacak kadar yüksek // "i < 3" içindeki değeri değiştirmek, sinyalin hemen tekrarlanma sayısını değiştirecektir. yani "i < 2" sinyali iki kez tekrarlayacaktır. // TV'niz yanıt vermiyorsa bu numarayla oynamanız gerekebilir, genellikle 1 veya 3 en çok çalışır, bunlar vermezse tek sayıları deneyin. // örneğin TV 10'um için sinyal içi gecikme zamanlama değerleriyle de oynamanız gerekebilir, ancak 30 çalışmıyor. {irsend.sendSony(0xa90, 12); // Sony TV güç kodu, TV'm için kodun 3x3 gönderilmesi gerekiyor, bu nedenle 3 darbe, üç ayrı gecikme süresi(10); // (int i = 0; i < 3; i++) için "sinyal içi gecikme" {irsend.sendSony(0xa90, 12); // "12" bit numarasıdır, farklı protokoller farklı bit numaralarını çağırır. NEC 32, Sony 12, diğer gecikmelere bakabilirsiniz(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üç Sesi Azaltma gecikmesi(100);}}} gecikme(100);} if (irrecv.decode(&results)) // kodun aşağıdaki kısmı, çeşitli uzaktan kumandalardan gelen Kızılötesi sinyalleri yorumlamanıza olanak tanır. { Serial.println(sonuçlar.değer, HEX); // "NEC, Sony, Etc.." prosedürünü ve "c90, a90, FF02FD" TV kodunu oluşturacak, TV Kodu anahtarının önüne 0x eklemeniz gerekecek (results.decode_type) {case DENON: Serial.println("DENON"); kırmak; durum NEC: Serial.println("NEC"); kırmak; durum PANASONIC: Serial.println("PANASONIC"); kırmak; durum SONY: Serial.println("SONY"); kırmak; durum RC5: Serial.println("RC5"); kırmak; durum JVC: Serial.println("JVC"); kırmak; case SANYO: Serial.println("SANYO"); kırmak; case MITSUBISHI: Serial.println("MITSUBISHI"); kırmak; durum SAMSUNG: Serial.println("SAMSUNG"); kırmak; dava LG: Serial.println("LG"); kırmak; durum RC6: Serial.println("RC6"); kırmak; case DISH: Serial.println("DISH"); kırmak; case SHARP: Serial.println("SHARP"); kırmak; case NEDEN: Serial.println("NEDEN"); kırmak; durum AIWA_RC_T501: Serial.println("AIWA_RC_T501"); kırmak; varsayılan: durum BİLİNMEYEN: Serial.println("BİLİNMEYEN"); break;} irrecv.resume();}}

Adım 3: Derinlemesine Kodlama: IR Sinyalleri Gönderme

Kod satırlarına satır numaralarına göre atıfta bulunacağım - takip etmek için bu bağlantıyı kullanın:

pastebin.com/AQr0fBLg

İlk olarak, IR Remote Library'yi z3t0'a dahil etmemiz gerekiyor.

İşte kütüphaneye bir link:

github.com/z3t0/Arduino-IRremote

Bir kitaplığın nasıl düzgün bir şekilde indirileceği ve IDE'ye nasıl kurulacağı konusunda bir kılavuza ihtiyacınız varsa:

www.arduino.cc/en/guide/libraries

Satır 1 kitaplığı içerir.

Ardından, birkaç değişken bildirmemiz gerekiyor, 2-12 satırları bunu yapıyor.

Değişmeyecek değişkenleri tanımlamak için " cost int " kullanırız, biri hariç hepsi bu kategoriye girer.

Değişecek değişkenleri tanımlamak için " int " kullanırız.

LED pinimiz için modülasyonlu darbeli (PWM) bir pin kullanmalıyız - yanında "~" olan herhangi bir pin yeterli olacaktır, benim kodumda dijital pin 3 kullanıyoruz.

Ardından, bazı kurulumlar yapmamız gerekiyor - bu kod, Arduino açıldığında veya sıfırlandığında yalnızca bir kez çalışacaktır.

Giriş ve çıkışlarımızı (15-20) tanımladığımıza, seri monitörü (21) çalıştırdığımıza, IR sensörünü (22) etkinleştirdiğimize ve Arduino'ya sensörde bir sinyal aldığımızda yerleşik LED'i yanıp sönmesini söylediğimize dikkat edin (23).

Ardından, döngümüzü oluşturacağız - bu kod, saniyede birkaç kez yukarıdan aşağıya doğru giderek art arda çalışacaktır.

25. satırda bir if ifadesi kullanıyoruz, bu Arduino'ya "bu belirli kriterleri arayın, bu kriterler karşılanıyorsa, bu belirli şeyi yapın" der. Bu durumda kriter analogRead(Button1)>900 'dir veya başka bir deyişle - "Arduino, daha önce pin A4 olarak tanımladığımız button1'e bakın, alınan analog sinyal 900'den büyükse lütfen sonraki talimatlarımıza geçin., değilse, lütfen devam edin". Burada paketten çıkarılması gereken bir parça var, o yüzden hemen konuya girelim: Arduino'daki bir analog sinyal 5V'a eşit veya bundan daha düşük bir değerdir, 5V 1023'e ve 0V 0'a eşittir. 0 ile 5V arasındaki herhangi bir voltaj şu şekilde tanımlanabilir: bir sayı ve biraz matematikle bu sayıyı veya tam tersi bir voltajı bulabiliriz. 1024'ü (birim olarak 0'ı dahil ediyoruz) 5'e bölün, bu bize 204.8 verir. Örneğin, 900 sayısını voltaja çevirmek için kullanırız, 900'ü 204.8'e böleriz ve bize ~4.4V veririz. Arduino'ya ~4.4 volttan daha büyük bir voltaj aramasını söylüyoruz ve eğer öyleyse bir sonraki talimatımızı yapın.

Sonraki talimatlardan bahsetmişken (satır 25), irsend.sendNEC(0xFF02FD, 32) dosyasını görüyoruz. Bu, "Arduino, NEC protokolünü, özellikle FF02FD sinyalini izleyen modüle edilmiş bir darbe gönder ve 32 bit uzunluğunda olduğundan emin ol" diyor. Bu, IR LED'imizin diğer cihazların anlayabileceği şekilde titreşmesini sağlayacaktır. Biraz Mors Kodu gibi düşünün, ama sadece görünmez ışıkla! Her biri yüzlerce hatta binlerce bireysel sinyale sahip ve her biri kendi özel bit numarasına sahip birçok farklı protokol var - cihazımız bu sinyallerin büyük bir miktarını tanıyabilecek, ancak buna daha sonra dalacağız!

28. satırda ilk gecikmemiz var - bu, istem dışı tekrarlama sinyallerini önlemek için, düğmeye basıldığında ve IR sinyali gönderildiğinde, parmağımızı düğmeden çekmek için 100 milisaniyemiz var. bu çok uzun bir süre gibi gelmiyor, ancak pratikte iyi çalışıyor gibi görünüyor. gecikme işlevi, Arduino'ya "X milisaniye için hiçbir şey yapma" ve referans olarak, bunların bir saniyede 1000 milisaniye olduğunu söyler.

29. satırdaki bir sonraki düğmemize geçiyoruz, buton5 (Bu uzaktan kumandada başlangıçta 4 düğmem vardı, beşinci bir düğme ekledim, bu yüzden bozuk durumdayız). Bu, özünde düğme 1 ile aynı şeydir, ancak birkaç önemli farkla. Göreceğiniz ilk fark, bir for ifadesidir - bu aslında başka bir döngüdür - başka bir daha büyük döngüde, döngü algısında olan bir döngü. Özellikle " for (int i = 0; i < 3; i++) " var, bunu "Arduino, hadi 0'dan başlayalım, 3 katına ulaşana kadar aşağıdaki talimatları tekrarlayın" olarak okuyun. for işlevi kullanılır, çünkü birçok cihaz tekrarlanan bir sinyali aramaya programlanmıştır ve bizim durumumuzda burada 3 kez. Cihazınız farklı bir tekrar programı gerektiriyorsa, 3 rakamını farklı bir numarayla değiştirebilirsiniz. button5 ile bir diğer önemli fark, tekrar, 3 kez veya 3x3 tekrarlanmasıdır. Yani sinyali 3 kez gönderiyoruz, 10 milisaniye bekliyoruz, 3 kez tekrar gönderiyoruz, 10 milisaniye daha bekliyoruz ve ardından 3 kez tekrar gönderiyoruz. Bu tür iletişim, cihazları açıp kapatmak için yaygındır ve TV'nizin veya cihazınızın gerektirdiği şey olabilir - bunun anahtarı, istediğiniz sonucu elde edene kadar tüm değişkenlerle oynamaktır. Kısa gecikme değerini değiştirin, tekrar değerini değiştirin, 3 yerine 6 grup gönderin vb. Cihazlar kasıtlı olarak rastgele sinyal kurallarıyla programlanmıştır, TV uzaktan kumandanızın ses çubuğunuzla aynı türde sinyal gönderdiğini düşünün; TV'nizde kanalı her değiştirdiğinizde, sound barınız kapanır - bu yüzden farklı sinyal kuralları vardır.

Sonraki üç düğme, en azından kısmen yukarıda açıklanan aynı ilkelerle programlanmıştır - böylece 55. satıra kadar atlayabiliriz.

Adım 4: Derinlemesine Kod: IR Sinyallerini Alma

Derinlikteki Kod: IR Sinyallerini Alma
Derinlikteki Kod: IR Sinyallerini Alma

55. satırda, Arduino'yu diğer uzaktan kumandalar tarafından gönderilen IR sinyallerini yorumlamak için programlamaya başlıyoruz - bu, uzaktan kumandalarınızın kullandığı protokolleri ve sinyalleri anlayabilmeniz için gereklidir. 55. satırdaki ilk kod satırı if (irrecv.decode(&results) bunu şu şekilde okur: "Arduino, bir IR kodu arayın, bulursanız gerçek bir değer döndürün, hiçbir şey bulunamadıysa false döndürün. Doğru olduğunda, kaydedin bilgileri "sonuçlara"" aktarın.

56. satıra geçerken, elimizde Serial.println(results.value, HEX) var ve "Ardunio, sonuçları seri monitörde HEX formatında yazdır" yazıyor. Onaltılık anlamına gelen onaltılı, ikili bir dizeyi (sadece 0'lar ve 1'ler) yazılması biraz daha kolay bir şeye kısaltmamızın bir yoludur. Örneğin 101010010000, televizyonumu kapatıp açmak için kullanılan kod olan "a90" ve 1111111000000101111101, RGB şeridimi kontrol eden 0xFF02FD'dir. İkiliyi hex'e dönüştürmek için yukarıdaki grafiği kullanabilir veya tam tersini yapabilir veya aşağıdaki bağlantıyı kullanabilirsiniz:

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

57. satıra kadar, anahtar durumu adı verilen yeni bir fonksiyonumuz var.

Temel olarak, bir anahtar durumu, belirli bir değişkenin (durum) sonuçlarına göre farklı talimatlar belirtmemize izin verir. break, switch deyiminden çıkar ve her deyimin sonunda kullanılır.

Arduino'muzun çeşitli uzaktan kumandalardan algıladığı protokollere dayalı olarak seri monitörde nasıl yazdıracağımızı değiştirmek için buradaki anahtar kasasını kullanıyoruz.

Adım 5: Sonuç

Bir sorunuz varsa - lütfen bana buradan ulaşmaktan çekinmeyin! Elimden geldiğince size yardımcı olmaya çalışmaktan mutluluk duyarım.

Umarım hayatınızı biraz daha iyi hale getirmek için kullanabileceğiniz bir şey öğrenmişsinizdir!

-RB

Önerilen: