IR 프로토콜 디코딩에 대한 도움말 또는 힌트


10

나는 간단하고 저렴 작은 IR 제어 장난감 헬리콥터 구입 조금 전 (동일 이 하나 - 그것은 "다이아몬드 자이로"또는 "다이아몬드 포스"라고). 재미있게, 나는 Arduino를 통해 그것을 제어하는 ​​방법을 찾고 있습니다.

업데이트 : 프로토콜을 알아 냈습니다. 답을보십시오

다른 사람들 은 이미 다른 IR 장난감 헬리콥터를 해킹하고 IR 프로토콜을 해독 한 결과를 공유 했습니다. 정말 시원하지만 불행하게도 헬리콥터는 다른 프로토콜을 사용합니다. 내가 알아낼 수없는 것. (전자 제품은 순수한 취미 일 뿐이므로 분명한 것을 간과했을 수도 있습니다).

위의 두 번째 링크와 마찬가지로 컨트롤러를 분리하여 LED를 제어하는 ​​IC 핀을 찾은 다음 (IC 표시는 지워졌습니다) 로직 분석기를 연결했습니다.

좋은 데이터가 많지만 여전히 프로토콜을 알 수 없습니다. 이 사이트 는 훌륭한 자료이지만, 나열된 프로토콜 중 어느 것도 적합하지 않은 것 같습니다. 그리고 내가 찾은 어떤 것도 내가 포착 한 신호에 맞지 않는 것 같습니다. 그러나 나는 그것이 저렴한 작은 장난감이기 때문에 단순하고 기성품 프로토콜이라고 상상해야합니다.

그래서 당신이 가지고있는 아이디어를 주셔서 감사합니다. 어쩌면 내가 잘못보고있을 것입니다.
(이미지 아래의 추가 정보)

채널 A의 샘플

신호 / 프로토콜 특성

컨트롤러를 채널 A로 설정하여 16MHz에서 이것을 캡처했습니다. 타이밍에 따라 정확해야합니다. (선택할 수있는 3 개의 IR 채널이 있지만 다른 2 개의 채널을 사용하더라도 특성 자체는 변경되지 않으며 패킷 자체의 일부만 변경됩니다.) 타이밍은 매우 일정합니다 (최대 +/- 10µs). 패킷은 다양한 간격으로 반복되지만 최소한 약 100ms 떨어져 있습니다.

캐리어 : 38kHz @ 50 % 듀티 사이클

최저 :
-짧은 : 285µs-
긴 : 795µs


최고 : -짧게 : 275µs-
길게 : 855µs

패킷 당 항상 최고 17

컨트롤 / 입력

헬리콥터에는 "스로틀"(예 : 리프트 / 로터 속도), 피치 (앞으로 / 뒤로) 및 요 (로터 축을 중심으로 한 회전)의 3 가지 컨트롤이 모두 2 개의 썸 스틱으로 제어됩니다. 그것들은 모두 어떤 종류의 범위 (켜기 / 끄기뿐만 아니라)를 가지고 있으며, 내가 알 수있는 한, 모두 단일 패킷으로 전송됩니다. 왼쪽 / 오른쪽 입력은 다른 것이 전송되는 경우에만 보내 지므로 샘플링 할 때 최대 스로틀을 적용했습니다. 썸 스틱을 임계 값 / 불감 대를 지나치 자마자 썸 스틱을 전송하자마자 스로틀 및 피치 입력이 전송됩니다 (“최소”레이블 아래의 그래프에서 컨트롤을 불감 대를 천천히 눌렀을 때 첫 번째 패킷이 전송 됨).

또한 (헬기의로, 잘되지 정밀 기기를 왼쪽 트리밍 버튼을 가지고 전혀 ) 그렇지 않으면 천천히 회전하는 경향이있다. 왼쪽 / 오른쪽 트림 버튼은 불행히도 각 프레스마다 무언가를 증가 / 감소시키는 신호를 보내지 않는 것 같습니다 (프로토콜을 파악하는 데 편리함). 헬리콥터가 왼쪽 / 오른쪽으로 트림하라고 지시하는 것은 하나의 명령 인 것 같습니다.


이미 원시 패킷을 작성해야하는 신호 추적을 사용하지 않는 이유는 무엇입니까?
Ignacio Vazquez-Abrams

@ IgnacioVazquez-Abrams 녹음 된 신호를 헬리콥터로 재생하는 것입니까?
Flambino

확실한. 그것은 ... 그 차이를 알 수있을 것입니다 헬리콥터처럼 아니에요
이그나시오 바스케스 - 아브람에게

@ IgnacioVazquez-Abrams 사실 이지만 내가 말할 수있는 한, 패킷에는 3 가지 컨트롤 (스로틀 / 피치 / 요)이 포함되어 있으며 헬리의 컨트롤은 없습니다. 재생을 통해 문제를 해결하려면 모든 단일 구성을 캡처해야합니다 ... 프로토콜을 이해하고 싶습니다
Flambino

@ IgnacioVazquez-Abrams 죄송합니다. 어쨌든 내 마지막 의견을 왜곡했습니다. "... 패킷에는 3 개의 컨트롤 (스로틀 / 피치 / 요잉)이 모두 포함되어 있으며 그 중 어느 것도 켜져 있거나 꺼져 있지 않습니다"
Flambino

답변:


8

나는 대부분의 결과를 알아 냈을 때 내 자신의 질문에 자유롭게 대답하고 있으며 이것이 내 발견을 공유하는 좋은 방법입니다. Olin Lathrop에게 감사의 말을 전하고 시험해 볼 수있는 아이디어를 제공 해주신 것에 감사드립니다. 그러나 궁극적으로 프로토콜은 Olin의 추측과는 상당히 다른 것으로 나타났습니다.


업데이트 : 나는 완전히 이해하지 못한 마지막 8 비트에 대한 후속 질문을 게시 했으며 Dave Tweed가 알아 냈습니다 . 여기에 세부 사항을 포함 시키므로이 답변은 전체 프로토콜 사양으로 작동 할 수 있지만 Dave의 답변을 확인하십시오.


나는 이것을 알아 내기 위해 몇 가지 다른 것을 시도해야했지만, 나는 그것을 얻었을 것이라고 확신한다. 이상하게도, 나는 다른 곳에서이 프로토콜과 비슷한 것을 발견하지 못했지만, 내가 알지 못하는 일반적인 프로토콜 일 수 있습니다.

어쨌든, 여기 내가 찾은 것이 있습니다 :

프로토콜 / 인코딩

펄스와 그 사이의 공백은 데이터를 인코딩하는 데 사용됩니다. 긴 펄스 / 공간은 이진 1 (1)이고 짧은 펄스 / 공간은 이진 영 (0)입니다. 펄스는 50 % 듀티 사이클에서 표준 소비자 적외선 38kHz 변조를 사용하여 전송됩니다.

펄스 / 공간 타이밍은 원래 질문에 있지만 완전성을 위해 여기에서 반복합니다.

 Bit    Pulse     Space
-----+---------+---------
  0  |  275µs  |  285µs
  1  |  855µs  |  795µs

모든 ± 10µs max., ± 5µs typ. 이것은 16MHz에서 로직 분석기로 캡처 한 샘플을 기반으로합니다. 오실로스코프가 없으므로 정확한 프로파일 (예 : 상승 / 하강 시간)을 모릅니다.

제어 입력이 적용되고 최소 100ms 간격으로 떨어진 것처럼 패킷이 반복됩니다.

패킷 전송은 데이터의 일부가 아닌 고정 된 "펄스 1"프리앰블로 시작합니다. 다음 공간은 패킷의 첫 번째 데이터 비트를 인코딩하고 마지막 펄스는 마지막 비트를 인코딩합니다.

각 패킷은 32 비트 길이이며 리모콘이 제공 할 수있는 모든 입력을 포함합니다. 값은 리틀 엔디안, 즉 MSB부터 읽습니다.

데이터 구조

아래는 개별 패킷의 기본 구조입니다. 마지막 8 비트는 혼란 스러웠지만 지금은 알아 냈습니다 (아래 참조).

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2
--+---------------------------+-----------+---+-------+-----------
 P|    Yaw    |   Throttle    |   Pitch   | T | Chan. |   Check

P: Preamble (always a pulse-1), T: Trim, Chan.: Channel

Bit    Length    Description (see note below)
-----------------------------------------------
0      1         Preamble. High 1
1-6    6         Yaw. Range 0-36 for left-right, 17 being neutral
7-14   8         Throttle. Range 0-134
15-20  6         Pitch. Range 0-38 for forward-back, 17 being neutral
21-22  2         Trim. Left = 1, right = 2, no trim = 0
23-26  4         Channel. A = 5, B = 2, C = 8
27-32  6         Check bits

참고 : 범위는 내가 얻은 최고 기록을 기반으로합니다. 이 프로토콜은 더 큰 범위 (스로틀의 경우 최대 255, 피치 / 요의 경우 63)를 가질 수 있지만 그 절반 정도는 제한됩니다.
피치 값은 14-21 (불포함)의 데드 밴드를 갖는 것으로 보입니다. 위 또는 아래 값만 실제로 헬리콥터를 반응시킵니다. 나는 그것이 요우에 대해 같은지 모른다.

여기에 그래픽 용어가 있습니다 (원래 질문의 그래픽과 비교)

패킷 구조

6 개의 검사 비트는 모든 이전 값을 XOR하여 계산됩니다. 각 값은 6 비트로 처리됩니다. 즉, 8 비트 스로틀 값의 2MSB는 단순히 무시됩니다. 즉

check = yaw ^ (throttle & 0x3F) ^ pitch ^ trim ^ channel

실용 메모

신호 타이밍과 변조가 매우 정확할 필요는 없습니다. Arduino의 정확하지 않은 타이밍조차도 실제 리모콘과 비교할 때 dodgy 변조 및 펄스 / 공간 지속 시간에 대한 약간의 히트 및 누락에도 불구하고 잘 작동합니다.

나는 헬리콥터가 발견 한 첫 번째 신호의 채널에 간단히 고정 될 것이라고 믿는다. 너무 긴 시간 동안 신호가 없으면 (몇 초) 신호를 다시 획득 할 때까지 "검색"모드로 돌아갑니다.

스로틀이 0이면 헬리콥터가 피치 및 요 값을 무시합니다.

트림 명령은 리모콘의 버튼을 누를 때마다 한 번만 전송됩니다. 아마도 트림 값은 단순히 헬리콥터 자체 컨트롤러의 값을 증가 / 감소시킵니다. 리모컨이 추적하는 것이 아닙니다. 따라서이 구현은 아마도 그 계획에 충실해야하며 가끔 트림 왼쪽 / 오른쪽 값만 보내지 만 그렇지 않으면 기본적으로 패킷의 트림 값이 0입니다.

스로틀을 단순히 0으로 설정하는 킬 스위치를 사용하는 것이 좋습니다. 이로 인해 헬리콥터가 하늘에서 떨어질 수 있지만 모터가 회전하지 않을 때는 손상이 줄어 듭니다. 따라서 충돌하거나 무언가를 치려고 할 경우, 기어를 벗기거나 날이 파손되지 않도록 킬 스위치를 누르십시오.

원래 리모콘의 IR LED는> 900nm 파장을 갖는 것으로 보이지만 ~ 850nm LED를 사용하는 데 아무런 문제가 없습니다.

헬리콥터의 IR 수신기는 괜찮지 만 초 고감도는 아니므로 IR 소스가 밝을수록 좋습니다. 리모콘은 3 개의 LED를 직렬로 사용하여 로직에서 사용하는 5V 레일 대신 9V 레일에 앉아 있습니다. 현재의 전류를 매우 정확하게 확인하지는 않았지만 50mA입니다.

샘플 데이터

관심있는 사람을위한 많은 패킷이 있습니다 (예, 디코더를 스크립팅했습니다.이 모든 것을 수동으로 해독하지는 않았습니다). 채널 A 패킷은 원래 질문의 그래프와 동일한 캡처에서 가져옵니다.

Channel A                                                       
Yaw     Throttle  Pitch   Tr  Chan  Check     Description
-----------------------------------------------------------
000100  10000100  000000  00  0101  000101    Left Mid + Throttle
000000  10000110  010001  00  0101  010010    Left Max + Throttle 
100001  10000110  000000  00  0101  100010    Right Mid + Throttle 
100100  10000100  010001  00  0101  110100    Right Max + Throttle
010001  00000000  001011  00  0101  011111    Forward Min 
010001  00000000  000000  00  0101  010100    Forward Max 
010001  00000000  011000  00  0101  001100    Back Min 
010001  00000000  100101  00  0101  110001    Back Max
010001  00000000  010001  01  0101  010101    Left Trim 
010001  00000000  010001  10  0101  100101    Right Trim 
010001  00000011  010001  00  0101  000110    Throttle 01 (min)
010001  00010110  010001  00  0101  010011    Throttle 02
010001  00011111  010001  00  0101  011010    Throttle 03
010001  00101111  010001  00  0101  101010    Throttle 04
010001  00111110  010001  00  0101  111011    Throttle 05
010001  01010101  010001  00  0101  010000    Throttle 06
010001  01011111  010001  00  0101  011010    Throttle 07
010001  01101100  010001  00  0101  101001    Throttle 08
010001  01111010  010001  00  0101  111111    Throttle 09
010001  10000101  010001  00  0101  000000    Throttle 10 (max)

Channel B
Yaw     Throttle  Pitch   Tr  Chan  Check     Description
-----------------------------------------------------------
000000  10000110  010001  00  0010  010101    Left Max + Throttle 
100100  10000110  010001  00  0010  110001    Right Max + Throttle 
010001  00000000  001001  00  0010  011010    Forward Min 
010001  00000000  000000  00  0010  010011    Forward Max 
010001  00000000  010111  00  0010  000100    Back Min 
010001  00000000  100110  00  0010  110101    Back Max
010001  00000000  010001  01  0010  010010    Left Trim 
010001  00000000  010001  10  0010  100010    Right Trim 
010001  00000001  010001  00  0010  000011    Throttle Min 
010001  00110100  010001  00  0010  110110    Throttle Mid 
010001  01100111  010001  00  0010  100101    Throttle High 
010001  10001111  010001  00  0010  001101    Throttle Max 

Channel C
Yaw     Throttle  Pitch   Tr  Chan  Check     Description
-----------------------------------------------------------
000000  10000101  010001  00  1000  011100    Left Max + Throttle 
100100  10000101  010001  00  1000  111000    Right Max + Throttle 
010001  00000000  001010  00  1000  010011    Forward Min 
010001  00000000  000000  00  1000  011001    Forward Max 
010001  00000000  010111  00  1000  001110    Back Min 
010001  00000000  100110  00  1000  111111    Back Max
010001  00000000  010001  01  1000  011000    Left Trim 
010001  00000000  010001  10  1000  101000    Right Trim 
010001  00000001  010001  00  1000  001001    Throttle Min 
010001  00110100  010001  00  1000  111100    Throttle Mid 
010001  01100110  010001  00  1000  101110    Throttle High 
010001  10000101  010001  00  1000  001101    Throttle Max

위에서 언급했듯이 마지막 8 비트는 알아 냈지만 후손을 위해서만 내 원래 생각이 있습니다. 내가 추측하는 데 거의 틀 렸기 때문에 그것을 완전히 무시하십시오.

마지막 8 비트

패킷의 마지막 8 비트는 여전히 미스터리입니다.

비트 23에서 26까지의 4 비트는 모두 리모컨의 채널 설정에 의해 완전히 결정된 것으로 보입니다. 리모컨의 채널을 변경해도 프로토콜이나 변조는 변경되지 않습니다. 이 4 비트 만 변경합니다.

그러나 4 비트는 채널 설정을 인코딩하는 데 실제로 필요한 것의 두 배입니다. 채널은 3 개뿐이므로 2 비트가 충분합니다. 따라서 위의 구조 설명에서 처음 두 비트는 "채널"로 레이블링하고 다른 두 비트는 "X"로 레이블링했습니다. 그러나 이것은 추측입니다.

다음은 각 채널 설정에 대한 관련 비트 샘플입니다.

Chan.   Bits 23-26
-----+-------------
  A  |  0  1  0  1
  B  |  0  0  1  0
  C  |  1  0  0  0

기본적으로 채널 설정을 전송하는 데 필요한 것보다 2 비트가 더 있습니다. 프로토콜에는 나중에 더 많은 채널을 허용하기 위해 4 비트가 따로 설정되어 있거나 프로토콜을 완전히 다른 장난감으로 사용할 수는 있지만 모르겠습니다. 더 큰 값을 위해 프로토콜은 생략 될 수있는 여분의 비트를 사용하지만 (요 / 스로틀 / 피치는 각각 조금씩 줄어 듭니다) 3 가지 상태를 갖는 트림에는 2 비트 만 사용됩니다. 따라서 채널도 2 비트에 불과하지만 다음 2 개는 설명되지 않습니다.

다른 가능성은 패킷의 체크섬이 "X 비트"로 시작하는 8 비트 길이이며 체크섬 마법을 통해 항상 채널 설정을 반영하는 것입니다. 그러나 다시 : 나는 모른다.

그리고 말하기 : 나는 그 체크 비트가 어떻게 형성되는지 전혀 모른다. 나는 그들이 의미 있는 그들이 어떤 하나의 제어 입력에 대응을하지 않기 때문에, 체크 비트, 나는 그들과 함께 바이올린 경우 헬리콥터가 응답하지 않는 것 같습니다. 나는 그것이 어떤 종류의 CRC라고 생각하지만 그것을 알아낼 수 없었습니다. 체크는 6-8 비트 길이, 당신은 "X 비트를"해석 방법에 따라, 그래서 거기이다 많은 조립 될 수있는 방법.


6

그렇게 나쁘지 않습니다. 먼저 모든 메시지에는 정확히 17 개의 펄스가 포함되어 있습니다. 이것은 메시지 내의 짧은 공간이 관련이 없다는 강력한 단서를 제공합니다. 데이터는 펄스가 짧거나 길어서 인코딩 된 것으로 보이며, 이러한 펄스 사이의 간격 범위는 허용 가능합니다.

분명히, 모든 메시지는 시작 비트로서 긴 펄스로 시작합니다. 16 개의 데이터 비트가 남습니다. 초기 비트 중 일부는 아마도 가변 길이 인 opcode 일 것입니다. 내가 이것을하고 있다면, 결말 비트 중 일부는 체크섬이 될 것입니다. 펌웨어를 작성한 엔지니어가 스스로 간단하게 유지하려고했기 때문에 8 개의 데이터 비트가 있다고 가정하여 시작할 수 있습니다. 이제 어떤 메시지가 의미가 있는지 확인하십시오.

long 1과 short 0을합시다. 다른 방법 일 수도 있지만 어딘가에서 시작해야합니다. 시작 비트를 제거하면 다음과 같습니다.

1010001101011010 분 스로틀
최대 스로틀
1010000001011111 분 앞으로
최대 1010000000011110
다시 최대 1010000011011101
다시 1010000100011010 분
0000010101011100 최대 왼쪽 + 최대 스로틀
0100010101011110 최대 오른쪽 + 최대 스로틀
트림 트리밍 1010000101111111
오른쪽 트림 1010000101011011

몇 가지가 바로 나타납니다. 분명히 비트 0은 패리티 비트입니다. 그렇지 않으면 3 비트 필드 <15:13>, 8 비트 데이터 값 <12 : 5> 및 다른 4 비트 필드 <4 : 1>이있는 것으로 보입니다.

데이터 값이 낮은 비트에서 높은 비트 순서로 전송되는 것처럼 보이므로 아마도 내가 보여주는 것에서 뒤집힌 전체 16 비트를 해석하는 것이 더 합리적입니다.

나는 이것에 더 많은 시간을 보내고 싶지는 않지만, 이것이 당신에게 시작을 줬기를 바랍니다. 패리티 비트를 제거하고 LSB를 MSB로 뒤집은 정수 필드와 해당 필드와 인접 필드 사이에 공백이 별도로 표시된 각 가정 필드를 사용하여 위 목록을 다시 작성합니다. 그것은 당신에게 더 많은 것을 보여줄 수 있습니다. 또한 우리는 각 비트의 1/0 감각을 거꾸로 가질 수 있음을 명심하십시오. 아마도 새로운 방법으로 새 ​​테이블을 작성하고 어떤 방법이 더 의미가 있는지 알아볼 것입니다.


고마워요, 훌륭합니다! 나는 그것을 바로 잡고 내가 찾은 것을 볼 것이다. 다른 프로토콜을 살펴본 후 공간이 관련이 없다고 생각하기 시작했지만 두 개의 매우 일관된 타이밍이 있었기 때문에 확실하지 않았습니다. 나는 그들이 중요하지 않으면 더 다양 할 것이라고 생각했습니다. 어쨌든 시도해 볼게요 다시 한번 감사드립니다
Flambino

허 .. 내가 말할 수있는 한, 공간 중요하다. 스로틀에 중점을 두었고 10 개의 서로 다른 스로틀 위치에서 더 많은 샘플을 캡처했습니다. 공백을 제외하면 변환을 수행 한 방법에 관계없이 의미있는 숫자가 없었습니다. 그러나 long = 1로 포함하면 short = 0은 1에서 134 (작은 엔디안)까지 스로틀 값을 부드럽게 진행합니다. 여전히 다른 매개 변수에 대한 작업
Flambino

프로토콜이 거의 완전히 파악되었지만 여전히 약간의 미스터리가 있습니다. 당신이 그것에 스윙을하고 싶다면 내 질문에 많은 물건을 추가했습니다. 어쨌든 지금까지 도와 주셔서 감사합니다! 올바른 방향으로 일하게되었습니다.
Flambino

@Flambino : 당신이 내가 처음부터했던 것보다 훨씬 앞서있는 것 같습니다. 업데이트 된 질문을 읽었지만 여전히 공백의 길이가 정확히 어떻게 사용되는지 이해하지 못합니다. 당신이 보여준 모든 패턴이 정확히 17 펄스를 가지고 마지막 펄스가 0 또는 1로 취해진 경우 패리티를 나타내는 것이 일어 났습니까?
Olin Lathrop

솔직히 그것은 대부분 시행 착오였습니다. 공간에 사용되는 2 개의 타이밍은 펄스 타이밍과 똑같으므로 의미가있을 것으로 생각했습니다. 그리고 공간을 무시해도 유용한 이진 데이터가 생성되지 않으면 long pulse = 1 long space = 1 (및 short space / pulse = 0)로 가정하여 매우 유용한 데이터를 즉시 얻었습니다. 따라서 프리앰블 펄스 뒤의 첫 번째 공간은 첫 번째 비트 (최대 오른쪽 + 최대 스로틀 그래프는 첫 번째 비트로 "공간 1"을 나타냄)와 그 뒤에 16 개의 펄스와 그 사이에 15 개의 공백이 더 있습니다. 32 비트
Flambino
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.