== ギタコンの自作 試作3
=== 試作3の内容
* ボタンを小さなタクトスイッチから、それっぽい大きさのタクトスイッチに変えます。
* ボタンの数を増やします。
* Pickをボタンではなく、アナログスティックにしてみます。
* ごちゃごちゃしてきた配線をすっきりさせます。
[[PageOutline(start=3)]]
=== 試作3で使うもの一覧
試作1で使ったものに加えて、以下を使います。
追加費用は、合計で 2400円+発送費用くらいです。
||名称||値段||(参考)通販コード||
||それっぽい大きさのタクトスイッチを、必要な個数分だけ。[[br]][[br]]私にはボタン候補としてこれくらいしか見つけることができませんでした。ブレッドボードに載せられるもっといいボタンがあれば、ぜひ教えてください。[[br]][[br]]なおこの写真には、タクトスイッチだけでなく、次の項目のジョイスティックも含まれています。[[Thumb(IMG_3632_.jpg, size=240x84)]] ||1個160円程度||マルツオンライン:[[br]][https://www.marutsu.co.jp/pc/i/9556/ KC901TCアカ] [[br]][https://www.marutsu.co.jp/pc/i/9567/ KC901TCミドリ] [[br]][https://www.marutsu.co.jp/pc/i/9557/ KC901TCアオ] [[br]][https://www.marutsu.co.jp/pc/i/9565/ KC901TCキ] [[br]][https://www.marutsu.co.jp/pc/i/9566/ KC901TCシロ] ||
||2軸ジョイスティックモジュール x1 ||1個780円程度||秋月電子:[[br]][http://akizukidenshi.com/catalog/g/gM-06807/ M-06807] ||
||各種長さが揃ったジャンパワイヤー [[Thumb(IMG_3643.JPG, size=256x93)]] || 400円程度 || 秋月電子:[[br]][http://akizukidenshi.com/catalog/g/gP-05160/ 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連打してください。
{{{ html
<pre>
Joystick_ Joystick(
JOYSTICK_DEFAULT_REPORT_ID, JOYSTICK_TYPE_GAMEPAD,
<s>4</s><font color="red">6</font>, 0, // Buttons, Hat Switch Count <font color="red">ボタンの数を4から6に増やす</font>
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
<font color="red"> pinMode(7, INPUT_PULLUP); // 追加
pinMode(8, INPUT_PULLUP); // 追加
</font> 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 = <s>9</s><font color="red">7</font>; <font color="red">// 9を7に変更</font>
// Last state of the button
int lastButtonState[<s>4</s><font color="red">6</font>] = {0,0,0,0<font color="red">,0,0</font>}; <font color="red">// 4を6に変更し、0を2つ追加</font>
unsigned long lastButtonChangedTime[<s>4</s><font color="red">6</font>] = {0,0,0,0<font color="red">,0,0</font>}; <font color="red">// 4を6に変更し、0を2つ追加</font>
void loop() {
// Read pin values
for (int index = 0; index < <s>4</s><font color="red">6</font>; index++) <font color="red">// 4を6に変更</font>
{
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);
}
</pre>
}}}
配線の説明は不要かなと思いますが・・・念のために。ボタンを2個増やす場合は、Arduino MIcroの7,6番ピンを、それぞれ追加するボタンにつなぎます。ボタンのもう片方の端子は、どちらもGNDにつなぎます。(試作1の配線と全く同じ。)
[[Thumb(gt-con-04_bb.png, size=480x218, caption=ボタンを6個に増やしたときの配線図。試作1と比べて、黄色と白、黒の配線を増やしただけ。)]]
=== アナログスティックの追加
[http://myct.jp/arduino/index.php?2%E8%BB%B8%E3%82%B8%E3%83%A7%E3%82%A4%E3%82%B9%E3%83%86%E3%82%A3%E3%83%83%E3%82%AF ここ]を参考にして、アナログジョイスティックをピック用に追加します。(アナログスティックをピックに使うため、これまでボタンで実現していたピックは削除します。つまり、ボタンは1個減らします)
ここで使っているアナログスティックは2軸(X,Y)をサポートしていますが、ここではX軸だけを使います。
まず、配線図は以下のようになります。Arduino Microのアナログ入力ピン(A0)に、ジョイスティックのX軸の出力ピン(L/R)をつなぎます。
また、スティックの「L/R+」ピンにはArduino Microから5Vを入力し、GNDも忘れずに配線します。Y軸関係(U/Dなど)の配線は不要です。
[[Thumb(gt-con-05_bb.png, size=480x236, caption=ボタンを5個に減らし、アナログスティックを増やしたときの配線図。)]]
[[Thumb(gtcon-05.jpg, size=480x360, caption=実際に配線してみた図。)]]
次に、Arduino Microのスケッチに、アナログスティック対応を追加(と、ボタン1個削除)します。
{{{ html
<pre>
(略)
Joystick_ Joystick(
JOYSTICK_DEFAULT_REPORT_ID, JOYSTICK_TYPE_GAMEPAD,
<s>6</s><font color="red">5</font>, 0, // Buttons, Hat Switch Count <font color="red">6を5に減らす</font>
<s>false</s><font color="red">true</font>, false, false, // X,Y,Z Axis <font color="red">X Axisを有効化</font>
false, false, false, // Rx, Ry, Rz Axis
false, false, // rudder, throttle
false, false, false // accelerator, break, steering
);
void setup() {
// Initialize Button Pins
<s>pinMode(7, INPUT_PULLUP);</s> <font color="red">// ボタンを1個減らす</font>
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 = <s>7</s><font color="red">8</font>; <font color="red">// ボタンを1個減らす</font>
// Last state of the button
int lastButtonState[<s>6</s><font color="red">5</font>] = {0,0,0,0,0<s>,0</s>}; <font color="red">// ボタンを1個減らす</font>
<font color="red">int lastAnalogInput[1] = {0};
const int AnalogInputPin[3]={A0, A1, A2};</font>
unsigned long lastButtonChangedTime[<s>6</s><font color="red">5</font>] = {0,0,0,0,0<s>,0</s>}; <font color="red">// ボタンを1個減らす</font>
void loop() {
// Read <font color="red">digital</font> pin values
for (int index = 0; index < <s>6</s><font color="red">5</font>; index++) <font color="red">// ボタンを1個減らす</font>
{
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;
}
}
}
<font color="red">// 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;
}
}</font>
delay(1);
}
</pre>
}}}
何度もしつこくて申し訳ないですが、修正したスケッチをArduino Microに書き込む際には、COMポートが変わってないか確認して、
(変わっていたら再設定, ポートが見つからなかったらリセットボタン2連打)、書き込みのタイミングでArduino Microのリセットボタンを2連打してください。
=== アナログスティックのキャリブレーション
Win10の場合、以下のような流れとなります。これを実施しないと、DTXManiaで軸入力を正しく読み取ることができません。
[[Thumb(carribration01_.png, size=320x271, caption=「設定」-「デバイス」-「Bluetoothとその他のデバイス」で、右端または画面下にある「デバイスとプリンター」をクリック。)]]
[[Thumb(carribration02_.png, size=320x215, caption=「Arduino Micro」というデバイスが見えているはずなので、右クリックして「ゲームコントローラーの設定」をクリック。)]]
[[Thumb(carribration03_.PNG, size=320x267, caption=「ゲームコントローラー」のウインドウが出てくるので、「Arduino Micro」をクリックして、「プロパティ」をクリック。)]]
[[Thumb(carribration04_.png, size=320x356, caption=「Arduino Microのプロパティ」ウインドウが出てくるので、「設定」タブをクリックし、「調整」ボタンをクリック。)]]
[[Thumb(carribration05_.png, size=320x247, caption=「ゲームデバイスの調整」ウィザードが出るので、「次へ」をクリック。)]]
[[Thumb(carribration06_.png, size=320x247, caption=「方向パッドを中央において、コントローラーのボタンを押して下さい。」と出るので、コントローラーを水平な場所において、「次へ」をクリック。)]]
[[Thumb(carribration07_.png, size=320x247, caption=「方向パッドをすべての方向に押してから、コントローラーのボタンを押してください。」と出るので、スティックをぐるぐる大きく何回か回してから「次へ」をクリック。たくさん回す必要はありません。)]]
[[Thumb(carribration08_.png, size=320x247, caption=「完了」をクリックして、キャリブレーション完了。)]]
[[Thumb(carribration09_png.png, size=320x247, caption=キャリブレーションが終わったら、軸入力とボタン入力がどちらも正しく動作するか確認してください。軸を目一杯倒したときに、カーソルが目一杯動いていればOKです。目一杯倒してもカーソルが少ししか動かないようであれば、キャリブレーションの時の軸のぐりぐり回しの時の軸の傾け方が不十分です。もう一度キャリブレーションをやり直してください。)]]
=== DTXManiaでの、アナログスティックのキーアサイン
DTXManiaは、アナログスティックの軸入力に対応しています。ダウンストロークとアップストロークの両方を登録してください。
軸の遊びの大きさは調整できません。(ごめんなさい)
=== アナログスティックの敏感さの軽減
このままDTXManiaでこの「ギタコン試作3」を使用することができますが、Arduino Microをよく見ると、中央付近のオレンジのLEDが頻繁にチカチカしていると思います。
このLEDは、USBへの出力が発生したときに光るようなのですが、実際にはアナログ軸の値が微妙に変化していて、それをいちいち軸入力としてPCに送信しているようです。
このような誤差レベルの通信が頻繁に発生しているようでは、肝心の操作情報の通信にも影響があるかもしれませんので、このような「微妙な操作情報」はPCに送信しないように工夫します。具体的には、前回の軸入力の値と比較して、変化量が±5以下の場合は、無視するようにします。スケッチの修正箇所は以下となります。
{{{ html
<pre>
(中略...以下、最後のところ)
// Read analog pin values
for (int index = 0; index < 1; index++)
{
int currentAnalogInput = analogRead(AnalogInputPin[index]);
if (currentAnalogInput != lastAnalogInput[index])
{
<font color="red">if (abs(currentAnalogInput - lastAnalogInput[index]) > 5)
{</font>
Joystick.setXAxis(currentAnalogInput);
lastAnalogInput[index] = currentAnalogInput;
<font color="red">}</font>
}
}
delay(1);
}
</pre>
}}}
=== 配線をすっきりさせる
新しく入手した「短いジャンパーワイヤー」を使って、GNDや5Vの配線を置き換えました。
ジョイスティックのところへの信号線は適当な長さのケーブルが無かったので、やむなく反対側(手前側)のL/R端子に接続を迂回しました。
これで、ケーブルを手前側でまとめれば、そこそこすっきりするかなと思います。
[[Thumb(gtcon-05.jpg, size=512x384, caption=すっきりさせる前。これで実際にギターパートをプレイしろというのは無謀ですね。)]]
[[Thumb(IMG_3644_.jpg, size=512x238, caption=短いジャンパーワイヤーを使って、配線をすっきりさせた後。そこそこすっきりした。画面奥側(実際に指が出てくるところ)を邪魔するケーブルはなくなりました。))]]
=== まとめ
試作3では、ボタンを増やし、ピックをアナログスティックに変え、配線をすっきりさせました。
ただ、ピックをアナログスティックにしたくない (デジタルボタンのままが良い) という方もいらっしゃると思います。そういう方は、ピックをデジタルボタンのまま残しておいてもよいと思います。
試作3のスケッチ全体のダウンロード: [[LinkAttach(gtcon-05_.zip)]] (アナログスティック対応あり)