Helixビルドログ

自作キーボードHelixのキットを組み立てたときの作業ログです。

基本的には[公式のビルドガイド](https://github.com/MakotoKurauchi/helix/blob/master/Doc/buildguide_jp.md)を元に実装していますが、一部確認作業を追加したりしています。

## 買ったキットやそれ以外の部品

遊舎工房さんのキットを注文しました。注文してから2週間ほどで届いたはずです。
https://yushakobo.jp/shop/helix-keyboard-kit/?attribute_pa_helixtype=helix-s5-bl-w

5行版、ステンレスプレートのものを選びました。

また[キースイッチ](https://yushakobo.jp/shop/pg1350/?attribute_pa_stem=red)、[キーキャップ](https://yushakobo.jp/shop/pg1350cap-doubleshot/?attribute_pa_keycapcolor=black)も遊舎工房さんで購入しました。

[TRRSケーブル](https://www.amazon.co.jp/gp/product/B008PMEGJG)はamazonで購入しました。USBケーブルは家にころがってたのを使ったので出自が不明ですが、他のキーボードにつないで使用できることを確認したものを使いました。

## 使った道具

マスキングテープ以外amazonで購入しました。

- [はんだごて](https://www.amazon.co.jp/gp/product/B001PR1KLK)
    - なんでこれにしたのか覚えていないのですが、いまのところは問題ないです
    - いろんなところでおすすめされているのは白光の[FX600](https://www.amazon.co.jp/dp/B006MQD7M4)なので買うならこっちのほうがいいかも
- [こて先](https://www.amazon.co.jp/gp/product/B0036RW764)
    - 基本は早く温めたいので、細かいところ以外にはんだするときに使いました
    - 細かいところははんだごてに付属のB型のを使っています
- [はんだこて台](https://www.amazon.co.jp/gp/product/B001UNTRTG)
    - こて先を掃除するのは[別で購入](https://www.amazon.co.jp/gp/product/B001PR1KOW)
    - 台についてくるのは水に濡らして使うスポンジで、こて先がいちいち冷えるのが個人的に微妙だったので買い足しました
- はんだ
    - 細かいところは[0.3mmの鉛フリー](https://www.amazon.co.jp/gp/product/B000W9IS1M)
    - LEDやスルーホール（穴にピン差してそこをはんだするやつ）は[0.8mmの鉛あり](https://www.amazon.co.jp/gp/product/B0029LGAMA)
        - 「融点の関係で高温で壊れるLEDを鉛フリーではんだ付けするのは難しい」と聞いたので鉛ありでやってます（そのうち慣れたら鉛フリーでやりたい）
        - スルーホールは穴に流れる関係ではんだ量が多い方がやりやすいので太いほうでやってます（こちらは別に鉛フリーでも問題ない）
- [はんだ吸い取り線](https://www.amazon.co.jp/gp/product/B001PR1KPQ)
    - ミスった時用
- [PCファン（吸煙器代わり）](https://www.amazon.co.jp/gp/product/B002TOK0QY)
- [テスター](https://www.amazon.co.jp/gp/product/B005BE4XZS)
- [ピンセット](https://www.amazon.co.jp/gp/product/B0036RSP4W)
    - ダイオードが小さいので素手だと厳しいはず
    - 逆作用ピンセットもあるんですが今回は用意するだけして使わなかった
- [ニッパー](https://www.amazon.co.jp/gp/product/B0711B8DG9)
- [カッターマット](https://www.amazon.co.jp/gp/product/B0029M485A)
- 細めのマスキングテープ
    - 随分前に購入したものなので買った場所は不明（確かどこかの文房具屋）
    - 部品固定用

## ファームウェアビルド環境

Macを使ってファームウェアをビルドしてProMicroに書き込んでいます。ここでは詳細は割愛します。
詳しくは[`qmk_firmware` のドキュメント](https://docs.qmk.fm/#/newbs_getting_started)を参照してください。

## 組み立て

PCB左右両方を、上面が見えるようにした状態です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/18011/cf784f42-6a80-796a-0ce9-cee2b7e29e77.png)

### PCBの一部をジャンパ

OLEDを使う場合、一部にジャンパ（ランドとランドが導通する状態にする）が必要です。ビルドガイドの通りにジャンパさせます。

これ、ジャンパさせたいランドにはんだが盛られるだけで全然ジャンパできなくてなんかやたら難しかったのですが、普通にちゃんとジャンパする部分のPCBをあっためたらいいんでしょうか……（なんならここが一番難しかった気がする……。）

### ダイオードはんだ付け

シルク（PCBに書いてある白い線）の向きを合わせてダイオードを付けます。ダイオードは表面実装（スルーホールではなく表面のランドにはんだ付けする）なので、やり方を色々調べて↓の手順でやりました。

1. ランドの片方（利き手側）にはんだを薄く盛る
1. ピンセットでダイオードをつまみ、その盛ったはんだを溶かしながらダイオードの金属部分（ピン？）をはんだにつける（仮留め）
1. ダイオードの向きが合っていること、ダイオードがPCBから浮いていないことを確認する
1. もう片方をはんだ付けする
1. 仮留めした方をもう一度はんだ付けする（仮留めだと強度があまりないので）

1列ごとに上記の手順を両手分やります。

はんだ付けした後はこんな感じです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/18011/02acab57-4d6c-fda6-e6c0-aa8734003634.png)

### LEDはんだ付け

まず、はんだこての温度を下げます。私のは最低250度だったのでそれでやりましたが、公式ビルドガイドを見る感じ、もっと低めのほうが安全そうです。下記の手順ではんだ付けしましたが、1個ずつやると時間がかかって大変だったので、列ごともしくは1手順ずつ全部やっていくほうが効率がよかったです。

1. LEDを向きを合わせてはめる
    - シルクで○印のあるランドにLEDのGND（一番大きいランド）を合わせる
    - このときちょっと上から押さえると外れにくい（確実に外れなくなるわけではない）
1. GNDをはんだ付けしてLEDが動かないようにする
1. 他をはんだ付けする

2が終わった時の写真が↓です。（なぜか上下反転した写真しかありませんでした。。）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/18011/cf749de2-f5ca-6d63-bc4d-d2ca013503e3.png)

その後の3が終わり、はんだ付け終了時の写真が↓です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/18011/278e845e-eeaf-6788-642e-98f9fe74ccc6.png)

GNDのはんだ付けは、はんだでLEDがこて先にくっついてPCBから取れてしまうことが何回かありました。上記で書いた通りPCBではめた時に押さえておくと多少マシになりましたが、それでも外れるのであわてずにピンセットで取りましょう。私は途中からめんどくさくなってマットの上でこて先を振って取ってましたがマネしないでください。

はんだ付け自体は、PCB側のランドにはんだを盛っておいて、それをこて先でLEDのランドに伸ばしてくっつける感じでやりました。LEDが熱に弱いので、あまりこて先を当てないようにするとよさそうです。手早くやるのが大事っぽい。

### ProMicroにスプリングヘッダをはんだ付け

先にLEDの動作確認をしたかったので、ビルドガイドから順番を変えて先にProMicroにスプリングヘッダをはんだ付けしました。
はんだ付けのやり方はビルドガイドと同じです。

### LEDテスト用ファームウェアを焼いて動作確認

ProMicroをPCBに付けて（スプリングヘッダをPCBの穴に差して）、PCに接続します。ターミナルで `qmk_firmware` のディレクトリに移動してから `make helix/rev2:led_test:avrdude` を実行し、LEDテスト用に用意されているファームウェアを書き込みます。（ProMicro2つとも）
すると↓のようにLEDが色を変えながら点灯するはずです。ここで点灯しない場合ははんだミスなどを確認します。（今回は片手側にはんだミス1箇所、はんだ忘れ1箇所がありました）

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">とりあえずLEDつけたところでLED確認した　次もう片方やる <a href="https://t.co/yPMFUlKdDR">pic.twitter.com/yPMFUlKdDR</a></p>&mdash; ひよ or ひょっしー (@hyoshihara04) <a href="https://twitter.com/hyoshihara04/status/1103608693029888000?ref_src=twsrc%5Etfw">2019年3月7日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

### TRRSジャック&リセットスイッチはんだづけ

ビルドガイドのままです。TRRSジャックは傾かないようにマスキングテープで固定してはんだ付けしました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/18011/7d269a34-cbf2-9292-ea72-419fb09e477d.png)

### 両手を接続した状態でLEDがつくか確認

TRRSジャックの動作確認も兼ねて、両手のPCBを繋いだ状態でLEDの動作確認をしました（とはいえLEDがハード的に失敗してないか不安なだけなので、やらなくてもよかったかも）
やることはProMicroを両方のPCBに装着→TRRSジャックをケーブルで繋ぐ→左手側のProMicroにUSBケーブルを差すだけです。ファームウェアは先ほど書き込んであるので、問題なければ↓のように両手が光ります。終わったらUSBケーブルを抜いてからTRRSケーブルを抜きます。

両手のLEDの色が合わない時もあったような気がするのですが、PCB内で色があってれば大丈夫だろうと思ってスルーしました。（本当にそれで問題ないかは不明）

<blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"><p lang="ja" dir="ltr">左右つなげた　とてもまぶしい　しかしLEDつけるの、片手ではんだミス2箇所あっただけで済んだのでだいぶスムーズだった <a href="https://t.co/HwpfsZWE7Y">pic.twitter.com/HwpfsZWE7Y</a></p>&mdash; ひよ or ひょっしー (@hyoshihara04) <a href="https://twitter.com/hyoshihara04/status/1103617181638488064?ref_src=twsrc%5Etfw">2019年3月7日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

### OLEDまわりはんだ付け

ここもビルドガイドの通りです。ただ、OLEDソケットはTRRSジャックやリセットスイッチよりも背が低い部品なので、それらより先にOLEDソケットをはんだ付けしたほうがやりやすかったかも？　私はやりにくかったのでProMicroを一旦外してはんだ付けしました。

ソケットをはんだ付けし終わったら、ProMicroを装着してから、その上に被さるようにOLEDピンヘッダとディスプレイを装着します。装着後にOLEDディスプレイとOLEDピンヘッダをはんだ付けします。こうするとピンヘッダが傾かないのではんだ付けしやすいです。

### プレートに絶縁シールを貼り付け

私が買ったキットはステンレスプレートなので、このままだとプレートに電流が通ってショートします。
そのため、プレートに絶縁シールを貼ります。貼るプレートはキースイッチをはめる穴が空いているプレートで、PCBに面する側に貼ります。シールにLとRが示してあるので、それを確認しつつ、プレート - シール - PCBの順で合わせてみて向きが問題ないかもあわせて確認すると確実です（最初片方を逆に貼りそうになった）

↓の写真だとわかりにくいですが、右上に「R」の文字があります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/18011/15026c67-6043-6612-23b3-78d1b8b5134c.png)

なお、ボトムプレート（キースイッチ用の穴が空いてないやつ）はスペーサーによりPCBと接しないので絶縁シールは不要です。

### キースイッチはめ→はんだ付け

![image.png](https://qiita-image-store.s3.amazonaws.com/0/18011/9e712db7-b7be-29bf-7eb7-e98b4a55974c.png)

写真のようにプレートとPCBを合わせて、キースイッチをはめていきます。ステンレスだからか固くて結構つらかったですが、キースイッチがプレートにひっかかるツメの部分をちょっと押してからはめると多少楽でした。

はめ終わるとこんな感じになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/18011/e5d930ea-f405-f5ef-2bf9-49ecc004f53d.png)

きちんと全部のキースイッチの足がPCBから出ているのを確認してから、はんだ付けします。私は片手ずつキースイッチを押してきっちりはまっていることを確認してからはんだしていきましたが、わりと簡単に浮くので、1個ずつ押さえる→はんだづけする、を繰り返したほうが安全かもしれません。

ここまでで組み立てはほぼ終わりで、あとはスペーサーやねじでプレートをPCBに留めて、キーキャップをはめるだけです。その前に、PCBにファームウェアを書き込んだりして動作確認をしました。

### 動作確認

TRRSケーブルをジャックに差してから **左手**側のProMicroにUSBケーブルを差し、動作確認します。USBケーブルを差した側が左手と認識されるので間違えないようにします。先程書き込んだLEDテスト用のファームウェアはデフォルトのキーマップになっていたので、デフォルトのキーマップ定義をGitHubで見ながら確認しました。

### ファームウェアいじり（OLEDディスプレイの表示変更）

デフォルトのファームウェアのディレクトリをコピー（今回は `keyboards/helix/rev2/keymaps/default` を `keyboards/helix/rev2/keymaps/hyoshihara04` にコピー）してから自分用にファームウェアを変更します。やったのはキーマップの変更とOLEDの表示内容の変更です。前者については割愛して、ここでは後者について書きます。

HelixはデフォルトのキーマップだとWin/Macに接続した時のために一部キーの動作を変更するキーが割り当てられています。そのキーを押してキーの動作が変わると、それに合わせて左側のOLEDディスプレイにWin/Macを表わすロゴが表示されるようになっています。が、私はmacにしか接続する予定がなかったので、 ~~推しのアイドルの顔文字~~ 好きな顔文字を常に表示するようにしました。また、右側もついでに変えてみたくなったので ~~推しのアイドルグループのマーク~~ 好きな柄を表示するようにしました。いじってはみたかったがネタがなかった。

まず [Helixのファームウェアのガイド](https://github.com/MakotoKurauchi/helix/blob/master/Doc/firmware_jp.md#%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA) を元にフォントの元になるファイルを変更しました。
最終的なフォントは以下のようになりました。もともとあったロゴを上書きする形で追加しています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/18011/2b31c433-b6fc-f059-f5d5-dea53d4fcd69.png)

その後はファームウェアのコードを変更します。
左側は `keymap.c` の `render_status()` 関数の中で描画されていたので、その中でキーの動作変更に合わせて表示を変えている部分を顔文字が出るように修正しました。書き込む値はどういう根拠で計算してるのかよくわからなかったのですが、もともとあったロゴの位置から計算しました。実際のコードはこんな感じです。

```C
  static char logo[2][7]={{0x95,0x96,0x97,0x98,0x99,0x9a,0},{0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0}};
  matrix_write(matrix, logo[0]);
  matrix_write_P(matrix, PSTR("\n"));
  matrix_write(matrix, logo[1]);
```
右側は同じ `keymap.c` の `render_logo()` 関数の中で描画されていたので、こちらも左側と同様に書き換えます。 `0x20` は空白で、省くと☆がくっつきます。

```C
  static char logo[2][20]={
  {0x9b,0x9c,0x9d,0x20,0x9b,0x9c,0x9d,0x20,0x9b,0x9c,0x9d,0x20,0x9b,0x9c,0x9d,0x20,0x9b,0x9c,0x9d,0},
  {0xbb,0xbc,0xbd,0x20,0xbb,0xbc,0xbd,0x20,0xbb,0xbc,0xbd,0x20,0xbb,0xbc,0xbd,0x20,0xbb,0xbc,0xbd,0}
  };

  matrix_write(matrix, logo[0]);
  matrix_write_P(matrix, PSTR("\n"));
  matrix_write(matrix, logo[1]);
```

両方とも、配列の初期化時の要素数を修正するのを忘れないようにします（数が合ってないとビルド時にエラーで止まります）
変更したら次のコマンドを実行してビルドと書き込みをします。

```console
$ make helix/rev2:hyoshihara04:avrdude
```

両手とも書き込んだら、USBケーブルを抜いて、TRRSケーブルで左右を繋ぎ、改めてUSBケーブルを左手側のProMicroに接続して動作確認して完了です。TRRSケーブルを差したままでUSBケーブルを抜き差しすると予期しないところに電流が通って最悪壊れるらしいので注意します。

完成してから写真を撮ったので保護プレートがついてたりキーキャップがすでにはまっていたりしますが、OLEDは↓のように表示されます。（ `Layer: ○○○` の `○○○` のところは現在のレイヤーによって変わります）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/18011/712777ea-0144-86b2-2ac1-6b7645309192.png)

### プレートねじ止め&キーキャップはめ

OLED保護用とボトム用のプレートを、ビルドガイド通りスペーサーをはさみつつねじ止めします。表面保護のシートを剥がすのにいつも苦戦します。
その後、カスタマイズしたキーマップにあわせてキーキャップをはめます。購入したキーキャップだと一部キーは対応するものがないので、別のキー用のもので代用します。

## 完成

![image.png](https://qiita-image-store.s3.amazonaws.com/0/18011/e5910095-b8de-365e-da74-752bb2439f19.png)

## 使ってみての感想

ステンレスなので割とずっしりしてます。少々押してもずれない。
最近使っていたのがErgo42だったので、数字キー行があるキーボードを久々に使っているのですが、便利だと思う一方で、わざわざ遠くまで指を伸ばさなくても、別レイヤーでホームポジションの近くに設定した数字を押している時もあります。Emacsとかで同時押しするときは数字キーあった方が便利かなと思うのですが、慣れの問題のような気もします。
あと `Default` , `Lower` , `Raise` , `Adjust` （キーボード自体の調整用のキーがあるレイヤー）の4レイヤーを設定しているのですが、このキー数だとレイヤー数は3つで十分な感じがしてきました。というのも、押したいキーが大体 `Default` と `Lower` にあるせいで多分1回も `Raise` レイヤーを使っていない……。もっとキー数減らしてレイヤーも `Default` と `Lower` と `Adjust` だけで私は十分かもしれない、ということがわかりました。この辺はOSやどういう作業をするのかで結構変わりそうです。
ただ、それだとErgo42でいいという話になりそうなんですが、そもそも最下段も若干余ってるので、3行＋親指で押すキーがいくつかあれば私の場合はいいのかも？　ということに気づいたのでまた別のキーボードを作る予定です。最終的には設計から自分でやりたい。