ギタコンの自作 試作3

試作3の内容

  • ボタンを小さなタクトスイッチから、それっぽい大きさのタクトスイッチに変えます。
  • ボタンの数を増やします。
  • Pickをボタンではなく、アナログスティックにしてみます。
  • ごちゃごちゃしてきた配線をすっきりさせます。

試作3で使うもの一覧

試作1で使ったものに加えて、以下を使います。

追加費用は、合計で 2400円+発送費用くらいです。

名称値段(参考)通販コード
それっぽい大きさのタクトスイッチを、必要な個数分だけ。

私にはボタン候補としてこれくらいしか見つけることができませんでした。ブレッドボードに載せられるもっといいボタンがあれば、ぜひ教えてください。

なおこの写真には、タクトスイッチだけでなく、次の項目のジョイスティックも含まれています。IMG_3632_.jpg
1個160円程度マルツオンライン:
KC901TCアカ
KC901TCミドリ
KC901TCアオ
KC901TCキ
KC901TCシロ
2軸ジョイスティックモジュール x1 1個780円程度秋月電子:
M-06807
各種長さが揃ったジャンパワイヤー IMG_3643.JPG 400円程度 秋月電子:
P-05160

ボタンの追加

試作1と2で、4つのボタンを使うために、Arduino Microの、12,11,10, 9番ピンを既に使用しています。ボタンの数を増やす場合は、8,7,6,5..というように、使うピンを増やしてださい。

その上で、スケッチを変更してください。 例えば、ボタンを2個増やす場合(8,7ピンを追加で使用する場合)は、以下のようにスケッチを修正します(赤字部)。

しつこいようですが、修正したスケッチをArduino Microに書き込む際には、COMポートが変わってないか確認して、 (変わっていたら再設定, ポートが見つからなかったらリセットボタン2連打)、書き込みのタイミングでArduino Microのリセットボタンを2連打してください。

Joystick_ Joystick(
  JOYSTICK_DEFAULT_REPORT_ID, JOYSTICK_TYPE_GAMEPAD,
  46, 0,                 // Buttons, Hat Switch Count ボタンの数を4から6に増やす
  false, false, false,  // X,Y,Z Axis
  false, false, false,  // Rx, Ry, Rz Axis
  false, false,         // rudder, throttle
  false, false, false   // accelerator, break, steering
);

void setup() {
  // Initialize Button Pins
  pinMode(7, INPUT_PULLUP);    // 追加
  pinMode(8, INPUT_PULLUP);    // 追加
  pinMode(9, INPUT_PULLUP);    
  pinMode(10, INPUT_PULLUP);
  pinMode(11, INPUT_PULLUP);
  pinMode(12, INPUT_PULLUP);

  // Initialize Joystick Library
  Joystick.begin();
}

// Constant that maps the phyical pin to the joystick button.
const int pinToButtonMap = 97; // 9を7に変更

// Last state of the button
int lastButtonState[46] = {0,0,0,0,0,0};    // 4を6に変更し、0を2つ追加
unsigned long lastButtonChangedTime[46] = {0,0,0,0,0,0};    // 4を6に変更し、0を2つ追加

void loop() {

  // Read pin values
  for (int index = 0; index < 46; index++)    // 4を6に変更
  {
    int currentButtonState = !digitalRead(index + pinToButtonMap);
    if (currentButtonState != lastButtonState[index])
    {
      unsigned long t = millis();

      if (t > lastButtonChangedTime[index] + 10)
      {
        Joystick.setButton(index, currentButtonState);
        lastButtonState[index] = currentButtonState;
        lastButtonChangedTime[index] = t;
      }
    }
  }

  delay(1);
}

配線の説明は不要かなと思いますが・・・念のために。ボタンを2個増やす場合は、Arduino MIcroの7,6番ピンを、それぞれ追加するボタンにつなぎます。ボタンのもう片方の端子は、どちらもGNDにつなぎます。(試作1の配線と全く同じ。)

アナログスティックの追加

ここを参考にして、アナログジョイスティックをピック用に追加します。(アナログスティックをピックに使うため、これまでボタンで実現していたピックは削除します。つまり、ボタンは1個減らします)

ここで使っているアナログスティックは2軸(X,Y)をサポートしていますが、ここではX軸だけを使います。

まず、配線図は以下のようになります。Arduino Microのアナログ入力ピン(A0)に、ジョイスティックのX軸の出力ピン(L/R)をつなぎます。 また、スティックの「L/R+」ピンにはArduino Microから5Vを入力し、GNDも忘れずに配線します。Y軸関係(U/Dなど)の配線は不要です。

次に、Arduino Microのスケッチに、アナログスティック対応を追加(と、ボタン1個削除)します。

(略)
Joystick_ Joystick(
  JOYSTICK_DEFAULT_REPORT_ID, JOYSTICK_TYPE_GAMEPAD,
  65, 0,                 // Buttons, Hat Switch Count  6を5に減らす
  falsetrue, false, false,  // X,Y,Z Axis  X Axisを有効化
  false, false, false,  // Rx, Ry, Rz Axis
  false, false,         // rudder, throttle
  false, false, false   // accelerator, break, steering
);


void setup() {
  // Initialize Button Pins
  pinMode(7, INPUT_PULLUP);  // ボタンを1個減らす
  pinMode(8, INPUT_PULLUP);
  pinMode(9, INPUT_PULLUP);
  pinMode(10, INPUT_PULLUP);
  pinMode(11, INPUT_PULLUP);
  pinMode(12, INPUT_PULLUP);

  // Initialize Joystick Library
  Joystick.begin();
}

// Constant that maps the phyical pin to the joystick button.
const int pinToButtonMap = 78;      // ボタンを1個減らす

// Last state of the button
int lastButtonState[65] = {0,0,0,0,0,0};    // ボタンを1個減らす
int lastAnalogInput[1] = {0};
const int AnalogInputPin[3]={A0, A1, A2};
unsigned long lastButtonChangedTime[65] = {0,0,0,0,0,0};  // ボタンを1個減らす

void loop() {

  // Read digital pin values
  for (int index = 0; index < 65; index++)  // ボタンを1個減らす
  {
    int currentButtonState = !digitalRead(index + pinToButtonMap);
    if (currentButtonState != lastButtonState[index])
    {
      unsigned long t = millis();

      if (t > lastButtonChangedTime[index] + 10)
      {
        Joystick.setButton(index, currentButtonState);
        lastButtonState[index] = currentButtonState;
        lastButtonChangedTime[index] = t;
      }
    }
  }

  // Read analog pin values
  for (int index = 0; index < 1; index++)
  {
    int currentAnalogInput = analogRead(AnalogInputPin[index]);
    if (currentAnalogInput != lastAnalogInput[index])
    {
      Joystick.setXAxis(currentAnalogInput);
      lastAnalogInput[index] = currentAnalogInput;
    }
  }

  delay(1);
}

何度もしつこくて申し訳ないですが、修正したスケッチをArduino Microに書き込む際には、COMポートが変わってないか確認して、 (変わっていたら再設定, ポートが見つからなかったらリセットボタン2連打)、書き込みのタイミングでArduino Microのリセットボタンを2連打してください。

アナログスティックのキャリブレーション

Win10の場合、以下のような流れとなります。これを実施しないと、DTXManiaで軸入力を正しく読み取ることができません。

DTXManiaでの、アナログスティックのキーアサイン

DTXManiaは、アナログスティックの軸入力に対応しています。ダウンストロークとアップストロークの両方を登録してください。 軸の遊びの大きさは調整できません。(ごめんなさい)

アナログスティックの敏感さの軽減

このままDTXManiaでこの「ギタコン試作3」を使用することができますが、Arduino Microをよく見ると、中央付近のオレンジのLEDが頻繁にチカチカしていると思います。

このLEDは、USBへの出力が発生したときに光るようなのですが、実際にはアナログ軸の値が微妙に変化していて、それをいちいち軸入力としてPCに送信しているようです。

このような誤差レベルの通信が頻繁に発生しているようでは、肝心の操作情報の通信にも影響があるかもしれませんので、このような「微妙な操作情報」はPCに送信しないように工夫します。具体的には、前回の軸入力の値と比較して、変化量が±5以下の場合は、無視するようにします。スケッチの修正箇所は以下となります。

(中略...以下、最後のところ)
  // Read analog pin values
  for (int index = 0; index < 1; index++)
  {
    int currentAnalogInput = analogRead(AnalogInputPin[index]);
    if (currentAnalogInput != lastAnalogInput[index])
    {
      if (abs(currentAnalogInput - lastAnalogInput[index]) > 5)
      {
        Joystick.setXAxis(currentAnalogInput);
        lastAnalogInput[index] = currentAnalogInput;
      }
    }
  }

  delay(1);
}

配線をすっきりさせる

新しく入手した「短いジャンパーワイヤー」を使って、GNDや5Vの配線を置き換えました。 ジョイスティックのところへの信号線は適当な長さのケーブルが無かったので、やむなく反対側(手前側)のL/R端子に接続を迂回しました。 これで、ケーブルを手前側でまとめれば、そこそこすっきりするかなと思います。

まとめ

試作3では、ボタンを増やし、ピックをアナログスティックに変え、配線をすっきりさせました。

ただ、ピックをアナログスティックにしたくない (デジタルボタンのままが良い) という方もいらっしゃると思います。そういう方は、ピックをデジタルボタンのまま残しておいてもよいと思います。

試作3のスケッチ全体のダウンロード: gtcon-05_.zip (アナログスティック対応あり)