Bu sinyalde hangi kodlama kullanılır?


19

Ucuz bir kablosuz havuz termometrem var (AcuRite 617 1 ) ve alıcıdaki sıcaklık verilerini yakalamak ve bilgisayarlı bir veri kayıt sistemi ile kullanmak istiyorum.

Uygun olarak, alıcının içinde antene bağlı ve dijital "V", "G", "D" ve "SH" pimlerine sahip küçük bir ayırma kartı bulunur:

RF211 kartı

Burada bir iletim sırasında "D" pininden yakalanan verilerin bir bölümü (bunlar dakikada bir kez olur). Bu segmentten önce, çok daha yüksek oranlı veriler var gibi görünüyor, ancak bunun gürültü olabileceğine inanıyorum - bu 1.36kHz / 680Hz verilerinin başlangıcı.

"D" pininden yakalanan sinyal

Biraz googledim ve buna benzer bir kodlama bulamıyorum, ama ne olduğunu tahmin edersem, düşündüğüm şudur:

  • 680 Hz'lik ilk 4 döngü, saatleri senkronize etmek içindir ancak veri içermez
  • Takip eden 13 döngü 1,36 kHz (başlangıç ​​hızının 2 katı) iki formdan birine sahip gibi görünüyor: ya döngünün orta noktasından önce ya da sonra düşüyorlar - bir formun mantıksal bir diğeri olduğunu varsayalım sıfırdır.
  • Bundan sonra, garip bir boşluk var gibi görünüyor, ancak önceki "1" in bir parçası olan düşük kısmını indirirseniz, kalan boşluk 735 µs'dir, bu da (faz-doğru!) 680 Hz önsöz.

Buna doğru bakıyor muyum? Bu kodlama için bir ad var mı?

Çıkış tahtası hakkında bazı notlar:

  • tahtası "433.92MHz çalışır genel amaçlı, 3V QwikRadio Alıcı" MICRF211 ile şaşırtıcı bir uyum "RF211" ve görünüm olarak işaretlenmiş 3
  • MICRF211 veri sayfası, yakalama ile karşılaştırıldığında çift veri hızı kare dalgası dışında gördüğüm gibi görkemli bir şekilde görünen aşağıdaki şekle (çok az açıklama ile) sahiptir:
    veri profili

2016-02-14 Güncelleme: Bu projeyi tekrar gözden geçirdim ve 4 döngülü bir başlangıç ​​eki ile 1 döngülü bir "postamble" arasında temiz bir 64 bit akış görüyorum, ardından ekran kartı RF modülünü kapatıyor ^ SH düşük çekerek (üst satır):

64 bit veri

Micrel'in "% 33/66 PWM" planına (Google'da başka hiçbir yerde görünmüyor) göre, bu

-_-_-_-_0000011110011000110000000000000000000000100011101000010010101010-_

Şimdi bitleri çözmek için sıcaklığı değiştirmeye başlamalıyım. Burada ("x"), ekranda belirgin bir değişiklik olmadan değişmiş gibi görünen bitler:

0000011110011000110000000000000000000000100011101000010010101010
------------------------------------------------x----xxxx----xxx

Bunların ya en az anlamlı bitler ya da pil seviyesi olduğunu varsayıyorum (önemli ölçüde düştüğünde yalnızca "Düşük" olarak gösterilir).

2016-02-15 Güncelleme: Yeni "Tersine Mühendislik" yığınını değiştirmek için bir gösteri yapmak için yola çıkıyorum: /reverseengineering/12048/what-is-contained -in-Bu nakil-rf-havuz sıcaklığa sensör temel birimi yeniden


BTW - AcuRite 617 ünitesi için Home Depot web sitesindeki kullanıcı yorumlarını okumak, bu ürünün genel dayanıklılığında iyi bir his vermez. Aslında, gönderici birimine sızmama konusunda bir çıkış noktası gibi görünüyor.
Michael Karas

oh, öyle. benimki zaten sızdırılmış. ama kurutdum ve söktüm ve sıcak tutkal ve / veya silikon ile sızdırmazlığı geliştirebileceğimden eminim. pil bölmesi iyi bir o-ring ile iyi tasarlanmış gibi görünüyor; ünitenin geri kalanı çok kötü ve bir daha asla açılmasına gerek yok ...
Rob Starling

Diğer cevapları kaçırdı ama bu görünüşte. İlk kare dalga, veri dilimleyiciyi% 50 oranında senkronize etmektir. Verilerin "1" seviyesinin azalmasını sağlamak için duraklatma. Sonra 2: 1mk-spc = 1 say ve 1: 2 = 0. Histerezis ile 50:50 önceki 1 veya 0 arasında geçiş yapmaz, ancak veri akışı sırasında gerçekleşmemelidir. Önceki "kötü" olduğu için ortalama 50:50 oranını korumaya çalışmaz ve verileriniz daha fazla 1 veya 0'a sahipse dc seviyeniz kaymaya başlar, ancak DC seviye zaman sabitiniz bir msg uzunluğuna kıyasla uzunsa Önemli olmak. Daha sonra bir sonraki mesaj için 1: 1 önsözüyle tekrar senkronize edersiniz.
Russell McMahon

Bir kod çözücü, bir direnç artı + ve histerez geri beslemesi (belki yaklaşık 4R) aracılığıyla ortalama DC seviyesini ve diğer beslenen sinyali ayarlamak için RC filtresi tarafından bir giriş besleme sinyali olan bir opamp olabilir, böylece 1: 1 sinyal çıkışı çevirmez, ancak 2 : 1 veya 1: 2 yapar. Histerezis% ve DC RC zaman sabiti ile biraz oynamak ve yeterince iyi çalışmalıdır.
Russell McMahon

Muhafazanın altındaki birkaç granül Kalsiyum Karbür veya metalik Kalsiyum kuru ve hafif basınçlı kalmalıdır :-). Hayır, bunu hiç denemedim.
Russell McMahon

Yanıtlar:


8

Micrel bunu% 33/66 PWM şeması olarak ifade eder. Oldukça basit ama ad-hoc bir protokol gibi görünüyor.

PWM darbe genişliği modülasyonu anlamına gelir. Daha ayrıntılı bir Wikipedia sayfası var, ama kısacası, PWM sabit bir dönemi tuttuğunuz yerdir, bu yüzden yükselen kenardan bir sonraki yükselen kenara kadar geçen zamandır, ancak yüksekte harcanan sürenin yüzdesini değiştirirsiniz. düşen kenar meydana geldiğinde değiştirerek durumu. Bunun için, '1' için% 33, '0' için% 66 yüksek olduğunu görebilirsiniz.

Başlangıçtaki pals serileri yüksek ve düşük zamanlara eşittir. Bu genellikle alıcının gerçek veriler alınmadan önce senkronize olmasına izin vermek için yapılır.

Modül için ne bekledikleri hakkında daha fazla bilgi için http://www.micrel.com/_PDF/App-Notes/an-22.pdf adresine bakın .

Bu tür bir kodlamayı alabilmenin tipik bir yolu, bunu bir mikrodenetleyicinin bir zamanlayıcı giriş yakalama pimine girmek olacaktır. Veya sadece genel bir girişe bağlanabilir ve PWM periyodunda 4-5x oranında örnek alabilirsiniz. Kod çözme algoritması oradan çok zor değil.

Alternatif olarak, markt'ın önerdiği gibi, sıcaklık sensörünün kendisine geri dönebilirsiniz. Ancak, analog bir çıkış sinyali ise, bunu kendiniz dijitale dönüştürmeniz gerekir ve günlüğünüzde orijinal çıkıştan biraz farklı sayılar olabilir.


3

Tanıdığım insanlar genellikle kodlama tekniğine "PWM" diyorlar, ki bu da makul bir tanım.

Veri akışınıza bakarak ilk düşüncem ve bitlerin kutupluluğunu doğru tahmin ettiğinizi varsayarak, 12 bitlik ADC okuması, önce LSB, başlangıçta '1' önde gelen bir başlangıç ​​biti. İlk önce LSB ile gidiyorum çünkü muhtemelen bir sonraki okumanın başlangıcı tek bitlik bir varyasyon gösteriyor ve (havuz) sıcaklığının bir ADC okumasının bu kısa zaman dilimi içinde 2. veya 3. MSB ile değişmesi olası değil.

Sistemin içine biraz daha veriyorum, veriyi üreten her şeye geri (veri aktarımının aksine), sıcaklık sensörünü tespit edip edemeyeceğinize bakın ve iletilen veriler ile sıcaklık arasında bir korelasyon olup olmadığına bakın.


Bana göre @RobStarling, alıcı cihaza bakıp neyin görüntülendiğini görerek iletilen sıcaklığın ne olduğunu zaten bilmelidir.
Michael Karas

1
doğru, ama bu şeyler hileli olabilir. örn. ekran ˚F / ˚C arasında değiştirilebilir, bu nedenle aktarım mutlak ˚C veya orF olabilir veya bazı garip ofsetlere veya bazı keyfi sabit nokta hassasiyetlerine göre olabilir. Ayrıca, 3 değiştirilebilir istasyon kimliği ("A", "B", "C") var ve ID değiştirmenin resepsiyona yardımcı olabileceğini söylese de, mesajlarda sadece bir tanımlama öneki var - geçiş yapacağım ve verilerde nelerin değiştiğini görün.
Rob Starling

@RobStarling - Gönderici birimini, LM75 veya diğer yaygın I2C türlerinden biri gibi basit bir sıcaklık sensörü türü kullanıp kullanmadığını görmek için açabilirsiniz. Eğer öyleyse, sıcaklık değeri olarak bağlantı üzerinden gönderilen verilerin sıcaklık sensörü cihazından okunması muhtemeldir. Öte yandan gönderici, sensör olarak bir diyot veya BJT transistörü gibi bir analog sensör kullanıyorsa, gönderilen gerçek verilerin çıkarılması daha zor olacaktır.
Michael Karas

Veri içeriğini anlamanız için en iyi şansın, göndericiyi sıcaklığı yavaşça değiştirebileceğiniz kontrollü bir duruma getirmektir, böylece okuma her seferinde biraz değişebilir. Gerçekte ne beklendiğini size bildirmek için alıcı ekranınız olacaktır.
Michael Karas

@MichaelKaras - sensörün ne olduğunu görmek zor - uçtaki küçük bir tutucuya takılmış küçük bir tahtada, suyun altındaki dış duvara birleştirmek için bir termal macun sürüsü içinde saklanıyor.
Rob Starling

2

Hemen hemen tüm RF iletim şemalarının veri kodlama protokollerinde çeşitli özelliklere sahip olması gerekecektir. Bunlar şunları içerir:

  1. Bir alıcıyı frekansta kilitlemek için kullanılan tutarlı format başlangıç ​​eki
  2. Kare gösterimi durumunda başlatmayı işaretlemek için bir senkronizasyon pals göstergesi
  3. Veri kurtarma için bir çeşit kodlanmış saat ile veri 1 ve 0'ları kodlama yöntemi.

Belirttiğiniz tek top darbesi, kesinlikle senkronizasyon darbesi göstergesidir.

Veri kodlama darbe genişliği kodlama olarak adlandırılan gördükleri takip gibi görünüyor. Bu, bir geçiş yönünün sabit genişlikli bit hücre sürelerine yol açan sabit bir frekansı takip ettiği oldukça yaygın bir tekniktir. Bit hücresi sırasında aktif darbe, bit hücre süresinin% 25'i veya bit hücre süresinin% 75'i olarak sunulur. Bu şema Manchester'ın kodlama teklifleri gibi darbeden darbeye DC dengeli kodlama şeması değildir. Tüm mesajda genel bir denge oluşturmak için ekstra bitler göndererek mesaj protokolü içinde DC dengesi sağlamak için darbe genişliği kodlaması olan yaygın bir tekniktir. En basit haliyle, veriler ikinci kopya mantıksal olarak ters çevrilerek iki kez gönderilir.

Örneğinizde, senkronizasyon darbesinden önce meydana gelen darbe genişliği modülasyonlu verileri görmek tuhaftır. Bununla birlikte, veri kod çözme algoritmasının tasarlanmış olması, bu konumda senkronizasyon ile alınan verileri kabul etmek için hala uygulanabilir bir şemadır. Ünitenin senkronizasyondan önce ve sonra bir tür veri göndermesi mümkündür. Bölme, sensör adresi / geçici veri VEYA gerçek veri / ters veri arasında olabilir.

Düzenle:

Verici biriminin, eşitleme deseninden önce veri hücreleri için pozitif darbe genişliklerini, eşitleme desenindeki ve sonrasındaki darbe genişliğinden daha fazla formüle etmek için farklı bir yazılım algoritması kullanıyor gibi görünmesi ilginçtir. Bu, kalıbın sonraki kısmına göre daha önceki kalıbı üreten ayrı bir yazılım parçası olabileceğini ima eder. Bu örüntü farkı, her durumda veri kaynağının veriye nasıl erişildiğine göre farklı işlem gerektirdiğini ima edebilir. Zamanlama şemasında görülen fark basitçe bir talimat zamanlaması veya örüntü oluşturma döngülerindeki iki fark olabilir.


merak ediyorum: önsöz (kare) + başlangıç ​​biti (1) + benzersiz id (12 bit) + senkronizasyon darbesi + veri. (oh, önerdiğiniz gibi ... örneğin belki µC'nin senkronizasyon darbesi sırasında veriye hazır olmasını bekler)
Rob Starling

2

Acurite 617 kodunu çözmeye başladım ve işte ilk gözlemlerim. Son baytın bir çeşit "kontrol" baytı olduğunu ve son üç baytın yanında sıcaklığı içerdiğini söyleyebilirim. Bu bayt ayrıca eşitlik sağlamak için 7. bit kullanılarak gönderilir ve her baytın sadece daha düşük kırıntıları kullanılır. Verileri yakalamak için bir Arduino programı yazdım ve aşağıdaki mesajları / sıcaklığı gördüm.

40 ce c0 00 00 0c 03 olmak
(00 0C 03) => 0C3 => 67F

40 ce c0 00 00 0c 84 39
(00 0C 04) => 0C4 => 67F

40 ce c0 00 00 0c 05 b8
(00 0C 05) => 0C5 => 67F

Gördüğüm diğer veriler / temperler:

E2 => 73F

F5 => 76F

108 => 80F (81 00 88)

109 => 80F

Bunu kullanarak "düz çizgi" (varsayım) dönüşümünü yapabilmelisiniz.

İyi bir kapsamım olmadığından (ve verilerin dakikada bir kez gönderildiği gerçeğinden) zamanlamamdan emin değilim. HI ve LO senkronizasyonunun 720 usec ve veri bitlerinin 240 ve 480 usec olduğunu görüyorum.

Umarım daha sonra daha fazla bilgi sahibi olurum. Bunlardan bir sürü var. Sızmaya başlar başlamaz onları havuzdan çıkarıyorum ve evin etrafında kullanmak için kurutuyorum. Daha sonraki 617 modülleri (vidası alttan ve O-ring ile) daha uzun süre dayanıyor gibi görünüyor.


Biraz daha kod çözme yaptım. Son bayt (kontrol baytı), sekiz baytın tamamının XOR değerini 0FFH'ye eşit yapar. Örneğin "40 CE C0 00 00 8D 0C 30", 40 x veya CE x veya C0 x veya 00 x veya 00 x veya 8D x veya 0C x veya 30, 0FF'ye eşittir.

Ayrıca, sıcaklığı 34F'ye düşürdüm ve sayım 10 ondalıktı (yani, 00 00 0A) ve 80F'de sayım 264 ondalıktı (yani, 81 00 88 veya 108H).

Bundan Temp (F) = 0.1811 * Sayım + 32.1889 kullanıyorum. Herhangi bir hata görürsem daha iyi veriler elde etmek için daha büyük bir aralık alabilirim.

2016-02-14'teki Rob Starling'in ipine bakarken:

00000111/10011000/11000000/00000000/00000000/10001110/10000100/10101010 07 98 C0 00 00 8E 84 AA

XOR = FF

Sayı = 0E4 veya 228

Sıcaklık = 73.5F


Teşekkürler beyler!!! sayının sadece bir "sayım" değil , daha doğrusu 0.1C'de tam sıcaklık olduğundan eminim - yani, kod çözme için "matematik" 228olmasıdır 22.8C. Farenheit için her zamanki gibi yapın F=C*9/5+32.
Rob Starling

Tersine Mühendislik SE'de özetlenmiştir: reverseengineering.stackexchange.com/a/13593/15076
Rob Starling

1
Rob, haklısın - bunu görmeliydim. F = 0.18 * Sayım + 32.0. İyi bir şey işaret etti, ben yakında daha geniş bir açıklık kullanarak daha iyi bir "m" ve "x" elde etmek için gerçek sıcak suya koymak olacaktı.
Ken S

Bazı hakemler ekranın birkaç derece kapalı olduğundan şikayet ettiğinden, daha doğru sayılar elde etmek için kalibrasyonu yapmak isteyebilirsiniz. Bununla birlikte, bu sadece yüzeyin sadece ≈4 "ve çoğu eski okul havuz termometresinin uzun bir ipte olduğu gerçeğini yansıtabilir.
Rob Starling

Güncelleme: Bir Arduino kütüphanesi yazdım - github.com/robstarling/ArduRight - işinize yarayıp yaramadığını bana bildirin! Bir örneği ve her şeyi var. Bu yazıdaki resme referans olarak, kabloları "SH", "D" ve "G" pinlerine lehimlemeniz gerekir. Örnek çizimi çalıştırmak için, bu kabloları sırasıyla 2, 7 ve GND pinlerine bağlayın.
Rob Starling
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.