Helixの親指拡張を作った

Thumbhelix Rev1

f:id:yskoht:20180427001120j:plain

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

先行例

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

デモ動画

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

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

不具合

凡ミスのまとめです。

PCBの裏表が逆になった

f:id:yskoht:20180428144808j:plain

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

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

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

f:id:yskoht:20180428150706j:plain
スイッチのパターンが上下さかさま&配線忘れ

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

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

f:id:yskoht:20180428151715j:plain

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

f:id:yskoht:20180429005414j:plain

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

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

実装について

ハードウェア構成

f:id:yskoht:20180429023406p:plain

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

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

パーツリスト

部品 メーカー名 定数・型番 個数 備考
抵抗 - 4.7k 2 リード付き・1/6W。I2Cプルアップ用
抵抗 - 10k 1 3216チップサイズ抵抗。SWプルアップ用
マイコン Atmel ATtiny85-20SUR 1 Atmel ATtiny25, ATtiny45, ATtiny85 Datasheet
ジョイスティック Top-Up Industry Corporation JT8P-3.2T-B10K-1-16Y 1 TOP-UP INDUSTRY CORP. -- JT8P-3.2T
秋月電子JT8P-3.2T- -1-16Y Model (1)
ジョイスティック用キャップ - - 1 今回はWholesale Product Snapshot Product name is for 3D analog joystick cap for PSP 2000 PSP 3000 thumbsticks thumb sticks capを加工して使用
スイッチ Kailh PG1350-* 1 CherryMX互換スイッチも可
PCB - - 1 thumbhelix_device/rev1/pcb at master · yskoht/thumbhelix_device
アクリルプレート - - ボトム・トップ各1 thumbhelix_device/rev1/case at master · yskoht/thumbhelix_device
Kailh Low Profileの場合、厚さは1.5mm~2.0mmが適
ネジ・ナット・ワッシャー - M2 - Kailh Low Profileの場合は10mmネジが適
ゴム足 - - - -

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

PCBの作成

f:id:yskoht:20180429143218j:plain

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

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

f:id:yskoht:20180429144158p:plain

アクリルケースの作成

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

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

Ponoko用.svgの作成

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

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

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分で十分でした。

f:id:yskoht:20180429153558j:plain
Ponokoに発注したアクリル

f:id:yskoht:20180429153611j:plain
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.mkincludeコメントアウトすれば無効にできます。

写真

f:id:yskoht:20180430221341j:plain

f:id:yskoht:20180430221355j:plain

f:id:yskoht:20180430221402j:plain

感想

  • Helixにシリアル口が出てるのすごい良いですね。自作キーボードにはもれなくシリアル口をつけておいてほしい
  • モノが実用できるレベルに達しなかったのは残念でしたが、PCB発注やアクリル加工の経験が得られたのは良かったです
    • 特にPCBの設計は初めてでしたが、この程度なら簡単にできるんだなと感動しました
    • 改善はしていきたいです。モチベーションが続けばですが

  1. Pointing DeviceとMouse Keysを両方使う場合は、mousekey_send(void)host_mouse_send()コメントアウトして、Mouse Keysのmouse_reportpointing_device_task内で書き換えれば所望の動作が得られました。が、両方使うメリットはあんまりないかも