マイコン工作実験日記

Microcontroller を用いての工作、実験記録

ヌンチャクでGoogle Earthする -- 準備編

2012-06-16 11:01:18 | WT32/BM20
さてWCA-009(WT32)を使えばヌンチャクをBluetooth HDIマウス/キーボード化することは簡単にできます。今回製作したボードの構成は次のようになっています。



マイコンのソフトでは、I2Cでヌンチャクからのデータを読み取り、その内容に応じて適切な疑似マウス/キーボードのイベントをHIDのレポート形式で送信してやるだけです。マイコンからはUARTを使ってデータを送信してやれば、あとはWT32がBluetooth無線化してくれます。パソコン側では、Windows XP, Windows 7, MacOSいずれもBluetooth HIDのドライバはあらかじめ用意されていますので、追加でドライバをインストール必要もありません。

それでは実際にどのようなアプリを使うかですが、わたしがやってみたかったのはGoogle Earthです。PC向けゲームソフトとか持っていないので、他にジョイスティックがあれば便利そうなアプリを思いつかないだけのことなのですけど。老眼と乱視の影響かゲームのような動きの激しい画面を見続けていると、酔ってしまい頭痛が襲ってきます。時には気持ち悪くなって横になりたくなるくらいです。これが眼精疲労ってやつでしょうか? Google Earthでも20分くらい遊んでいると頭痛がしてくるので要注意です。

Google Earthにはフライトシュミレーターの機能もあり、マウスやジョイスティックで操作することができるようになっています。しかし、慣れないわたしはうまく操縦できません。ゆっくりと動かして景色みたりするのであれば、普通にGoogle Earthを使うだけの方が良さそうです。

今回はジョイスティックではなくマウス/キーボードを疑似することになりますので、ヌンチャクの操作に応じて、適切なマウスあるいはキーボード操作に対応するHIDのレポートを出力する処理が必要となります。HIDの規格ではキーボードに対応するModifierやUsage IDが規定されていますので、キーの押下を表現するには対応するUsage IDを含むレポートを送出することになります。実際のヌンチャクの操作とGoogle Earthの動作の対応付けと、それに伴いHIDで送信する内容は、次のようにすることにしました。

まず、動作モードとしてマウス・モードとナビ・モードの2つを設けます。マウス・モードでは1ボタンのマウスの動作を疑似し、HIDマウスのレポートを生成/送信します。

ヌンチャク操作マウス動作HID動作
スティック上カーソル上へ移動Y-step(正)
スティック下カーソル下へ移動Y-step(負)
スティック左カーソル左へ移動X-step(負)
スティック右カーソル右へ移動X-step(正)
Zボタン左ボタン左ボタン
Cボタンナビ・モードに遷移N/A

Cボタンを押すとモードが変わります。ナビ・モードではGoogle Earthの3Dナビゲーション制御に必要なキー操作を疑似するためのHIDキーボードのレポートを生成/送信します。

ヌンチャク操作Google Earth動作HID動作
スティック上上へ移動UpArrow (0x52)
スティック下下へ移動DownArrow (0x51)
スティック左左へ移動LeftArrow (0x50)
スティック右右へ移動RightArrow (0x4f)
Zボタン+スティック上下に傾斜Left Shift+UpArrow (0x52)
Zボタン+スティック下上に傾斜Left Shift+DownArrow (0x51)
Zボタン+スティック左時計回りに回転Left Shift+LeftArrow (0x50)
Zボタン+スティック右反時計回りに回転Left Shift+RightArrow (0x4f)
下へ傾けるズームインPageUp (0x4b)
上へ傾けるズームアウトPageDown (0x4e)
Cボタンマウスモードに遷移N/A

ナビ・モードではキーボードを疑似しているので、上下左右の方向キーに対応するキーコードを生成することで移動はできても、斜め方向に移動することができないのが使いづらいところです。斜め移動のためには、マウスモードに遷移してグラブ動作(Zボタンを押しながらスティック操作)が必要となります。

こうして用意した疑似マウス/キーボードのデータは、つぎのフォーマットでWT32に送信してやることでBluetoothで無線化されます。

最初の0x9fで以降のデータがレポート形式で示されるRawデータであることを示します。その次のバイトはデータ長を示しています。0xa1の次の1バイトがマウスとキーボードを識別するレポートIDになっているようです。キーボードでは最大6つのキー状態変化を送信することができます。シフトキーの状態は、Modifierバイトの該当ビットで通知します。



上の写真ではWCA-009の下側にLEDが3つありますが、これらは現在の動作状況を表すのに用いています。
  • 緑LED -- 未使用
  • 赤色LED -- ナビ・モードで点灯
  • 青色LED -- Bluetooth接続されると点灯

調べてみると同じような機能を提供できる製品としてはZeemoteというものがあるようです。ざっと見たところではSPPを使ってAndroidスマホでゲームする人を意識した様子。HIDも使えるので疑似マウス、キーボードもできるようですがあらかじめ用意された動作モードにはGoogle Earth向きのモードは無いように思われます。ジョイスティックを疑似するモードではSPPを使っておりHIDではないので、「PC用」と言わずに「スマホ用」としているのでしょうか?

iBUFFALO Bluetooth2.1対応スマートフォン用ゲームコントローラーブルー/ブラック「ZeemoteJS1」 BSGPJS1
バッファロー
バッファロー


計画していた動作はできるようになりました。写真ではわかりにくいので、動画を用意するつもりです。