ハードウェアボタンを自作して、Android端末に増設した話です。
写真のようなボタンをAndroid端末に接続して、ネイティブなアプリケーションと
連動させるという事をやりました。
前回の記事で書いた、Androidアプリの案件ですが、ハードウェアボタンを自作する必要がありました。マイコン使ったり、ドライバー開発したりが必要なのか…?はたまたBluetooth…と色々考えましたが、開発の手間や、機器コスト、運用の手間諸々鑑みて、何かもっと簡単な方法を…ということで以下の方法にたどり着きました。
イヤホンには再生や停止、ボリュームのアップダウン等のボタンが付いたものがあります。あの仕組みと同じものを自作して、アプリでフックする事ができれば…以下実装方法です。
調べてみたところ、アレらはイヤホンジャックのマイク接続部分からの入力を受け取って判断しているとのこと。
GND接続部分とマイク接続部分の間に抵抗とスイッチを並行に入れた回路を作って、
平常時:抵抗経由
スイッチON時:抵抗なしのスイッチ経由
と、回路がつながるようにすることで、スイッチのON/OFFを捕まえるという仕組みのようです。
そして、抵抗の大きさを変える事でハードに伝える信号の種類を変えられる様子。
回路図的には以下です。
今回、抵抗は22KΩを使用しました(22KΩは手元の端末的にはHEADSETHOOKという信号が来ます)。
↓実証実験中。
イヤホンジャック端子はマイク対応のもの(端子が4つに分かれているもの)を使用します。今回は100均(セリア)で買った延長コードを分解して流用しました。
このケーブルの皮膜を剥くと、こんな感じで4本の線が現れます。
見にくいですが、左から順に緑・青・赤・茶色の4色に分かれていて、このうちの青と茶色がMICとGNDです。
スイッチは何でもいいですが、今回はこれを選択。
組み立てます。
ハード側が完成。
で、押し釦をAndroid側アプリでフックするためのコードが以下です。
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
Log.d("KeyCode", "KeyCode:" + event.getKeyCode());
// ボタン押下を捕捉
if ( (event.getAction() == KeyEvent.ACTION_UP) && (event.getKeyCode() == KeyEvent.KEYCODE_HEADSETHOOK) ) { // Wired(HEADSETHOOK)
// お好みの動作内容を記述
return true;
}
return false;
}
dispatchKeyEvent()で捕まえたキーイベントが目当てのもの(今回の場合はKEYCODE_HEADSETHOOK)だった場合に動作するようにしています。
event.getAction()をKeyEvent.ACTION_DOWNではなくKeyEvent.ACTION_UPにしているのは、DOWNだと押している間、連打になってしまったので、押したタイミングではなく、離したタイミングを捕まえるようにしています。
ちなみに、作ったボタンが実際のところ何のイベントを発生させるか、ですが、以下のアプリを使うことで調査できます。
本来、各種キーの動作を別の動作に割り当て直すというアプリなのですが、外付けのボタンのイベントを扱う為の「ボタンを追加」の機能を使うことで、作ったボタンが何のイベントを発生させているかを割り出すことが出来ます。
…てな感じです。