2011年5月25日水曜日

USB Host Shield (HID キーボード篇)


USB ホストシールドは、Arduino に各種USB デバイスを接続することができるシールドです。
今月行われた Google I/O 2011 にて発表された Android Open Accessory Development Kit (ADK) のリファレンスボードが、Arduino + USB Host Shield と同等の構成だったことから、注目度が急上昇しています。
(ADK 対応デバイス (Android 3.1 or 2.3.4以上) を持っていないので、そちらの話題は当面扱いません。)

Sparkfun 製の同等品が、日本でも簡単に入手できます。(→千石電商SwitchScience
私は大分前に買ったのですが、、、そのまま手つかずにしていました。
USB のクラスライブリに相当するものが整っておらず、使い方が分からなかったためです。

Sparkfun のUSB ホストシールドは、古いもの(DEV-09628)と新しいもの(DEV-09947)で、配線が異なっています。
複数のサイトを参考にする場合は要注意です。
新しいものは、開発者のサイトのライブラリがそのまま使えます。
(#define MAX_GPX 7、#define MAX_RESET 8 に変更する、とある場合は古い版です。 7, 8 ピンが入れ替わっているだけなので、私は基板の配線を新しい方に合わせて修正しました。)


新旧USB ホストシールド。Arduino と連結するピンヘッダは別売りです。

ここ (GitHuB)からライブラリのダウンロード
(私がダウンロードしたのは felis-USB_Host_Shield-a59ba5b.zip という名前でした。)

解凍して、フォルダ丸ごと ~/Documents/Arduino/libraries へコピー
(そのままの名前だと記号を含むためエラーになるので、フォルダ名をUSBHost にしました。)


Arduino IDE を再起動して、インストール完了


darran さんのUSB Keyboard Passthrough をやってみます。

USB ホストとして、キーボードの入力を受け取り、前回紹介した atmega8u2を HID キーボード化したArduino Uno を使って、USB キーボードとしてPC に送り出します。

kbd_usb_passthrough.pde をArduino IDE で開きます。

コンパイルするとError になりました。

'EP_RECORD' does not name a type
など、いろいろ言われる場合 ('MAX3421E' does not name a type, 'USB' dose not name a type) は、上記ライブラリがインストールできていません。
ライブラリの場所(Arduino フォルダの libraries の中)、名前(記号を含まない) を確認してください。ライブラリの読み込みには Arduino IDE の再起動が必要です。

kbd_usb_passthrough.cpp:2:17: error: Spi.h: No such file or directory
#include <spi.h> でerror になる場合は、この行をコメントアウトします。
(現在のライブラリで、この記述は不要です。→根拠はこちら


コンパイルができればあとは通常通り、Arduino Uno に Upload をします。
その後、前回同様、DFU モードでatmega 8u2 にArduino-keyboard-0.3.hex を書き込みます。

後はUSB ホストシールドを載せて、USB キーボードを接続、Arduino Uno をキーボードとしてPC に接続すれば、完了です。
(キーボードの実験をするときは、事前にテキストエディタなどを開いておいた方がよいでしょう。暴走して勝手に入力されると困るので。)

これで完成、、、と思ったのですが、私はうまく行きませんでした。
いろいろ試したのですが、「キーボードが悪い」という結論に達しました。


使っていたキーボードは USB ハブを内蔵していたため、複合デバイスになっているのだと思います。このプログラムでは、プレーンなUSB HID キーボードしか認識できません。
他のキーボードもトラックパッド内蔵だったりしたため、押し入れを引っくり返してようやく普通のキーボードを発見。動作確認ができました。

それでも上手く行かない場合は Examples に入っている board_test.pde を実行してみましょう。何かわかるかもしれません。(こちらに手順を書きました)
私の場合、Uno では動作しましたが、クロックの精度が必要なためか、eJackino (セラロック仕様) ではNG でした。(こちら にClock を確認するように、とあります。)

また、Arduino をUSB バスパワーで動作させていると、シールドへ給電する Vin の電圧が低くなり、結果的にUSB Host シールド上のUSB ポートから出力される電圧(Vbas) が低くなってしまいます。
今回の実験では問題なかったのですが、接続する機器によっては動作に影響があるかもしれません。AC アダプタ (7〜12Vが適正) から給電するか、こちらのサイトの方法が参考になると思います。


0 件のコメント:

コメントを投稿