電子ピアノのフットペダルをUSBフットペダル化するまで

# 経緯
ある日友人から「USBフットペダルが欲しいが、どれも野暮ったいデザインばかり。いい製品を知らないか？」と相談を受けました。
オシャレな製品の一つくらいあるだろうと調べてみると、予想と異なり目を覆いたくなるようなデザインの商品しか存在しませんでした。
![812mUjagPXL._AC_SX425_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587410/a14a4ca9-f9b0-2960-dccd-e0ee74ab494b.jpeg)

そこで思いついたのが電子ピアノのフットペダルをUSBフットペダルに利用する方法です。
これをUSB接続できれば最高のUSBフットペダルが出来上がるはず！
![51FDOZ-fs5L._AC_SL1000_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587410/a139793f-bdd5-a0fd-14f5-d7d5e24b5e92.png)
でもフットペダルそのものを改造してしまうと、後から増やしたい場合に不便です。
(増設時はフットペダル買ってきて刺すだけで完了させたい)

ということで今回はフットペダルのジャックを接続することでUSBフットペダル化する変換器を作りたいと思います。

# 作りたいもの
モノラルジャックの接続端子を持ち、信号をArduinoでUSB入力に変換するデバイスを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587410/0e083ce5-4f07-967a-eb51-cb4c85294c40.png)

# 材料費 (5,109円)
| 品名 | 金額 | 販売ページ |
|:-:|:-:|:-:|
| Arduino Micro<br>![Arduino Micro.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587410/c01be107-a3f3-715b-6c1a-965316b7e728.jpeg) | ￥3,200  | [Amazon](https://www.amazon.co.jp/gp/product/B00AFY2S56/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&psc=1) |
| モノラルジャック オープンタイプ<br>![71S8jr31FyL._AC_SL1500_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587410/db4198fc-9dfc-6394-d8d5-fd48c37aff01.png)  | ￥700   | [Amazon](https://www.amazon.co.jp/gp/product/B08ZSP28T5/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&psc=1)  |
| デュポンワイヤー(メス)<br>![71ysg9mfPnL._SL1001_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587410/7753f229-1728-d21b-bbbd-d9b0cd4a1f46.png)  | ￥990  | [Amazon](https://www.amazon.co.jp/gp/product/B06Y48V9DL/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&psc=1)  |
| プラスチックケース<br>![mono88209737-160226-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587410/58a3aee9-0d8d-e702-f694-d2647e54dd9d.png) | ￥219  | [モノタロウ](https://www.monotaro.com/p/8820/9737/?utm_campaign=order_confirmation&utm_medium=email_html&utm_source=system-email&utm_term=productImg)  |

# 1. 調査と設計

## 1-1. 調査編
フットペダルの接続端子を見ると絶縁ラインは1本のみなので、GND/信号線の2極のはずです。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587410/9ab992a7-b3e2-4730-8a19-80537c2a7256.png)

フットペダルを踏みながらテスターで確認するとしっかり通電してました。
これでフットペダルはただのスイッチと同じ扱いで良いことがわかりました。
![IMG_E0902.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587410/a057e82e-f0d2-bdb6-f0c9-c4cb6d6d3379.jpeg)

次は端子を接続するジャック側のGNDと信号線を確認します。
フットペダルの端子をジャックに接続し、テスターで確認すると中央と右側の端子が通電していることが確認できました。
この端子に配線すればArduino Microでフットペダルの状態を取得できます。
![IMG_0903.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587410/9ae6a230-7809-a8df-ae3f-a17775fa5bb3.jpeg)

## 1-2. 設計編
[Fritzing](https://fritzing.org/)でサクッと回路図を作ります。
調査編でフットペダルはただのスイッチに過ぎないと確認したので、回路図上はタクトスイッチとして扱います。
※実際は回路図のスイッチの箇所にジャックを接続します。

| 配置図 | 回路図 |
|:-:|:-:|
| ![Untitled Sketch 2_ブレッドボード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587410/8849588b-6f69-15ec-103e-b971d341dc2f.png) |![Untitled Sketch 2_回路図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587410/fcc30c93-1531-a10d-4978-1fcc5730a220.png)   |

※あれ？抵抗は？？って思う方いるかもしれませんが、今回はソース側にてINPUT_PULLUPでマイコン内のプルアップ抵抗を使ってるので、回路に抵抗は組み込まないのです！

# 2. デバイスの作成
## 2-1. ジャックにワイヤーを接続する
設計図に従ってジャックと配線をはんだ付けします。
![IMG_0906.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587410/e9647022-5d31-a347-10f2-20e7744793a8.jpeg)

## 2-2. ケースに穴を空ける
ケースにジャックの穴を3ヶ所、USBケーブル用の穴を1ヶ所作成します。
※ドリルで下穴を通して、テーパーリーマーでゴリゴリして空けました。
![IMG_0907.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587410/e8b5b015-1e24-b999-6cda-e94c16f87d61.jpeg)

## 2-3. ケースに部品を組み込む
ジャックをナットで固定して、Arduino MicroのGPIOピンに配線を接続します。
![IMG_0908.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587410/2e79f99f-7561-6171-0264-8db85284c0c0.jpeg)
Arduino Microにmicro USBケーブルを接続して蓋をねじ止めすればデバイスは完成です。
![IMG_0909.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587410/83f8c69d-10b5-c261-cb48-6222afb78cd0.jpeg)

# 3. ソースコードの焼き込み
## 3-1. Arduino IDEをインストールする
[Arduino IDE](https://www.arduino.cc/en/software)をダウンロードしてインストールします。

## 3-2. 制御用ソースを準備する

※エミュレートするキー値・マウス操作の値　(ソース中のBTN_xに設定する値)

| 設定値 |
|:-:|
|[キーボード (ASCII)](https://www.asciitable.com/)|
|[キーボード (拡張)](https://www.arduino.cc/reference/en/language/functions/usb/keyboard/keyboardmodifiers/)|
|[マウス](https://www.arduino.cc/reference/en/language/functions/usb/mouse/mousepress/)|

以下が制御ソースとなります。

```c++:footpedal_fw.ino
#include <Mouse.h>
#include <Keyboard.h>

// キー割り当て
const int BTN_1 = 0x80;
const int BTN_2 = MOUSE_RIGHT;
const int BTN_3 = MOUSE_LEFT;

// 定数
const int BTN_PUSH    = 0;
const int BTN_RELEASE = 1;
const int PIN[] = {8, 9, 10};                  // 利用PIN定義
const int PIN_NUM  = sizeof(PIN) / sizeof(int);// 利用PINの数

// ペダルごとの動作定義
static void push_btn_1(void){ Keyboard.press( BTN_1 ); }
static void push_btn_2(void){ Mouse.press( BTN_2 ); }
static void push_btn_3(void){ Mouse.press( BTN_3 ); }
static void release_btn_1(void){ Keyboard.release( BTN_1 ); }
static void release_btn_2(void){ Mouse.release( BTN_2 ); }
static void release_btn_3(void){ Mouse.release( BTN_3 ); }

void (* const FUNC_BTNS[PIN_NUM][2])(void) = {
    {push_btn_1, release_btn_1},
    {push_btn_2, release_btn_2},
    {push_btn_3, release_btn_3}
};

// グローバル変数
int BEFORE_VALUE[PIN_NUM] = {HIGH, HIGH, HIGH};  // 押下情報記録用 (High -> Low検知式の為、初期値High)

/*
 * 通電時の初期化処理
 */
void setup(){
  // ピン設定
  for (int i=0 ; i < PIN_NUM ; i++) {
      pinMode( PIN[i], INPUT_PULLUP );
  }
}

/*
 * 通電中のループ処理
 */
void loop(){
  for (int i=0 ; i < PIN_NUM ; i++) {

    // ピン値読み取り
    int value = digitalRead( PIN[i] );

    if (value == LOW) {
      if (BEFORE_VALUE[i] == HIGH) {
        // High -> Lowの場合
        FUNC_BTNS[i][BTN_PUSH]();

        // ボタンの変化を記録
        BEFORE_VALUE[i] = value;
      } else {
        // Low -> Lowの場合
        // Do Nothing
      }
    } else {
      if (BEFORE_VALUE[i] == LOW) {
        // Low -> Highの場合
        FUNC_BTNS[i][BTN_RELEASE]();

        // ボタンの変化を記録
        BEFORE_VALUE[i] = value;
      } else {
        // High -> Highの場合
        // Do Nothing
      }
    }
  }

  // ポーリング間隔
  delay( 10 );
}
```

## 3-3. 制御ソースをArduinoに焼く
まずはArduino MicroをUSBで開発PCに接続します。

「ツール」→「ボード」から「Arduino Micro」を選択します。
![](https://raw.githubusercontent.com/ATB-K/FootPedalFW/master/doc/image/board_select.png)

「ツール」→「シリアルポート」から接続している「Arduino Micro」を選択します。
![](https://raw.githubusercontent.com/ATB-K/FootPedalFW/master/doc/image/port_select.png)

「→」ボタンで制御用ソースを「Arduino Micro」に焼き込みます。
![](https://raw.githubusercontent.com/ATB-K/FootPedalFW/master/doc/image/write_fw.png)

# 4. 完成
制御ソースの書き込みが完了すればキーボードデバイスとして認識するので、ジャックにフットペダルを接続すれば利用できます。
オシャレなUSBフットペダルでブラウジングやコーディング、ゲーム体験を向上させましょう！
※ゲームとかはもしかするとマクロツール判定されるかもしれないので利用は自己責任で！