RC FighterのHack


はじめに

LEGO Bionicleシリーズの#8539 Manasは、本体と赤外線リモコンが各2台含まれていて、対戦ゲームができます。実は2台だけでなく、3台までお互いに混信せずに制御可能で、リモコン、本体双方にチャンネルを切り替えられるようになっていて、同じ数字にしたもの同士が組になります。さらにリモコンには、"All"のポジションがあり、本体側がどのチャンネルを選択していても、制御可能になります。

電波なら、周波数をずらせば混信なく通信可能ですが、赤外線で、どうやってこの機能を実現しているのか、発売前から大変興味がありました。

このページは、Manasの通信や中身のついて、私の興味が向くまま、レゴ社の意向は無視して掘り返すことを主な趣旨としています。

生粋のレゴファンの方が、Manasについて知りたい場合は、おでんさんがレビューをしておられますので、参照してください。


リモコンの中身


搬送波

MindStormsでは、38kHzに変調された、2400 bpsの信号が使われていますが、Manasは、74kHzに変調された4800 bpsの信号が使われています。送信信号はすべて、20bit+startbitになっていて、約4.7msで1回の送信は終了します。


混信の防止

では、どうやって混信を防止したのでしょうか?もしかするとリモコン同士が、協調して衝突防止しているのかと期待していたのですが、見事に肩透かしを食いました。チャンネルごとに送信周期をずらしてあるだけです。

チャンネル 送信周期 [ms]
1 52
2 70
3 88
All 52

たまにぶつかるのは、無視しているんですね。それにしても応答性に差が出るんで、本気で勝負をかけるときは、1チャンネルを死守したほうが有利かもしれません(^^;


ボタンと送信データ

各ボタンに、番号を付けました。

機能

番号

左前進

1

右前進

2

左後進

3

右後進

4

左前進+右前進

5

左前進+左後進

6

左後進+右前進

7

左後進+右後進

8

ボタンを離す

0

ボタンは複数押せますので、左前進と、右前進を押した場合は、5と表示しました。左前進と、左後進のような不合理な組み合わせは、無視されます。チャンネルAllは4と表示しました。

ボタンを全部離した後、そのことを示すシグナルが数回送信されていますが、これは、button 0と表示しました。

Channel Button Data
0 1 1111 1010 0100 1010 1111
0 2 0111 1010 1100 1001 1111
0 3 0111 1011 0101 1000 1111
0 4 0111 1001 1101 1111 1111
1 1 0100 0101 1100 1010 1111
1 2 1100 0110 0100 1001 1111
1 3 0100 0110 1101 1000 1111
1 4 1100 0101 0101 1011 1111
2 1 1111 1101 1101 1010 1000
2 2 0111 1110 0101 1001 1000
2 3 1111 1110 1100 1000 1000
2 4 0111 1101 0100 1011 1000
3 1 0000 0001 1100 1010 1111
3 2 1000 0010 0100 1001 0000
3 3 0000 0010 1101 1000 1111
3 4 1000 0001 0101 1011 1111
4 1 0111 1001 1100 1010 0000
4 2 1111 1010 0100 1001 0000
4 3 011101010 1101 1000 0000
4 4 1111 1001 0101 1011 0000
5 1 0100 0001 0101 1010 1000
5 2 1100 0001 1100 1100 1100
5 3 0100 0010 0100 1000 1000
5 4 0100 0000 1100 1011 1000
6 1 1100 0101 0100 1010 0000
6 2 0100 0101 1100 1001 0000
6 3 1100 0110 0101 1000 0000
6 4 1100 0100 1101 1011 0000
7 1 0000 0101 0101 1010 1000
7 2 0111 1110 0101 1001 1000
7 3 0000 0110 0100 1000 1000
7 4 0000 0100 1100 1011 1000
8 1 1000 0001 0100 1010 0000
8 2 0000 0001 1100 1001 0000
8 3 1000 0010 0101 1000 0000
8 4 1000 0000 1101 1011 0000

今後の予定

思ったより単純で、RCXに応用するのもちょっとやりにくそうだし、PCから、操作するのも、面倒な割りにあまり面白くなさそうなので、ちょっと悩んでます。


PICで信号を生成する

とは言ったものの、信号を実際生成して、動作することを確かめなければ、解析の正しさが証明できないので、実際やって見ました。回路はPIC-IR TOWERと同じ物を使い、クロックを20MHzとし、PIC16F84A-20/Pで実験しました。

Programをここに示します。9600 bpsで'A'を入れると、上記表の0-1が、'B'をいれると0-2がと順に出るようにしたつもりだったのですが、まだバグがあり、偶数の文字しか受信出来ません。'C'をいれても'B'、'E'をいれても'D'になってしまうつまらないバグが残っています。そんなバグすぐにつぶせるだろうと思ったのですが、なかなか見つからずに休みが終わってしまったので、送信成功のレポートとしてこのまま暫定公開します。


Spyboticsとの互換性

#8539 ManasとSpyboticsでは、リモコンに互換性があることが判明してます。

詳しくは、Spybotic(Hack編)に記載します。


リモコンコードその後

USB LEGO Towerには、76kHz 4800bpsの赤外線でも通信できる機能があることは、薄々気づいてましたが、MindStorms SDK 2.5の公開でその使い方がわかるようになりました。

早速、急場しのぎのプログラムを作り、リモコンが送信しているコードを読んでみました。

前にオシロスコープで読んだコードとは、だいぶ違っているし、ボタンの読みも互換性がありません。

後で、PCから操作できるリモコンにしようと思ったので、時計回りに、

1 2
4 3

と各ボタンに番号を割り当ててます。

コードは16 bitのようです。前に行った、オシロスコープによる観測では、2 byte連続して送られているもののスタートビット、ストップビットも一緒に数えてしまったようです。

code ch button1 button2
40 0c 0 0 0
40 75 0 1 0
40 fd 0 4 0
47 05 0 2 0
47 7e 0 1 2
47 f6 0 2 4
4f 0d 0 3 0
4f 76 0 1 3
4f fe 0 3 4
50 0b 1 0 0
50 74 1 1 0
50 fc 1 4 0
57 04 1 2 0
57 7d 1 1 2
57 f5 1 2 4
5f 0c 1 3 0
5f 75 1 1 3
5f fd 1 3 4
60 0a 2 0 0
60 73 2 1 0
60 fb 2 4 0
67 03 2 2 0
67 7c 2 1 2
67 f4 2 2 4
6f 0b 2 3 0
6f 74 2 1 3
6f fc 2 3 4
70 09 3 0 0
70 72 3 1 0
70 fa 3 4 0
73 7f 3 1 3
77 02 3 2 0
77 7b 3 1 2
77 f3 3 2 4
7f 0a 3 3 0
7f fb 3 3 4

まだ予測の段階ですが、コードは4bit (ニブル)ごとに役割を割り当てているようです。

MSBから順に、チャンネル、ボタン2,3、ボタン1,4、チェックコードとなっているようです。

b15 b14 b13 b12 b11 b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0
N1 = Channel N2 = Button 2,3 N3 = Button 1,4 Check Code

N1 : チャンネル

chanel ALL 1 2 3
Code 4xxx 5xxx 6xxx 7xxx

N2 : ボタン2,3

Button 2 3
Code x7xx xfxx

N3 : ボタン1,4

Button 1 4
Code xx7x xxfx

そしてチェックコードは、

SUM = N1 + N2 + N3

N4 = ~SUM+1

ではないかと予測しています。

検証する為に、LTremo76は、このアルゴリズムで、チェックコードを発生させ、動作することを確認しました。


MindStormsの洞窟へ戻る

Copyright (c) 2001 ">

最終更新日 2003年2月5日

Google