AndroidにPS2キーボードを繋いでみた

公開日: 電子工作 | , , ,

@yishiiさんの素のAndroid端末を外部のキーにより操作する実験と言う記事を参考に、Arduino+MicrobridgeでAndroidにPS2キーボードを繋いてみました。
※PS2ってプレイステーション2のことじゃないよ

以前、wimejibimeji経由でキー入力を行うデバイスをArduinoで作ったことが有りますが、今回のものはwimejiやbimejiと言ったAndroid側のアプリは必要無く、ハードウェアキーボードが付いた端末と同等な操作できます。
若干反応は鈍いですが・・・実用レベルかも

microbridge keyboard

以前作った経験から「これは余裕だろ」と思ってたのが、思わぬ所でハマってしまい完成まで若干時間がかかりました・・・が、なんとかハマった所も対策が出来たっぽいので、また作り方を紹介したいと思います。

デバイスの概要

  • 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モジュールを接続するためのピンヘッダが付いているけど、モジュールを付けなければ特に問題は無い。

microbridge keyboard

こっちは、昔のbimeji clientの写真。
Bimeji Client 写真1 Bimeji Client 写真2

 

回路図

microbridge keyboard 回路図

実際には、ArduinoにUSBホストシールドを接続してから、各部品の配線を行って下さい。

PS2 キーボード ピンアサイン

1 DATA
2 NC
3 GND
4 5V
5 CLK
6 NC

 

ps2keyboardキーアサイン(mini-din6)

 

作り方とか

上の回路図をもとに部品を接続し、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デバッグ

設定 > アプリケーション アプリケーション > 開発 開発 > 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機種全てでキー操作ができるようになった。
しかし、まだ入力の反応の鈍さは残ってる・・・でも、まぁ自分的には、とりあえずこれで満足しています。
(なにか他に解決方法があれば是非教えて欲しいです)

 

関連記事

秋月電子 リアルタイムクロック(RTC)モジュール

秋月のリアルタイムクロック(RTC)モジュール

今回は秋月電子のI2C接続のリアルタイムクロック(RTC)モジュールを買ったので、ちょっと試してみま

記事を読む

Raspberry Pi 起動SDカード

Raspberry Piの起動SDカードを準備する

先日入手したRaspberry PiでLinuxを起動する為のSDカードを準備します。 Ras

記事を読む

Androidで気圧高度計

androidで気圧・高度計(LPS331AP使用)

Androidと大気圧センサー(LPS331AP)をイヤフォンジャックで繋いで気圧と高度、ついで

記事を読む

no image

SoundIRModemライブラリのサンプル

 SoundIRModemライブラリは、米粒AVR(Tiny10)とAndroid端末をイ

記事を読む

no image

AndroidとArduinoの接続で使えそうなBluetoothモジュール

1ヶ月ほど前に書いた、Android + Bluetooth + Arduino が割と人気があるよ

記事を読む

no image

Arduino + USBホストシールド で ADK を試す(その2)

前回「Arduino + USBホストシールド で ADK を試す(その1)」では、Androidで

記事を読む

米粒AVR リモコン

米粒AVRでリモコン送信機

米粒AVR(tiny10)を使った赤外線リモコン送信機を作ってみました。 これで送信できるのは

記事を読む

no image

Bimeji Client for Arduino

前回紹介したWimeji Client for Arduinoの最後で予告していた、Wimeji c

記事を読む

no image

ボツネタ~CAN的な何か

少し前に必死になって作ってたデバイス+アプリですが、気持ちが萎えてしまい、結果ボツと

記事を読む

no image

米粒AVRでシリアル通信(ただし送信だけ)

米粒AVR(ATtiny10)にUART機能は搭載されていないので、シリアル通信を行う為には自前

記事を読む

Arduinoで温湿度データロガー
Arduinoで温湿度計 #2

今回は、前回作った温湿度計にRTCモジュールとSDカードアダプタを

Arduinoで温湿度計
Arduinoで温湿度計

秋月電子の温湿度モジュールを使って、温湿度計を作ってみました。 以前

SDカード・マイクロSDカード
ArduinoでSDカード

電子工作で大量のデータを保存する方法を調べていると、 Arduin

秋月電子 リアルタイムクロック(RTC)モジュール
秋月のリアルタイムクロック(RTC)モジュール

今回は秋月電子のI2C接続のリアルタイムクロック(RTC)モジュールを

秋月電子 キャラクタLCD
秋月の小型キャラクタLCD

今回秋月電子で売られている小型のキャラクター液晶2種を買ったので、

PAGE TOP ↑