Pengkodean apa yang digunakan dalam sinyal ini?

19

Saya memiliki termometer kolam nirkabel murah (AcuRite 617 1 ) dan saya ingin memotong data suhu pada receiver dan menggunakannya dengan sistem logging data terkomputerisasi.

Secara mudah, di dalam receiver terdapat papan break-out kecil yang terhubung ke antena dan memiliki pin digital "V", "G", "D", dan "SH":

Papan RF211

Berikut adalah segmen data yang diambil dari pin "D" selama transmisi (ini terjadi sekali per menit). Sebelum segmen ini, ada data yang nampaknya jauh lebih tinggi, tapi saya percaya itu mungkin noise - ini adalah awal dari data 1.36kHz / 680Hz.

menangkap sinyal dari pin "D"

Saya sudah sedikit menelusuri Google dan tidak dapat menemukan pengkodean yang terlihat seperti ini, tetapi jika saya menebak apa yang terjadi, inilah yang saya pikirkan:

  • 4 siklus awal 680 Hz adalah untuk menyinkronkan jam tetapi tidak mengandung data
  • 13 siklus 1,36 kHz (2x tingkat awal) yang mengikuti tampaknya memiliki salah satu dari dua bentuk: mereka turun rendah sebelum titik tengah siklus atau setelah itu - saya akan menganggap satu bentuk adalah yang logis dan yang lainnya adalah nol.
  • setelah itu, tampaknya ada celah aneh, tetapi jika Anda mengabaikan bagian dari rendah yang merupakan bagian dari "1" sebelumnya, maka celah yang tersisa adalah 735 μs, yang merupakan kelanjutan (fase-benar!) dari Pembukaan 680 Hz.

Apakah saya melihat ini dengan benar? Apakah ada nama untuk pengodean ini?

Beberapa catatan lebih lanjut di papan break-out:

  • papan ditandai "RF211" dan terlihat sangat konsisten dengan tujuan umum MICRF211 ", Penerima Radio QwikRadio 3V yang beroperasi pada 433,92MHz" 3
  • lembar data MICRF211 memiliki gambar berikut (dengan sedikit penjelasan), yang terlihat menggiurkan seperti yang saya lihat kecuali untuk gelombang persegi laju data ganda dibandingkan dengan tangkapan saya:
    profil data

2016-02-14 Pembaruan: Saya telah meninjau kembali proyek ini dan tampaknya mendapatkan aliran 64-bit yang bersih antara basa-basi 4-siklus dan "postamble" 1-siklus, setelah itu papan display menutup modul RF dengan menarik ^ SH rendah (baris teratas):

64 bit data

Menurut skema Micrel's "33/66% PWM" (yang muncul di tempat lain di Google), itu

-_-_-_-_0000011110011000110000000000000000000000100011101000010010101010-_

Jadi sekarang saya harus mulai memanipulasi suhu untuk memecahkan kode bit. Di sini ("x") adalah bit yang tampaknya berubah tanpa ada perubahan nyata pada layar:

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

Saya berasumsi ini adalah bit paling tidak signifikan atau tingkat baterai (yang hanya ditampilkan sebagai "Rendah" ketika turun secara signifikan).

2016-02-15 Pembaruan: Saya mengadakan pertunjukan di jalan untuk memberikan stackexchange "crack Engineering" baru dalam menentukan makna: /reverseengineering/12048/what-is-contained -dalam-transmisi-rf-pool-suhu-sensor-basis-unit-re ini

Rob Starling
sumber
BTW - Membaca komentar pengguna di situs web Home Depot untuk unit AcuRite 617 tidak memberikan perasaan yang baik pada daya tahan keseluruhan produk ini. Sebenarnya kedengarannya seperti itu adalah pos outrite sehubungan dengan tidak bocor ke unit pengirim.
Michael Karas
oh itu. punyaku sudah bocor. tetapi saya sudah mengeringkannya dan membukanya dan memiliki tingkat kepercayaan diri bahwa saya dapat memperbaiki penyegelan dengan lem panas dan / atau silikon. kompartemen baterai tampaknya dirancang dengan baik dengan o-ring yang layak; itu adalah sisa dari unit yang sangat buruk, dan yang tidak perlu dibuka lagi ...
Rob Starling
Menyimak jawaban lain tetapi ini dari penampilan. Gelombang persegi awal adalah untuk mendapatkan alat pengiris data yang disinkronkan pada tingkat 50%. Jeda sebelum data untuk memastikan level "1" telah membusuk. Maka 2: 1mk-spc = 1 katakan dan 1: 2 = 0. Dengan histeresis 50:50 tidak berganti antara 1 atau 0 sebelumnya TETAPI tidak boleh terjadi selama aliran data. Sebelumnya adalah "buruk" karena tidak berusaha untuk mempertahankan rasio rata-rata 50:50 dan tingkat dc Anda akan melayang jika data memiliki lebih dari 1 atau 0 tetapi jika konstanta waktu level DC Anda lebih panjang dibandingkan dengan panjang pesan, itu tidak masalah. Anda kemudian menyelaraskan kembali dengan pembukaan 1: 1 untuk pesan berikutnya.
Russell McMahon
Sebuah decoder dapat berupa opamp dengan satu sinyal input input oleh filter RC untuk mengatur level DC rata-rata dan sinyal input lainnya melalui resistor plus + ve hysteresis feedback (mungkin sekitar 4R) sehingga sinyal 1: 1 tidak membalik output tetapi 2 : 1 atau 1: 2. Sedikit bermain dengan hysteresis% dan DC RC waktu konstan dan itu harus bekerja dengan cukup baik.
Russell McMahon
Beberapa butiran Kalsium Karbida atau Kalsium logam di bagian bawah rumah harus tetap kering dan agak bertekanan :-). Tidak, saya belum pernah mencobanya.
Russell McMahon

Jawaban:

8

Micrel menyebutnya sebagai skema PWM 33/66%. Tampaknya protokol yang cukup sederhana, tetapi ad-hoc.

PWM adalah singkatan dari modulasi lebar-pulsa. Ada halaman Wikipedia yang menjelaskan lebih detail, tetapi singkatnya, PWM adalah tempat Anda menyimpan periode yang tetap, jadi inilah saatnya dari sisi kenaikan ke sisi naik berikutnya, tetapi Anda memvariasikan persentase waktu yang dihabiskan di bagian tinggi negara dengan mengubah ketika ujung jatuh terjadi. Untuk yang ini, Anda dapat melihat bahwa 33% tinggi untuk '1' dan 66% tinggi untuk '0'.

Rangkaian awal pulsa sama dengan waktu tinggi dan rendah. Ini biasanya dilakukan untuk memungkinkan penerima melakukan sinkronisasi sebelum data aktual diterima.

Lihat http://www.micrel.com/_PDF/App-Notes/an-22.pdf untuk detail lebih lanjut tentang apa yang mereka harapkan untuk modul.

Cara tipikal untuk dapat menerima pengkodean semacam ini adalah dengan memasukkan ini ke dalam pin tangkap input penghitung waktu dari mikrokontroler. Atau, Anda cukup menghubungkan ke input umum dan mengambil sampel pada 4-5x periode PWM. Algoritma untuk decoding tidak terlalu sulit dari sana.

Atau, seperti yang disarankan oleh markt, Anda dapat bekerja kembali ke sensor suhu itu sendiri. Tetapi, jika ini adalah sinyal keluaran analog, Anda harus mengonversinya sendiri menjadi digital dan mungkin memiliki angka yang sedikit berbeda dari pencatatan Anda dari keluaran aslinya.

manusia gua
sumber
3

Orang-orang dari kenalan saya biasanya menyebut teknik pengkodean "PWM", yang saya kira merupakan deskripsi yang masuk akal.

Pikiran pertama saya melihat aliran data Anda, dan berasumsi bahwa Anda menebak polaritas bit dengan benar, adalah bahwa ini adalah pembacaan ADC 12-bit, LSB pertama, dengan angka '1' sebagai bit awal. Saya akan menggunakan LSB pertama karena awal dari apa yang mungkin membaca berikutnya menunjukkan variasi bit-tunggal dan tidak mungkin bahwa pembacaan ADC suhu (kumpulan) akan bervariasi oleh MSB ke-2 atau ke-3 dalam jangka waktu yang singkat.

Saya akan menggali sedikit lebih jauh ke dalam sistem, kembali ke apa pun yang menghasilkan data (sebagai lawan mentransmisikannya), melihat apakah Anda dapat mengidentifikasi sensor suhu, dan mencari beberapa korelasi antara data yang dikirim dan suhu.

markt
sumber
Menurut saya @RobStarling seharusnya sudah dapat mengetahui suhu yang ditransmisikan dengan melihat pada perangkat penerima dan melihat apa yang sedang ditampilkan.
Michael Karas
1
benar, tetapi hal-hal ini bisa rumit. misal, layar dapat dipindah-pindahkan di antara ˚F / soC, sehingga transmisi bisa dalam ˚C atau ˚F absolut atau relatif terhadap beberapa offset aneh atau ke beberapa presisi titik tetap sewenang-wenang. juga, ada 3 ID stasiun switchable ("A", "B", "C") dan meskipun ia mengatakan mengubah ID dapat membantu penerimaan, saya punya firasat itu hanya awalan identifikasi pada pesan - saya akan beralih dan lihat apa perubahan pada data.
Rob Starling
@RobStarling - Anda dapat membuka unit pengirim untuk melihat apakah mereka menggunakan tipe sensor suhu sederhana seperti LM75 atau salah satu tipe I2C umum lainnya. Jika demikian, kemungkinan data yang dikirim melalui tautan sebagai nilai suhu cukup mengikuti yang dibaca dari perangkat sensor temp. Di sisi lain jika pengirim menggunakan sensor analog seperti dioda atau transistor BJT sebagai sensor, akan lebih sulit untuk menyimpulkan data aktual yang dikirim.
Michael Karas
Saya menduga bahwa peluang terbaik Anda untuk mengetahui konten data adalah menempatkan pengirim ke dalam situasi yang terkontrol di mana Anda dapat mengubah suhu secara perlahan sehingga Anda dapat melihat perubahan bacaan sedikit demi sedikit. Anda akan memiliki layar penerima untuk memberi tahu Anda apa yang sebenarnya diharapkan.
Michael Karas
@MichaelKaras - sulit untuk melihat apa sensornya - ada di papan kecil yang diikatkan di dudukan kecil di ujungnya, dioleskan pasta termal untuk memasangkannya ke dinding luar di bawah air.
Rob Starling
2

Hampir semua skema transmisi RF perlu memiliki beberapa karakteristik dalam protokol penyandian data mereka. Ini akan mencakup:

  1. Pembukaan format yang konsisten digunakan untuk mengunci penerima pada frekuensi
  2. Indikator pulsa sinkron untuk menandai awal jika indikasi bingkai
  3. Metode untuk menyandikan data 1 dan 0 dengan semacam pencatatan jam kerja yang dikodekan untuk pemulihan data.

Pulsa bola aneh yang Anda catat pastinya adalah indikator pulsa sinkronisasi.

Pengkodean data muncul untuk mengikuti apa yang saya lihat disebut sebagai pengkodean lebar pulsa. Ini adalah teknik yang cukup umum di mana satu arah transisi mengikuti frekuensi konstan yang mengarah ke kali sel bit lebar konstan. Selama sel bit, pulsa aktif disajikan sebagai 25% dari waktu sel bit atau 75% dari waktu sel bit. Skema ini bukan skema pengkodean seimbang DC ke pulsa seperti penawaran pengkodean Manchester. Ini adalah teknik umum dengan pengkodean lebar pulsa untuk memberikan keseimbangan DC dalam protokol pesan dengan mengirim bit ekstra untuk menciptakan keseimbangan keseluruhan dalam keseluruhan pesan. Dalam bentuk yang paling sederhana, data dikirim dua kali dengan salinan kedua secara logis terbalik.

Dalam contoh Anda, aneh untuk melihat data modulasi lebar pulsa terjadi sebelum sinkronisasi pulsa. Namun itu masih merupakan skema yang layak jika algoritma decoding data dirancang menerima data yang diterima dengan sinkronisasi di posisi ini. Ada kemungkinan bahwa unit mengirimkan satu jenis data sebelum sinkronisasi dan satu setelah. Pemecahannya bisa antara alamat sensor / data temp ATAU data sebenarnya / data terbalik.

Edit:

Sangat menarik untuk dicatat bahwa hampir terlihat seperti unit pemancar menggunakan algoritma perangkat lunak yang berbeda untuk merumuskan lebar pulsa positif untuk sel data sebelum pola sinkronisasi daripada untuk lebar pulsa pada dan setelah pola sinkronisasi. Ini menyiratkan bahwa mungkin ada sejumlah perangkat lunak terpisah yang menghasilkan pola lebih awal dari itu untuk bagian selanjutnya dari pola tersebut. Perbedaan pola ini dapat menyiratkan bahwa sumber data dalam setiap kasus memerlukan penanganan yang berbeda dalam hal bagaimana itu diakses sedikit demi sedikit. Perbedaan yang terlihat pada diagram waktu dapat dengan mudahnya menjadi waktu instruksi atau dua perbedaan dalam loop pembuatan pola.

Michael Karas
sumber
saya bertanya-tanya apakah ini: preamble (persegi) + bit mulai (1) + id unik (12 bit) + sinkronisasi pulsa + data. (oh, seperti yang Anda sarankan ... mis. mungkin itu mengharapkan µC untuk bersiap-siap untuk data selama pulsa sinkronisasi)
Rob Starling
2

Saya sudah mulai men-decoding Acurite 617 dan inilah pengamatan awal saya. Saya dapat memberi tahu Anda bahwa byte terakhir adalah semacam "periksa" byte dan di samping tiga byte terakhir berisi suhu. Byte ini juga dikirim dengan menggunakan bit ke-7 untuk membuat paritas genap dan hanya gigitan terendah dari setiap byte yang digunakan. Saya telah menulis program Arduino untuk menangkap data dan telah melihat pesan / suhu berikut.

40 ce c0 00 00 0c 03 menjadi
(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

Data / temps lain yang pernah saya lihat adalah:

E2 => 73F

F5 => 76F

108 => 80F (81 00 88)

109 => 80F

Dengan menggunakan ini Anda harus dapat melakukan konversi "garis lurus" (asumsi).

Karena saya tidak memiliki cakupan yang baik (dan fakta bahwa data dikirim satu menit sekali), saya tidak yakin tentang waktu saya. Saya melihat sinkronisasi HI dan LO sebagai 720 usec dan bit data 240 dan 480 usec.

Semoga saya akan mendapat info lebih lanjut nanti. Saya punya banyak ini. Begitu mereka mulai bocor, saya mengeluarkannya dari kolam dan mengeringkannya untuk digunakan di sekitar rumah. Modul 617 yang lebih baru (dengan sekrup yang dilepas dan cincin-O) tampaknya bertahan lebih lama.


Saya melakukan beberapa decoding lagi. Byte terakhir (periksa byte) membuat XOR dari semua delapan byte sama dengan 0FFH. Misalnya untuk "40 CE C0 00 00 8D 0C 30", 40 xor CE xor C0 xor 00 xor 00 xor 8D xor 0C xor 30 sama dengan 0FF.

Juga, saya menurunkan suhu ke 34F dan hitungannya adalah 10 desimal (i, e., 00 00 0A) dan pada 80F hitungannya adalah 264 desimal (yaitu, 81 00 88 atau 108H).

Dari sini saya menggunakan Temp (F) = 0.1811 * Hitung + 32.1889. Saya mungkin mendapatkan rentang yang lebih besar untuk mendapatkan beberapa data yang lebih baik jika saya melihat kesalahan.

Melihat string Rob Starling pada 2016-02-14:

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

XOR = FF

Hitung = 0E4 atau 228

Temp = 73.5F

Ken S
sumber
Terima kasih kawan !!! Saya cukup yakin bahwa angka itu bukan hanya "hitungan", melainkan suhu yang tepat dalam 0,1C - yaitu, "matematika" untuk decoding 228adalah bahwa itu 22.8C. Untuk Farenheit, lakukan yang biasa F=C*9/5+32.
Rob Starling
diringkas pada Reverse Engineering SE: reverseengineering.stackexchange.com/a/13593/15076
Rob Starling
1
Rob, Anda benar - saya harus melihat itu. F = 0,18 * Hitung + 32,0. Untung Anda menunjukkan hal itu, saya akan segera memasukkannya ke dalam air panas nyata untuk mendapatkan "m" dan "x" yang lebih baik menggunakan rentang yang lebih luas.
Ken S
Anda mungkin masih ingin melakukan kalibrasi untuk mendapatkan angka yang lebih akurat, karena beberapa pengulas mengeluh karena layarnya mati beberapa derajat. Namun, itu mungkin juga hanya mencerminkan fakta bahwa itu hanya "4 "di bawah permukaan dan kebanyakan termometer kolam tua berada di tali panjang.
Rob Starling
Pembaruan: saya menulis perpustakaan Arduino - github.com/robstarling/ArduRight - beri tahu saya jika berfungsi untuk Anda! Ia memiliki contoh dan segalanya. Merujuk gambar di pos ini, Anda harus menyolder kabel ke pin "SH", "D", dan "G". Untuk menjalankan contoh sketsa, hubungkan kabel-kabel itu masing-masing ke pin 2, 7, dan GND.
Rob Starling