キーボードを自作するための情報メモ

自分はキーボードを自作している途中なのですが、
作るにあたって調べた事をメモしておきます。
偏見・誤解があると思うので異論はコメントにどうぞ。
適時追加します。

必要な構成要素
============

## スイッチ
種類がいろいろあってよくわからない。
プランドとバリエーションが選択空間としてある。
同一ブランドであれば、キーキャップは互換性がある。

ブランドとしては、CherryMXっていうのが一番メジャーのようだ。
Gateronっていブランドのキーが、MXと互換で安い。

CherryMXやGateronの場合、バリエーションは、軸の色であらわす。
重さやクリック感が違っていて、一概にどれがいいとは決められない。
だいたい友達に1人ぐらいは試軸機を持ってる人がいると思うので試すのがいいと思う。
自分の理解だと、茶軸が一番ベーシックで、他のはそれを重くしたり、
うるさくしたりした物という話なので、
とりあえず、茶軸を買っておいて、後で別なのに切り替えるのでもいいと思う。

自分はGateronの茶軸を1つ23セントで60個買った。

## キーキャップ
ピンキリで、安いのからかなり高いのまである。
種類もいろいろあるっぽいがよくわからない。

redditのキーキャップまとめ記事が割と良くまとまってる。
https://www.reddit.com/r/MechanicalKeyboards/wiki/keycap_guides

選択空間としては、対応するキー、キーキャップの形、素材、装飾がある。

キー本体の上部にはキーキャップをつけるところがあるのだが、
これがキーによって違うので、キーにあうキャップを買う必要がある。

キーキャップの形というのは各キーの傾きぐあい。
http://keycapsdirect.com/images/faq/FamilyProfilesLG.jpg
そもそも、キーの傾きに種類がある事すら知らなかった。
格子型キーボードにはすべての段が同じ形の物が似合うかな。

素材はよくわからない。
ABSとかPBTとか。

装飾はまあ、好きな感じで適当に。
自分は、きっとコロコロ配列をいじるし、
無刻印のHHKで生活してたので、そのまま無刻印のキーキャップにした。
海外では、レトロなキーでなぜかひらがなが刻印されてるのや、
都道府県のロゴがのってるのが流行してるかもしれないが驚かないように。
http://imgur.com/kIYJSNS
http://xahlee.info/kbd/promethium51_keyboard.html

たぶん、大量生産されているのは安くて、数が出ないのは高いんだろう。
CherryMX(かGeteron)用のはユーザーが多いからか安いように見える。
自分は安いのでいいや、という事で、PBT製の87keyのものを13ドルで買った。
(が109キーのものが届いた。書いてなかったがDSAみたいな形をしてる。)

## ケース
キーボードの中身を保護するという役目の他に、キーを保持するという役目もある事がある。
プラスチック製の物もあれば、金属板から切り出したもの、アクリル板を切ったのもなど様々。
キーボードのオリジナリティを出すために、様々な種類のケースが小数ずつ作られている。
つまり高い。40ドルから100ドルを越えるものもある。
自分は、3Dプリンタで印刷する事にした。

## PCB
いわゆる基板。
キーと後述するコントローラーを繋ぐ役割をする。
ケースと同じでキー配置によって違うので、大量生産はできない。
10ドルから60ドルぐらいが相場か？
PCB無しで手配線で頑張ってる人もいるらしいので、自分は手配線にチャレンジしようと思う。

## コントローラー
何10個もあるキーの情報を、1本のUSBで送るために変換がいる。
普通のキーボードは専用チップなんだろうが、
キーボード自作派はそんなものを使えないので、
汎用のCPUを使う。
調べた感じ、ハードウエアUSBサポートがあるATMega32Uを使うのがメジャー
一部の高級製品にはARMが乗っているものまである。
左右セパレートタイプのキーボードには2つ必要。
自分は、ATMega32U2を基板に入れてUSB端子をつけたPro Microという製品を1つ3ドルで2つ購入。

## ファームウエア
専用チップのかわりに汎用CPUを使うのはメリットがあり、
その上で動かすソフトウエアにはある程度自由がきく。
レイヤと呼ばれる複数キーを同時に押した時の挙動を変えたり、
1キーで複数の事ができるようにしたりできる。
今はQMK Firmwareというのが良く使われてるっぽい。
https://github.com/qmk/qmk_firmware

## お金
||単価|数量|合計|
|:-:|:-:|:-:|:-:|
|Gateronスイッチ|23セント|60|13.80ドル|
|キーキャップ|13ドル|1セット|13ドル|
|コントローラー|3ドル|2|6ドル|

常にAliexpressの送料無料の所からだけ買ってる。
その他、配線とか細々した物を入れて35ドルぐらい。

専門用語
=======

## キーキャップを付ける土台
キーボードの事。
キーキャップに拘りすぎる人はこう呼ぶらしい。
https://mstdn.mechkey.jp/@riv_mk/1907

## end game
たぶん「俺が考える究極の」みたいな意味っぽい。
至高のキーボードは何ていうかは知らない。

## double shot
エスプレッソの事ではない。
キーキャップの刻印は使いこむと消えたりする。
筆者の私見ではそれはそれで味があっていいと思っている。
(ビーマニファンでずっとBM98をプレイしている先輩のキーボードが、
ASZXCだけ刻印が消えているのを見てカッコイイと思っていた)
しかし、それでは困るという人もいて、その対策として、
字の部分とまわりの部分を別の色のプラスチックを押し出し成形して作る手法がある。
2種類押し出し成形するので、double shotという訳だ。

QMK Firmware
============
https://github.com/qmk/qmk_firmware

- QMK Firmwareは、TMK Firmwareをベースにしている、というよりは、TMK Firmwareの上にQMKのレイヤを作ってるように見える。
- ATmegaとARM Cortex-Mをサポートしてる。
- ARMにはChibiosを使ってる。 OS使ってるのか。すごいな。
- HHKB用ファームとかいうのまである。
 - 基板取り替えてサポートするらしい。
 - http://qiita.com/shela/items/62324752ff703bae3e74
- Let's splitの場合、左右のコントローラーにそれぞれ1つづつファームウエアを入れる。
 - 左右は完全に同じファームウエア。
 - デフォルトでは起動時に自分がUSBにつながってるマスターか、マスターにぶらさがるスレーブかを判断して自動的にそうなる。
 - 見た目は4行12列のキーボードだが、ファームウエア的には8行6列扱いになるらしい。

## コンパイルと書き込み

QMK Firmwareはソースコードで配布されているので、
コンパイルして書き込まなければならない。

自分がやったステップを書き出しておく。
マシンは、Ubuntu 17.04

1. sudo apt-get install gcc unzip wget zip gcc-avr binutils-avr avr-libc dfu-programmer dfu-util gcc-arm-none-eabi binutils-arm-none-eabi libnewlib-arm-none-eabi
2. git clone --recursive https://github.com/qmk/qmk_firmware
3. cd qmk_firmware/keyboards/lets_split
4. make
5. make rev2-serial-avrdude

ところが、Step5が失敗した。
rules.mkを見ると、シリアルポートの変化を待って書き込みにいくようだが、
手元のPro Microはシリアルポートを使ってアレこれするファームが既に書き込まれていたため、
変化というのはシリアルポートが消える変化になってた、
ちょっといじって、新しく増えた時だけ書き込みを開始するようにしたら動いた。
単に手でタイミングをみて書き込んでも良いと思う。

## スキャン

うっかり配線がショートした場合に壊れないか考えてみたい。

とりあえず、Let's split キーボードの例を見てみる。
https://github.com/qmk/qmk_firmware/blob/master/keyboards/lets_split/matrix.c
以下のコードはqmkファームウエアからの抜粋

init_colsとunselect_rowsで初期化が行われる。

```
static void  init_cols(void)
{
    for(int x = 0; x < MATRIX_COLS; x++) {
        _SFR_IO8((col_pins[x] >> 4) + 1) &=  ~_BV(col_pins[x] & 0xF);
        _SFR_IO8((col_pins[x] >> 4) + 2) |= _BV(col_pins[x] & 0xF);
    }
}

static void unselect_rows(void)
{
    for(int x = 0; x < ROWS_PER_HAND; x++) {
        _SFR_IO8((row_pins[x] >> 4) + 1) &=  ~_BV(row_pins[x] & 0xF);
        _SFR_IO8((row_pins[x] >> 4) + 2) |= _BV(row_pins[x] & 0xF);
    }
}
```
col_pins、row_pinsの上半分には、IOレジスタアドレス、下半分にはビット位置が入ってるっぽい。

データシートによると、IOレジスタは、入力レジスタ、方向レジスタ、出力レジスタの順にアドレスが並んでいる。
また、出力レジスタはプルアップを兼ねる。
https://avr.jp/user/DS/PDF/mega8U2.pdf

つまりループ内の1行目は、方向レジスタ、2行目は出力レジスタをいじってる。
たしか、_BVは(1<<n)というマクロで、~してるから、指定したビットを0にしてて、
つまり、1行目は、そのピンを入力に設定。
2行目は、逆にそこを立ててるから、そのピンをプルアップにしてる。

つまり、初期化時は両方プルアップの入力に指定されてる。

で、スキャンだけど、select_rowして、read_colsしてる。

```c
static void select_row(uint8_t row)
{
    _SFR_IO8((row_pins[row] >> 4) + 1) |=  _BV(row_pins[row] & 0xF);
    _SFR_IO8((row_pins[row] >> 4) + 2) &= ~_BV(row_pins[row] & 0xF);
}
static matrix_row_t read_cols(void)
{
    matrix_row_t result = 0;
    for(int x = 0; x < MATRIX_COLS; x++) {
        result |= (_SFR_IO8(col_pins[x] >> 4) & _BV(col_pins[x] & 0xF)) ? 0 : (1 << x);
    }
    return result;
}
```

えーと、select_rowは、そのピンを0V出力に設定して、
read_colsは、入力が0Vだったら、1を出力。

うっかり、全部のケーブルがショートするという最悪のシナリオを考えてみる。
1本のRowに残りの3つのRowと6つのColumnから電流が流れこむ。
電源はUSBの5Vで、
データシートによると、内蔵プルアップは最低20kΩが保証されてる。
あわせて2.22kΩだから、3mA以下なので、
取り敢えず火事になる事はなさそう。

回路
====

Let's splitの回路図がここにある。
https://github.com/climbalima/let-s-Split-v2

行(Row)と列(Col)の交差する点にスイッチを入れる。
スイッチと直列にダイオードを入れてる。
これは同時押しの時にどれが押されたのかこんがらがらないようにするため。
ダイオードはRow側をカソード(黒いマークがついてるほう)にする。
これはスキャン時にRow側を0Vにしているため、
スイッチが押されると、Col側からRow側に電流が流れる。

情報源
======

## 掲示板・SNS

### マストドン
メカニカルキーボードマストドンがある。
登録: https://mstdn.mechkey.jp/about/more
タイムライン: http://k52.org/mastodon/?t=mstdn.mechkey.jp

### Reddit
RedditのMechanicalKeyboards板が情報の総本山的な状態になってる。
https://www.reddit.com/r/MechanicalKeyboards/
DIYで検索すると自作記事がいろいろでてくる。
https://www.reddit.com/r/MechanicalKeyboards/search?q=DIY&sort=new&restrict_sr=on

## 参考になる記事とか

### okapiesさんのplanckキーボード制作記事
これを見て、格子キーボードを作ろうと思った。
http://okapies.hateblo.jp/entry/2017/03/26/063136

### riv_mkさんのLet's Splitの制作記事
これを見て分離型いいなーと思った。
http://riv-mk.hateblo.jp/entry/2017/03/05/164425

### emizpingさんのLet's splitの制作記事
執筆途中みたい。
http://emizping.hatenablog.com/entry/2017/04/24/234018

### Togetterのキーマウントについての議論
プレートマウントとPCBマウントの違い。
また、3Dプリンタでプレートを作るというアイディアもここで頂いた。
https://togetter.com/li/1092000

### Redditのキーボード自作まとめ
まだ全部読めてない。
https://www.reddit.com/r/MechanicalKeyboards/wiki/customkeyboards

### wscarltonさんの35%キーボードの記事
小さいことはいいことだ。
http://imgur.com/a/ytZjs