Keyball44をBMPで無線化した話

# はじめに
<!-- 発端や概要を記載 -->
Keyball44の2台目を入手したので、持っていたBLE Micro Proを使って無線化した話を書いておきます。
かなり端折って書いているので、BMPによる無線化の経験がある方や、自分でファームが組める等、一定のスキルがある方向けと思います。ご了承下さい。

![photo.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288022/53c13453-7413-83e1-6a1e-098ca9d2fe05.jpeg)


# 目次
<!-- タイトルとアンカー名を編集 -->
1. [必要なもの](#Chapter1)
1. [PCB周りの準備](#Chapter2)
1. [バッテリーの準備](#Chapter3)
1. [BMPの設定](#Chapter4)
1. [その他](#Chapter5)
1. [最後に](#end)


<!-- 各チャプター -->
<a id="#Chapter1"></a>
# 1. 必要なもの


| No |    品名     |    備考   |
|---:|-------------|------------|
| 1  | Keyball44   |  [白銀ラボリンク](https://shirogane-lab.com/products/keyball44)|
| 2  | BLE Micro Pro   |  左右用に2個 |
| 3  | BMP用電池基盤 | [遊舎工房リンク](https://shop.yushakobo.jp/products/ble-micro-pro-battery-board)。トラボ無し側用に一個でOK。 |
| 4  |  CR1632 | No.3用の電池として二個。     |
| 5  | USB昇圧モジュール  | [Amazonリンク](https://amzn.asia/d/9hFpZnU)。トラボ側の電源用に一個。   |
| 6  | 単4電池ボックス |  直列で二本繋げられるものを適当に。スイッチついてるのとかお好みで。単4以外でも大丈夫だと思います。  |
| 7  | 短めのUSBケーブル |  昇圧モジュールとBMPを繋ぐ用。  |
| 8  | 単4電池 |  お好みで。筆者はPanasonicさんのニッケル水素電池で動作確認しています。  |
| 9  | 組み立て工具類一式 |  はんだごてとか一通り。  |

上記以外にも、必要に応じて背の高いスペーサ(マイコンガード用)等を準備ください。



<a id="#Chapter2"></a>
# 2. PCB周りの準備


Keyball44の[ビルドガイド](https://github.com/Yowkees/keyball/blob/main/keyball44/doc/rev1/buildguide_jp.md)を参考に組み立ててください。
BMP利用にあたって取り付け不要なパーツは以下になります。

- OLED
- TRRSジャック

タクトスイッチはBMPのファームを焼く際に便利なので取り付けておくことをおすすめします。
また、後述のファームではOLEDのコードを書いていないのでつけても動きません。
一応ジャンパは手順通り全て実施して確認しています。

なお、筆者はコンスルーを使ってBMPを接続していますが、ピンソケットを使う場合はそちらも半田してください。


余談ですが、BMP及びUSB昇圧モジュールを重ねて配置すると、アクリルプレートと干渉します。
このため、アクリルプレートの取り付けは最後にしておき、高さが明らかになった後に適切なスペーサに交換してプレートを取り付けることをオススメします。


<a id="#Chapter3"></a>
# 3. バッテリーの準備
バッテリーは左右で異なる実装となるので、それぞれで記載します。


## 3.1.トラボ無し側のバッテリー作成
よくあるBMP+ボタン電池基盤の組み合わせになります。
こちらの[ビルドガイド](https://github.com/sekigon-gonnoc/BLE-Micro-Pro/tree/master/CoinCellHolder)等に従って組み立ててください。
他にもBMPによる無線化の解説サイトで、BMPとの接続や電池基盤の組み立て手順は紹介されてると思いますので、ググりながらうまくやってください。
なお、Keyballはマイコンボードを乗せる幅が広くないので、BMPの上に重ねる組み方が良いと思います。


## 3.2. トラボ側のバッテリー作成
トラックボールを動かす側の電源を準備します。

![battery.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288022/c48b73a3-8b59-9ce2-6cb2-9987a6ffd9c0.jpeg)

電池ボックスの+/-を間違えないように配線してください。
昇圧モジュールにはスイッチが具備されていないので、必要に応じて+側にスイッチを挟んでください。逆流防止のためダイオードを付ける等は各自の判断で実施ください。
電池を二本入れて昇圧モジュールのLEDが点灯すれば成功です。

バッテリーの配置はお好みで設計いただければと思います。
筆者は昇圧モジュールをBMPの上に重ねて配置して、単4電池ボックスはマイコンボード側面に設置しています。
同様の組み方をする場合は、BMPと電池基盤がショートしないようビニールテープで絶縁したり、何らかの方法でスペースを確保するなど適宜対応してください。

![install.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288022/edf172f4-4729-6706-b27b-c853cb240796.jpeg)


■余談
Keyballのトラックボールを動かすには、BMPバッテリーピン供給の電圧3Vでは足りないようです。おそらくKeyballの基盤はProMicroによるUSB電源を軸に設計されているので、トラックボールを動かすには一定の電圧が必要な設計になっているように見えます。
※PMW3360のデータシート的には5V不要そうなので制御ICの関係かもですね。
加えて、BMPのバッテリーピンは3.3Vが上限の仕様になっています。
このためバッテリーピンによる電源供給は行わず、USBポートから給電することで5V電源を確保する方針としています。

一般の電池を直列に繋いでも5V電源を確保できないので、昇圧する必要があります。
品名No.5で載せた回路はモバイルバッテリー作成などに使われる品で、5V以下の電圧入力を通常のUSB同様に5Vまで昇圧して出力できるものです。
筆者はリチウム電池で充電できることを期待して、単4電池ボックスを使ってバッテリーを作りました。


<a id="#Chapter4"></a>
# 4. BMPの設定
## 5.1 BMP用Keyball44ファームの導入
[こちら](https://github.com/black-choco1ate/qmk_firmware)にBMP用のソースを置いていますので、Releaseからuf2ファイルを持ってくるかCloneしてビルドしてください。
keyball44-devブランチにソースを置いていますのでチェックアウトしてビルドしてください。

```
 $ git checkout keyball44-dev
 $ make keyball44:default:uf2
```

ファームの焼き方は[こちら](https://sekigon-gonnoc.github.io/BLE-Micro-Pro/#/build_firmware)をご確認ください。
いつも通り左右のBMPに同じファームを焼いてください。


## 4.2 コンフィグ類の設定

[こちら](https://github.com/black-choco1ate/qmk_firmware)のReleaseに以下のファイルを配置していますのでBMPのストレージに転送します。

- CONFIG.JSN
- KEYMAP.JSN 

CONFIG.JSNは左右で異なるため、トラボ側がMasterになるように書き換えてください。
筆者は右をトラボにしているので、同様の場合はBMPのストレージにあるCONFIG.JSNをRightフォルダのCONFIG.JSNで上書きすればよいです。

これでKeyball44をBMPで制御できるようになっているはずです。

<a id="#Chapter5"></a>
# 5. その他

## 5.1 キーコードと編集について
Remapに繋ぐとKeyball44として認識されるので、通常と同じようにキーマッピングが可能です。
なお、本家のファームと同様に以下のキーコードは実装済みです。
KEYMAP.JSNに書き込んでいただければREMAP上からHexキーコードも見えるはずなので環境に合わせて活用ください。

| No |    キーコード     |    用途   |
|---:|-------------|------------|
| 1  | CPI_I100  |  CPIを100増加させる |
| 2  | CPI_D100   |  CPIを100減少させる |
| 3  | CPI_I1K | CPIを1000増加させる |
| 4  |  CPI_D1K | CPIを1000減少させる。   |
| 5  | SCRL_TO  | スクロールモードのON/OFFを切り替える   |
| 6  | SCRL_MO |  キーを押している間、スクロールモードとなる  |
| 7  | SCRL_DVI |  スクロールの除数を増加させる |
| 8  | SCRL_DVD |  スクロールの除数を減少させる  |

なお、マウスボタン用に以下のキーコードを規定しています。
KC_BTN等でドラッグ&ドロップ等うまく動かない場合は以下を試してみてください。
| No |    キーコード     |    用途   |
|---:|-------------|------------|
| 1  | MY_MS_BTN1  |  KC_MS_BTN1,KC_BTN1相当 |
| 2  | MY_MS_BTN2   | KC_MS_BTN2,KC_BTN2相当　|
| 3  | MY_MS_BTN3 | KC_MS_BTN3,KC_BTN3相当 |



## 5.2 今後について

以下を実装予定ですがいつになるかはわかりません。

 - EEPROM周り
 - LED
 - 自動マウスレイヤー機能



## 5.3. Q&A

### Q1. Keyball44以外のKeyballシリーズに対応予定はありますか
　A. 無しです。本体がないので検証できずのため。おそらくConfigやKeymapのjsnを書き換えて、config.hをその他のKeyball用に書き換えてビルドすれば動くと思います。

### Q2. ファームウェアを改変したりプルリクしてよいですか
　A. ご自由にどうぞ。ファーム修正やチューニング等ウェルカムです。

### Q3. バッテリーはどの程度持ちますか
　A. 5V昇圧に伴う劣化があるので一概には言えないです。このため、電池直列の単純な容量よりは確実に下がります。

### Q4. 昇圧モジュールを使わずUSBモバイルバッテリーでも動きますか
　A. 5V電圧のものであれば動くと思います。ただし、モバイルバッテリーは消費電力が少ない場合に自動スリープする製品が多いので注意が必要と考えられます。

### Q5. 電池ボックスはどうやって固定していますか
　A. アクリルプレートと電池ボックスをL字に接着剤で固定しました。また、テンティングの関係で少し電池ボックスが浮いてたのでゴムシートで足を埋めました。

### Q6. この昇圧モジュールを選んだ理由を教えてください
　A. BMPと同じ程度のサイズ感でUSBポートまでついてるため。しかもかなり安いため。

### Q7. 単4電池以外でも動きますか。
　A. 多分動くと思います。あとモジュール仕様は入力電圧0.9V~となっていますが、電池一本でやったら動かなかったのでもう少し余力は必要かも。

### Q7. 本家Keyballのファームと差分はありますか
　A. 近い動きをするようにはしましたが、ところどころ書き換えているので詳しくはlib_keyballやpmw3360あたりのソースを見比べていただければ。(例えば、左右間通信の関連ソース消したり、SPI通信はBMP用だったりと差分はあります)


<a id="#end"></a>
# 最後に
本記事は筆者のみ検証していますので、予期せぬ動作となる可能性があります。
実施は自己責任のもとでよろしくお願いいたします。


また無線化にあたって特に以下のコードを参考にさせていただきました。
この場を借りてお礼申し上げます。

 - [Keyballファームウェア(Yowkees様, KoRoN@香り屋様)](https://github.com/Yowkees/keyball)
 - [BLE Micro ProでKeyball44を無線化したい(@sndmtk様)](https://qiita.com/sndmtk/items/9b61067080974b4b78bd)