ARDUINO Pro Micro ATmega32U4で自作キーボードを作る

ARDUINO Pro Micro ATmega32U4で自作キーボードを製作しました。
当初は、全く別の企画からスタートしましたが、最終的に使えるものにしよう
という事でコンセプトより中身重視に移行し完成しました。
#試作１号・試作２号
STM32のUSB機能付きのSTM32F042K6T6(秋月電子＠250円）を使用し開発していました。
スイッチとOLED、ボリュームという構成は同じです。
![DSC_0164 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/7aeb01aa-cfe0-b7f8-de3e-8fb35e440ab0.jpeg)
#STM32CubeIDEでの開発
製作していくといくつかの問題が発生しました。
STM32CubeIDEで開発を行いましたが、私のスキルが低い為にマクロキーやHIDデバイスとしてボリュームをコントロールできないのです。
Arduinoならばライブラリがあるのですが移植もうまくいきません。
結果として途中で断念することとなりました。
#Arduinoで再開発
自作キーボードはArduinoで作るのが一般的なようです。
という事でセオリーに戻り、再製作します。
Arduinoを使用するのは、ライブラリや事例が多く、開発しやすいからです。
今回参照したのがこちらのサイトです。
___ProMicro Macro Keyboard Ver2.0___
http://www.retrobuiltgames.com/the-build-page/macro-keyboard-v2-0/
このままでも全く問題ありませんが、私が欲しい形にカスタマイズしました。
#構成
2つのロータリー・エンコーダとボリューム、OLEDと、いくつかのスイッチで構成します。
今回使用するロータリー・エンコーダはセンタープッシュ付きで、スイッチとしても使用可能です。
LEDは、Neopixelで、数珠つなぎすることで、個別に点灯可能です。
#使用部品
ATmega32U4を搭載したPro Micro ATmega32U4を
LEDには、3535サイズのNeopixel　SK6812を
OLEDにはI2C接続の0.91インチOLED　128x32表示を
ロータリーエンコーダーはセンタープッシュ付きのRE111F-4S1-152S4-15P-Aを
キースイッチはCherry MXの透過型（ビット・トレード・ワン　ADMXBRIL を
キートップは遊舎工房の50円の透明型を使用しました。
なお、Enterキーはネットよりダウンロードしました。
#基板の製作
今回は100x100㎜以下の中に入れたいのでいくつかデザインして作っています。
特にEnterキーは大きい日本語キーボードタイプが欲しかったのでサイズ調整しながら作っています。
MXスイッチ スタビライザーというものを使用するようですが、今回は、使用していません。
LEDは基板に穴をあけて中に埋め込む形で配置します。
Cherry MXの透過型でないものでも0603程度のLEDを表面実装しても光らせる事は可能なようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/41ea3fe0-a6a2-38e1-690c-aa271cbb1b89.png)
#回路図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/62d46ab1-d049-0b8a-de6a-a3ce102ac20d.png)

#プログラム
ProMicro Macro Keyboard Ver2.0のプログラムをSSD1306を搭載したOLED用に加工します。
素直にAdafruit_SSD1306のプログラムを追加していきますが
ProMicro Macro Keyboard Ver2.0のプログラムはキャラクタ液晶用のライブラリ等により
Adafruit_SSD1306を追加すると容量オーバーします。
このため、不要な部分は消していく必要があります。

追加のヘッダーファイル

```
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 32 // OLED display height, in pixels
#define OLED_RESET     4 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
```

文字を表示するプログラム

```
    setColorsMode0();                         //indicate what mode is loaded by changing the key colors
          display.clearDisplay();
                display.setTextSize(2);             // Normal 1:1 pixel scale
                display.setTextColor(SSD1306_WHITE);        // Draw white text
                display.setCursor(0,0);             // Start at top-left corner
                display.println(F("Default"));
                display.setTextColor(SSD1306_WHITE);
                display.print(F("     Mode"));
                display.display(); 
```
#ケースの製作
ケースを製作します。
何度も何度も作りなおしました・・・
現在は片側をネジで固定していますが、両側にしてほしいという要望も頂いたのでそのうちリベンジするかもしれません。
![DSC_0159 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/81781faf-dc59-c52b-97d9-874bcb7f8a90.jpeg)
#動作風景
こんな感じで動作するようになります。
ProMicro Macro Keyboard Ver2.0を基にしているだけに簡単にできてしまいましたね。
キーのチャタリング対策などこれからもう少し弄らないといけませんがボリュームや各種キーの設定を個別にするだけで動くものが出来上がりました。
![DSC_0163 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/71711cd3-1dd6-fc91-040b-852548ca9386.jpeg)
![IMG_2559.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/bb5f6e39-0b5a-9b6f-7d92-5eb7a7453af6.jpeg)