これまでの課題
去年、PSP用っぽいスライドジョイスティックモジュールを、ポインタデバイスにしたことを記事にしました。
この時、これを使い続けることができませんでした。それには複数の理由がありました。
PSPっぽいジョイスティックをトラックポイント代わりにする試み、ユニバーサル基板に移して、少し感度チューニングして、まともに操作できるくらいになってきた。
— 74th (@74th) October 29, 2022
ただ、土台の安定性が足りなくて操作しにくい。やはりキーボードの人差し指の位置に仕込まないと。 pic.twitter.com/3iDLTsS1Aq
- 親指での操作は難しい。
- 小さいユニバーサルボード上に実装したため、操作時の安定性が悪い。少し力を加えると、モジュール全体を傾きそうになってしまう。
- ファームウェアがこなれていない。細かい操作をするには感度が良すぎて操作しにくく、大きく動かすには動く量が少ない。
モジュール基板化
以前の記事ではユニバーサルボード上に実装するため、MUC ATTiny202はSOP8の変換基板を使っていました。これをモジュール化するために、PCBを設計しました。このジョイスティックモジュールと、ATTiny402を載せ、さらに電圧を安定化させるためにキャパシタを積みました。さらに I2C の接続口を追加するために、4極オーディオケーブルよりは取り回しが良いだろうと、M5Stackでも使われている Grove と互換性のある HY コネクタを追加しました。
これで、GroveのI2Cを持つMCUと通信できるようになりました。
Sparrow59 に組み込んだ
この 1、2を解決するために、以前ブログにも書いたケースに収めるタイプの自作キーボード Sparrow59 の次のバージョンに組み込むことにしました。
Sparrow-C には、Groveの端子となる HYコネクタソケットを追加し、コードを通すように穴を開けました。また、トッププレートもコードを通せるように、穴を開け、さらにモジュールをスペーサーを経由してネジ止めするためのM2の穴を開けておきました。これで、PicoからI2Cで通信してモジュールを使うことができます。
ジョイスティクのトラックポイントもどきが乗ったキーボード、物理的にはできた!
— 74th (@74th) January 3, 2023
(ソフトウェアがまだ) pic.twitter.com/OSuexRPT2L
しかし、組み込んだだけでは使い勝手は良くなく、結局使わないまま時が経っていました。
ファームウェアをチューニングした
2月のある日、天下一キーボードわいわい会(以下、天キー) vol.4 が発表されました。自作キーボードの研究成果を持ち寄ってみたいと思うようになり、天キーまでにチューニングすることに決めました。
天キーまでに、この赤ぼっちモジュール良い感じにチューニングしたい。。。 pic.twitter.com/nXCwbkIXDU
— 74th (@74th) February 11, 2023
使い勝手が悪いと思いながら、以下の課題を感じていました。
- スティックの傾き具合(この部品の場合は移動量)でアクセルを制御するならば、せいぜいできて4段階の制御しか人間には無理である。
- 特に低速のために「ちょっとだけ動かす」という操作が難しい。
- 低速にレンジを設けると、高速動作までのジョイスティックの傾き量と速度の関係が、線形にならない。
この解決として、以下のようにチューニングできると思いました。
- スティックの傾き具合とポインタの速さの関係式は、階段状にする。
- 低速のレンジを広く取ることで、低速の制御をしやすくする。
- ジョイスティックの傾き以外の要因で、早く移動するモードを用意する。
このファームウェアは以下のコードです。
以下の通り速さ制御の部分は定数で切っているだけです。
const int deadzone = 100; const int high_zone = 7; const int middle = 200; void read_analog(int vcc, int a, int *under, int *upper) { int max = vcc; int center = vcc / 2; if (a < high_zone) { *under = 5; } else if (a < middle) { *under = 3; } else if (a < center - deadzone) { *under = 1; } else { *under = 0; } if (max - high_zone < a) { *upper = 5; } else if (max - middle < a) { *upper = 3; } else if (center + deadzone < a) { *upper = 1; } else { *upper = 0; } }
更に、2回コツコツっと動かすと早く移動できる、ゲームのダッシュ操作のような、ダッシュモードを実装しました。どんなそうさかはTwitterに上げた動画がわかりやすいです。
キーボードに付けたジョイスティックモジュールをチューニングした。2回こつこつっとやるとダッシュモードになって早く動かせる。 pic.twitter.com/qUuInTwNs0
— 74th (@74th) March 3, 2023
これで良い感じの実用に足るデバイスにすることができました。
天キー会場で体験できるようにした
このキーボードを天キー会場に持ち込みました。
設置Done #天キー pic.twitter.com/h5Pg8w6Oiu
— 74th (@74th) March 4, 2023
このツイートの写真にはでていないのですが、Chromebookを持ち込み、キーボードを接続し、実際にポインターを操作して体験できるようにしました。
そして何人かの方に実際に触っていただき、実用に足るくらいになっているねと言ってもらうことができました。
昨日チューニングした、このトラックポイントもどきも、Chromebook 置いて実際に何人か触っていただいて、操作感実用レベルになってるよねと言ってもらえた。
— 74th (@74th) March 4, 2023
あと結構ゲームパットのやつが通りがけにぺしぺしされていたw https://t.co/bGgT3zTrJY
めちゃくちゃ使いやすかったです👏✨ https://t.co/pxRwRPFm25
— パレットシステム よっぴ' (@4py1) March 4, 2023
離席時で直接お話出来ませんでしたが、トラックポイントのチューニング動作試させて頂きました!
— tsnd (@tsnd0524) March 4, 2023
同じジョイスティック持っているので分かりますが、機構上の扱いにくさをダブルクリック動作で見事に解消されていましたね。
わざわざツイートでお知らせまでしてくれて、感激です。
本当にこれはオフラインイベントでなければできなかったことで、天キーには非常に良いイベントだったと思います。
今後のプラン
このジョイスティックモジュール自体は非常に安価に購入できるものですが、ファームウェアと合わせて価値を作り出せたように思うので、モジュールの販売にこぎつけたいと思います。
また、Sparrow59 には付属モジュールとして、この特徴的なポインターデバイスをもった自作キーボードキットとして世に出したいと思います。
その前に、Sparrow59 では Sparrow62v2 と同様に KMK Firmware で作っており、KMK Firmware 側にも若干のチューニングを加えて、動くようにしていました。このまま QMK Firmware に持っていったのでは、使い心地のよいものではないと考えています。なので、その前に Sparrow59 の QMK Firmware への対応と、QMK Firmware 向けのJoyPointファームウェア側のチューニングをするつもりです。
更に思うこと
このように I2C で通信できる AZ1UBALL などの追加モジュールが、OLEDの他に自作キーボードの世界でもっと広まってくれたら面白いのになと思いました。