DDR（フットコントローラ）をArduino Microをとおして認識させるときのメモ

# はじめに
本記事はDDR（Dance Dance Revolution）のフットコントローラをArduino Microを介してパソコンに認識させるための改造メモです。

Amazonでは下記のようなDDRのパチモンが、よくわからないメーカーから販売されています。
USBでPCと接続・認識しますが、Mac catalinaでいまいち認識しなかったので、仕組みを理解する・分解を楽しむために改造してみました。

有料ソフトでこういったコントローラを認識するソフトがあるので、改造が手間という場合はそちらを使った方が良さそうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212276/629ab5b2-5992-0915-26e5-12e54ec84da9.png)

# 必要なもの
- フットコントローラ
- Arduino Micro (もしくはArduino Leonardo、Arduino Due)
　→　HID機能をつかって入力をキーボードのボタンに割り当てるためHID機能がついているボードを使います。 

# 分解
基板部分を分解すると、下記のようになっていました。
フットコントローラ部分の接続は薄いフィルムとなっていて、基板部分と接触することでつながっています。
真ん中の少し太い線がGNDで、それ以外がフットコントローラのそれぞれの入力ピンとなっています。

![配線.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212276/22faf04d-ad77-8485-c87b-f0e3a1da9a5a.jpeg)

そこから配線を適当に伸ばします。
そしてこれらをマイコンにつなぎます。
GNDはGND、入力ピンはデジタルピンに繋ぎます。
これで回路の準備は終わりです。

![footcontroller10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212276/62948058-ff25-c380-555f-f6083165cf3c.jpeg)

# プログラム
[Github](https://github.com/minwinmin/Footcontroller-ArduinoMicro)にも一応あげておきます。
まずはどの入力ピンがどのボタンに接続されているか確かめます。
下記のプログラムのピン番号は任意です。
ボタンとピンの割り当てがわかればメモしておきましょう。

```c++
#define SERIAL Serial

void setup() {
  SERIAL.begin(115200);
  pinMode(3, INPUT_PULLUP);
  pinMode(4, INPUT_PULLUP);
  pinMode(5, INPUT_PULLUP);
  pinMode(6, INPUT_PULLUP);
  pinMode(7, INPUT_PULLUP);
  pinMode(8, INPUT_PULLUP);
  pinMode(9, INPUT_PULLUP);
  pinMode(10, INPUT_PULLUP);
  pinMode(14, INPUT_PULLUP);
  pinMode(15, INPUT_PULLUP);
  pinMode(16, INPUT_PULLUP);
}

void loop() {
  SERIAL.println("Pin 3 is : ");
  SERIAL.println(digitalRead(3));
  SERIAL.println("Pin 4 is : ");
  SERIAL.println(digitalRead(4));
  SERIAL.println("Pin 5 is : ");
  SERIAL.println(digitalRead(5));
  SERIAL.println("Pin 6 is : ");
  SERIAL.println(digitalRead(6));
  SERIAL.println("Pin 7 is : ");
  SERIAL.println(digitalRead(7));
  SERIAL.println("Pin 8 is : ");
  SERIAL.println(digitalRead(8));
  SERIAL.println("Pin 9 is : ");
  SERIAL.println(digitalRead(9));
  SERIAL.println("Pin 10 is : ");
  SERIAL.println(digitalRead(10));
  SERIAL.println("Pin 11 is : ");
  SERIAL.println(digitalRead(11));
  SERIAL.println("Pin 12 is : ");
  SERIAL.println(digitalRead(12));
  SERIAL.println("Pin 13 is : ");
  SERIAL.println(digitalRead(13));

  delay(1000);
}

```

Arduino Microに書き込むプログラムは下記の通りです。
フットコントローラの入力をキーボードの入力に置き換えています。

```c++
#include <Arduino.h>
#include "Keyboard.h"
#define SERIAL Serial

const int inputPin = 3;
bool currentState = HIGH;
bool beforeState = HIGH;

void setup() {
  SERIAL.begin(115200);
  pinMode(3, INPUT_PULLUP);
  pinMode(4, INPUT_PULLUP);
  pinMode(5, INPUT_PULLUP);
  pinMode(6, INPUT_PULLUP);
  pinMode(7, INPUT_PULLUP);
  pinMode(8, INPUT_PULLUP);
  pinMode(9, INPUT_PULLUP);
  pinMode(10, INPUT_PULLUP);
  pinMode(14, INPUT_PULLUP);
  pinMode(15, INPUT_PULLUP);
  pinMode(16, INPUT_PULLUP);
  Keyboard.begin();
}

void loop() {
  int pinNum[11] = {3, 4, 5, 6, 7, 8, 9, 10, 14, 15, 16};
  #下記は文字コード(ASCIIコード)
  unsigned char s[11] = {0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x70, 0x71};

  for(int i; i<11; i++){
    if ( digitalRead(pinNum[i]) == 0){
        //digitalWrite(ledPin, HIGH);
        SerialUSB.println("Push!");
        #ボタンがおされたときに文字を入力
        Keyboard.press( s[i] );
    } else {
        //digitalWrite(ledPin, LOW);
        SerialUSB.println("Release!");
        #ボタンがおされなくなったら文字入力を終了
        Keyboard.release( s[i] );
    }
  }
  delay(500);
}
```

# 本当に雑な所感
Arduino MicroやLeonardo、 DueのHID機能をつかいこなすと面白いことができそう。