RPU-10講座/第十七章 無線コントローラ
すいません m(_ _)m、本記事はブログ引越時に書式が崩れました。順次修正中です。
RPU-10講座企画時にすっかり忘れていた無線コントローラですが、今回は、FUTABA GR-001の無線コントローラ・RRC-T11/R11をRPU-10に接続し、値を読み取る方法とデータの内容を紹介します。
■まずはペアリング
RRC-T11/R11にどんなマニュアルが付いているかわからないので、簡単に最初に行わないといけない作業だけ書いておきます。初めて電源を入れた場合、ペアリングという、RRC-T11とRRC-R11がお互いに認識する状態を作る必要があります(GR-001の取説に書いてあったと思います)。
RRC-R11の電源を入れ、左上にある小さなスイッチを押すと、緑LEDが高速点滅します。この状態でRRC-T11での電源をいれます、最初は赤色LEDもゆっくり点灯していると思います。そしておもむろに数秒間…10秒ぐらい押し続けているような気もしますけど…「F1」「SELECT」と「左アナログスティック」を同時に押し続けます。そうすると、RRC-R11の緑LEDが点灯、T11の方も、赤色LEDがゆっくり点灯していたのが消灯します。これでOKです。以降、電源を入れなおしてもペアリング状態は記憶され続けます。
ちなみに、RRC-T11は、5分程度無操作だと自動電源カットされますので、この場合は電源スイッチの入れなおしが必要なようです。
(2008/05/01追記:追試したことがあったので、書いておきます。ペアリングするときは、RPU-10に接続して行っていますが、RPU-10がブートローダ動作中や、SV_Init()など初期化処理を一切呼び出さずにwhileで待つだけの空のプログラムを走らせていてもペアリング動作はできました。よって、電源さえ入っていればペアリングできると思います。)
■なんだかPS2のコントローラパッド
GDLで用意されているそれっぽい関数は、「short RPU_GetController( char *pbuf )」です。「pbuf」には8バイト以上用意する必要があるようなことがコメントに書かれていたので、この関数を呼ぶと8バイト、ごそっと設定されるんでしょう。で、無線コントローラのボタンやアナログスティックのことを考えると、バイナリデータが濃厚です。ボタン分だけで2バイト(16ビット)必要で、さらにアナログスティック2つ分で4バイトはありそうですし。そういった意味でいくと、「unsigned char*」の方がいいんじゃないかな?と思いつつ、マイコン系の場合、だまって「unsigned」だったりすることもあるので、とりあえずこだわらずに行きます。実際、GDL2.0でRPU-10の設定にすると「unsigned」のようです。
■サンプルプログラム
ひたすら値を読み取って表示するプログラムを作ってみました。
1: //—————————————————————————————-
2: // コントローラパッドからの入力を表示します。
3: // 値をただひたすら表示します。
4: //
5: // 環境 RPU-10、GDL V2.00
6: // 説明 ビルドされた本プログラムをRPU-10へ転送後、パソコン側で「SIMPLE TERM」(GDLに
7: // 同梱)などを使って通信速度115200bpsで通信ポートを開いてください。その後RPU-10
8: // を再起動するとプログラムがスタートし、「SIMPLE TERM」にひたすらずらずらと値が
9: // 表示されます。
10: //
11: // AUTHORED BY SISO JUNK STDUIO
12: //—————————————————————————————-
13: #include <avr/pgmspace.h>
14: #include <avr/io.h>
15: #include <avr/interrupt.h>
16: #include <avr/eeprom.h>
17: #include <stdio.h>
18: #include <avr/boot.h>
19: #include <avr/wdt.h>
20:
21: #include <sv.h>
22: #include <rs.h>
23:
24: #include <../ATmega128/rs0_printf_P.c> // URART0用フォーマット(ROM用)
25:
26:
27:
28: //
29: // メインルーチン
30: //
31: int main( void )
32: {
33: char acPad[8]; // コントローラパッドデータ格納変数
34: short sResult; // コントローラパッド受信状態
35:
36: RPU_InitConsole( br115200 ); // RPU-10ライブラリの初期化
37: SV_Init( br115200 ); // サーボ制御ライブラリの初期化
38: sei(); // 割り込み処理開始
39:
40: // 1秒待つ(よく知らないけど必要らしい)
41: RPU_ResetTimerCounter();
42: while( RPU_GetTimerCounter10() < 100 );
43:
44: // 起動メッセージの表示
45: rs0_puts_P( PSTR( “CONTROL PAD MONITOR\n” ));
46:
47: while( 1 ){
48: // コントロールパッド値の取り込み
49: sResult = RPU_GetController( acPad );
50: // 値の表示
51: rs0_printf_P( PSTR( “sResult=%d Pad=%02X %02X %02X %02X %02X %02X %02X %02X\n” ),
52: sResult,
53: acPad[0], acPad[1], acPad[2], acPad[3], acPad[4], acPad[5], acPad[6], acPad[7] );
54:
55: // ちょい待ち
56: // あんまりたくさん画面にデータを表示しても見るのが大変なので、
57: // 0.1秒に1回表示するようにします。
58: RPU_ResetTimerCounter();
59: while( RPU_GetTimerCounter10() < 10 );
60: }
61:
62: return 1;
63: }
■調査結果
動かしてみた結果はこんな感じです(pbuf[1]、pbuf[2]は、左から「B7」、「B6」というように、ビット読みしてください)。サンプルプログラムでは「acPad」という変数名を使っていますが、ここでの説明はヘッダファイルに定義されている変数名にて説明します。押下時0で、通常は1になっています。このあたり、割といわゆるPS2コントローラパッドと同じですね。
戻り値は常に1のようです。通信できているかどうか?の判定は、pbuf[7]にて判定できそうです。
- pbuf[0]
0xFF固定 - pbuf[1]
B0…L2、B1…R2、B2…L1、B3…R1、
B4…1、B5…2、B6…3、B7…4 - pbuf[2]
B0…SELECT、B1…L3、B2…R3、B3…START、
B4…上、B5…右、B6…下、B7…左 - pbuf[3]
右アナログスティック左右(左:0x00、中心:0x80、右:0xFF) - pbuf[4]
右アナログスティック上下(上:0x00、中心:0x80、下:0xFF) - pbuf[5]
左アナログスティック左右(左:0x00、中心:0x80、右:0xFF) - pbuf[6]
左アナログスティック上下(上:0x00、中心:0x80、下:0xFF) - pbuf[7]
接続が切れると0xFF、
MODEを押してLEDが点灯すると0xF3、LED消灯で0xFB、
B0…F1、B1…F2、 - その他
アナログスティックは、2/3ぐらい倒したところで振り切り(0x00か0xFF)になる。
実行時間が気になるところですが、この関数自体は0.5msぐらいで実行しているようです。そんなわけで、必要なときにガンガン呼び出しても問題無さそうですね。
■今回使用した関数
- short RPU_GetController( char *pbuf )
内容については、調査結果を参照して下さい。
■ちょっとだけして深入り
ちょっとRRC-R11に供給されている電圧とかをテスターで当たって調べてみました。電源電圧は手持ちテスタで4.97Vだったので、5Vが供給されていると思われます。で、気になる接続ですが(RPU-10を開けて調べたのですが、内部写真はやめときます)、手持ちのRRC-R11だと、左下の写真のようなコネクタになっています。「手持ちの」と前置きした理由は、これらを頂いたのはかなり早期のため(ROBO-ONEの賞品で頂いたものです)、コネクタは同じですが、ケーブル色が現在のものと同じかどうかわからないためです。写真の状態では、コネクタのコンタクトピンがハウジングの上側にくる状態で見ています。また、RPU-10側はCコネクタに差しますので、ちょうどこの写真どおしを向かい合わせるように差し込みます。
そうすると、こういう状態になります。で、あまり得意ではない電子回路のおっかけをして調べたところ…
この状態で、上からATmega128の「PB3」、「PB2」、「PB1」、「PB0」の順番に接続されています。また、各端子は保護抵抗の目的と思われる5Ω程度の抵抗が直列に入っています。で、続いて5V、GNDとなります(うちのだと、誤植ならぬ誤色か?という色の組み合わせ…)。「PB3、PB2、PB1、PB0」というのは、SPIの「MISO、MOSI、SCK、SS」にあたりますので、おそらくPS2パッドと同じやり方でアクセスしているのではないかなと思います。接続についてはあまり自信が無いので、RRC-T11/R11をRPU-10/11以外に接続してみようという方で、RPU-10/11持ってないけどRRC-T11/R11買っちゃって、「SPIで…おそらくPS2パッドと…」で大体わかるから後は結線確認したいなぁ、という方(すごい限定…)、メールくだされば、こそっとこの調査をしたときのRPU-10の内部写真、送ります。
■これで一通り終了
ふー、予定+αで大方の情報については説明を入れました。サンプルソースはそのうちまとめてアーカイブでダウンロードできるようにするつもりです。ここまでの説明で、大方の技術要素は説明できたと思っていますので、あとはみなさんの応用次第で、いろいろなものが作れるのではないかと思います。
また、他にもいくつかまだ紹介していない関数があります。これらについてはまだ解析中ですが、ヒントを頂いたりしたものもありますので今後も情報はアップしていきますが、まあ、ぼちぼちっとしたペースで気が向いたときにって感じで。他には、もっとうまくRS301を動かす方法を思いついたので、現在、実験中です。あと、うちで開発しているSIPHA SYSTEMがまだ100%の完成品じゃなかったり、他にもいろいろやってみたいことがあるので、RPU-10講座は終了し、しばらくはSIPHA SYSTEMの方へ注力しようと思います。
RPU-10、自分で料理してみるにはなかなか良い教材だと思います。構成がシンプルですし、計算能力も結構あります。おまけとはいえ、ライブラリが提供されていますので、マイコンプログラミングを始めるときにつまづきやすいところも少なくなっています。また、RS301もなかなか丈夫ですし、温度センサーのおかげでモーターや基板を燃やしてしまうということもありませんでした。欲を言えば、もうちょっと形状が使いやすかったらなぁって思いますが、HPIさんの方からいろいろとパーツも発売されていますので、うまく使えばいい感じにロボットを組み上げれるのではないかと思います。
欲を言えば、RPU-10が1万円ぐらいだとうれしいとか、ソフト無しバージョンで安くならないかなぁとか(すでにソフトが配布されている状態でそれは無理ですね…)、裏フタ側に結構スペースがあるので、そこも詰めて、もうちょっと薄くして欲しいとか、もう少し入手製のいいコネクタ使って欲しいぞ、とか。EH、DF-11はなんとかなりますが、JAMがきついです。
自作コントローラボードというとハンダ付けから始まるのが普通ですが、ハンダ付け要らず(接続部品作るのにちょっと要りますけど)ですし、 ハブなども既に発売されていますから割と机を汚さずに?始めることができると思います。まあ、メーカーの想定外な使い方ですから「自己責任で」っていう言葉はいつも付きまとっちゃいますが、それはそれで趣味って感じで楽しめるのではないかと。
この先、見た目はまったくノーマルなのに、動きがぜんぜん違うぜ!なんていうGR-001が出てきたらおもしろいなぁ。昔、少年サンデーでパトレイバー読んでましたが(アニメは観たことがないという…)、「OUT OF STANDARD」って感じですよね。懐かしくてネットで検索したら、「サンデー名作ミュージアム」で、第一話だけは読めるようですね!いつかこういう腰~モモデザイン、やりたいなぁ。アニメにでてくるロボットの股間って、みんなこんな感じですよね。現実はきびしいです。
※注意:本BLOGにてRPU-10での再プログラミングについての情報を公開していますが、これらはSISOが個人的に再プログラミングを行った時の技術情報を整理して紹介しています。GDLへのRPU-10ライブラリ同梱については、 Best Technologyさんのご好意で、趣味人への1つのチャンスとして同梱してくださっていると理解しています。そのため、RPU-10の再プログラミングについては、くれぐれもご自身の責任で、また、Best TechnologyさんやFUTABAさんに問い合わせたりすることの無いようにお願いいたします。
SISOさん こんにちは。 shin1です。
RPU-10講座を熟読させてもらって、RPUいじりを楽しんでおります。 自分でH8-tinyとAI-MOTORを使って遊んでいた時も、結果的に同じような構成になっていたので、市販品でこれだけ好き勝手に遊べるとなると、手間を考えるとすっごく嬉しいですね。
ところで送受信機のペアリングですが、F1+左スティック押し じゃなくて select+左スティック押し じゃないでしょうか(バージョンの違いとかあるのかな) GR-001のマニュアルにもそう書いてあるので確認願います。
ではでは。