이 신호에 어떤 인코딩이 사용됩니까?


19

저렴한 무선 수영장 온도계 (AcuRite 617 1 )가 있으며 수신기의 온도 데이터를 가로 채서 컴퓨터 화 된 데이터 로깅 시스템과 함께 사용하고 싶습니다.

편리하게 수신기 내부에는 안테나에 연결되고 디지털 "V", "G", "D"및 "SH"핀이있는 소형 브레이크 아웃 보드가 있습니다.

RF211 보드

다음은 전송 중 "D"핀에서 캡처 된 데이터 세그먼트입니다 (분당 1 회 발생). 이 세그먼트 이전에는 훨씬 더 높은 속도의 데이터가있는 것으로 보이지만 잡음 일 수 있습니다. 이것이 1.36kHz / 680Hz 데이터의 시작입니다.

"D"핀에서 캡처 된 신호

나는 조금 구글 검색하고 이런 식으로 인코딩을 찾을 수 없지만, 무슨 일이 일어나고 있는지 추측한다면, 여기 내가 생각하는 것입니다 :

  • 680Hz의 초기 4주기는 클럭을 동기화하는 것이지만 데이터는 포함하지 않습니다.
  • 1.36 kHz (초기 속도의 2 배)의 13주기는 두 가지 형태 중 하나를 갖는 것으로 보입니다 : 이들은주기의 중간 점 이전 또는 이후에 낮게 떨어집니다. 0입니다.
  • 그 후에 이상한 갭이있는 것처럼 보이지만 이전 "1"의 일부인 low의 일부를 할인하면 나머지 갭은 735 µs입니다. 680Hz 프리앰블.

이것을 올바르게보고 있습니까? 이 인코딩의 이름이 있습니까?

브레이크 아웃 보드에 대한 추가 참고 사항 :

  • 이 보드는 "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 업데이트 : 새로운 "역 엔지니어링"스택 교환에 의미를 결정할 때 균열을 일으키기 위해 도로에서 공연을하고 있습니다 : /reverseengineering/12048/what-is-contained 전송 중 RF 풀 온도 센서 기반 장치


BTW-AcuRite 617 장치의 홈 디포 웹 사이트에서 사용자 의견을 읽음으로써이 제품의 전반적인 내구성에 대한 느낌이 들지 않습니다. 실제로 그것은 발신자 유닛으로 누출되지 않는 것과 관련하여 outrite pos 인 것처럼 들립니다.
Michael Karas

아. 광산은 이미 유출되었습니다. 그러나 나는 그것을 말려서 분해하고 뜨거운 접착제 및 / 또는 실리콘으로 밀봉을 향상시킬 수 있다고 확신합니다. 배터리 함은 괜찮은 O- 링으로 잘 설계된 것처럼 보입니다. 그것은 너무 나쁘고 다시는 열 필요가없는 나머지 유닛입니다 ...
Rob Starling

다른 답변을 훑어 보았지만 이것은 외모에서 비롯된 것입니다. 초기 구형파는 데이터 슬라이서를 50 % 수준에서 동기화하는 것입니다. 데이터가 "1"수준이 소멸되도록하기 전에 일시 중지하십시오. 그런 다음 2 : 1mk-spc = 1 say 및 1 : 2 = 0입니다. 히스테리시스를 사용하면 50:50이 이전 1 또는 0 사이에서 전환되지 않지만 데이터 스트림 중에는 발생하지 않아야합니다. 평균은 50:50 비율을 유지하려고 시도하지 않고 데이터에 1 또는 0이 더 있으면 DC 레벨이 표류하지만 DC 레벨 시간 상수가 msg 길이와 비교하여 길면 DC 레벨이 드리프트되므로 이전은 "나쁜"것입니다. 문제. 그런 다음 다음 msg에 대해 1 : 1 프리앰블과 다시 동기화하십시오.
Russell McMahon

디코더는 RC 필터에 의해 하나의 입력 피드 신호가있는 opamp 일 수 있으며, 저항 + + 히스테리시스 피드백 (약 4R)을 통해 평균 DC 레벨과 다른 피드 신호를 설정하여 1 : 1 신호가 출력을 플립하지 않고 2 : 1 또는 1 : 2 않습니다. 히스테리시스 % 및 DC RC 시간 상수로 약간만 연주하면 충분히 잘 작동합니다.
Russell McMahon 2014

하우징 바닥에있는 몇 초의 칼슘 탄화물 또는 금속성 칼슘은 건조하고 약간 가압 된 상태를 유지해야합니다. 아니요, 한번도 시도한 적이 없습니다.
Russell McMahon

답변:


8

Micrel은이를 33 / 66 % PWM 방식이라고합니다. 상당히 간단하지만 임시 프로토콜 인 것 같습니다.

PWM은 펄스 폭 변조를 나타냅니다. Wikipedia 페이지가 더 자세하게 설명되어 있지만 간단히 말해서 PWM은 고정 기간을 유지하는 지점이므로 상승 에지에서 다음 상승 에지까지의 시간이지만 높은 시간에 소요되는 시간의 비율은 다릅니다. 하강 에지가 발생할 때 변경하여 상태. 이 경우 '1'의 경우 33 %, '0'의 경우 66 % 높다는 것을 알 수 있습니다.

초기 펄스 시리즈는 높고 낮습니다. 이것은 실제 데이터가 수신되기 전에 수신기가 동기화되도록하기 위해 수행됩니다.

모듈에 대한 자세한 내용 은 http://www.micrel.com/_PDF/App-Notes/an-22.pdf 를 참조 하십시오 .

이러한 종류의 인코딩을 수신 할 수있는 일반적인 방법은이를 마이크로 컨트롤러의 타이머 입력 캡처 핀에 입력하는 것입니다. 또는 일반 입력에 간단히 연결하여 PWM주기의 4-5 배로 샘플링 할 수 있습니다. 디코딩 알고리즘은 그다지 어렵지 않습니다.

또는 markt가 제안한대로 온도 센서 자체로 되돌아 갈 수 있습니다. 그러나 아날로그 출력 신호 인 경우,이를 직접 디지털로 변환해야하며 원래 출력과 로깅에 약간 다른 숫자가있을 수 있습니다.


3

저의 지인들은 보통 인코딩 기술을 "PWM"이라고 부릅니다.

내 첫 번째 생각은 데이터 스트림을보고 비트의 극성을 올바르게 추측한다고 가정하면 12 비트 ADC 판독, LSB가 먼저 시작 비트로 '1'을 시작한다는 것입니다. 아마도 다음 판독이 시작될 때 단일 비트 변동이 나타나고 (풀) 온도의 ADC 판독이 짧은 시간 내에 2 또는 3 MSB에 의해 변할 가능성이 없기 때문에 LSB를 먼저 사용합니다.

데이터를 전송하는 것이 아니라 데이터를 생성하는 모든 항목으로 돌아가서 온도 센서를 식별하고 전송 된 데이터와 온도 사이의 상관 관계를 찾아보십시오.


@RobStarling은 수신기 장치를보고 표시되는 것을 확인하여 전송 된 온도가 무엇인지 이미 알고있을 것 같습니다.
Michael Karas

1
사실이지만 이러한 것들이 까다로울 수 있습니다. 예를 들어, 디스플레이는 ˚F / ˚C 사이에서 전환 할 수 있으므로 변속기는 절대 ˚C 또는 ˚F이거나 이상한 오프셋 또는 임의의 고정 소수점 정밀도를 기준으로 할 수 있습니다. 또한 3 개의 교환 가능한 스테이션 ID ( "A", "B", "C")가 있으며 ID를 변경하면 수신에 도움이 될 수 있다고하더라도 메시지의 식별 접두사 일뿐입니다. 데이터에 어떤 변화가 있는지 확인하십시오.
Rob Starling

@RobStarling-발신자 장치를 열어 LM75 또는 다른 일반적인 I2C 유형과 같은 간단한 유형의 온도 센서를 사용하고 있는지 확인할 수 있습니다. 그렇다면 온도 값이 단순히 온도 센서 장치에서 읽은 값을 따르기 때문에 링크를 통해 전송되는 데이터 일 가능성이 높습니다. 반면, 발신자가 다이오드 나 BJT 트랜지스터와 같은 아날로그 센서를 센서로 사용하는 경우 실제 전송 된 데이터를 추론하기가 더 어려워집니다.
Michael Karas

데이터 내용을 알아낼 수있는 가장 좋은 기회는 발신자를 한 번에 조금씩 읽는 변화를 볼 수 있도록 온도를 천천히 변경할 수있는 통제 된 상황에 놓는 것입니다. 실제로 예상되는 것을 알려주는 수신기 디스플레이가 있습니다.
Michael Karas

@MichaelKaras-센서가 무엇인지 알기가 어렵습니다. 끝의 작은 홀더에 갇힌 작은 보드에 있으며 열 페이스트가 물 속에 외부 벽에 결합되어 있습니다.
Rob Starling

2

거의 모든 RF 전송 방식에는 데이터 인코딩 프로토콜에 몇 가지 특성이 있어야합니다. 여기에는 다음이 포함됩니다.

  1. 주파수에서 수신기를 잠그는 데 사용되는 일관된 형식의 프리앰블
  2. 프레임 표시시 시작을 표시하는 동기 펄스 표시기
  3. 데이터 복구를 위해 일종의 인코딩 된 클럭킹으로 데이터 1과 0을 인코딩하는 방법입니다.

기록한 홀수 볼 펄스가 가장 확실하게 동기 펄스 표시기입니다.

데이터 인코딩은 내가 펄스 폭 인코딩이라고하는 것을 본 것처럼 보입니다. 이것은 하나의 전이 방향이 일정한 주파수를 따라 일정한 폭의 비트 셀 시간으로 이어지는 상당히 일반적인 기술입니다. 비트 셀 동안 활성 펄스는 비트 셀 시간의 25 % 또는 비트 셀 시간의 75 %로 제시된다. 이 체계는 Manchester 인코딩 오퍼링과 같은 펄스 대 펄스 DC 평형 인코딩 체계가 아닙니다. 전체 메시지에서 전체 균형을 만들기 위해 추가 비트를 전송하여 메시지 프로토콜 내에서 DC 균형을 제공하는 펄스 폭 인코딩의 일반적인 기술입니다. 가장 간단한 형태로 두 번째 사본이 논리적으로 반전 된 상태에서 데이터가 두 번 전송됩니다.

귀하의 예에서 동기 펄스 이전에 펄스 폭 변조 데이터가 발생하는 것은 이상합니다. 그러나 데이터 디코딩 알고리즘이이 위치에서 동기화 된 상태에서 수신 된 데이터를 수락하도록 설계된 경우에는 여전히 실행 가능한 방식입니다. 기기가 동기화 전과 후에 한 가지 유형의 데이터를 전송하고있을 수 있습니다. 센서 주소 / 임시 데이터 또는 실제 데이터 / 반전 된 데이터 사이에 분할이있을 수 있습니다.

편집하다:

송신기 유닛이 동기 패턴 전후의 펄스 폭과 동기 패턴 이전의 데이터 셀에 대한 포지티브 펄스 폭을 공식화하기 위해 다른 소프트웨어 알고리즘을 사용하는 것처럼 보이는 것이 흥미 롭다. 이는 패턴의 후속 부분에 대한 것보다 이전 패턴을 생성하는 별도의 소프트웨어 덩어리가있을 수 있음을 의미합니다. 이러한 패턴의 차이는 각 경우에 데이터 소스가 비트 단위로 액세스되는 방식과 관련하여 서로 다른 처리가 필요하다는 것을 의미 할 수 있습니다. 타이밍 다이어그램에서 볼 수있는 차이는 단순히 명령 타이밍 또는 패턴 생성 루프의 두 가지 차이 일 수 있습니다.


이것이 프리앰블 (스퀘어) + 시작 비트 (1) + 고유 ID (12 비트) + 동기 펄스 + 데이터인지 궁금합니다. (당신이 제안처럼 아 ... 예 어쩌면 그것은 동기 펄스 동안 데이터를 준비하기 위해 μC 기대)
롭 찌르레기

2

Acurite 617 디코딩을 시작했으며 여기에 초기 관찰 내용이 있습니다. 마지막 바이트는 일종의 "체크"바이트이고 마지막 3 바이트 옆에는 온도가 들어 있습니다. 이 바이트는 또한 7 번째 비트를 사용하여 짝수로 패리티를 만들고 각 바이트의 하위 니블 만 사용됩니다. 데이터를 캡처하기 위해 Arduino 프로그램을 작성했으며 다음 메시지 / 온도를 보았습니다.

40 ce
c00 00 0c 03 be (00 0C 03) => 0C3 => 67F

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

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

내가 본 다른 데이터 / 온도는 다음과 같습니다.

E2 => 73F

F5 => 76F

108 => 80F (81 00 88)

109 => 80F

이를 사용하여 "직선"(가정) 변환을 수행 할 수 있어야합니다.

나는 범위가 좋지 않기 때문에 (그리고 데이터가 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 x 또는 8D xor 0C xor 30은 0FF와 같습니다.

또한 온도를 34F로 낮추고 카운트는 10 진수 (즉, 00 00 0A) 였고 80F에서는 카운트가 264 10 진수 (즉, 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. 화씨의 경우 평소와 같이하십시오 F=C*9/5+32.
Rob Starling

리버스 엔지니어링 SE에 걸쳐 요약 : reverseengineering.stackexchange.com/a/13593/15076
롭 찌르레기

1
롭, 당신 말이 맞아요. F = 0.18 * 개수 + 32.0. 당신이 지적한 좋은 점은 곧 더 넓은 스팬을 사용하여 더 나은 "m"과 "x"를 얻기 위해 진짜 뜨거운 물에 넣을 것입니다.
Ken S

여러 리뷰어가 디스플레이가 2도 정도 꺼져 있다고 불평했기 때문에 더 정확한 숫자를 얻기 위해 여전히 캘리브레이션을 원할 수도 있습니다. 그러나 그것은 단지 지표면 아래 ≈4 "에 불과하고 대부분의 구식 수영장 온도계가 긴 끈에 있다는 사실을 반영 할 수도 있습니다.
Rob Starling

업데이트 : Arduino 라이브러리 ( github.com/robstarling/ArduRight)를 작성했습니다 . 예와 모든 것이 있습니다. 이 게시물의 그림을 참조하여 와이어를 "SH", "D"및 "G"핀에 납땜해야합니다. 스케치 예를 실행하려면 해당 와이어를 각각 핀 2, 7 및 GND에 연결하십시오.
Rob Starling
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.