ArduinoUNOでUSBキーボードを自作する

今回は、ArduinoUNOをUSBキーボードに改造してみました。
音声認識をしてキーボード入力する案件があったため、
そのメモ用です。

## 事前準備
AdruinoUNOをUSB-HIDと認識させるためには
基板内のATmega16U2のファームウェアを変更する必要があります。
そのためにはファームウェア変更ソフトの「FLIP」をインストールする必要があります。
https://www.microchip.com/en-us/development-tool/flip
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/35c5d24d-48d6-ef53-d0a1-38f431a92b24.png)
FLIP 3.4.x for Windows (Java Runtime Environment included)をインストールします。（JREも含まれる）

## 手順
１、まずはプログラムを作成します。ATmega16U2のファームウェアを一度書き換えてしまうとその後はHIDと認識されてしまうため
ATmega328に書き込みが出来なくなってしまうためです。
今回はGANTZ様の記事を参考にしてプログラムを作成しました
https://qiita.com/GANTZ/items/f619ccc6521e28a49faa

```c
int lastStatePin4 = HIGH; // ピン4の前回の状態を保存
int lastStatePin7 = HIGH; // ピン7の前回の状態を保存

void setup() {
  pinMode(4, INPUT_PULLUP);
  pinMode(7, INPUT_PULLUP);
  Serial.begin(9600);
}

void loop() {
  int currentStatePin4 = digitalRead(4); // ピン4の現在の状態を読み取る
  int currentStatePin7 = digitalRead(7); // ピン7の現在の状態を読み取る

  // ピン4が1から0に変化したときだけ「HELLO」を送信
  if (lastStatePin4 == HIGH && currentStatePin4 == LOW) {
    putChar(0x45);
  }

  // ピン7が1から0に変化したときだけ「IIO」を送信
  if (lastStatePin7 == HIGH && currentStatePin7 == LOW) {
    putChar(0x44);
  }

  // 現在の状態を保存
  lastStatePin4 = currentStatePin4;
  lastStatePin7 = currentStatePin7;

  delay(50); // デバウンスのための遅延
}

void putChar(byte data) {
  for (byte j = 0; j <= 7; j++) {
    if (j == 2) {
      Serial.write(data);
    } else {
      Serial.write(0x00);
    }
  }

  for (byte j = 0; j <= 7; j++) {
    Serial.write(0x00);
  }
}
void Sheft(byte data) {
  for (byte j = 0; j <= 7; j++) {
    if (j == 6) {
      Serial.write(data);
    } else if (j == 2) {
      Serial.write(0xE5);
    } else {
      Serial.write(0x00);
    }
  }
  for (byte j = 0; j <= 7; j++) {
    Serial.write(0x00);
  }
}
void Ender() {
  for (byte j = 0; j <= 7; j++) {
    if (j == 2) {
      Serial.write(0x00);
    } else {
      Serial.write(0x00);
    }
  }
}
```


２、ArduinoUNOのリセットピンをショート（ショートバー接続）させます。
![IMG20240708091016.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/992bc4be-1160-2fce-df14-f487cc771688.jpeg)

３、PCにArduinoUNOを接続し、その後ショートバーを取り外します。不明なデバイスで表示されることを確認しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/81cc075e-900d-af93-cf0e-b88fe0770a15.png)

４、FLIPを起動します。Select taget deviceからATmega16U2を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/62021af7-c412-111c-4760-fcb69d9e9f6f.png)

５、USB接続を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/43608815-581a-49c2-f493-972d6dedb198.png)

６、USB Port ConnectionをOpenします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/1c077733-d337-acb4-2e81-3ec11c1f03db.png)
※私はここでエラーになりました。どうもドライバのインストールが必要なようです。以下のサイトからドライバをダウンロードしました。ドライバーの更新でダウンロードしたフォルダを選択してください。
https://www.driverscape.com/download/atmega16u2
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/9dc2494e-4a86-9e08-ebc1-4bfbde778e0c.png)
正常に認識されると以下のように表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/dce93bbc-989c-c841-ce39-acf69fcb3012.png)

７、以下のサイトから「Arduino-keyboard-0.3.hex」をダウンロード。
https://github.com/coopermaa/USBKeyboard/blob/master/firmware/Arduino-keyboard-0.3.hex
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/52461187-f161-721b-7e6c-9e04198abd06.png)

８、File＞Load HEX Fileを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/b98dcbfa-46cd-b5dd-e3d8-bc0e9266d5fc.png)

９、Runボタンをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/251d5bbe-e139-880b-fa31-ca957c101395.png)

１０、左下に「Verify PASS」が表示されれば完了。
USBを再接続すると次回からはHIDキーボードデバイスとして認識されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/e81ae781-ed03-3e16-cd2c-d5ae77af4d92.png)

１１、最後に４ピンをショートさせれば「F12」キーを押されること。
　　　７ピンをショートさせれば「F11」キーを押されることが確認できれば完了です。