# 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)