#include #define LED 21 #define MODESWITCH 7 //割り込みに使用 uint8_t button[10] = {2, 3, 4, 5, 8, 9, 10, 16, 14, 7}; uint8_t btstat[9]; static volatile uint8_t mode; void setup() { for(int i=0; i<10; i++) pinMode(button[i], INPUT_PULLUP); for(int i=0; i<9; i++) btstat[i] = 1; pinMode(LED, OUTPUT); XInput.setJoystickRange(0, 1023); XInput.setAutoSend(false); // Wait for all controls before sending XInput.begin(); changeMode(); //スイッチ状態の設定 attachInterrupt(digitalPinToInterrupt(MODESWITCH), changeMode, CHANGE); } void loop() { uint8_t st; for(int i=0; i<9; i++) { st = digitalRead(button[i]); if(btstat[i] != st) { switch(i) { case 0: //上 XInput.setButton(DPAD_UP, !(st & 1)); break; case 1: //下 XInput.setButton(DPAD_DOWN, !(st & 1)); break; case 2: //右 XInput.setButton(DPAD_RIGHT, !(st & 1)); break; case 3: //左 XInput.setButton(DPAD_LEFT, !(st & 1)); break; case 4: //START XInput.setButton(BUTTON_START, !(st & 1)); break; case 5: //SELECT XInput.setButton(BUTTON_BACK, !(st & 1)); break; case 6: //A if(mode) XInput.setButton(BUTTON_B, !(st & 1)); else XInput.setButton(BUTTON_RB, !(st & 1)); break; case 7: //B if(mode) XInput.setButton(BUTTON_A, !(st & 1)); else XInput.setButton(BUTTON_LB, !(st & 1)); break; case 8: //C if(mode) XInput.setButton(BUTTON_X, !(st & 1)); else XInput.setButton(BUTTON_Y, !(st & 1)); break; } btstat[i] = st; XInput.send(); } } delay(10); //チャタリング軽減 } void changeMode() { if(digitalRead(button[9]) == LOW) { digitalWrite(LED, HIGH); mode = 0; } else { digitalWrite(LED, LOW); mode = 1; } }