나는 대부분의 결과를 알아 냈을 때 내 자신의 질문에 자유롭게 대답하고 있으며 이것이 내 발견을 공유하는 좋은 방법입니다. 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 비트를"해석 방법에 따라, 그래서 거기이다 많은 조립 될 수있는 방법.