この信号で使用されているエンコーディングは何ですか?


19

安価なワイヤレスプール温度計(AcuRite 617 1)があり、受信機で温度データをインターセプトし、コンピューター化されたデータロギングシステムで使用したいと思います。

便利なことに、受信機の内部には、アンテナに接続され、デジタルの「V」、「G」、「D」、および「SH」ピンがある小さなブレイクアウトボードがあります。

RF211ボード

これは、送信中に「D」ピンからキャプチャされたデータのセグメントです(これらは1分に1回発生します)。このセグメントの前には、はるかに高速のデータと思われるものがありますが、それはノイズである可能性があります。これが1.36kHz / 680Hzデータの始まりです。

「D」ピンからキャプチャされた信号

私は少しグーグルで調べて、このようなエンコードを見つけることができませんが、何が起こっているのかを推測した場合、私は考えています:

  • 680 Hzの最初の4サイクルは、クロックを同期しますが、データは含まれません
  • 続く13サイクルの1.36 kHz(初期レートの2倍)は、2つの形式のいずれかであるように見えます:サイクルの中間点の前または後のいずれかで低下します-ある形式が論理的な形式であり、他の形式が他の形式であると仮定しますゼロです。
  • その後、奇妙なギャップがあるように見えますが、前の「1」の一部である安値の部分を割り引くと、残りのギャップは735 µsになり、これは(位相補正!)の継続です。 680 Hzのプリアンブル。

これを正しく見ていますか?このエンコードには名前がありますか?

ブレイクアウトボードに関するいくつかのさらなる注記:

  • ボードには「RF211」のマークが付いており、MICRF211「433.92MHzで動作する汎用3V QwikRadioレシーバー」と著しく一致しているように見えます3
  • MICRF211データシートには次の図があります(説明はほとんどありません)。これは、キャプチャと比較して、ダブルデータレートの方形波を除いて、私が見ているものと似ています。
    データプロファイル

2016-02-14更新:このプロジェクトを再検討し、4サイクルのプリアンブルと1サイクルの「ポストアンブル」の間でクリーンな64ビットストリームを取得しているようです。その後、ディスプレイボードがRFモジュールをシャットダウンします^ SHを低く引きます(一番上の行):

64ビットのデータ

Micrelの「33/66%PWM」スキーム(Googleのどこにもありません)によると、それは

-_-_-_-_0000011110011000110000000000000000000000100011101000010010101010-_

そのため、ビットをデコードするために温度の操作を開始する必要があります。ここ(「x」)は、表示に明らかな変化がなくても変化しているように見えるビットです。

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

これらは最下位ビットまたはバッテリーレベル(大幅に低下した場合にのみ「低」と表示される)であると想定しています。

2016-02-15更新:意味を決定する際に、新しい「リバースエンジニアリング」スタックエクスチェンジにクラックを与えるために、私は公道でショーを開催していますhttps ://reverseengineering.stackexchange.com/questions/12048/what-is-contained -in-this-transmission-rf-pool-temperature-sensor-base-unit-re


ところで-AcuRite 617ユニットのHome Depot Webサイトでユーザーのコメントを読むことは、この製品の全体的な耐久性に良い印象を与えません。実際には、送信者ユニットに漏れないという点で、outrite posのように聞こえます。
マイケルKaras 14

ああ、そうです。私のはすでに漏れています。しかし、私はそれを乾燥させて分解し、いくつかのホットグルーおよび/またはシリコーンでシーリングを改善できるとある程度確信しています。バッテリーコンパートメントは、適切なOリングで適切に設計されているようです。それは悪いようだユニットの残りの部分だし、それは...再びオープンする必要はありません
ロブ・スターリング

他の回答をスキミングしましたが、これは外観からです。最初の方形波は、データスライサーを50%レベルで同期させることです。データの前に一時停止して、「1」レベルが減衰したことを確認します。その後、2:1mk-spc = 1と1:2 = 0になります。ヒステリシスを使用すると、50:50は前の1と0の間で切り替わりませんが、データストリーム中は発生しません。上記は平均50:50の比率を維持しようとしないため「不良」であり、データに1または0が多い場合はDCレベルがドリフトしますが、DCレベルの時定数がmsgの長さに比べて長い場合はドリフトしません問題。次に、次のメッセージのために1:1のプリアンブルで再度同期します。
ラッセルマクマホン14

デコーダーは、1つの信号が出力を反転せずに、抵抗と+ veヒステリシスフィードバック(4R程度)を介して平均DCレベルと他のフィード信号を設定するために、RCフィルターによって1つの入力フィード信号を持つオペアンプである可能性があります:1または1:2です。ヒステリシス%とDC RC時定数で少し遊んでみると、十分に機能するはずです。
ラッセルマクマホン14

ハウジングの底にあるいくつかの炭化カルシウムまたは金属カルシウムの粒子は、乾燥した状態を保ち、わずかに加圧されているはずです:-)。いいえ、試したことはありません。
ラッセルマクマホン14

回答:


8

マイクレルは、33/66%PWMスキームと呼んでいます。これは、かなり単純ですが、アドホックなプロトコルのようです。

PWMはパルス幅変調の略です。より詳細に説明するウィキペディアのページがありますが、要するに、PWMは一定の期間を維持する場所です。ここでは、立ち上がりエッジから次の立ち上がりエッジまでの時間を示しますが、立ち下がりエッジが発生したときに変更することにより、状態を変更します。この場合、「1」の場合は33%、「0」の場合は66%高いことがわかります。

最初の一連のパルスは、高い時間と低い時間が同じです。これは通常、実際のデータを受信する前に受信機が同期できるようにするために行われます。

モジュールに期待する内容の詳細については、http://www.micrel.com/_PDF/App-Notes/an-22.pdfを参照してください

この種のエンコードを受信できる一般的な方法は、これをマイクロコントローラーのタイマー入力キャプチャーピンに入力することです。または、単純に一般的な入力に接続し、PWM周期の4〜5倍でサンプリングすることができます。デコードのアルゴリズムはそこから難しくありません。

または、marktが示唆するように、温度センサー自体に戻る方法を使用できます。ただし、それがアナログ出力信号である場合は、自分でデジタルに変換する必要があり、元の出力とロギングの数値がわずかに異なる場合があります。


3

私の知り合いの人々は通常、そのエンコード手法を「PWM」と呼びますが、これは合理的な説明だと思います。

データストリームを見て、ビットの極性を正しく推測していると仮定して、最初に考えたのは、LSBが先頭の12ビットADCの読み取り値であり、先頭の「1」が開始ビットであるということです。おそらく次の読み取り値の開始点はシングルビットの変動を示しており、(プール)温度のADC読み取り値がその短い時間枠で2番目または3番目のMSBによって変化する可能性は低いため、LSBを最初に使用します。

システムをもう少し掘り下げて、データを生成するものに戻って(データを送信するのではなく)、温度センサーを特定できるかどうかを確認し、送信されたデータと温度の間の相関関係を探します。


@RobStarlingは、受信デバイスを見て表示されているものを見ることにより、送信された温度が何であるかをすでに知っているはずです。
マイケルカラス14

1
本当ですが、これらのことは難しい場合があります。たとえば、ディスプレイは˚F/˚Cの間で切り替え可能であるため、伝送は絶対˚Cまたは˚Fで、または奇妙なオフセットまたは任意の固定小数点精度に対して相対的です。また、3つの切り替え可能なステーションID(「A」、「B」、「C」)があり、IDの変更が受信に役立つかもしれないと言っていても、メッセージの識別プレフィックスだけですそれと、データの変更点を確認します。
ロブスターリング14

@RobStarling-センダーユニットを開いて、LM75などの単純なタイプの温度センサーまたは他の一般的なI2Cタイプのいずれかを使用しているかどうかを確認できます。その場合、温度値が温度センサーデバイスから読み取られた値に従っているため、リンクを介してデータが送信されている可能性があります。一方、送信側がセンサーとしてダイオードやBJTトランジスタなどのアナログセンサーを使用する場合、送信された実際のデータを推測することはより困難になります。
マイケルカラス14

データの内容を把握するための最良のチャンスは、温度をゆっくりと変化させることができる制御された状況に送信者を置き、一度に少しずつ読み値が変化するのを見ることができると思われます。実際に何が期待されているかを伝えるために、レシーバーのディスプレイが表示されます。
マイケルKaras 14

@MichaelKaras-センサーが何であるかを見るのは難しい-それは先端の小さなホルダーにくさびで留められた小さなボード上にあり、水の下の外壁にそれを結合するために少量のサーマルペーストでポッティングされている。
ロブスターリング14

2

ほとんどすべてのRF伝送スキームは、データエンコーディングプロトコルにいくつかの特性を持たせる必要があります。これらには以下が含まれます。

  1. 周波数で受信機をロックするために使用される一貫した形式のプリアンブル
  2. フレーム表示の場合に開始をマークする同期パルスインジケータ
  3. データ回復のために何らかのエンコードされたクロッキングを使用して、データ1と0をエンコードする方法。

気付いた奇数のボールパルスは、間違いなく同期パルスインジケーターです。

データエンコーディングは、パルス幅エンコーディングと呼ばれるものに従っているようです。これは、1つの遷移方向が一定の周波数に従い、一定の幅のビットセル時間になるかなり一般的な手法です。ビットセルの間、アクティブパルスはビットセル時間の25%またはビットセル時間の75%として表示されます。このスキームは、マンチェスターエンコーディングが提供するようなパルス間DCバランスエンコーディングスキームではありません。余分なビットを送信してメッセージ全体の全体的なバランスを作成することにより、メッセージプロトコル内でDCバランスを提供するのは、パルス幅エンコードの一般的な手法です。最も単純な形式では、データは2回送信され、2番目のコピーは論理的に反転します。

この例では、同期パルスの前にパルス幅変調データが発生するのは奇妙です。ただし、データデコードアルゴリズムが同期をこの位置に受信したデータを受け入れるように設計されている場合、それはまだ実行可能なスキームです。ユニットが同期前と後の1種類のデータを送信している可能性があります。分割は、センサーアドレス/一時データまたは真のデータ/反転データの間で行われます。

編集:

興味深いことに、送信機ユニットは、同期パターンの前後のパルス幅よりも、同期パターンの前のデータセルの正のパルス幅を定式化するために、異なるソフトウェアアルゴリズムを使用しているように見えます。これは、パターンの後続の部分よりも前のパターンを生成するソフトウェアの塊が存在する可能性があることを意味します。このパターンの違いは、各場合のデータソースがビットごとにアクセスされる方法の点で異なる処理を必要とすることを意味します。タイミング図に見られる違いは、単に命令のタイミングか、パターン生成ループの2つの違いです。


これはプリアンブル(正方形)+開始ビット(1)+一意のID(12ビット)+同期パルス+データかどうか疑問に思います。(ああ、あなたが示唆したように...例えば多分それはμCは同期パルスの間にデータの準備をすることを期待)
ロブ・スターリング

2

Acurite 617のデコードを開始しました。これが私の最初の観察です。最後のバイトはある種の「チェック」バイトであり、最後の3バイトの隣には温度が含まれています。これらのバイトも7番目のビットを使用して送信され、偶数パリティが作成され、各バイトの下位ニブルのみが使用されます。データをキャプチャするArduinoプログラムを作成しましたが、次のメッセージ/温度が表示されています。

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

私が見た他のデータ/一時は次のとおりです。

E2 => 73F

F5 => 76F

108 => 80F(81 00 88)

109 => 80F

これを使用すると、「直線」(仮定)変換を行うことができるはずです。

私には良い範囲がないので(そして、データが1分間に1回送信されるという事実)、タイミングについてはわかりません。同期HIおよびLOは720 usecであり、データビットは240および480 usecであると見ています。

できれば、後でもっと情報を得たいと思います。これらがたくさんあります。彼らが漏れ始めたらすぐに私はそれらをプールから取り除き、家の周りで使用するためにそれらを乾かします。後の617モジュール(底部にネジとOリングが付いている)は長持ちするようです。


さらにデコードを行いました。最後のバイト(チェックバイト)は、8バイトすべてのXORを0FFHにします。たとえば、「40 CE C0 00 00 8D 0C 30」の場合、40 xor CE xor C0 xor 00 xor 00 xor 8D xor 0C xor 30は0FFに等しくなります。

また、温度を34Fまで下げ、カウントは10進数で10(つまり00 00 0A)で、80Fではカウントは10進数で264(つまり81 00 88または108H)でした。

これから、私はTemp(F)= 0.1811 * Count + 32.1889を使用しています。エラーが表示された場合、より良いデータを取得するために、より大きなスパンを取得できます。

2016-02-14のRob Starlingのストリングを見てください。

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

XOR = FF

カウント= 0E4または228

温度= 73.5F


みんなありがとう!!!数値は単なる「カウント」ではなく、0.1Cの正確な温度であると確信し228てい22.8Cます。つまり、デコードの「数学」はであるということです。Farenheitについては、通常の手順を実行しF=C*9/5+32ます。
ロブスターリング

リバースエンジニアリングSEにオーバー要約:reverseengineering.stackexchange.com/a/13593/15076
ロブ・スターリング

1
ロブ、あなたは正しいです-私はそれを見るべきです。F = 0.18 *カウント+ 32.0。あなたが指摘した良いこと、私はすぐに実際の湯に入れて、より広いスパンを使用してより良い「m」と「x」を得るつもりでした。
ケンS

いくつかの校閲者が表示が数度ずれていると不平を言ったので、さらに正確な数値を得るためにキャリブレーションを行うことができます。しかし、それはまた、単にそれだけで≈4"表面の下に、最も古い学校のプールの温度計は、長い文字列であるという事実を反映することがあります。
ロブ・スターリング

更新:Arduinoライブラリを作成しました-github.com/robstarling/ArduRight-それがあなたのために機能するかどうか教えてください!例とすべてがあります。この投稿の写真を参照して、ワイヤーを「SH」、「D」、「G」ピンにはんだ付けする必要があります。サンプルスケッチを実行するには、これらのワイヤをそれぞれピン2、7、およびGNDに接続します。
ロブ・スターリング
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.