Thumbhelix Rev1

PCBとケースデータを置いていますが、いくつか不具合があります。Rev1を実際に作るのはおすすめしません。参考程度でお願いします。

先行例

既にHelixにトラックポイントを実装されている方がいます。使用感が気になります。

デモ動画

左側の隅に左ボタン、右側の隅に右ボタン、拡張キーにスクロールボタンを割り当てています。

このトラックポイントを使って細かい作業は難しいです。

不具合

凡ミスのまとめです。

PCBの裏表が逆になった

上記写真の左が表で、右が裏になるように設計していたんですが、アクリルプレートとPCBの隙間が無くてマイコンと抵抗がつけられませんでした。

それじゃあ裏表逆にして使おう。ジョイスティックとスイッチはリバーシブルで使えるパターンにしたし、と思ったのですが、スイッチは表面で使う用の配線しかしていませんでした。

さらに、キーのパターンがHelixと逆になってました。使用上は問題ないですが気持ち悪い。

スイッチのパターンが上下さかさま＆配線忘れ

スイッチが入りずらい、行が揃ってない、バックライトLEDがない

KailhロープロファイルスイッチのPCBマウントの足が入らないです（無理に押し込めば入る）。どうやらもう少し穴を大きくすべきだったらしい。

Helixのキーと行を揃えるつもりで設計したのですが、ちょっとだけ下にずれてしまいました。 バックライトLEDはもともとつける予定がなかったのですが、実物を見てみるとそこだけLEDが無いのはやっぱりかっこ悪いですね。

トラックポイントの操作感が悪い

ThinkPadのトラックポイントに比べて動かすときに力が要ります。 これはジョイスティックのデバイス自身の問題なのでどうしようもないですが、 カーソルの速度制御などはソフトで改善できる気がするので頑張りたいです。

実装について

ハードウェア構成

HelixのProMicroがI2Cマスタ、Attiny85がI2Cスレーブです。 スレーブはJoystickの状態を analogRead() 、スイッチの状態を digitalRead() で読み取り、マスタからリクエストがあったら、それぞれの状態をI2Cで返します。

Attiny85にはICSPでプログラムをアップロードします。

パーツリスト

マイコン、ジョイスティックは秋月電子通商で購入しました。 ジョイスティック用のキャップはAliExpress.comで"PSP joystick cap"等で検索すると見つかります。ただし、少し削らないとはまりません。

PCBの作成

以下のページと書籍を参考にKicadで作ってALLPCB.comに発注しました。

Order Timeが2018/4/8 23:42:50でFlow Progressが以下でした。

おおー pic.twitter.com/plo1SFFbpr — yskoht (@_yskoht) 2018年4月16日

アクリルケースの作成

大量ならオンラインで発注、少量・短TATならコワーキングスペーススペースに材料を持ち込み、と使い分けられるようにいろいろ経験したかったので、今回はPonokoとcoromozaの２か所にお願いすることにしました。

加工のためのデータはPonokoとcoromozaで異なるので２種類のデータを作る必要があります。

Ponoko用.svgの作成

GUIでポチポチやるのは面倒だと思ったので、Pythonのsvgwriteライブラリで作りました。

スクリプトはこんな感じになりました。生成されたSVGをInkscapeのテンプレートに張り付けてアップロードしました。

stroke , stroke_width , stroke_opacity , fill あたりは当然として、 stroke_miterlimit , stroke_dasharray も適切に設定しないとPonokoにアップロードできないっぽいです。

coromoza用.aiの作成

coromozaのデータ形式はIllustraor形式なので .svg を .ai に変換します。

Illustratorは持っていなかったので、Illustratorが使えるPCをkinko'sでレンタルすることにしました。

店頭のPCでゼロからデータを作るのは大変だと思いますが、 .svg を .ai に変換して線の色を変える程度であれば20分で十分でした。

Ponokoに発注したアクリル

coromozaで加工したアクリルの仮組

どちらの加工も思った通りにできてよかったです。

スレーブ側ソフトウェア

ATtiny85のソフト作成にはATTinyCoreを使用しました。Arduino IDEと既存のライブラリを利用できるので簡単でした。

送信データはアライン詰めれば3Byteで十分ですが、シンプルにしたかったので5Byte送っています。

マスター側ソフトウェア

I2Cマスタ

マスター側は LUFAのTWIライブラリを使っています。

スレーブにリクエストを送り、データを読みだすところはこんな感じになっています。サンプルのまんまですね。

void th_read(Thumbhelix *th) { if (TWI_StartTransmission((THUMBHELIX_ADDR << 1 ) | TWI_ADDRESS_READ, 20 ) == TWI_ERROR_NoError) { uint8_t byte1, byte2, byte3, byte4, byte5; TWI_ReceiveByte(&byte1, false ); TWI_ReceiveByte(&byte2, false ); TWI_ReceiveByte(&byte3, false ); TWI_ReceiveByte(&byte4, false ); TWI_ReceiveByte(&byte5, true ); TWI_StopTransmission(); ...

Pointing Device

読みだした値からQMK FirmwareのPointing Deviceを使ってカーソル移動、スクロール、クリックを行っています。

‘mouseReport.buttons‘は3bitから5bitを使うと書いてありますが、MSBが0bitです。

当初、マウスボタンのエミュレートにはQmkFirmwareのMouse Keysを使おうと思ったのですが、 Pointing DeviceとMouse Keysを両方有効にするとそれぞれで host_mouse_send() が呼ばれてしまい、 Mouse Keysでのドラッグが出来ませんでした1。

結局はプログラムをシンプルにしたかったのと、バイナリサイズがきつかったので結局Pointing Deviceのみを使うようにしています。

Makefileについて

qmk_firmware/users 以下にThumbhelixのファームを置くようにしました。使い方あってるのか謎です。

rules.mk の include をコメントアウトすれば無効にできます。

写真

感想