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内で書き換えれば所望の動作が得られました。が、両方使うメリットはあんまりないかも

Helix ビルドログ

Helix を作りました

運よく、2018/3/6にあったHelixの一般販売でステンレス5行版キットを購入することが出来ました。

f:id:yskoht:20180415221400j:plain

公式のビルドガイド(helix/buildguide_jp.md)を見ながら順に作成しました。

それから、以下の動画内でHelixの作成風景が紹介されています(16:10頃から)。これがとても参考になりました。

作成風景

いくつかの作業だけ写真を載せておきます。

ダイオードの実装

SMDダイオードのはんだ付けは初めてでした。こて先は白光 こて先 1C型 T18-C1を使いました。

f:id:yskoht:20180415221608j:plain

バックライトLEDの実装

ビルドガイドには220℃と書かれていますが、はんだが全然溶けなかったので270℃弱くらいで短時間を意識してはんだ付けしました。

TwitterでLED実装に関してアドバイスをいただきました(ありがとうございます)。この治具は、おそらく基板の裏から添えることで、はんだ付けする際にLEDが穴の下に落ちてしまうのを防ぐためのものだと思います。基板の個体差に依ると思うのですが、自分の基板はわりとLEDの大きさぴったりだったので、ポリミイドテープで止めておくだけで十分でしたが、LEDがポロポロ落ちて困るといったときはあると便利かもしれません。

Pro Microのはんだ付けまで終わった時点でLEDのテストをしました。 以下のKeymapを使うことで簡単にテストすることができました。

キースイッチの実装

ロープロファイルスイッチも使いたいし、CherryMX互換スイッチも使いたいなー」みたい優柔不断なことを考えていたところ、Twitterで以下の記事を教えていただき、Mill-Maxソケットというものを知りました。

ただ、このソケットはロープロファイル用の穴には入らないんですね。(これは完全に自分が確認しなかったのが悪いです。@nillpoさん、こちらこそお騒がせしてすみません。)

ということで、今回はKailhロープロファイルスイッチの茶軸をPCB直に実装することにしました。

ファームウェアビルド

以下の記事にファームウエアの設定ファイルについて書かれていますが、自分も設定ファイルを間違えてRGBLIGHT_ENABLE = yesしてるのにLEDつかないなーと少し悩みました。この記事に出会えてよかったです。

オーディオケーブル

いくつかオーディオケーブルを試しましたが、相性が結構あるらしく、キーが反応しないケーブルやバックライトLEDがつかないケーブルがありました。おかしいなと思ったら、いくつか試してみるのがいいのかもしれません。

完成

開始から10時間かかりました。

f:id:yskoht:20180415234105j:plain

f:id:yskoht:20180415234127j:plain

f:id:yskoht:20180415234132j:plain

f:id:yskoht:20180415234135j:plain

キーマップ

f:id:yskoht:20180416000018p:plain
QWERTYレイヤー

f:id:yskoht:20180416000033p:plain
LOWERレイヤー

f:id:yskoht:20180416000037p:plain
RAISEレイヤー

f:id:yskoht:20180416000041p:plain
ADJUSTレイヤー

感想

  • PCBの緻密さがかっこいい、シルクのデザインがかっこいい
  • バックライトLEDかっこいい、OLEDかっこいい
  • ステンレスプレートの重厚感、しっかり感がめちゃめちゃいい
  • ロープロファイルスイッチかっこいい。ただ自分は平面のキーキャップよりはアールがかかったキーキャップのほうが好きかも
  • 下段7キーあるの便利
  • はんだ付けは少し大変
  • 1回の通販でほとんどのパーツが全部集まるのすごい

ErgoDox EZを買った

ずいぶん時間が経ってしまったのですが、ErgoDox EZについて書いておこうと思います。

注文

2018/1/1にergodox-ez.comで注文しました。構成は以下です。

  • 1x Tilt/Tent Kit - White for $25.00 each
  • 1x The Wing: Custom ErgoDox EZ Wrist Rest - White for $30.00 each
  • 1x ErgoDox EZ Original Standalone - Blank / White / Cherry MX Silent Red for $240.00 - Shipping : $30.00 USD

総額は$325.00 USDでした。

f:id:yskoht:20180415145947p:plain
注文画面

受け取り

2018/1/20に到着しました。

カスタマイズ

キーキャップの交換

真っ白は味気なかったのでKBDfansでキーキャップを買い、既に持っていたキャップと混ぜて使いました。

キー刻印も欲しくなったのでBAROCCO MD600のキーキャップを外して付けました。

f:id:yskoht:20180415161232j:plain
キーキャップカスタマイズ後の見た目

キースイッチの交換

キースイッチはCherry赤軸のサイレントで注文しました。使ってみると軽いタッチ感でとても静かにタイピングできるのはとても良かったのですが、クリック感のないリニア軸なのでどこで入力されたのかが分かりずらく、キーの底まで力を入れて叩いてしまい指が痛くなってしまうので交換することにしました。

公式サイトを見てみると、2018年の1月からCIY featureがデフォルトで組み込まれたそうなので、付属のKeycap pullerを使って簡単に取り外せました。

f:id:yskoht:20180415163836j:plain
Keycap pullerのピンセットみたいになっているほうでスイッチの爪を押しながら引き抜くと簡単に外せます

代わりに使うスイッチはTALP KEYBOARDでGateronの茶軸を購入しました。

さすがにGateron茶軸は赤軸サイレントに比べればタイピング音が大きいので、職場で使うのは断念しましたが、好みの打鍵感になりました。

f:id:yskoht:20180415163843j:plain
Gateron茶軸に交換

キーマップのカスタマイズ

こんな感じで落ち着いています。下段と親指周りのキーがうまく活用できていない感があります。

f:id:yskoht:20180415171058p:plain
BASEレイヤー

f:id:yskoht:20180415171102p:plain
LOWERレイヤー

f:id:yskoht:20180415171654p:plain
RAISEレイヤー

感想

  • BAROCCO MD600やLet's splitでは右手側Bキーを割り当てる余裕がなかったのですが、Ergodoxはキーが多くて良いです。ただ少し大きすぎる感があり、机の上を圧迫します
  • 親指付近のキーはホームポジションから遠いのでほとんど使えてないです
  • キーキャップのカスタマイズは楽しいですが、必要なのが1u, 1.5u. 2uで集めるのが少し大変かもしれません

QMK Firmwareのkeymap.cからアスキーアートを出力するスクリプトを作った

Keymapviz

Keymapviz: https://github.com/yskoht/keymapviz

導入

Python3で動きます。

$ pip3 install keymapviz

使い方

レイヤーごとにアスキーアートを出力します。ファイルパスにキーボードの文字列があればそこからキーボードを特定します。 現状はergodox(ergodox_ez)lets_splitにしか対応していませんが…

以下のキーボードレイアウトに対応しました。(2018/08/01)


$ keymapviz.py qmk_firmware/keyboards/ergodox_ez/keymaps/default/keymap.c

/*
 *
 * .---------------------------------------------. .---------------------------------------------.
 * |  EQL  |  1  |  2  |  3  |  4  |  5  | LEFT  | ! RGHT  |  6  |  7  |  8  |  9  |  0  | MINS  |
 * !-------+-----+-----+-----+-----+-------------! !-------+-----+-----+-----+-----+-----+-------!
 * | DELT  |  Q  |  W  |  E  |  R  |  T  |TG(SYMB| !TG(SYMB|  Y  |  U  |  I  |  O  |  P  | BSLS  |
 * !-------+-----+-----+-----x-----x-----!       ! !       !-----x-----x-----+-----+-----+-------!
 * | BSPC  |  A  |  S  |  D  |  F  |  G  |-------! !-------!  H  |  J  |  K  |  L  |LT(MD|GUI_T(K|
 * !-------+-----+-----+-----x-----x-----!ALL_T(K! !MEH_T(K!-----x-----x-----+-----+-----+-------!
 * | LSFT  |CTL_T|  X  |  C  |  V  |  B  |       | !       |  N  |  M  |COMM | DOT |CTL_T| RSFT  |
 * '-------+-----+-----+-----+-----+-------------' '-------------+-----+-----+-----+-----+-------'
 *  |LT(SYM|QUOT |LALT(|LEFT |RGHT |                             ! UP  |DOWN |LBRC |RBRC | FN1  |
 *  '------------------------------'                             '------------------------------'
 *                               .---------------. .---------------.
 *                               |ALT_T(K| LGUI  | ! LALT  |CTL_T(K|
 *                       .-------+-------+-------! !-------+-------+-------.
 *                       !  SPC  ! BSPC  | HOME  | ! PGUP  |  TAB  !  ENT  !
 *                       !       !       !-------! !-------!       !       !
 *                       |       |       |  END  | ! PGDN  |       |       |
 *                       '-----------------------' '-----------------------'
 */
(以下略)


Keyboard Layout Editorで使えるjsonファイルも出力できます。 -oで指定されたファイル名に含まれる{}が添え字に置換されてレイヤーごとにファイルになります。

$ keymapviz.py qmk_firmware/keyboards/lets_split/keymaps/default/keymap.c -t json -o 'lets_split{}.json'
$ ls lets_split*.json
lets_split0.json  lets_split1.json  lets_split2.json  lets_split3.json  lets_split4.json  lets_split5.json

このjsonをKeyboard Layout Editorにアップロードします。

f:id:yskoht:20180225204057p:plain
Keyboard Layout Editorにjsonをアップロード

すると以下のような感じで画像にしてくれます。

f:id:yskoht:20180225204222p:plain


QMK FirmwareのKeycodesと凡例の関係はlegends.pyで変更できます。 この辞書に書いていないものは接頭辞のKC_を取り除いたものになります。

legends = {
    'XXXXXXX': '',
    '_______': '',
    'KC_TRNS': '',
    'KC_NO': '',
    'LCTL(KC_Z)': 'UNDO',
    'LCTL(KC_Y)': 'REDO',
    'LCTL(KC_C)': 'COPY',
    'LCTL(KC_V)': 'PASTE',
    'LCTL(KC_X)': 'CUT',
    'KC_PSCREEN': 'PSc',

   # (以下略)
}

感想

  • keymap.cを絵にするんじゃなくてKeyboard Layout Editorからkeymap.cを作れるようにすべきだったのかもしれない
  • 結局アスキーアートだすのもjson出すのもテンプレートを作っておかないといけないのがめんどくさい
    • MATRIX_ROWS, MATRIX_COLSがあるんだから自動でいい感じのレイアウトを作れるのかもしれない
  • keymapviz.py自体がpngやらjpegやらを作るわけでもないのにvizと名付けたのは大仰だったかもしれない

Ruby on Rails チュートリアル 第14章をやったメモ

Ruby on Rails チュートリアル:実例を使って Rails を学ぼうRails 5.1(第4版)

14章はユーザーのフォロー。

  • 気合で終わらさせた。特に詰まったところはなかった。
  • 11章でできなかったherokuでのメール送信のためにSendGridのインストールを試したけどできなかったので、サポートにチケット出した
    • スパム認定されてブロックされていたらしい。アンブロックしてもらって、すんなりインストールできた

感想

  • rails testでfailureした時の絶望がすごい
    • たいていはタイポか、編集するファイルが間違っていたかだったけど
    • 最初は全部コピペでよいかもしれない。ホントに必要になったらもう一回やればいいわけですし
  • Rails, AWS, Heroku一通り触れてよかった
  • 演習の解答をまとめてくれてるサイトがありがたかった。理解が深まった
  • やり遂げるためのモチベーションが辛い
    • このブログにメモを書いていたから最後までできたと思う。メモの内容が他の人の役に立つかどうかはさておき

Let's split ビルドログ

Let's split を作りました

Let's split: qmk_firmware/keyboards/lets_split at master · qmk/qmk_firmware

今回はRGB Underglowなし、リセットスイッチなしで作りました。

ケースはサンドイッチプレート1です。サンドイッチプレートでも強度の面で 特に不安は感じませんが、どうせならv2-case2で作れば良かったかなとも思います。

参考にしたビルドログ

作成にあたって以下の記事を参考にさせていただきました。

いくつかの些細なこと

上記のビルドログを参考に組み立てればなんの問題もないのですが、 いくつかの些細なことを確認しておくとトラブルを回避できるかもしれません。

pro micro の動作確認

pro micro は初期不良があったりするらしいので、組み立て前に書き込みできるか確認しておきました。

pro micro のモゲ対策1

USBケーブルの抜き差しによりpro micro側の端子が取れてしまうことがあるようなので、取り付け前にグルーガンで端子の両側を補強しておきました。

f:id:yskoht:20180212001057j:plain
pro microのモゲ対策1

スペーサが入らない…

今回使ったパーツだけの問題だったのかもしれませんが、pro microの隣にスペーサを取り付ける際にアクリル側の穴とPCBの穴の中心がずれていたので、自分が用意した厚みのあるスペーサは取り付けられませんでした。なのでここだけ家にあった別のスペーサを使ってナットで固定しています。事前に注意しておくと焦らずに済むかもしれません。

f:id:yskoht:20180212002420j:plain
わかりずらいですが、アクリルの穴とPCBの穴の中心がずれている

f:id:yskoht:20180212002427j:plain
肉厚の薄いスペーサを取り付けてナットで固定

pro micro のモゲ対策2

AliExpress.com | ケーブルマグネット充電

モゲ対策にマグネットで取り外しできるケーブルを買いました。このケーブルのマグネット部分は上下を逆にしても取り付けできるようになっているのですが、どちらか一方はデータ通信はできないようです(充電は上下どちらでもできる)。それから、Let's splitのdefaultのキーマップでは左手側にケーブルを刺さないとキーマップが左右反転したようになってしまうみたいです。公式ビルドログのトラブルシューティングに似たようなことが書かれていました。

f:id:yskoht:20180212003549j:plain
ケーブルマグネット

ダイオードのつけ忘れ

作り終えた後にキーマップをいじっていると、反応しないキーが1つありました。 最初はファームを疑っていたのですが、defaultのキーマップでも反応しないので、 どうもHWが問題っぽく、基板をよく見てみるとダイオードを1つ付け忘れていました。 Let's split では48のダイオードを使うので、事前に数えてからつけ始めれば防げるミスでした。 付け忘れたダイオードは他のダイオードとは別の面に実装することになってしまい、少しかっこ悪いのですが無事に動作しました。

キーマップ

f:id:yskoht:20180212012900p:plain
yskoht配置

ほどんどdefaultのままです。配列沼は深そうなのでこれから変わるかもしれませんが、現状は以下のような感じです。

  • ESCTABに変更。TABを2回押すとESCになる(Tap Dance)
    • TABQの隣にあってほしいけど、ESCも左上に欲しい。ESCを押すときは大体2回ぐらい叩いている気がするので問題ないけど、TABを連打できないのは辛いかもしれない
  • Aの隣はCtrl
  • 左手下段はAdjustを削除。SpaceShiftに置き換え。どうやら自分は右手親指でしかSpaceを押さないらしい
    • 左手親指のShiftはかな/英字切り替えをShift+Spaceに割り当てているため
  • EnterキーはタップでEnter、ホールドでShift
    • Enterの押しっぱなしができなくなるけど連打でカバー
  • Lowerレイヤー, Raiseレイヤーはdefaultのまま

あと、なぜかKC_LALTGUIキーと認識されていて、KC_GUIが’Altキーと認識されているっぽい?これは自分の環境のせいだと思うけど…

写真

f:id:yskoht:20180212015514j:plain
ダイオードとTRRSジャック取付後の写真。D24の付け忘れがばっちり写っていました

f:id:yskoht:20180212015547j:plain
なんでルパンなんですか?

f:id:yskoht:20180212015716j:plain
スイッチがつくとテンションが上がってきます

f:id:yskoht:20180212022935j:plain
完成。完成したその日が砲雷撃戦よーいの日だったので「たまもち屋」さんで頒布されていた時雨ちゃんキーキャップを付けてみました

Ruby on Rails チュートリアル 第13章をやったメモ

Ruby on Rails チュートリアル:実例を使って Rails を学ぼうRails 5.1(第4版)

13章はマイクロポストの実装。