HelixのOLED表示を簡単にカスタマイズするサービスを作った

:::note warn
本記事で取り扱っているサービスは Heroku の無料プラン終了によりクローズしました
:::

この記事は、[Treasure Advent Calendar 2018](https://qiita.com/advent-calendar/2018/treasure)の7日目の記事です！

自作キーボード関連の記事を書きたいなぁと考えていて、ちょうど作りたいサービスが思いついたので作ってみました。
自作キーボード「Helix」をカスタマイズするサービス[Helix OLED Dot Maker](https://helix-oled-dot-maker.herokuapp.com)を紹介します。

## はじめに

まずは、自作キーボード「Helix」について紹介します。
Helixは、遊舎工房さんから発売されている自作キーボードキットです。[Helix キーボードキット | 遊舎工房](https://yushakobo.jp/shop/helix-keyboard-kit/)
僕が自作キーボードを知り、その沼に引きずり込まれる原因となった(?)キーボードです。

Helixの良いところは、何と言っても見た目の良さにあると思っています。
アクリル版から覗く漆黒の基盤、色とりどりに光るLED、そしてなんとキーボード本体にOLEDディスプレイがついています！
![Helix_5rows_LP_BL-1024x471.jpg](https://qiita-image-store.s3.amazonaws.com/0/174052/7181401d-c1b8-9d5f-1df7-a458ca4fc026.jpeg)

今回作ったサービスはこのディスプレイのカスタマイズを行うためのサービスです。
Helixのディスプレイには、基本的に左側に状態表示、右側にロゴの表示がされています。
しかし、Twitterなどでみて見ると、ドット絵の得意な人がディスプレイの右側をカスタマイズして、まさに世界に一つだけのオリジナルHelixを作っています。
僕も挑戦したいと思いましたが、絵心がない僕にはとってもできない。。。でも作りたい。。。

そこで、画像を取り込んで簡単にディスプレイをカスタマイズできるサービス[Helix OLED Dot Maker](https://helix-oled-dot-maker.herokuapp.com)を作りました。

## 動作確認した環境(2018/12/5時点)

* ブラウザ: Chrome最新版、FireFox最新版
* 画像ファイル: jpg、png
* [QMK Firmware](https://github.com/qmk/qmk_firmware)


## 使い方

トップ画面はこのようになっています。
<img width="722" alt="スクリーンショット 2018-12-05 12.08.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/174052/4d04d2a9-c563-27e4-99a6-decf5d7f5e83.png">
ディスプレイをカスタマイズするには、READMEの[この部分](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)にあるように、`helix/common/glcdfont.c`を編集します。

まずは、一番上のファイルを選ぶところでカスタマイズ対象の`glcdfont.c`を選択します。
(2018/12/5現在最新かつデフォルトの`glcdfont.c`でしか動作確認をしていないので、それ以外のファイルを用いる場合は正常に動作しないかもしれません。)

次に、取り込みたい画像ファイルをアップロードします。

そうすると、トリミングができるようになるので、好きな画像になるように調整します。
<img width="723" alt="スクリーンショット 2018-12-05 12.10.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/174052/1f8485a5-562b-37b9-9333-b9feaba1f69e.png">
右側には、確認用の2倍の大きさのトリミング画像とディスプレイに反映される等倍のトリミング画像を確認する枠があります。

ちょうどいいトリミング画像ができたら、下の送信ボタンを押します。
すると、ディスプレイに反映されるとどうなるかがさらに右側に表示されます。
<img width="726" alt="スクリーンショット 2018-12-05 12.11.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/174052/e50bbcb7-f9d6-8ee6-dda9-0ac63bfc16cb.png">
良い画像ができていたら、ダウンロードボタンでダウンロードしましょう(ファイル名が生成されたものとなっているので、保存してすぐに使う場合は、該当ディレクトリに`glcdfont.c`で保存してください)。

生成された画像が白すぎたり、逆に黒すぎたりする場合は、閾値を変えて調整することができます。
白黒の二値への変換は、RGBそれぞれ0~255の合計を基準に決定しています。
画像によってちょうど良い閾値が変わってくると思うので、スライダーで調整後に送信することで画像の再生成が可能です。
特に、カラー画像の場合は調整が必要だと思います。

また、画像からはみ出した部分の色や、白黒反転をするかどうかを選べるようになっています。お好みで選択してください。

あとは、[ここ](https://github.com/MakotoKurauchi/helix/blob/master/Doc/firmware_jp.md#%E3%83%93%E3%83%AB%E3%83%89%E3%81%A8%E6%9B%B8%E3%81%8D%E8%BE%BC%E3%81%BF)にあるとおりデフォルトの`glcdfont.c`とダウンロードしたものを置き換えてビルドを実行します。

ビルドの前に、どのような表示になるか確認したい場合は、[Helix Font Editor](http://teripom.x0.com)で確認することをお勧めします。
開発中にも大変お世話になりました。:bow_tone1:

先ほど作成したファイルを取り込むと下の画像のようになります。
<img width="998" alt="スクリーンショット 2018-12-05 12.12.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/174052/de93f268-4153-2769-5682-582b88afd583.png">
このサービスは、右側のディスプレイ部分だけを変更するようになっています。
フォント部分をカスタマイズしていても、デフォルトで書いてあるファイル内容と構造が同様であれば、右側ディスプレイの部分だけ書き換えたものをダウンロードできると思います。

以上がこのサービスの使い方です！

実際にやってみます。
用意した以下の画像に対して変換をして、キーボードに書き込みました。
![スクリーンショット 2018-12-05 14.36.01.png](https://qiita-image-store.s3.amazonaws.com/0/174052/1f058f1f-5440-7b61-f4b2-acec67472399.png)
こんな感じになりました！
![IMG_0826.JPG](https://qiita-image-store.s3.amazonaws.com/0/174052/7c102e77-2fd3-e48a-5cec-fbc6e71ea2ab.jpeg)
細かいところは潰れていますが、これくらいの修正なら僕でもできそうです。(サンプルのため修正なしで書き込んでいます。)

## 技術的なこと

あとで振り返って記事など書けたらと思っているので、使用技術と詰まったポイントについて簡単にまとめておきます。

* 使用技術
    * [Sinatora](https://github.com/sinatra/sinatra)
    * Heroku
    * [RMagick](https://github.com/rmagick/rmagick)
    * [Cropper](https://github.com/fengyuanchen/cropperjs)

* 詰まったポイント
    * OLEDディスプレイへの設定がどのようにされているのか
    * 画像のピクセルをOLEDディスプレイにマッピングするのが大変だった
    * Cropperの使い方


## おわりに

毎日何時間も触ることになるキーボードなので、せっかくなら使っていて楽しくなるようなお気に入りのものを使いたいですよね。
今回はすでに自作キーボードを使っている人向けの記事になりましたが、少しでも興味を持つ人が増えてくれたら嬉しいです。
また、Helixを使っている人でもしサービス使ってみてもいいよ！って人がいましたら、使ってみて改善点など教えていただきたいです。(不具合あったらごめんなさい！！)

最後に。
このサービス、アドベントカレンダーの記事の作成には、MacBook Pro内臓キーボード・HHKB・Mint60・Helixの計4台のキーボードが使われました⌨️⌨️⌨️⌨️