ドン・キホーテで1980円で売っていました。
コントローラーは単3電池5つ(別売り)がいります。電池のふたがネジで止められているので、ドライバーが必要です。ジャイロは村田製作所製と広告に書かれてました。
毎回色々な方向に飛んで行ってしまい、とても難しいです。でも、パッケージに書いてある全操作ができたので、壊れてはいません。前のLEDは常にONです。
買った時に、テールローターの向きが、普通上でなくて、横を向いていないといけないのでは?と思いました。飛ばしてみて分かりましたが、これは、ヘリコプターが前と後に進むためです。
そのかわり、メインローターが上と下の二つ付いていて、それぞれ逆方向に回転しています。これで、機体が回ってしまうことはなくなります。これを、二重反転式ローターと言うそうです。
左を向きたい時は、上を早く回して、下をゆっくりにします。右を向きたい時は、その逆。両方の出力の合計は変えないので、同じ高さを飛びながら、左右に向きを変えれる仕組みです。
プロペラが回っている状態で、ヘリコプターを手で傾けて、分かりました。棒は、機体が傾いても、すぐには一緒に傾きません。棒は上のメインローターと繋がっていて、羽のピッチを変える作りになっています。調べたところ、風などで急に機体が傾いても、安定して飛ぶためにあり、スタビライザーやフライバーと言うそうです。
普通は羽と90度の角度でついているみたいですが、今回のような小型ヘリでは、羽が安定した飛行を重視した形状になっていて、それがもたらす歳差運動の関係上、約45度のオフセットでついていることがほとんどだとか。
取扱説明書によると、ヘリの下から出ている黒いLEDのようなモノが赤外線受信機です。
カメラを通してコントローラーの前についている3つのLEDを覗くと、点滅しているのがわかります。
オシロスコープで基板の色々な部分を突っつきながら、どこがつながっていそうなのか確認し、回路図を描きました。左下の黒いチップがメインのマイコンになります。
大きく4つに分けられます:
赤外線LEDは直列につながっているので、3つ同時に光ったり消えたりするのが分かります。マイコンの9番目のピンから信号が出ているみたいなので、信号を解読するときはここを見ていきます。
コントローラーの電源を入れるだけでは、信号が出ないので、フルスロットル状態(上昇下降レバーをMAX)でマイコンの9番目のピンの信号を取りました。
上のグラフからは、約130ミリ秒ごとに信号がまとめて送られているのが分かります。もう少し拡大した真ん中のグラフでは、短い信号と長い信号が、同じ間隔を開けて発信されているのが読み取れます。長いのは0.75ミリ秒ぐらいです。さらにズームインしたのが下のグラフです。オンとオフの回数を数えると、長いのが30回、短いのは15回でした。
ネットで調べると、赤外線信号はほとんどの場合38kHzのパルスで送られるそうです。理由は、自然界にこの周波数を出す物が少ないので、通信に使うと読み取りやすくなるそうです。38kHzのパルスを30回するには、約0.79ミリ秒かかります。今回のとほぼ同じです。
とりあえず短いパルスと長いパルスをそれぞれ0と1として、バイナリで表してみます。この中にコントローラーで操作できる3つの自由度の値がエンコードされているはずです。上昇下降レバーのみを少しずつ落としながら、計11回計測しました(A)。次に上昇下降レバーを中心位置から動かさずに、左右旋回レバーを左から右へ少しずつ動かしていきました(B)。同じように、前進・後進レバーを前進から後進へ少しずつ動かしていった場合も計測しました(C)。トリム調整ボタンは一回も押さず、チャンネルも毎回「A]です。
(A)
011111111100000011001100000001111 Thrust MAX
011111111100000000000000000001111
011111111100000000100000010001111
010001011100000000100000010001111
010010101100000000100000010001111
010111110100000011100000010001111
010111010110000011100000010001111
010000010100000011100000010001111
011101000100000011010000010001111
010110111010000011010000010001111
010000001010000011010000010001111 Thrust MIN
(B)
010001001111111101000000000001111 Left MAX
010001001111111101000000000001111 Left MAX
010001001111111101000000000001111 Left MAX
011110001111111101100000010001111 Left MAX
010101010101111101000000000001111 Left MAX
010011010101111101100100000001111
011101010111111101100100000001111
011101010110000000010100000001111
011101010110000000010100000001111 Center
011001010100000011101100010001111
011101010110011110101100010001111
010010010111111110100000010000011
010101010101111110101100010000011 Right MAX
010101010101111110000000000000011 Right MAX
011001010101111110000000000000011 Right MAX
010101010101111110000000000000011 Right MAX
011001010101111110000000000001111 Right MAX
(C)
011100110110000000000000001111011 Forward MAX
011100110110000000000000001111011 Forward MAX
011100110110000000000000001111011 Forward MAX
011100110110000011000000001111011 Forward MAX
010011010100000000000000001111011 Forward MAX
011101010110000011000000001111011
011001010100000000000000001011111
011101010110000011000000000000011
011101010110000011000000000001111 Center
011101010110000011000000000000011
011101010110000011100000010100111
011101010110000011100000011110111
011101010110000011100000011110111 Backward MAX
011100110110000011000000001110111 Backward MAX
010100110100000000000000001110111 Backward MAX
011100110110000011000000001110111 Backward MAX
010100110100000011000000001110111 Backward MAX
まず一つ目の問題が、データどこで区切ればよいのかわからないこと。ビット数は33と毎回一律ですが、単純にバイトで分けると余ります。2つ目は、エンディアンが分からないので、最下位ビットが最初に来るのか後に来るのかわからにこと。最後に、信号の0と1の解釈の仕方が逆の場合が考えられます。パリティビットやチェックサムなどが混ざっている可能性も思いつきます。
変更しているビットを色で識別し、各操作が該当しそうなデータの区間を探していきます。
最初の「01」と最後の「11」は固定であることがわかります。上昇下降に着目すると、3~10ビットの1バイトがそれにあてはまりそうです。バイトオーダーを逆にすると、(B)と(C)で変わっていない部分は、3~11番目の。