Mitosis Keyboardを組み立ててみました

# Mitosis Keyboardを組み立ててみました
## この記事について
この記事は、[自作キーボード Advent Calendar 2017](https://adventar.org/calendars/2114)の15日目の記事です。みなさんの記事がどれも素晴らしく、こんな記事でよいのかなと不安ですが、よろしくお願いします。

最近、時々知人と集まってオープンソースハードウェアのキーボードを組み立ててみたり、気になるところに手を加えてみたりしています。その中で、Mitosis Keyboardというオープンソースハードウェアのキーボードを組み立ててみましたので、その話をしたいと思います。

![完成写真](https://qiita-image-store.s3.amazonaws.com/0/148576/8d6aef32-e82d-2dd5-8e6b-0ed94f5b0d2e.jpeg)


## Mitosis Keyboard
もともと[あるブログの記事](https://hackaday.com/2017/06/05/mitosis-anatomy-of-a-custom-keyboard/)で知ったのですが、Mitosisなる自作キーボードが[Redditにて公開されています](https://www.reddit.com/r/MechanicalKeyboards/comments/66588f/wireless_split_qmk_mitosis/)。
詳細はRedditを見ていただいたほうが良いとは思いますが、このMitosis Keyboardの特徴は以下の通りです。

* Ergodox等と同じく、左右分離型のコンパクトキーボード
* PC(正確にはUSBドングル)とキーボード間、キーボードの左右の間の通信がBluetooth化されており、ケーブルが無い
* [QMK FirmwareベースのFirmwareが公開されており](https://github.com/qmk/qmk_firmware/tree/master/keyboards/mitosis)、自分でキー配列等に手を入れやすい

## アーキテクチャ概観
左右分離タイプで無線という若干珍しい方式のため、どのコンポーネントがどことどういう通信をしているかについて、簡単に抑えておいたほうが組み立て作業等をする上でも良いと思うので、軽く説明します。

まず、Mitosis Keyboardでは3つのコンポーネントがあります。

* キーボード本体(左)
* キーボード本体(右)
* レシーバー

キーボードの左右については、分離型なら当然存在するため、特に説明は不要かと思います。Mitosisではそれらに加え、レシーバーというコンポーネントが存在し、合計3つのコンポーネントがそれぞれ1つずつBluetoothのモジュールを備えます。そして、以下の図のように通信します。

![Mitosis Keyboard Architecture](https://www.planttext.com/plantuml/img/XP71Qi9048RlynJp0Xke89GIGkf9QFLGwJaacz6iJPmmcGIazDrTOwlTLEXj-VVxzvjXqqvpqRwf0THfJRXoofthy8ME1UTIuhFOoYbPxOK0sjn-v3l2Lzegnl6QIqeI_0GkzXuPu-Yd6eG7sSuV7cSp210qudQLcWdpTHEzdU_lcCRyZ-gINjy98JIrjvWfz5j6bjn0Siz7TeXQuQnnLZX8Rxg0GTEtPaASPT_LzyqYMtAd0C7k64L9MC8dNDGzARDM4Cx-7poPnoHNg-Vy4I2bG-b__mG0)

Bluetoothモジュールに焼きこむファームウェアについては公開されており、それを利用すれば3つのコンポーネントの間での無線通信ができるようになります。そして、レシーバーが備えるArduinoモジュールからすれば、その先が無線化されているかどうかにはあまりかかわりなく、どのキーが押下されたかの情報だけが分かる状態となるので、押下されたキーに対しどのスキャンコードをUSBホストに送信すればよいかを考えることのみ考えれば良いこととなります。結果的に、レシーバーのArduinoモジュールが、他のキーボードのコントローラに対応するもので、QMK Firmwareを焼く対象であるということになります。

## 組み立て方と注意点

### 大まかな手順
細かい説明はRedditにもある[こちら](https://imgur.com/a/mwTFj#JTzXTCD)を見るのが良いと思いますので、ここでは大まかな流れと注意のみ記します。

* キーボード用基板のうち2枚について、穴を作ってキースイッチを嵌めていく
    * キーボード本体の左右どちらかの片側だけで、基板を2枚使い、1枚はキースイッチを固定するための板とするために基板の一部を折り取って穴を作る必要がある
* Bluetoothモジュールと関連パーツをキーボード用基板に取り付ける
    * 先に紹介した細かい手順の説明ではモジュール取り付けの直後にL字タイプのピンヘッダを取り付けていますが、取り付け位置の基板裏側をBluetoothモジュールが覆うので、裏側からのハンダ作業はできなくなってしまうため、個人的にはピンヘッダを先につけるほうが楽だと思いました（その場合でも、ピンヘッダの足が基板を貫通しない程度に切り詰めて取り付ける必要はあるので注意して下さい）
* キースイッチ固定用と配線用の2枚1セットの基板を連結する
    * ボタン電池取り付け方法が特殊で、「いい感じにランドにハンダを盛って空隙を埋める」ことでボタン電池を挟めるようにする必要があるため、一発でうまくはいかないこともあります
    * その場合ピンヘッダで接続した2枚の基板の間にハンダごてを差し込んで、ハンダを足したり吸い取ったりが必要になるので、こて先形状によっては苦労すると思います（自分のは細いC型なのでなんとかなりましたが、もしかするとピンヘッダの部分をいじって基板の間隔自体を調整したほうが良い可能性もあります）
* キースイッチの足をハンダ付けする
* レシーバー用基板に本体と同じ要領で無線モジュールを取り付けたうえで、Arduinoモジュールと連結する
    * 何かあった時のため、ISPに必要なピンはヘッダを付けておくと良いかもしれない（経緯は後述）
* Bluetoothモジュール用ファームウェア, QMK Firmware焼きこみ
    * Bluetoothモジュール用ファームウェアはBluetoothモジュールの裏につけたピンヘッダ経由でライタから焼き込む
    * Githubにある説明ではBluetoothモジュール用のファームウェアのためにARMのコンパイル環境について言及があるが、precompiledのものが用意されているため、必ずしも必要ではない（OpenOCDはファームウェア書き込みに使うため、どのみち必要）
    * ST-Linkとの接続はReddit画像より [Githubにある説明](https://github.com/reversebias/mitosis#openocd-server)を参考にしたほうが良い
    * QMK FirmwareはArduinoモジュールにUSB経由で焼きこむ

### 技適について
最初、基板を発注した段階では全く気づいていなかったのですが、Mitosis keyboardで利用しているBluetoothモジュールは技適やFCCといった認証を取得していません。そこで、技適取得済みのモジュールで互換性のあると思われる[MDBT40-P256V3](http://eleshop.jp/shop/g/gGAB314/)を用意し、別途変換基板を作成してつなぐことで、対応することにしました。

![変換基板を使った組み立て図](https://qiita-image-store.s3.amazonaws.com/0/148576/938cdbe8-ea51-7da2-34c3-28804d6a0fb3.jpeg)

変換基板のデータは需要があれば公開するかもしれないですが、一旦保留しておきます。理由は

* 端面スルーホールの基板はちょっと割高になったりするので、おすすめしない
* XTAL周りに問題があるかもしれない（内蔵クロックを使うようにnRF51822用のファームウェアを書き換えて利用しているので、回避できていますが、消費電力が増大してしまうはずです）

ためです。特に後者について、もう少し試したいなと考えています。

### その他の気をつけるところなど
実際に組み立ててみて気づいた、部品等を調達する前に気をつけたいところを雑多に列挙しておくので、作成を考える方は参考にして下さい。

* Bluetoothモジュール用にライタが必要(ST-Link V2 など)
* Pro Micro クローンだと、ファームを書き込めなかったりする[^dfu_bug]（DFUブートローダが起きてこない）
    * ISPライタ(AVR-ISP mkII)を用いてDFU bootloader自体を書き直した
    * Atmel公式のDFU bootloaderを使うことにした
    * fuse bitは適宜いじった(BOOTRST, HWBEあたり)
* Mitosisを複数持ち寄ると干渉・混線する可能性がある
    * 試してはいないですが、作者は認識している様子です[^pairing] [^fhss]
* 今回採用した MDBT40 は 0.7mm ピッチの端面スルーホールで、自分の技量と道具だと難易度的にギリギリだったので、細めのコテ先等があったほうがよいと思う

## 謝辞
冒頭に述べた通り、Mitosis Keyboard作成にあたって知人にも協力を得たので、感謝の意をこめて以下に紹介します。

* M氏(匿名希望) : ハードウェア担当。自宅にCNCフライス盤がある。変換基板発注やパーツ調達で大いにお世話になった。
* @euxn23 : UX担当。既にsplit keyboardに手を染めている求道者。キーキャップやキースイッチのお得情報を仕入れて調達してきてくれたり、QMK Firmwareを色々いじって使い心地を積極的に確認してくれた。
* [@Con_Humi](https://twitter.com/Con_H) : なんでも担当。一番常識人。パーツ調達に行ってくれることもあれば、組立作業を手伝ってくれたり、M氏にCADを仕込まれて触っていた。

## 最後に
今日はMitosis Keyboardという分離型無線のキーボードの紹介をし、注意点などを記しました。この記事はTex Yoda (2ではない)を使って書きました。Mitosis Keyboardについては、キー配置等をいじりたい気持ちもあるので、これを参考にメインで使う気持ちでオリジナルキーボードを作りたいなと思っているところです。

明日は謝辞にも出てきた @euxn23 が何か書くそうです。よろしくお願いします。

[^dfu_bug]: [dfu-programmer を最初使えないという報告](http://www.omiya-giken.com/?page_id=1862) もあるので、同様の事象だったかもしれない
[^pairing]: ペアリング用のアドレスをハードコードしているらしい [reddit](https://www.reddit.com/r/MechanicalKeyboards/comments/66588f/wireless_split_qmk_mitosis/dgfp7hp/)
[^fhss]: 消費電力の都合もありFHSS未対応らしい [reddit](https://www.reddit.com/r/MechanicalKeyboards/comments/66588f/wireless_split_qmk_mitosis/dggoxav/)