---
# System prepended metadata

title: Arduino 自製按鈕盤製作

---

#  Arduino 自製按鈕盤製作

> 這是我自己利用 Arduino 製作一個簡易且可自訂的 USB 按鈕控制器的經驗
>
![0c2b6d0e-7c61-4725-aaff-98599d2e42d7](https://hackmd.io/_uploads/BJSVXEOfle.jpg)


---

##  材料清單

| 名稱 | 數量 | 備註 |
|------|------|------|
| 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)
