できるだけコンパクトなUSB接続のトラックボールを探していましたが,適当なものが見つからなかったので自作しました.ケースに入れて完成した状態で35x24x12mmという非常に小型のトラックボールに仕上がりました.
トラックボールにはAliExpressで売っていたHW-204 (ICSH044A)というモジュールを使用しました.これはBlackBerry端末で使用されている直径5.5mmのトラックボールを使いやすいモジュールにしたもので,SparkFunで扱っている製品と同等品のようです.中心のボールを回転させると4方向についている小さい磁石のローラーが回転して,その下に設置されたホールセンサーで検知してパルスを出力する仕組みになっています.またボールを押してプッシュスイッチとして利用したり,赤・青・緑・白のLEDが付いていてボールを光らせることもできます.このモジュールの動作電圧は2.5-5.25Vと広いのですが,LEDを使う場合は5Vで使うのがよいと思います.
USBのHIDデバイスとしてマウスのように動作させるので,Pro Microを使ってArduinoでソフトを開発しました.Blue PillでもUSBが使えますが,今回は少しでも小さくしたかったのでPro Microを使いました.Pro Microとトラックボールの基板を薄い両面テープで張り合わせて,UEW線で配線しました.回路が単純なので,回路図は書かずに下記の対応表を用意して配線を行いました.
Trackball (HW-204) | AVR (Pro Micro) |
BLU | 9 (PB5) |
RED | 8 (PB4) |
GRN | 6 (PD7) |
WHT | 4 (PD4) |
UP | 3 (PD0/INT0) |
DWN | 2 (PD1/INT1) |
LFT | RXI (0/PD2/INT2) |
RHT | TXO (1/PD3/INT3) |
BTN | 7 (PE6/INT6) |
GND | GND |
VCC | VCC |
LEDの取り付けが内部で入れ替わっているらしく青色と赤色の発光が逆でした.LEDを光らせる必要はあまりないのですがせっかくあるので,通常は緑色,移動させると白色,クリックすると赤色に光るようにしました.
ファームウェアもかなり単純な作りになっています.4つのホールセンサーからのパルスの立上がり・立下りは外部割込みを使って非同期にカウントします.そしてメインのloop()関数では10ms毎にそれらのカウンターの値を調べてUSBマウスとして信号を送信します.ボールを押したかどうかもこのタイミングで調べることでチャタリングに対処します.ケースは3Dプリンターで作りました.
ハードウェアもソフトウェアも簡単なのですぐに完成しましたが,実用性はやや微妙でした.サイズはとてもコンパクトでボールも操作しやすいのですが,トラックボールの分解能が低すぎました.素早くボールを回しても,1秒間に10パルスほどしか出力されません.PC等の大きな画面でマウス代わりに使うには向いていないようです.