私は自分の質問のほとんどを理解したので、自由に自分の質問に答えています。これは私の発見を共有する良い方法です。開始する場所と試してみるアイデアを提供してくれたOlin Lathropに感謝しますが、最終的にプロトコルはOlinの推測とはかなり異なることが判明したため、この回答を投稿しました。
更新:最後の8ビットに関するフォローアップの質問を投稿しましたが、完全には理解できませんでしたが、Dave Tweedがそれを理解しました。詳細をここに含めますので、この回答は完全なプロトコル仕様として機能しますが、Daveの回答を確認してください。
私はこれを理解するためにいくつかのことを試さなければなりませんでしたが、私はそれを理解したと確信しています。奇妙なことに、このプロトコルに似たものは他に見つかりませんでしたが、私が知らない一般的なプロトコルである可能性が非常に高いです。
とにかく、これが私が見つけたものです:
プロトコル/エンコーディング
データのエンコードには、パルスとその間のスペースの両方が使用されます。長いパルス/スペースはバイナリ1(1)、短いパルス/スペースはバイナリ0(0)です。パルスは、消費者の標準的な赤外線38kHz変調@ 50%デューティサイクルを使用して送信されます。
パルス/スペースのタイミングは元の質問にありますが、完全を期すためにここで繰り返します。
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ビットのスロットル値の2つのMSBが単に無視されることを意味します。すなわち
check = yaw ^ (throttle & 0x3F) ^ pitch ^ trim ^ channel
実用的なメモ
信号のタイミングと変調は、非常に正確である必要はありません。私のArduinoの正確ではないタイミングでも、実際のリモートコントロールと比較して、怪しげな変調と、パルス/スペースの持続時間に対する多少のヒットとミスにもかかわらず、うまく機能します。
私は信じていますが、テストしていません-ヘリコプターは、最初に見つかった信号のチャネルにラッチするだけです。信号がない状態で長時間(数秒)放置すると、再び信号を取得するまで「検索」モードに戻ったように見えます。
スロットルがゼロの場合、ヘリコプターはピッチとヨーの値を無視します。
トリムコマンドは、リモコンのボタンを押すたびに1回だけ送信されます。おそらくトリム値は、ヘリコプター自身のコントローラーの値を単純に増減します。リモコンが追跡するものではありません。したがって、これの実装はおそらくそのスキームに固執し、時折トリムの左/右の値のみを送信する必要がありますが、それ以外の場合はデフォルトでパケットのゼロのトリム値になります。
スロットルをゼロに設定するだけのキルスイッチを用意することをお勧めします。これにより、ヘリコプターが空から落下しますが、モーターを回転させていないときのダメージは少なくなります。クラッシュしたり何かにぶつかったりする場合は、ギアを剥がしたりブレードを壊したりしないようにキルスイッチを押してください。
元のリモコンの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ビットはチャネル設定をエンコードするために実際に必要なものの2倍です。チャネルは3つしかないので、2ビットで十分です。したがって、上記の構造の説明では、最初の2ビットに「チャネル」というラベルを付け、残りの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つは考慮されていません。
もう1つの可能性は、パケットのチェックサムが「Xビット」で始まる8ビット長であり、チェックサムマジックによって、チャネル設定が常に何らかの形で反映されることです。しかし、再び:わかりません。
そして言うと、私はそれらのチェックビットがどのように形成されるのかわかりません。つまり、それらは単一の制御入力に対応していないためチェックビットであり、私がそれらをいじくるとヘリコプターが応答しないようです。それはある種のCRCだと思いますが、それを理解することができませんでした。チェックは、「Xビット」の解釈方法に応じて6〜8ビット長であるため、組み合わせることができる方法は多数あります。