Arduino ProMicroで音量調整ボタンを作ろうとして無駄なことをした話

# 緒言
音量調整ボタンを作った。素晴らしい先例を元にすれば非常に楽に作れる。
無駄に突っかかったため3時間もかかってしまった。
この記事はその**突っかかりをまとめたもの**である。
先人の素晴らしい作例を元にすれば十分だと思うが、個人的に記事に残しておこうと思う。

## すばらしい作例
この記事はすべて、

https://www.kwbtblog.com/entry/2018/12/17/054646

この記事をもとにしている。

# 突っかかりポイント

## Leonaldを持っていない
一番の問題はこれだろう。Leonaldを持ってさえいれば10分で終わっていた。
ProMicroを使って作ろうとした。

## エラー

```
 error: 'HIDSubDescriptor' does not name a type; did you mean '_hidReportDescriptor'?
```
エラーが出てしまう。

先に最終的な原因を書くと、Arduino ProはHID対応していない。
私が持っているのはProMicroで**書き込み対象の名前が間違っていた**。
作例が間違っているということは一切ない。


## 他の作例を試す

https://deviceplus.jp/arduino/translated-usb-volume-control-with-arduino/

作例通り作ったところ

```
#error HID Project can only be used with an USB MCU.
```
とコンパイルエラー。

原因がわからない・・・

上述の作例は`HID-project.h`というライブラリを使っている。

https://github.com/NicoHood/HID

調べると同じエラーに遭遇している人はいた。


これもまた、私が持っているのはProMicroで書き込みが間違っていた。
作例が間違っているということは一切ない。

## 理由がわからないということで、`Keyboard`ライブラリでできないか？
`Keyboard`ライブラリに音量を上げるボタンがないか調べる。ヘッダファイルに

```C
// Modifiers
#define KEY_LEFT_CTRL     0x80
#define KEY_LEFT_SHIFT    0x81
#define KEY_LEFT_ALT      0x82
#define KEY_LEFT_GUI      0x83
#define KEY_RIGHT_CTRL    0x84
#define KEY_RIGHT_SHIFT   0x85
#define KEY_RIGHT_ALT     0x86
#define KEY_RIGHT_GUI     0x87

// Misc keys
#define KEY_UP_ARROW      0xDA
#define KEY_DOWN_ARROW    0xD9
#define KEY_LEFT_ARROW    0xD8
#define KEY_RIGHT_ARROW   0xD7
#define KEY_BACKSPACE     0xB2
#define KEY_TAB           0xB3
#define KEY_RETURN        0xB0
#define KEY_MENU          0xED // "Keyboard Application" in USB standard
#define KEY_ESC           0xB1
#define KEY_INSERT        0xD1
#define KEY_DELETE        0xD4
#define KEY_PAGE_UP       0xD3
#define KEY_PAGE_DOWN     0xD6
#define KEY_HOME          0xD2
```
と設定が羅列してあるが、ない

`Keyboard.write(i)`で全て試してみようと思う。

## ここでようやく、気づく
以前、Keyboardライブラリで作ったものを流用して書き込もうとしたところコンパイラエラーが出て気付く。

これまで、

**ライブラリの対応問題**

だと思っていたものが

**書き込み先のマイコンの型式が間違っていたため通っていない**

だった。
長い旅路だった。

## 正しい書き込み先と書き込み方法
![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/79d078d5-7d23-1f7a-4abd-954ff177bf47.png)

![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/f6601a35-051e-9098-38a1-278dfae4c0cd.png)

こっちではない。

# 反省
エラーを吐くときに、他の作例を試したり、他の方法を試そうとして遠回りになってしまった。

最初の作例のエラー内容から、書き込み対象が間違っていると推定することはできない気がする。

まぁ、いいか

とりあえず、いいものができた！

# 追記：esp32を使えば、Bluetooth接続のキーボードが作れる

https://wak-tech.com/archives/1593

を参考に作れる。
更に、ボリュームキーなどもある

```C
const uint8_t KEY_LEFT_CTRL = 0x80;
const uint8_t KEY_LEFT_SHIFT = 0x81;
const uint8_t KEY_LEFT_ALT = 0x82;
const uint8_t KEY_LEFT_GUI = 0x83;
const uint8_t KEY_RIGHT_CTRL = 0x84;
const uint8_t KEY_RIGHT_SHIFT = 0x85;
const uint8_t KEY_RIGHT_ALT = 0x86;
const uint8_t KEY_RIGHT_GUI = 0x87;

const uint8_t KEY_UP_ARROW = 0xDA;
const uint8_t KEY_DOWN_ARROW = 0xD9;
const uint8_t KEY_LEFT_ARROW = 0xD8;
const uint8_t KEY_RIGHT_ARROW = 0xD7;
const uint8_t KEY_BACKSPACE = 0xB2;
const uint8_t KEY_TAB = 0xB3;
const uint8_t KEY_RETURN = 0xB0;
const uint8_t KEY_ESC = 0xB1;
const uint8_t KEY_INSERT = 0xD1;
const uint8_t KEY_PRTSC = 0xCE;
const uint8_t KEY_DELETE = 0xD4;
const uint8_t KEY_PAGE_UP = 0xD3;
const uint8_t KEY_PAGE_DOWN = 0xD6;
const uint8_t KEY_HOME = 0xD2;
const uint8_t KEY_END = 0xD5;
const uint8_t KEY_CAPS_LOCK = 0xC1;
const uint8_t KEY_F1 = 0xC2;
const uint8_t KEY_F2 = 0xC3;
const uint8_t KEY_F3 = 0xC4;
const uint8_t KEY_F4 = 0xC5;
const uint8_t KEY_F5 = 0xC6;
const uint8_t KEY_F6 = 0xC7;
const uint8_t KEY_F7 = 0xC8;
const uint8_t KEY_F8 = 0xC9;
const uint8_t KEY_F9 = 0xCA;
const uint8_t KEY_F10 = 0xCB;
const uint8_t KEY_F11 = 0xCC;
const uint8_t KEY_F12 = 0xCD;
const uint8_t KEY_F13 = 0xF0;
const uint8_t KEY_F14 = 0xF1;
const uint8_t KEY_F15 = 0xF2;
const uint8_t KEY_F16 = 0xF3;
const uint8_t KEY_F17 = 0xF4;
const uint8_t KEY_F18 = 0xF5;
const uint8_t KEY_F19 = 0xF6;
const uint8_t KEY_F20 = 0xF7;
const uint8_t KEY_F21 = 0xF8;
const uint8_t KEY_F22 = 0xF9;
const uint8_t KEY_F23 = 0xFA;
const uint8_t KEY_F24 = 0xFB;

const uint8_t KEY_NUM_0 = 0xEA;
const uint8_t KEY_NUM_1 = 0xE1;
const uint8_t KEY_NUM_2 = 0xE2;
const uint8_t KEY_NUM_3 = 0xE3;
const uint8_t KEY_NUM_4 = 0xE4;
const uint8_t KEY_NUM_5 = 0xE5;
const uint8_t KEY_NUM_6 = 0xE6;
const uint8_t KEY_NUM_7 = 0xE7;
const uint8_t KEY_NUM_8 = 0xE8;
const uint8_t KEY_NUM_9 = 0xE9;
const uint8_t KEY_NUM_SLASH = 0xDC;
const uint8_t KEY_NUM_ASTERISK = 0xDD;
const uint8_t KEY_NUM_MINUS = 0xDE;
const uint8_t KEY_NUM_PLUS = 0xDF;
const uint8_t KEY_NUM_ENTER = 0xE0;
const uint8_t KEY_NUM_PERIOD = 0xEB;

typedef uint8_t MediaKeyReport[2];

const MediaKeyReport KEY_MEDIA_NEXT_TRACK = {1, 0};
const MediaKeyReport KEY_MEDIA_PREVIOUS_TRACK = {2, 0};
const MediaKeyReport KEY_MEDIA_STOP = {4, 0};
const MediaKeyReport KEY_MEDIA_PLAY_PAUSE = {8, 0};
const MediaKeyReport KEY_MEDIA_MUTE = {16, 0};
const MediaKeyReport KEY_MEDIA_VOLUME_UP = {32, 0};
const MediaKeyReport KEY_MEDIA_VOLUME_DOWN = {64, 0};
const MediaKeyReport KEY_MEDIA_WWW_HOME = {128, 0};
const MediaKeyReport KEY_MEDIA_LOCAL_MACHINE_BROWSER = {0, 1}; // Opens "My Computer" on Windows
const MediaKeyReport KEY_MEDIA_CALCULATOR = {0, 2};
const MediaKeyReport KEY_MEDIA_WWW_BOOKMARKS = {0, 4};
const MediaKeyReport KEY_MEDIA_WWW_SEARCH = {0, 8};
const MediaKeyReport KEY_MEDIA_WWW_STOP = {0, 16};
const MediaKeyReport KEY_MEDIA_WWW_BACK = {0, 32};
const MediaKeyReport KEY_MEDIA_CONSUMER_CONTROL_CONFIGURATION = {0, 64}; // Media Selection
const MediaKeyReport KEY_MEDIA_EMAIL_READER = {0, 128};
```