AndroidにPS2キーボードを繋いでみた
公開日:
電子工作 | Android, Arduino, MicroBridge, キーボード
@yishiiさんの素のAndroid端末を外部のキーにより操作する実験と言う記事を参考に、Arduino+MicrobridgeでAndroidにPS2キーボードを繋いてみました。
※PS2ってプレイステーション2のことじゃないよ
以前、wimejiやbimeji経由でキー入力を行うデバイスをArduinoで作ったことが有りますが、今回のものはwimejiやbimejiと言ったAndroid側のアプリは必要無く、ハードウェアキーボードが付いた端末と同等な操作できます。
若干反応は鈍いですが・・・実用レベルかも
以前作った経験から「これは余裕だろ」と思ってたのが、思わぬ所でハマってしまい完成まで若干時間がかかりました・・・が、なんとかハマった所も対策が出来たっぽいので、また作り方を紹介したいと思います。
デバイスの概要
- Arduino + USBホストシールドがメインとなります。
- AndroidとArduinoとの通信は、MicroBridgeによって行っています。
- PS2接続の日本語キーボードを利用
- PS2キーボードの状態取得はPS2Keyboardライブラリを使う(少し改造した)
- 動作確認したのは Nexus One,IS01,HT03Aの3機種。
XOOMでは動かず・・・そもそもMicrobridge全般がXOOMで動かないorz - 実はJapaninoでも動くことを確認しています。
Android AccessoryはJapaninoで動かなかったので、これもMicrobridgeの利点
パーツリスト
名前&メーカーリンク | 数量 | 記号 | 備考&販売店リンク |
Arduino Duemilanove | 1 | スイッチサイエンス(UNO) | |
Sparkfun USBホストシールド | 1 | スイッチサイエンス | |
PS2(miniDin6)コネクタ | 1 | 千石 | |
PS2キーボード | 1 | なんだって良い(Amazon) | |
僕は、以前bimeji clientと言うのを作った時に、シールド化していたのでそれをそのまま利用しました。
PS2コネクタは、要らなくなったマザーボードから取った奴で不細工です(´・ω・`)
AmazonでPS2キーボードを見てみると、500円台で売ってたりするんで、実験用ならコネクタ使わずにケーブル切ってt直接繋ぐって言う手もありかなとも思う。
Bluetoothモジュールを接続するためのピンヘッダが付いているけど、モジュールを付けなければ特に問題は無い。
回路図
実際には、ArduinoにUSBホストシールドを接続してから、各部品の配線を行って下さい。
PS2 キーボード ピンアサイン
1 | DATA |
2 | NC |
3 | GND |
4 | 5V |
5 | CLK |
6 | NC |
作り方とか
上の回路図をもとに部品を接続し、ArduinoIDEを使ってプログラムをArduinoに書き込めばデバイスは完成です。
プログラム一式) MB_Keyboard20110810.zip
MicroBridgeのライブラリは、予めArduino IDEのlibrariesフォルダにコピーしておいてください。
PS2Keyboardライブラリは、少し修正しているのでzipファイルに同梱しています。
そのままコンパイルは通ると思います。
オリジナルのライブラリは、onDownイベントしか取れないのですが、onUpイベントも欲しかったので、その辺りを修正しました。
USBホストシールドのUSB給電問題
SparkfunのUSBホストシールドは、USBから給電で動作させる場合、電圧不足でAndroid Accessoryのデバイスとして認識されません。 これはMicroBridgeでも同様です。 その原因と対策は、Arduino + USBホストシールド で ADK を試す(その2)のUSBホストシールドの項 を参照してください。
使い方とか
Android側には特にアプリは必要とせず、完成したデバイスをAndroidに接続すると、即使えます。
その際には設定で、USBデバッグをONにしてください。
設定の方法は、
設定 > アプリケーション > 開発 > USBデバッグ
ソフトキーボードが消える問題
FlickWnnで、このデバイスを使うと、ソフトキーボードが消えてしまい、通常時にフリック入力で文字を入力したくても出来なくなってしまいました。
その場合、一度他の入力方法に変更して、FlickWnnに戻すとソフトキーボードが表示されるようになりました。
最後にプログラムの話を少し・・・
MicrobridgeでAndroidのキー操作をする方法
Microbridgeではコネクションを作る時に "shell:" と指定すると、ADBのshellに接続することができる。
コード例)
<br /> Connection * shell;<br /> ...<br /> // Initialise the ADB subsystem.<br /> ADB::init();<br /> // Open an ADB stream to the phone's shell. Auto-reconnect<br /> shell = ADB::addConnection("shell:", true, adbEventHandler);<br />
後は、shellコネクションに対してコマンドを送信するだけで、ADBのshell操作ができます。
キー操作のshellコマンドは input で、テキストの指定やキーイベントの指定で、キー操作を行えます。
shell->writeString("input keyevent 23n");
参考)
adbを使って端末にキーイベントを送る – TechBooster
今回のハマりポイント
今回テストに利用したのは、 Nexus One,IS01,HT03A なのですが、N1だけで発生する不具合があった。
キー操作が、Microbridge接続後に、最初の1回だけ正しくできるものの、その後2回目からは操作ができなくなると言う不具合。 これはキー操作だけではなく、shellコマンド全般に言えることかもしれない。
IS01やHT03Aでは問題なく操作できるのに、N1だけで発生する。
ちなみに、XOOMではMicrobridge自体が動かない。
■解決策その1
@yishiiさんのブログでは、
実際にADBから送る場合には、以下のような文字列を送ればキーイベントが発行されます。
shell:exec input keyevent 23
と有ったので、コマンドの先頭にexecを付けてみた。(shell:execと付けるとエラーが発生した)
shell->writeString("exec input keyevent 23n");
これで、一応2回目以降の操作もできるようになったものの、困ったことに、キー操作のバッファリングが行われなくなると言う副作用が現れた。
どういうことかと言うと、例えば「konnnitiha」と普段通り連続で入力すると、「k」とか「h」とかだけが入力されて、未処理の途中のキー操作が全部吹っ飛んでしまう。
一応、1文字ずつゆっくりと入力すればキー操作は可能なので、「これでいいか・・・」と妥協モードに入ったのだけども・・・
■解決策その2
Microbridgeで公開されているライブラリには、exampleとしてArduinoのシリアル経由で操作するshellターミナルのようなプログラムが含まれている。
試しに、このshellプログラムを利用して、手入力でinputコマンドを実行すると2回目以降も問題無くキー操作ができることが分かった。
では、このshellプログラムと、自作のプログラムの違いが解法となるのでは無いか・・・
違いの一番分かりやすいところとしては、shellプログラムでは1回inputコマンドを実行するのに複数回 shell->write を実行してるのに対して、自作のプログラムは1回の shell->writeString で済ましている。
と言うことで、結論。
inputコマンド実行後、さらに改行コードだけを1回送信すると、自作のプログラムでも2回目以降のキー操作ができるようになった。
コード例)
// inputコマンドの送信<br /> shell->writeString(command);<br /> <br /> // ADB_OPENを待つ<br /> while(shell->status != ADB_OPEN) ADB::poll();<br /> <br /> // ダミーで改行を送信<br /> command[0]='n';<br /> shell->write(1, (uint8_t *)command);<br />
これが正しい解決方法かどうかは分からないけど、Nexus One,IS01,HT03A 3機種全てでキー操作ができるようになった。
しかし、まだ入力の反応の鈍さは残ってる・・・でも、まぁ自分的には、とりあえずこれで満足しています。
(なにか他に解決方法があれば是非教えて欲しいです)
関連記事
-
-
Android+Arduinoでリモコン4(Microbridge接続)
前回AndroidAccessory接続で作った赤外線学習リモコンを、今回はMicrobridge接
-
-
米粒AVRでSoftModem的なこと その2
前回は「米粒AVRからAndroidへデータを送る」ことを試しました。 今回はその逆の「And
-
-
赤外線リモコン受信機(イヤホンジャック接続)のアプリ
前回の赤外線リモコン受信機(イヤホンジャック接続)の回路 を使う為のAndroidア
-
-
Arduino + USBホストシールド で ADK を試す(その1)
先日Google IOで発表された Android Open Accessory。みなさん知ってます
-
-
Androidで温度計(STTS751使用)
Androidに温度センサー(STTS751)を繋いで温度表示してみました。 温度
-
-
Androidで一眼レフカメラのシャッターを制御する(MicroBridge接続)
以前書いた、Androidで一眼レフカメラのシャッターを制御するでは、AndroidとArduino
-
-
Raspberry PiをWindowsで操作する(SSH)
SSHを使って、Raspberry Piを外部PC(Windows)で操作する。
-
-
AndroidでSoftModemを試してみた
今回、ここで言うSoftModemとは、携帯電話のオーディオ端子(イヤホン・マイク端子)を利用し
-
-
Android + Arduino でリモコン2 (softmodem接続)
以前、LAN接続のリモコン Android + Arduino でリモコン と言うものを作ったのです