自作キーボードの技術でスクフェスコントローラーを作る

自作キーボードの技術を使って、スクフェス[^1]専用のコントローラーを作りました。
`Pro Micro`と`qmk_firmware`を使っているため、キーボードとして文字を打つことも可能です

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">自作キーボードでスクフェスをやってる様子。<br>MASTER譜面もクリア出来るようになった。<br><br>若干の遅延はノートパソコンのスペック的な問題<br>(デスクだとスピーカーがないので) <a href="https://t.co/gSv0cW990X">pic.twitter.com/gSv0cW990X</a></p>&mdash; 銀鮭Over the Rainbow⌨🌈 (@sirojake) <a href="https://twitter.com/sirojake/status/1091691105207300096?ref_src=twsrc%5Etfw">2019年2月2日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


実機でも出来なくはないのですが、設定が大変なためNox Playerを使用しています。

[^1]: ラブライブ！スクールアイドルフェスティバル
# 作り方
## 1 筐体の作成
千石電商 秋葉原本店等で売っている適当なアルミケースを買ってきて、ボタンが入る箇所にドリルで穴をあけます。
![almi.PNG](https://qiita-image-store.s3.amazonaws.com/0/261659/4dbd2484-39c5-3068-5f0c-6d17f49679eb.png)

穴を開けたらテーパーリーマーを使ってボタンが入るまでひたすら拡張し、ボタンをはめます。
ボタン自体は三和電子の通販サイトや千石電商ラジオデパート店で購入できます。
技術力より腕力が勝負です。穴の拡張で半日かかりました。


## 2 キーボードとして実装する
自作キーボードお馴染みの`Pro Micro`を、ビニール被覆銅線を用いてボタンに接続します。
ボタン側はファストン端子を使えばあとから取り外しができるのでメンテが楽になります。

ボタンの片方は全て`GND`に接続し、もう片方はそれぞれのピンに接続します。
いつものキーボード組み立てではダイオードを使いますが、今回は不要です。
図にすると次のようになります。回路図とかは書き方分からないので察してください
<img src="https://qiita-image-store.s3.amazonaws.com/0/261659/89505f8a-255e-7e60-018b-f7581f06f988.png" width="50%">
私はリセットスイッチを実装しましたが、ファーム焼くときくらいしか使わないので別になくてもいい気がします

## 3 LEDの実装
自作キーボード会で定番の[SK6812MINI](https://yushakobo.jp/shop/sk6812mini-35/)と
しろとり氏の発明[無限の可能性](https://booth.pm/ja/items/1073225)を使っています。
この辺りは難易度が高いので、分かる人以外はお勧めしません。

## 4 ファームの書き込み
[QMK公式](https://github.com/qmk/qmk_firmware) からcloneし
`make handwired/lovelive9:defaulte`
をしてリセットスイッチを押します。
リセットスイッチがない場合、`Pro Micro`の`RST`と`GND`をピンセットで一瞬ショートさせます。
環境構築については[公式ドキュメント](https://docs.qmk.fm/#/)や[プログラマーではない人向けのQMK Firmware入門](https://qiita.com/cactusman/items/ac41993d1682c6d8a12e)が参考になります。

## 5 動作確認＆マッピング
全てのボタンがレイヤーキーになっているため、2ボタンを押して何か入力されるか確認していきます。
(Shiftキーになってるボタンもあるので3ボタンで確認が安全です)

10個以上のレイヤーがありますが、その辺は[keymap.c](https://github.com/ginjake/qmk_firmware/blob/master/keyboards/lovelive9/keymaps/default/keymap.c)を参照してください。
次の順番で同時に押していくことで、音ゲーモードになります。
このモードのときは1~9が入力されるので、これをNoxPlayerでマッピングしていきます。



#### 苦戦したこと
#### LT関数
長押しすると`レイヤー`、一瞬押すと`キャラクター名`が入力されたら面白いと実装に挑戦。
キーマップで`LT(レイヤー名,キーコード)`とやると
「一瞬押すと指定したキー、長押しでレイヤー」　という風に、1キーに2つの動作を割り当てることが可能です。
これを使えば簡単かなーと思ってたのですが、この関数はデフォルトキーコードにしか対応しておらず、
カスタムキーコードは使えません。
仕方なく、自分で実装する羽目になりました。


#### UNICODE対応
苦戦というか綺麗な方法では無理でした。
1プッシュで「黒澤ルビィ」と入力されるようにしたかったのですがUNICODEは闇でした。
OS毎に別々の対応が必要であり、特にwindowsだとWinComposeというソフトを入れないとまともに使えません。
(レジストリを書き換えたり、MSYSなど一部のソフト上ではちゃんと入力されます。)
ハード側だけで完結するのも自作キーボードの良さなので、WinComposeはちょっと抵抗があります。
[公式ドキュメント](https://beta.docs.qmk.fm/features/feature_unicode)や[emojiキーボードを実現する](https://skyhigh-works.hatenablog.com/entry/2018/09/24/002901)記事が参考になりました。
結局諦めて「KUROSAWA RUBY」になりましたが[UCIS_ENABLE](https://beta.docs.qmk.fm/features/feature_unicode#ucis_enable)とかいう
誰が何の目的で実装したのか分からない謎機能を発見出来たので収穫自体はありました。


#### LED
`rgblight_sethsv_at` や `sethsv` 
などのLED操作の関数を入れてコンパイルしましたが、未定義だと怒られてしまいました。
しかしLED自体は光っています。
必要そうなものをincludeしましたが状況は変わらず、悩むこと2時間。
`rules.mk`でLED関連の設定をyesにしていないだけでした。


### 作ってうれしかったこと

#### 物理ボタンでスクフェスが出来る
個人的な話ですが、タッチパネルより物理ボタンで音ゲーをするのが好きです。
アーケード版のスクフェスもありますが、寒い中外出するのも面倒なので家で出来るのは最高です。

#### 自作キーボードに詳しくなった
配線の為に[自作キーボード設計入門](https://booth.pm/ja/items/1044084)を読んだり
ファームを書くときもqmk_firmwareに入っている様々なキーボードのコードを見たりと勉強になりました。
知らない関数とかもたくさんあって勉強になりました。

#### ゲーム中のtwitterが捗る
格ゲーや音ゲー中にtwitterするときって、みなさんどうしていますか？
机があまり広くないので、アケコンを退けてからキーボードを引っ張り出してツイートしていました。
これならばキーボードとして機能しているのでそのままツイートが出来ます。理論上は。


#### 自由自在のLED
ボタンが光る音ゲー用コントローラーは数多ありますが、大抵は単色だったり、決まった発光パターンです。
キー入力と連動させて自由自在に色を変えれるというのは、無限の可能性を感じました。

#### 乾燥
ネタで作ったつもりが、実用的なものが出来てしまいました。
自作キーボードはファーム、回路、プレート含めオープンソースが多く
今回も[MiniAxe](https://booth.pm/ja/items/1094860)の回路やQMK上の様々なファームのコードが物凄く参考になりました。

電子工作など分からん人間でもこういうの作れるので、自作キーボードに手を出して良かったと思います。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">QmkとPro Microを使った片手キーボード、キーブレード11完成です！<br>USB接続ならキーボードに。電池駆動ならオタクブレードになるというコンセプトです。<br>恐らく世界初だと思います <a href="https://t.co/zvTZgWR8TU">pic.twitter.com/zvTZgWR8TU</a></p>&mdash; 銀鮭Over the Rainbow⌨🌈 (@sirojake) <a href="https://twitter.com/sirojake/status/1086082441503072256?ref_src=twsrc%5Etfw">2019年1月18日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
(改造ペンライトはライブによっては禁止されている場合があります。使う場合は自己責任でお願いします)