2015年9月30日水曜日

新キーボード プロジェクト? - ポインティング デバイス内蔵タイプの開発

Bluetooth LE(BLE)版のNISSEの開発は前回で一段落ということで、今回はNISSEのようなキーボードに求められることの多いポインティング デバイス内蔵版の開発のお話です。

タッチセンシング アナログパッドを内蔵したNISSE

なお、BLE版のファームウェアについてはその後も開発を継続していてます。前回は、『ファームウェアの書き換えには、TSUBOLink-IIのようなCMSIS-DAPデバッグアダプタが別途必要』でしたが、現在はNordic社のnRF Toolboxアプリを使ってスマートフォンなどからファームウェアを更新することもできるようになっています(より詳しくはこちらを)。

スマートフォン(iPhone版)からBLE版のNISSEのファームウェアを更新しているところ。
BLE版のNISSEの発売については引き続き検討中です。すぐに販売開始とはしていない理由としては、
  1. Bluetoothの登録料金の扱い(最終的には料金を製品価格に反映させることになるので、NISSEのような製品では1台あたりの負担がかなり高額になります)。
  2. nRF51822のICリビジョンの扱い(HRM1026ではRev. 2が使われていますが、Nordic社の最新のICはRev. 3となっていて、SDKの対応もRev. 3専用になってきています。現在のBLE版NISSE用のファームウェアはRev. 2用にカスタマイズしてあります)。
といったところがあります。1.については大量生産モデルから離れることのできる今のMakersムーブメントを考えると、無料でEPL登録ができた2014年1月以前の体系の方が良かったような印象はありますね。

内蔵するポインティング デバイスの選定


エルゴノミック キーボードのユーザーの方はなるべく手をホームポジションから動かしたくない、という方も多く、NISSEについてもポインティング デバイスの内蔵タイプのリクエストをいただくことがありました。

NISSEやオリジナルのTRONキーボードの場合は、親指のキーが弧状に配置されていることもあって、その中心付近のスペースにポインティング デバイスを置いてみたいというアイデアをかなり前からもっていました。

キーボードに内蔵されているポインティング デバイスとしては、
  • タッチパッド
  • トラックボール
  • ポインティング スティック(トラックポイントなど)
が定番になるでしょうか。それぞれに良い所がありますが、3Dゲーム機が登場してからは親指を使ったアナログ スティックの操作に慣れた人がとても多くなっていることもあって、NISSEではアナログ パッドを使うことにしました(スティック タイプではなく、パッドにしたのは、汎用品のスティック タイプのものは操作するのに必要とされる力が大き過ぎたため)。

アナログパッドを親指のキーの下側に配置することにして、次に決めないといけないのは、マウス ボタンをどこに配置するか、ということでした。一番安易なのは必要な数だけさらにボタンを追加するというもの。 ただ独立したカーソルキーまでオミットしているNISSEで、わざわざボタンを増やすというのはナンセンスということがありました。

アナログパッドに指が置かれているかどうか検知できれば、キーボードのキーをマウス ボタンとしても兼用できるはず、ということで先月タッチセンサーを組み込んだアナログパッドを作って実験してみました。結果は思った以上にうまく行きました。

タッチセンサーを組み込んだアナログパッドの試作品。白いプラ板の下側にタッチセンサーがあります。
最近のマイコンはタッチセンサーを作るために必要な機能があらかじめ組み込まれているものが多くなっています。タッチセンサーの電極部分とマイコンを繋げば簡単にタッチセンサーを作ることができます。写真のように電線1本でON/OFFの区別ができるという仕組みはとても面白いものなので、気になった方は調べてみてください。

プリント基板


タッチセンサーを組み込んだアナログパッドを使ってみた結果は満足の行くものでしたので、 実際にプリント基板を起こしてNISSEに組み込んでみることにしました。スペースが限られた場所に部品を詰め込むこともあって、製品版のNISSEでははじめて表面実装部品を使っています。(Makers本からは"Use surface-mount components if at all possible"というのがルール#8に出てきていますね。)

アナログパッドの基板(製品版)。設計にはいつも通りKiCadを使っています。

アナログパッドの基板上のマイコン(PIC12F1822)と、NISSEの制御基板上のマイコン(PIC18F4550)はUARTで通信して動いています。PIC12F1822は必要がないときはスリープしているので、消費電流はごく僅かなものになっています(BLE版でも使えています)。

樹脂パーツ


静電容量式のタッチセンサーは電極と指までの距離が数ミリ程度離れていても、指が近づいてきていることを検出できます。ただ距離がありすぎるとさすがに検出が不可能になってしまいます。

今回のアナログパッドの形状は、厚みがありすぎるとタッチセンサーが指を検知できなくなってしまう一方で、薄すぎると操作感が良くない、という難しい部分でした。今はこういったパーツも高性能な3Dプリンタで手軽に出力して比較検討できるようになっているのはありがたいところですね。

3Dプリンタで出力した樹脂パーツの試作品。設計にはFusion 360を使っています。

ファームウェア


ファームウェア(PIC18F4550側)については、いつも通りGitHubから公開しています。

マウスカーソルの操作は、パッドの操作量に応じてかなり遅い動きから速い動きまで調整できるようにしてあります。遅い動きの場合は、単純に1ドット単位でカーソルが動くのではなくて、アナログパッドを10回スキャンするたびに1ドットずつ動く(実質0.1ドット単位で動いている)、というような操作をできるようにしてあります。

そのため慣れてくればマウスがなくても困らないような場面が多くなってくるかと思います。とは言っても、ノートパソコンとマウスをいつもセットで持ち歩いている人の多さからも明らかなように、マウスのポインティング デバイスとしての優秀さは圧倒的なものがあります。今回のアナログパッドも、ファームウェア側でいろいろと対処していますが、右手にマウスやデジタイザ、左手でキーボード ショートカットというような操作が基本になるCADソフトのようなアプリケーションの場合には、素直にマウスやデジタイザを使った方が効率は良いように思います。

タッチセンサーの処理は、タッチセンサーから指を離した時に on/off のしきい値を再計算するように実装しています。グラフは、実際の入力値、ローパスフィルタを通した値、しきい値を示したものです。

タッチセンサーのon/off判定。しきい値の下側にフィルタした値があればタッチしていると判定しています。

現在のファームウェア(ver 0.17)には組み込んでいませんが、パッドを動かし始めた時の速度に応じて感度を動的に変化させるような機能も組み込んでみるのもおもしろいかなと思っています。このあたりもファームウェアについては引き続き開発を進めていく予定です(マイコンのプログラム メモリの空きがさすがに少なくなってきていますが)。


まとめ


ポインティング デバイスについては、マウスやデジタイザなど非常に洗練されたデバイスが既にあるので、逆にアナログパッドなどになると良い汎用品が非常に少ないのが課題のひとつでしょうか。今回使用しているアナログパッドは作動力120±50gfとなっています。操作感についてはパッドの形状である程度対処していますが、理想を言えばもう少し軽いものがあると嬉しいところだろうと思います(パッドを中央に戻すためにある程度バネの力が強いものを使わないといけない、というような背景があるように思います)。

NISSEの制御基板とアナログパッド基板間で使っているシリアルのプロトコルはごく単純なものなので、カスタマイズしてみたい方は実際にいろいろと試してくださればと思います。PIC12F1822側のプラグラムもとても単純なものですが、こちらもご要望があるようであれば公開します(書き換えにはPICkit 3などが別途必要になります)。

というわけで今回は以上です。新キーボード プロジェクトもはじめて2年ほど経ちました。キーボードに関してはやってみたかったことはこれで一通りできたような感じもありますが、さらに要望等ありましたら、お気軽に。 :-)

お知らせ: ポインティング デバイス内蔵型のNISSEは今週からエスリルのウェブサイトから購入できるようになっています。