İçindekiler:

Arduino İle I2C Kızılötesi Uzaktan Kumanda: 8 Adım (Resimli)
Arduino İle I2C Kızılötesi Uzaktan Kumanda: 8 Adım (Resimli)

Video: Arduino İle I2C Kızılötesi Uzaktan Kumanda: 8 Adım (Resimli)

Video: Arduino İle I2C Kızılötesi Uzaktan Kumanda: 8 Adım (Resimli)
Video: DENEYAP KART İLK UYGULAMA, SERİ PORT HABERLEŞME 2024, Kasım
Anonim
Arduino ile I2C Kızılötesi Uzaktan Kumanda
Arduino ile I2C Kızılötesi Uzaktan Kumanda
Arduino ile I2C Kızılötesi Uzaktan Kumanda
Arduino ile I2C Kızılötesi Uzaktan Kumanda

ÖnsözBu Eğitilebilir Kitap, arabirim için I2C kullanarak evrensel bir uzaktan kumandanın nasıl oluşturulacağını ayrıntılarıyla anlatır.

Bir I2C bağımlı cihazı kullanarak ne kadar garip diyorsunuz?

Evet, bir I2C bağımlı cihazı.

Bunun nedeni, IR paketlerinin doğru zamanlamasının oldukça zorlu olması ve aynı anda birçok başka görevi yerine getiriyorsa, tipik bir Arduino ile mücadele etmesidir. Bilgi işlem yükünü, mümkün olduğunda özel işlemcilere zamanlama yoğun etkinlikler atayarak dağıtmak daha iyidir (yine de donanımda yapın). I2C'nin IC'ler arasında iyi belgelenmiş ve sağlam bir iletişim yöntemi olduğu göz önüne alındığında, bunu arayüz olarak seçtim.

Tanıtım

Yukarıda bahsedildiği gibi bu talimat, Arduino'daki IRremote kitaplığını kullanarak TV, DVD oynatıcı ve Uydu vb. gibi ev aletlerinin nasıl kontrol edileceğini açıklar.

Arduino'yu prototip test devresi (yukarıdaki resim 2) ile bir I2C bağımlı uzaktan kumanda modülüne (yukarıdaki resim 1) dönüştüren bir tasarım örneği ile sona erer ve tasarımınızı gerekli minimum bileşenlere nasıl küçültebileceğinizi ayrıntılarıyla anlatır. başka bir tasarıma gömülü. Benim durumumda bu gömülü cihazı bir ESP8266-12E temelli bir IoT Evrensel uzaktan kumanda cihazında kullanıyorum.

Hangi parçalara ihtiyacım var?

Adım 1'de (IR Verici) gösterilen devreyi kurmak için aşağıdaki parçalara ihtiyacınız olacak;

  • 2 kapalı 10K direnç
  • 1 kapalı 390R direnç
  • 1 kapalı 33R direnç
  • 1 kapalı 3K8 direnç
  • 1 kapalı Kırmızı LED
  • 1 kapalı IR Led TSAL6400
  • 1 kapalı Transistör BC337
  • 1 kapalı 220uF kapasitör
  • 1 adet Arduino Uno

Adım 4'te (IR Alıcı) gösterilen devreyi kurmak için aşağıdaki parçalara ihtiyacınız olacak;

  • 1 kapalı 10K direnç
  • 1 kapalı TSOP38328
  • 1 kapalı 220uF kapasitör
  • 1 adet Arduino Uno

Adım 5'te (Slave test devresi) gösterilen devreyi kurmak için aşağıdaki parçalara ihtiyacınız olacak;

  • 4 kapalı 10K direnç
  • 2 kapalı 390R direnç
  • 1 kapalı 33R direnç
  • 1 kapalı 3K8 direnç
  • 2 kapalı Kırmızı LED
  • 1 kapalı IR Led TSAL6400
  • 1 kapalı Transistör BC337
  • 1 kapalı 220uF kapasitör
  • 2 kapalı SPST Düğmesi
  • 2 kapalı Arduino Unos

Adım 6'da (Shrink tasarım) gösterilen devreyi kurmak için aşağıdaki parçalara ihtiyacınız olacak;

  • 3 kapalı 10K direnç
  • 1 kapalı 270R direnç
  • 1 kapalı 15R direnç
  • 4 kapalı 1K direnç
  • 1 kapalı Kırmızı LED
  • 1 kapalı IR Led TSAL6400 veya TSAL5300
  • 1 kapalı Transistör BC337
  • 1 kapalı 220uF kapasitör elektrolitik @ 6.3v
  • 1 kapalı 1000uF kapasitör elektrolitik @ 6.3v
  • 2 kapalı 0.1 uF kapasitör
  • 2 kapalı 22pF kapasitör
  • 1 kapalı 16MHz Xtal
  • 1 adet ATMega328P-PU

Not: ATMega328P'yi programlamak için ayrıca bir FTDI cihazına ihtiyacınız olacaktır.

Hangi becerilere ihtiyacım var?

  • Minimum düzeyde elektronik bilgisi,
  • Arduino ve IDE bilgisine sahip,
  • Biraz sabır,
  • I2C'yi biraz anlamak faydalı olacaktır (bazı genel I2C/Wire Library ayrıntıları için buraya bakın).

İşlenmiş konular

  • Devreye kısa bir bakış,
  • Yazılıma kısa bir bakış,
  • I2C Paket içeriği,
  • Uzaktan kumanda kodlarının (ui32Data) alınması,
  • I2C Slave cihazınızı nasıl test edersiniz,
  • Tasarımınızı küçültmek,
  • Çözüm,
  • Kullanılan referanslar.

sorumluluk reddi

Her zaman olduğu gibi, bu talimatları kendi sorumluluğunuzda kullanırsınız ve desteklenmezler.

Adım 1: Devreye Kısa Bir Bakış

Devreye Kısa Bir Bakış
Devreye Kısa Bir Bakış

Devrenin amacı IR uzaktan kumanda kodlarını iletmektir. Tasarımı oldukça yalındır ve oldukça basittir.

Transistör Q1 a BC337 NPN, Arduino PWM O/P D3'ten Direnç R5'e bir mantık yoluyla açıldığında, akım Ledler 1 ve 2'den geçer. Sadece sırasıyla balast dirençleri R3 ve R4 ile sınırlıdır. Q1, IR Diyottan (IF Max = 100mA) geçen akımı, Arduino O/P'nin ~40mA @ +5v besleme kapasitesini aşan bir seviyeye yükseltmek için kullanılır.

Kapasitör C1 a 220uF Elektrolitik, Led 1 ve 2 tarafından çekilen güç tarafından besleme rayının düşmesini önleyen bir miktar stabilizasyon sağlar.

Dirençler R1 ve R2, I2C pull up'larıdır.

2. Adım: Yazılıma Kısa Bir Bakış

Yazılıma Kısa Bir Bakış
Yazılıma Kısa Bir Bakış
Yazılıma Kısa Bir Bakış
Yazılıma Kısa Bir Bakış
Yazılıma Kısa Bir Bakış
Yazılıma Kısa Bir Bakış

önsöz

Bu kaynak kodunu başarılı bir şekilde derlemek için aşağıdaki ekstra kütüphaneye ihtiyacınız olacak;

IRremote.h

  • Gönderen: z3t0
  • Amaç: Arduino için kızılötesi uzak kütüphane: çoklu protokollerle kızılötesi sinyaller göndermek ve almak
  • Kimden:

Kod Genel Bakış

Yukarıdaki resim 1'de gösterildiği gibi, başlatma sırasında kod, mikro denetleyici G/Ç'sini yapılandırır ve ardından dahili yazılım bayrağı 'bFreshDataFlag' durumunu sorgular. Bu bayrak ayarlandığında, kontrolör 'Meşgul' hattı olduğunu belirtir (veri pini D4 düşük gönderiliyor) ve 'eBUSY' durumuna geçer, uDataArray içinde tutulan düğmeye basın komutlarını sırayla okur ve IR modülasyonlu verileri IR LED'e gönderir. iletim sırası.

uDataArray içinde tutulan veriler tamamen gönderildikten sonra, 'eIDLE' durumu devam ettirilir ve 'Meşgul' satırı onaylanır (veri pimi D4 yüksek gönderiliyor). Cihaz artık iletim dizisinin sonunu işaret eden daha fazla düğmeye basmaya hazırdır.

IR düğmesi basın verilerinin alınması

Veriler, I2C aracılığıyla Kızılötesi uzaktan kumandaya gönderildiğinde, bir kesmeyi tetikler ve alıcıEvent() işlev çağrısı eşzamansız olarak tetiklenir.

Tetiklendikten sonra alınan I2C verileri sırayla 'uDataArray' arabelleğine yazılır.

Veri alımı sırasında, ana cihaz tarafından bir dizinin sonu bildirilirse (bFreshData!=0x00) 'bFreshDataFlag' ayarlanır, böylece iletim dizisinin başladığını bildirir.

Resimler 2…3, tipik bir paket dizisinin bir örneğini vermektedir.

Not: Tam kaynak kodu burada mevcuttur

Adım 3: I2C Paket İçeriği

I2C Paket İçeriği
I2C Paket İçeriği

I2C üzerinden slave'e gönderilen kontrol paketinin formatı yukarıda resim 1'de verilmiştir, her alanın anlamı aşağıda verilmiştir.

Kontrol paketi alanlarının anlamı

bayt bEncoding;

  • IR uzaktan kumanda kodlaması,

    • RC6 (Gökyüzü) = 0,
    • SONY = 1,
    • SAMSUNG = 2,
    • NEC = 3,
    • LG = 4

uint32_t ui32Data;

İkili IR veri akışının onaltılı gösterimi 4 Veri baytı (işaretsiz uzun), LSByte … MSByte

bayt bNumberOfBitsInTheData;

Verideki Bit Sayısı (Max 32). Aralık = 1 … 32

bayt bPulseTrainRepeats;

Bu darbe treninin kaç tekrarı. Aralık = 1 … 255. Tipik olarak 2…4 tekrar. Alıcı cihaz bazen bir açma sinyali almak için birkaç ekstra darbe dizisi tekrarı gerektirdiğinden, bunu Açma/Kapama komutları için genişletmek isteyebilirsiniz

byte bDelayBetweenPulseTrainRepeats;

Bu darbe dizisinin tekrarları arasındaki gecikme. Aralık = 1 … 255mS. Tipik olarak 22mS … 124mS

bayt bButtonRepeats;

Aynı düğmeye tekrar tekrar basılmasını simüle eder (ancak Apple uzaktan kumandası gibi değiştirilen kodu desteklemez, sadece düğme kodunu tekrarlar). Aralık = 1 … 256. Varsayılan = 1

uint16_t ui16DelayBetweenButtonRepeats;

Düğme tekrarları arasındaki gecikme (işaretsiz int). Toplamda 2 bayt LSByte… MSByte. Aralık = 1 … 65535mS. Varsayılan = 0mS

bayt bFreshData;

  • Taze veriler. Sıfır olmayan bir değer. En son yazılan, IR TX dizisini tetikler. Aralık 0x00…0xFF

    • Daha fazla kontrol paketi gelecek = 0
    • Bu son kontrol paketidir = Sıfırdan farklı değer 1, 2, … 255

'_packed_' derleyici yönergesinin kullanımına dikkat edin. Bu, kullanılan hedef sistemden (Uno, Due, ESP8266 vb.) bağımsız olarak verilerin bellekteki bayt için paket bayt olduğundan emin olmak içindir. Bu, registerAllocationType ve dataArrayType arasındaki birliğin, bir kontrol paketinden bayt cinsinden yalnızca sıralı olarak saat aşımına/saat hızına ihtiyacı olduğu anlamına gelir, bu da TX/RX yazılımını basitleştirir.

Adım 4: Uzaktan Kontrol Kodlarını Alma (ui32Data)

Uzaktan Kontrol Kodlarını Alma (ui32Data)
Uzaktan Kontrol Kodlarını Alma (ui32Data)
Uzaktan Kontrol Kodlarını Alma (ui32Data)
Uzaktan Kontrol Kodlarını Alma (ui32Data)
Uzaktan Kontrol Kodlarını Alma (ui32Data)
Uzaktan Kontrol Kodlarını Alma (ui32Data)
Uzaktan Kontrol Kodlarını Alma (ui32Data)
Uzaktan Kontrol Kodlarını Alma (ui32Data)

İlgili bir uzaktan kumanda anahtarı kodunu edinmenin üç yolu vardır;

  1. Osiloskop ile bit sayma yoluyla,
  2. Bir web sitesinde ara,
  3. Doğrudan yazılımdaki veri akışından kodunu çözün.

Kapsamlı bit sayma yoluyla

Bu, oldukça zaman aldığı ve potansiyel olarak birden fazla deneme gerektirdiği için verimli bir yöntem değildir, ancak oldukça doğru olabilir. Ayrıca, 2. ve 3. yöntemler kullanılarak elde edilen kodların görsel olarak doğrulanmasında ve ayrıca bir uzaktan kumandanın herhangi bir özelliğinin belirlenmesinde de yararlıdır. Örnek olarak, bir Apple IR uzaktan kumandasında bir düğmeyi basılı tutarken. Uzaktan kumanda başlangıçta bir komut dizisi yayınlayacak, ardından bunu tekrarlanan sıkıştırılmış 0xF dizisiyle takip edecektir.

Bir web sitesinde ara

Linux Kızılötesi Uzaktan Kontrol web sitesindeki uzaktan kontrol kodu veritabanı iyi bir kaynaktır.

Ancak dezavantajı, sizin için uygun olanı bulana kadar birkaç kod denemeniz gerekebilir. Ayrıca, kodların bazı temsillerini eşdeğer onaltılık biçimlerine dönüştürmek için yorumlamanız gerekebilir.

Doğrudan veri akışından kodunu çözün

IRremote kütüphane örneği 'IRrecvDumpV2.ino' ile bağlantılı olarak yukarıdaki resim 1'deki devreyi kullanarak, veri akışını doğrudan uzaktan kumandadan çözmek mümkündür. Resim 2, Arduino IDE terminal penceresinde bir açma/kapama düğmesine basmak için kodu çözülmüş bir Samsung TV uzaktan kumandasını göstermektedir.

Kombine Alıcı/Verici

Yukarıdaki 3 ve 4 numaralı resimler, kolay prototip oluşturmaya izin vermek için IR komutunun hem alınmasına hem de iletilmesine izin veren bir çözümü göstermektedir.

IR uzaktan kumanda düğmesine basışların kodunu çözmek için, IRremote kitaplığı ile birlikte gelen 'IRrecvDumpV2.ino' örneği ile Arduino'yu flaş etmeniz gerekecektir.

IR komutları varsa iletim için de eşit derecede iyi çalışır. Cihazın çalıştığına dair görsel bir gösterge olarak kırmızı bir led dahildir.

Adım 5: I2C Slave Cihazınızı Test Etme

I2C Slave Cihazınızı Test Etme
I2C Slave Cihazınızı Test Etme
I2C Slave Cihazınızı Test Etme
I2C Slave Cihazınızı Test Etme

Buradaki kaynak kodunu ve yukarıda resim 1'de özetlenen devreyi kullanarak, 'Master' Arduino'yu 'IR_Remote_Sim_Test.ino' ve 'Slave' Arduino'yu 'IR_Remote_Sim.ino' ile programlayın.

Bir Sony Bravia TV'niz, Sky HD kutunuz ve bir Sony BT SoundBar'ınız olduğunu varsayarsak, 1 düğmesine bastığınızda TV'niz BBC1'e (kanal 101) geçecektir. 2 düğmesine basın, ses çubuğunuz sessize alınacaktır. Tekrar basın ve sesi açacaktır.

Kızılötesi iletim dizisinin yürütülmesi sırasında, bağımlı birimin meşgul olduğunu belirten LED3 yanacak ve LED1, kızılötesi iletim işlemiyle birlikte yanıp sönecektir.

Tabii ki, yukarıdakiyle aynı eğlence sistemi kurulumuna sahip değilseniz, slave'i 'IRrecvDumpV2.ino' ile yeniden programlayabilir, ilgilendiğiniz uzaktan kumanda komutlarının kodunu çözebilir ve ardından bunları sizin için 'IR_Remote_Sim_Test.ino'ya programlayabilirsiniz. verilen senaryo.

Resim 2, Master ve Slave arasındaki sistem seviyesi test yazılımına genel bakışı gösterir.

Adım 6: Tasarımınızı Küçültün

Tasarımınızı Küçültmek
Tasarımınızı Küçültmek

Tamam, ev cihazlarınızı kontrol etmek için iki Arduino'ya güvenerek bu talimatı takip ettiğinizi varsayarsak, Arduino stoğunuzun en verimli kullanımı değildir. Sonuç olarak, yukarıdaki resimde gösterilen devreyi kurarsanız ve ATMega328P'yi 'IR_Remote_Sim.ino' ile programlamak için buradaki talimatları takip ederseniz, tüm sistemi minimum bileşenlere indirgeyebileceksiniz. Bu, tasarımınızı başka bir sisteme yerleştirmenize izin verecektir.

7. Adım: Sonuç

Çözüm
Çözüm
Çözüm
Çözüm

Çözüm kararlı ve iyi çalışıyor, birkaç haftadır herhangi bir sorun olmadan başka bir sisteme yerleştirildi.

Arduino Uno R3'ü, makul derinlikte bir düğme arabelleğine sahip olabileceğim kadar yeterli RAM'e sahip bir cihaz istediğim için seçtim. 20 paketlik bir arabellek boyutuna karar verdim (MAX_SEQUENCES).

Yaptığım Hybrid TX/RX kalkanı, Sony ve Sky uzaktan kumandalarının kodunu çözerken de çok kullanışlı oldu. Zaman zaman dijital kapsamımı kullanarak yazılımın kodu çözülmüş IR komutunun, alınan IR'den gelenle aynı olduğunu (TSOP38328) kontrol etmem gerektiğini itiraf etmem gerekiyor.

Farklı bir şekilde yapacağım tek şey, yukarıda resim 2'de gösterildiği gibi IR led için sabit akım sürücü devresini kullanmak olurdu.

Unutulmaması gereken bir diğer nokta, tüm IR vericileri 38KHz ile modüle edilmemiştir, TSOP38328 38KHz için optimize edilmiştir.

Adım 8: Kullanılan Referanslar

IRUzaktan.h

  • Gönderen: z3t0
  • Amaç: Arduino için kızılötesi uzak kütüphane: çoklu protokollerle kızılötesi sinyaller göndermek ve almak
  • Kimden:

IR Uzak kitaplığı

  • z3t0.github.io/Arduino-IRremote/
  • https://arcfn.com/2009/08/multi-protocol-infrared-remote-library.html

IR (Kızılötesi) Alıcı Sensör - TSOP38238 (eşdeğer)

https://cdn-shop.adafruit.com/datasheets/tsop382.pdf

Kelime sınırlarına veri yapısı dolgusunu önlemek için

  • https://github.com/esp8266/Arduino/issues/1825
  • https://github.com/tuanpmt/esp_bridge/blob/master/modules/include/cmd.h#L15
  • https://stackoverflow.com/questions/11770451/what-is-the-meaning-of-attribute-packed-aligned4

IR uzak ayrıntıları için iyi bir kaynak

https://www.sbprojects.com/knowledge/ir/index.php

I2C

  • https://playground.arduino.cc/Main/WireLibraryDetailedReference
  • https://www.arduino.cc/en/Reference/WireSend

IR Uzaktan Kumanda Veritabanı

  • https://www.lirc.org/
  • https://lirc-remotes.sourceforge.net/remotes-table.html

BC337 Veri Sayfası

https://www.onsemi.com/pub/Collateral/BC337-D. PDF

1N4148 Veri Sayfası

https://www.vishay.com/docs/81857/1n4148.pdf

ATMega328P-PU Veri Sayfası

Önerilen: