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-IR TOWERと同じ物を使い、クロックを20MHzとし、PIC16F84A-20/Pで実験しました。
Programをここに示します。9600 bpsで'A'を入れると、上記表の0-1が、'B'をいれると0-2がと順に出るようにしたつもりだったのですが、まだバグがあり、偶数の文字しか受信出来ません。'C'をいれても'B'、'E'をいれても'D'になってしまうつまらないバグが残っています。そんなバグすぐにつぶせるだろうと思ったのですが、なかなか見つからずに休みが終わってしまったので、送信成功のレポートとしてこのまま暫定公開します。
#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は、このアルゴリズムで、チェックコードを発生させ、動作することを確認しました。
Copyright (c) 2001 ">
最終更新日