# Arduino 自製按鈕盤製作
> 這是我自己利用 Arduino 製作一個簡易且可自訂的 USB 按鈕控制器的經驗
>

---
## 材料清單
| 名稱 | 數量 | 備註 |
|------|------|------|
| Arduino Leonardo / Micro | 1 | **需支援 HID** |
| 按鈕(Push Button) | N | 數量視需求而定 |
| 杜邦線 / 排線 | 若干 | 用來連接按鈕 |
| 面板(可選) | 1 | 壓克力、紙板或 3D 列印殼都可 |
| 焊接工具(可選) | - | |
---
## 為什麼要用 Arduino Leonardo / Micro?
只有這些板子內建 USB 通訊功能,可用作 **HID(Human Interface Device)**,模擬鍵盤或滑鼠輸入,才可被電腦識別為控制器。
## 電路接法
每個按鈕一端接到 Arduino 某個數位腳位(如 A2~A9),另一端接 GND,並在程式中設定為 **INPUT_PULLUP** 模式。
```plaintext
[Button] --- A2 (Arduino)
|
└-------- GND
```
## 程式碼(使用 Joystick 庫)
### 安裝 Joystick 函式庫
在 Arduino IDE:
`工具 → 管理程式庫 → 搜尋 Joystick → 安裝`
### 程式碼範例:20 鍵模擬
```cpp
#include <Joystick.h>
Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID,
JOYSTICK_TYPE_JOYSTICK,
20, 0,
false, false, false,
false, false, false,
false, false, false);
const int buttonPins[20] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, A0, A1, A2, A3, A4, A5};
bool lastButtonState[20] = {HIGH};
unsigned long lastDebounceTime[20] = {0};
const int debounceDelay = 50;
void setup() {
for (int i = 0; i < 20; i++) {
pinMode(buttonPins[i], INPUT_PULLUP);
}
Joystick.begin();
}
void loop() {
for (int i = 0; i < 20; i++) {
bool reading = (digitalRead(buttonPins[i]) == LOW);
if (reading != lastButtonState[i]) {
lastDebounceTime[i] = millis();
}
if ((millis() - lastDebounceTime[i]) > debounceDelay) {
if (reading != lastButtonState[i]) {
Joystick.setButton(i, reading ? 1 : 0);
lastButtonState[i] = reading;
}
}
}
delay(5);
}
```
---
## 組裝建議
- 可用 3D 列印、雷切壓克力、紙板製作面板固定按鈕
- 如需支援多個按鈕,可搭配電阻矩陣、I2C 擴展模組
- 若需要顯示狀態,可加上 LED 或 OLED 顯示模組
---
### 測試方式
1. 將 Arduino 接上電腦
1. 開啟driverstation usb ( 搖桿連接判斷介面 )
1. 按下按鈕,應該會輸出對應按鍵
**如果想測試按鍵是否有正確觸發也可用這段程式來測試0/1的轉變(有時會是電路連接的問題):**
```cpp
const int buttonPin = 3; // 你的接腳
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
Serial.begin(9600);
}
void loop() {
int buttonState = digitalRead(buttonPin);
Serial.println(buttonState);
delay(100);
```
---
### <font color="#f50"> ! 都看完了,我要回家 ! </font>
## [好](https://hackmd.io/ACI3uWclSO6rAX9mMNIxcQ)