2015年3月28日土曜日

Wiiリモコン+Arduino+LEGO でラジコンを作る(3):USB Host Shield で Bluetooth ドングルを使えるようにする

もくじ
  1. Wiiリモコン+Arduino+LEGO でラジコンを作る(1):材料選定
  2. Wiiリモコン+Arduino+LEGO でラジコンを作る(2):DCモーターを動かす
  3. Wiiリモコン+Arduino+LEGO でラジコンを作る(3):USB Host Shield で Bluetooth ドングルを使えるようにする
  4. 【完成】Wiiリモコン+Arduino+LEGO でラジコンを作る(4):WiiリモコンでDCモーターを操作する


前回、せっかくArduinoでDCモーターを動かせるようにしましたが一旦モーターから離れます。

今回は USB を使えるようにして Bluetooth ドングルを接続し、
さらに Wii リモコンと通信できるようにします。

一見、ものすごく大変そうですが実は簡単に終わります。
このあたりが Arduino の素晴らしいところですね。

USB Host Shield本体


Circuits@Home の USB Host Shield が手に入った場合は
Arduino UNO のピンソケットに差し込んで2階建てにすればOKです。

一応、Amazon で Circuits@Home 互換のシールドが売っているようです。


一方、秋葉原などで比較的手に入りやすいのは SparkFun のシールドです。
スイッチサイエンスさんで取り扱っているのも SparkFun です。

この後で USB Host Shield を動かすために Circuits@Home のライブラリを使うのですが
SparkFun のシールドは Circuits@Home のライブラリと互換性がありません。

そこで、SparkFun の USB Host Shield を改造したいと思います。
ADK 勉強会さんのサイトで凄まじく詳しく説明されているので一緒にご覧ください。


  • STEP 1 : Vin のラインをカット
    Vin から延びるラインの途中をカットします。
    かなり固いですが小さなマイナスドライバーでガリガリするとカットできます。
    USBHost_VIN_cut.jpg

  • STEP 2 : 7, 8ピンからのラインをカット
    7番ピンと8番ピンから延びるラインをドライバーでガリガリします。
    ラインは裏面から回り込んでいたりしてかなり分りにくいので注意してください。
    表側から見ると、2番と3番の間、および、7番と8番の間から出ているのがそれです。
    USBHost_78_cut.jpg
    どうでも良いですが、背景に映っているのはラジコンではなく Quadcopter です。

  • STEP 3 : 5V とレギュレータをバイパス
    レギュレータの真ん中のピンと5Vピンをリード線で繋ぎます。

    ピンソケットがはんだ付けされている場合、表側から5Vに繋ぐのは少々難しいです。
    レギュレータからユニバーサル基盤部分に繋ぎ、ユニバーサル基盤の裏側から5Vピンに繋ぐと簡単です。
    USBHost_5V.jpg

  • STEP 4 : 74HC4050 と RST を接続


    チップの足のうち、もっとも USB コネクタに近いところからリード線を延ばします。
    はんだ付けに手間取るとチップが壊れますが、焦ると隣の足とブリッジしてしまいます。
    迅速かつ丁寧に頑張りましょう。

    本来は RST ピンに繋ぐのですが、やはり表側からはんだ付けするのは面倒なので、
    リセットスイッチの最も RST ピン側の足にはんだ付けするのが簡単です。

    正直言って、表面実装の手はんだはクリップがないと苦行です。

USB Host Shield ライブラリ


Circuits@Home の USB Host Library 2.0 を使います。
GitHubからソースをダウンロードしてください。

GitHub から ZIP をダウンロードしたら、Windows のマイドキュメントにある
「Arduino\libraries」フォルダの中に放り込んで Arduino IDE を再起動します。

Arduino IDE の「ファイル>スケッチの例>USB_Host_Shield_20>Bluetooth」にWiiが表示されればOKです。
そう、これだけで Wii と通信する準備が完了です。
Arduino 恐るべし。

ソースコード


今回は Wii リモコンとの接続確認だけですので USB Host Library のサンプルコードを使います。

Arduino UNO のピンソケットに USB Host Shield を差し込んで2階建てにし、
USB Host Shield の USB コネクタに Bluetooth ドングルを取り付けます。

準備ができたら、Arduino IDE の「ファイル>スケッチの例>USB_Host_Shield_20>Bluetooth>Wii」を開いてください。
Arduino UNO にスケッチを書き込んだあと、「ツール>シリアルモニタ」を開きます。

Wii リモコンからの操作


Arduino UNO 動作中に Wii リモコンの 1 ボタンと 2 ボタンを同時押しします。
しばらくすると Bluetooth ドングルの LED が点滅して Wii リモコンとの接続が完了します。
この状態で Wii リモコンのボタンを適当に押すとシリアルモニタに認識結果が表示されます。

そう、Bluetooth のプロトコルや Wii リモコンの通信内容の解析などという面倒な作業は一切必要ありません。
これだけで Wii リモコンの操作内容を取得できます。

また、単なるボタン操作だけでなく加速度センサの値を取得したり、
ヌンチャクの操作を取得することも可能です。
USB Host Library のソースを見て色々試してみてください。

なお、Arduino とペアリングした後でも電源を入れなおせば普通に Wii で使えますのでご安心ください。

余談:Wiiモーションプラス


蛇足ですが、応用編で Wii モーションプラス(リモコンの踵の部分)だけを取り外し、
Arduino に直結してジャイロセンサーにするという応用も可能です。
Wii リモコンが1台あれば Arduino と組み合わせるて色々と遊べるのでお勧めです。

さらに発展すると Wii モーションプラスを分解して加速度センサを取り出し、
Arduino の基板上に組み込んでマルチコプター(複数プロペラのヘリコプター)の
フライトコントローラーにしてしまう猛者が現れました。

それが MultiWii という Arduino ベースのフライトコントローラーです。
先ほど写真に映りこんでいた Quadcopter は MultiWii で作ってあり、
さらに Arduino を繋いで Wii リモコンで操縦できるようになっています。
その話もまたいずれご紹介できればと思います。


今回は Arduino で USB ホスト機能を使えるようにし、
Bluetooth ドングル経由で Wii リモコンと接続できました。
次回はこの仕組みと前回のDCモーター制御を組み合わせて、
ラジコンを完成させます。


4 件のコメント:

  1. SECRET: 0
    PASS: 3998ba7b1fb3599cb7f2abcf79d91c1e
    コメント失礼します。arduinoを用いたbluetooth制御について調べていたらこちらのページにたどり着きました。
    USB Host Shieldのソースコードをインストールする手順まで行ったのですが、どのファイルをインストールしていいか分からなくなってしまいました。
    お手間をお掛けしてしまいますが、どのファイルをダウンロードすればいいか教えていただけないでしょうか。

    返信削除
  2. SECRET: 0
    PASS: 74be16979710d4c4e7c6647856088456
    ソースコードってここのことですよね。
    https://github.com/felis/USB_Host_Shield_2.0
    ZIPファイルでまとめてダウンロードして
    解凍したフォルダをこのあたりに放り込めばよいのではないかと。
    C:\Program Files (x86)\Arduino\libraries

    返信削除
  3. SECRET: 0
    PASS: 74be16979710d4c4e7c6647856088456
    なんとか進めることができました。
    非常に分かりやすいページを作ってくださり、助かっています。
    返信が遅くなってしまい申し訳ございません。

    返信削除
  4. Wii.getButoonClic() がボタンを押した瞬間しか非0を返さないので困っています。
    よろしければ教えていただけないでしょうか。

    返信削除