İçindekiler:

Arduino RF Sensör Dekoderi: 5 Adım
Arduino RF Sensör Dekoderi: 5 Adım

Video: Arduino RF Sensör Dekoderi: 5 Adım

Video: Arduino RF Sensör Dekoderi: 5 Adım
Video: How to decode any RF signal remote in Arduino | Arduino Project| ALPHA Lab 2024, Temmuz
Anonim
Arduino RF Sensör Dekoderi
Arduino RF Sensör Dekoderi

Önceki evim, kapı sensörleri, hareket sensörü ve kontrol paneli olan önceden kurulmuş bir güvenlik sistemiyle geldi. Her şey bir dolaptaki büyük bir elektronik kutuya bağlıydı ve bir alarm durumunda otomatik olarak arama yapmak için sabit hatlı bir telefonun kablolanması için talimatlar vardı. Onunla oynamayı denediğimde, kapı sensörlerinden birinin eksik takıldığını ve diğerinin yanlış hizalama nedeniyle kesintili olduğunu keşfettim. Güvenlik şirketinin kartvizitinde lanse edilen profesyonel kurulum için çok fazla. O zamanki çözümüm birkaç internet güvenlik kamerası ve ucuz bir kablosuz güvenlik alarmı almaktı.

Bugüne hızlı ileri sar ve kablosuz alarm bodrumumdaki bir kutuda duruyor. Ucuz bir RF alıcısı edindikten sonra, sahip olduğum çeşitli alarm sensörleri ve uzaktan kumandalar tarafından iletilen mesajların kodunu çözüp çözemeyeceğimi görmeye karar verdim. Hepsi ucuz alarm kutusuyla çalıştığından, hepsinin aynı mesaj formatını farklı bir kimlikle kullanması gerektiğini düşündüm. Kısa sürede mesajların sadece genel yapısında benzer olduklarını öğrendim. Böylece proje hızla önemsizden çok ilginç hale geldi.

Adım 1: Sensör Modülleri

Sensör Modülleri
Sensör Modülleri
Sensör Modülleri
Sensör Modülleri
Sensör Modülleri
Sensör Modülleri
Sensör Modülleri
Sensör Modülleri

Yukarıdaki resimlerde de görebileceğiniz gibi vericiler, kapı açık sensörleri, hareket dedektörleri, devreye alma uzaktan kumandaları ve alarm kutusunu programlamak için kullanılan bir kablosuz tuş takımı içerir. Görünüşe göre, bu cihazlardan hiçbiri aynı senkronizasyon uzunluğunu veya bit süresini kullanmaz. Mesaj uzunluğu dışındaki tek ortak nokta, bitlerin temel formatıdır. Her bit, sıfır ve bir arasındaki fark yüksek/düşük bölümlerin görev döngüsü olacak şekilde sabit bir zaman periyodu alır.

Yukarıda gösterilen güzel dalga formu, ilk aldığım şey DEĞİLDİR. 433 MHz frekans bandında çok fazla trafik olduğundan, kapsamı tek bir tetikleme yapacak şekilde ayarlamadan hemen önce sensörü etkinleştirdiğimden emin olmam gerekiyordu. Neyse ki sensörler, etkinleştirildiğinde veri mesajının birkaç kopyasını çıkarır ve uzaktan kumandalar ve tuş takımı, bir tuşa basıldığı sürece mesaj göndermeye devam eder. Kapsamı kullanarak, her bir öğe için senkronizasyon uzunluğunu ve veri biti sürelerini belirleyebildim. Daha önce bahsedildiği gibi, senkronizasyon zamanları farklıdır ve bit zamanları farklıdır ancak mesaj formatlarının tümü, 24 veri biti ve bir durdurma biti tarafından takip edilen düşük seviyeli bir senkronizasyona sahiptir. Bu, her bir cihaz için tüm farklı ayrıntıları sabit kodlamak zorunda kalmadan yazılımda genel bir kod çözücü oluşturabilmem için yeterliydi.

2. Adım: Donanım

Donanım
Donanım
Donanım
Donanım

Başlangıçta bir PIC mikrodenetleyici ve montaj dili kullanarak bir sensör kod çözücüsü oluşturdum. Son zamanlarda Arduino varyantlarıyla oynuyordum, bu yüzden onu çoğaltabilir miyim diye düşündüm. Basit şema yukarıda gösterilmiştir ve ayrıca benim prototipimin bir resmi de vardır. Tek yaptığım Arduino Nano'dan RF alıcı kartına gitmek için üç ortak atlama kablosu kullanmaktı. Tüm gereken güç ve tek bir veri hattıdır.

"3'ü 1 Arada Zaman ve Hava Durumu Ekranı"ndaki Talimatımı okursanız, ortak bir RXB6, 433-MHz alıcı kullandığımı göreceksiniz. Bu proje için gereken kısa mesafelerde çalışacak gerçekten ucuz alıcıları elde edebilirsiniz, ancak yine de süper heterodin bir alıcı kullanmanızı tavsiye ederim.

3. Adım: Yazılım

Yazılım, alınan bitleri görüntülenebilir ASCII karakterlerine dönüştürür. Senkronizasyon uzunluğunun değerini ve 1 ve 0 bitlerinin uzunluklarını verir. Senkron uzunluklarını ve bit biçimlerini zaten bildiğim için yazılımı özellikle onlar için yazabilirdim. Bunun yerine, senkronizasyon uzunluklarını sıralamak ve veri bitlerini otomatik olarak bulmak için yazıp yazamayacağımı görmeye karar verdim. Bu, bir süre sonra diğer biçimleri algılamaya çalışmak istemem durumunda değiştirmeyi kolaylaştırmalı. Yazılımın bir mesajın ilk bitinin 1 mi yoksa 0 mı olduğunu bilmediğine dikkat etmek önemlidir. Bunun 1 olduğunu varsayar, ancak sıfır olması gerektiğini anlarsa, ters çevirir. seri bağlantı noktasından göndermeden önce tamamlanan mesajdaki bitler.

Senkronizasyon darbesinin süreleri ve veri bitleri, bir kesme işleyicisini tetiklemek için INT0 harici kesme girişi kullanılarak belirlenir. INT0 yükselen, düşen veya her iki kenarda veya sabit bir düşük seviyede tetiklenebilir. Yazılım her iki kenarda da kesintiye uğrar ve darbenin düşük kaldığı süreyi ölçer. Bu, işleri basitleştirir, çünkü mesaj başlatma/senkronizasyon düşük seviyeli bir darbedir ve bitler, düşük seviye zamanlarına göre belirlenebilir.

Kesme işleyicisi önce yakalanan sayının bir başlatma/senkronizasyon darbesi olacak kadar uzun olup olmadığını belirler. Sahip olduğum çeşitli cihazlar 4, 9, 10 ve 14 milisaniyelik senkronizasyon darbeleri kullanıyor. Min/maks izin verilen eşitleme değerleri için tanımlama ifadeleri yazılımda ön plandadır ve şu anda 3 ve 16 milisaniye olarak ayarlanmıştır. Bit süreleri de sensörler arasında farklılık gösterir, bu nedenle bitlerin kodunu çözme algoritmasının bunu hesaba katması gerekir. İlk bitin bit zamanı, ilk bitten önemli bir farkı olan bir sonraki bitin zamanı gibi kaydedilir. Sonraki bit sürelerinin doğrudan karşılaştırılması mümkün değildir, bu nedenle bir "geçişleme faktörü" tanımlaması ("Varyasyon") kullanılır. Bit kod çözme, ilk veri bitinin her zaman bir mantık 1 olarak kaydedildiği varsayılarak başlar. Bu değer kaydedilir ve ardından sonraki bitleri test etmek için kullanılır. Bir sonraki veri biti sayısı kaydedilen değerin varyans penceresi içindeyse, o zaman aynı zamanda lojik 1 olarak kaydedilir. Kaydedilen değerin varyans penceresinin dışındaysa, lojik 0 olarak kaydedilir. bit zamanı ilk bit zamanından daha kısaysa, yazılıma baytların görüntülenmeden önce ters çevrilmesi gerektiğini söylemek için bir bayrak ayarlanır. Bu algoritmanın başarısız olduğu tek durum, bir mesajdaki bitlerin hepsinin 0 olması durumudur. Bu tür bir mesaj anlamsız olduğu için bu sınırlamayı kabul edebiliriz.

Tüm ilgilendiğim sensörlerin mesaj uzunluğu 24 veri biti ama yazılım bu uzunlukla sınırlı değil. Yedi bayta kadar bir arabellek vardır (daha fazlası eklenebilir) ve bayt cinsinden minimum ve maksimum mesaj uzunluğunu tanımlar. Yazılım, bitleri toplamak, bunları baytlara dönüştürmek, geçici olarak depolamak ve ardından seri bağlantı noktası aracılığıyla ASCII formatında çıktı vermek üzere ayarlanmıştır. Mesajın çıkışını tetikleyen olay, yeni bir başlatma/senkronizasyon darbesinin alınmasıdır.

4. Adım: Veri Kaydı

Veri kaydı
Veri kaydı

Yazılım, dönüştürülen verileri ASCII karakterleri olarak Arduino'nun seri (TX) çıkışı üzerinden verecek şekilde ayarlanmıştır. PIC versiyonunu yaptığımda, verileri görüntülemek için PC'deki bir terminal programına arayüz oluşturmam gerekiyordu. Arduino IDE'nin bir avantajı, yerleşik bir Seri Monitör işlevine sahip olmasıdır. Seri port hızını 115.2k olarak ayarladım ve ardından Seri Monitör penceresini aynı hıza ayarladım. Buradaki ekran görüntüsü, sahip olduğum çeşitli sensörlerden gelen çıktılara sahip tipik bir ekranı gösteriyor. Gördüğünüz gibi, veriler bazen mükemmel değil ancak her sensörün gerçek değerinin ne olması gerektiğini kolayca belirleyebilirsiniz.

Adım 5: Örnek Alıcı Yazılımı

Örnek Alıcı Yazılımı
Örnek Alıcı Yazılımı

Uygulamanız için belirli bir kod setini almak için toplanan bilgileri nasıl kullanabileceğinizi gösteren örnek bir yazılım listesi ekledim. Bu örnek, Etekcity uzak çıkışlarımdan birini taklit edecek şekilde ayarlanmıştır. Bir komut Nano'da yerleşik LED'i (D13) açar ve diğer komut LED'i kapatır. Arduino'nuzda yerleşik bir LED yoksa, direnç ve LED'i şemada gösterildiği gibi ekleyin. Gerçek bir uygulamada bu işlev, bir elektrik prizinin gücünü açar/kapatır (bir röle veya triyak kullanarak). Senkronizasyon süreleri, bit süreleri ve beklenen veri baytlarının tümü, değişiklik kolaylığı için önceden tanımlanmıştır. Özel uygulamanız için bazı şeyleri açmak/kapatmak vb. için kalan veri hatlarından herhangi birini kullanabilirsiniz. Sadece ilgili komut kodu tanımlarını ekleyin ve LED açma/kapama mantığını ihtiyaçlarınıza göre “loop”ta değiştirin.

Önerilen: