I2CトラックパッドTPS43-201A-SをQMK Firmwareで使う

tl;dr

  • トラックパッドTPS43-201A-Sは、2本指ジェスチャに対応した簡単に扱えるI2C接続デバイスだよ
  • QMK Firmwareにドライバが実装されているため、設定するだけで使えるよ
  • 3.3VのGrove接続化して、Raspberry Pi Picoにつなげて使ってみたよ
  • ポインタとしての性能は良さそうだよ
  • 2本指スクロールは若干難ありだけど、少し工夫したら、ある程度良くなったよ

TPS43-201A-Sとは

TPS43-201A-S とは、Azoteqが販売するI2C接続のトラックパッドバイスです。トラックパッドとしての機能を、I2Cで簡単に制御できるようにできています。IQS572というタッチセンサーICが含まれており、それがセンサーとしての制御をすべて行ってくれます。

Marutsu経由でDigiKeyから購入することができます。1個1,200円ほどと、とてもリーズナブルな価格で購入することができます。

www.marutsu.co.jp

以前、M5StackCore2、M5Dialを使ってトラックパッドを作った私ですが、この安価に買えるデバイスを一度触ってみたいと思っていました。

QMK Firmwareにはドライバが実装されている

TPS43(IQS5xx)は、QMK Firmware上でドライバが提供されています。

docs.qmk.fm

QMK Firmwareで利用するには、以下の記述を追加します。

rules.mk でポインティングデバイスの有効化と、ドライバを指定します。

# keyboards/sparrowxxt/rules.mk
POINTING_DEVICE_ENABLE = yes
I2C_DRIVER_REQUIRED = yes
POINTING_DEVICE_DRIVER = azoteq_iqs5xx

config.h でI2C接続するピンの指定と、TPS43を使う指定をします。

# keyboards/sparrowxxt/config.h
#pragma once

#define I2C1_SCL_PIN GP1
#define I2C1_SDA_PIN GP0
#define I2C_DRIVER I2CD0
#define F_SCL 100000
#define AZOTEQ_IQS5XX_TPS43 1

基本的にこれだけでファームウェアの基本的な準備はOKです。

なお、QMK Firmwareファームウェアを新しいキーボードで作る時の手順は、Zennの記事にしていますので、良ければ参照ください。

zenn.dev

Raspberry Pi Picoにつなぐ

私の最近作るキーボードは、ポインターバイスとの接続はGroveコネクタでやるようにしています。なので、TPS43にもGroveケーブルを実装しました。

Raspberry Pi PicoにI2Cデバイスを繋ぐ場合、プルアップがSDA、SCLに必要です。

私はブレッドボードにGroveコネクタを引き出すアダプタを作っています。このアダプタにはプルアップの機能も含まれているので、今回便利に使いました。

74th.booth.pm

これで、TPS43を、自作のRaspberry Pi Picoクローンボード(以下Pico)にブレッドボードを使って接続しました。

QMK Firmwareコンパイルし、Picoに書き込んだところ、USBキーボード、マウスとして認識し、Macで操作することができました。

操作感のファーストインプレッション

この施策の目的は、TPS43でどのくらい快適な操作感を得ることができるのかを調べることです。

ポインター操作

ポインターを動かすのはかなりスムーズだと感じました。MagicTrackpadほどとまではいえませんが、特に通常使用に問題ないくらい、意図通り動かすことができました。

タップ

タップ操作も問題なさそうでした。特にタップ時にポインターがぶれるということもなさそうでした。

2本指タップ

右クリックに相当する2本指タップは動作しました。2本指スクロール時に意図せず2本指タップとして認識されることはありません。

ただ、指を近づけすぎると1本指タップとして認識するようでした。意図的に2本の指を離してタップした際は、意図通り動作しました。この動作がくせ者で、なれれば良さそうですが、MagicTrackpadに慣れていると、ついつい指を近づけてタップしてしまいます。

2本指スクロール

2本指で触れた状態で上下に動かすスクロールが動作しました。

ただし、少しの動きでかなり数のカウントがされるようで、びゅっと動いてしまいます。ここはTrackpad本来の、ポインタのように移動量をPCに伝えているのではなく、マウススクロールのカウントをボタン動作のように伝えているようでした。そのため、移動量に相当する数のカウントを伝えており、100スクロールしたくらい一瞬で動きます。

加えて、2本指タップと誤認識されないためか、一定量動かした後にスクロールとする移動量が設定されており、ちょっと反応まで遅いように感じました。

また、2本指タップで指摘した、指を近づけすぎると1本指として認識する現象も同じく起こり、ある程度指を離して利用する必要があります。

ほか

他にスワイプなどのジェスチャに対応していますが、特に検証はしていません。

チューニングする

2本指を近づけすぎるとダメな問題は解決できる気がしませんでした(タッチセンサの問題)。

スクロールの移動量をチューニングすることにしました。

2本指スクロールが最初の認識されるまでの移動量を調整

こちらはパラメータ化されており、config.h記述することで調整できました。初期値50から10に減らしました。

# keyboards/sparrowxxt/config.h
#define AZOTEQ_IQS5XX_SCROLL_INITIAL_DISTANCE 10

2本指スクロールの移動量

2本指スクロールの移動量の制御を加えました。このあたりは、SparrowDialを作る時にもチューニングしたので、同じように割合で減らすようにしました。以下のコードは移動量を3%に減らすようにしたものです。keymap.c内に実装しました。

# keyboards/sparrowxxt/keymaps/default/keymap.c

#define SCROLL_SCALE_PERCENT 3

int32_t scroll_amount_h = 0;
int32_t scroll_amount_v = 0;

report_mouse_t pointing_device_task_user(report_mouse_t mouse_report) {
    scroll_amount_h += mouse_report.h * SCROLL_SCALE_PERCENT;
    scroll_amount_v += mouse_report.v * SCROLL_SCALE_PERCENT;
    int8_t h = scroll_amount_h / 100;
    int8_t v = scroll_amount_v / 100;
    scroll_amount_h -= h*100;
    scroll_amount_v -= v*100;

    mouse_report.h = h;
    mouse_report.v = v;
    return mouse_report;
}

これでびゅっと動いてしまうことはなくなりました。

どんな評価をしたか

ポインターとしては精度が良いと思いました。特に苦もなく、OSの移動量が多い時はさらに移動量を多くする機能などともうまく動きそうだと思いました。

2本指スクロールには難があります。そもそもTPS43の43x40のサイズでは2本指を動かす操作はあまり快適ではないと感じました。なので、Lenovo Trackpointの下部にあるようなクリック、スクロールボタンを併用する形の方が、サイズ的にも使いやすいように思いました。

残課題

まだ研究が必要と思ったのは2点です。

1つは固定の方法です。特にネジ穴があるようなデバイスではないため、接着で付けるしかありません。3Dプリンタで土台を作って接着することになると思います。

もう1つは、操作する面の処理です。操作する面はむき出しの基板に両面テープが付いており、何かをかぶせる必要があります。試しに2mmアクリルを乗せてみましたが、操作は貫通しませんでした。クリアフォルダーに貼ってみたところ貫通しました。タッチパネルの上に貼って良く、さらに触った感触の良い素材を見つける必要があります。

まとめ

I2CトラックパットデバイスをQMK Firmwareで使う方法と簡単なチューニング、その操作感の感想を紹介してきました。

安価に手に入り、組み込みも簡単なのもあって、今後分割キーボードの片方に組み込むことも考えてみたいと思います。

こんな感じで使えるTrackPointがあればいいのに……。