DTXMania 099 series, and DTXCreator: (099g(191022)) | 2019-10-23 00:21 |
DTXMania 100 series, and DTXCreator: (119(211020) and 035(191001)) | 2021-10-20 00:00 |
試作1で使ったものに加えて、以下を使います。
追加費用は、合計で 2400円+発送費用くらいです。
名称 | 値段 | (参考)通販コード |
それっぽい大きさのタクトスイッチを、必要な個数分だけ。 私にはボタン候補としてこれくらいしか見つけることができませんでした。ブレッドボードに載せられるもっといいボタンがあれば、ぜひ教えてください。 なおこの写真には、タクトスイッチだけでなく、次の項目のジョイスティックも含まれています。 | 1個160円程度 | マルツオンライン: KC901TCアカ KC901TCミドリ KC901TCアオ KC901TCキ KC901TCシロ |
2軸ジョイスティックモジュール x1 | 1個780円程度 | 秋月電子: M-06807 |
各種長さが揃ったジャンパワイヤー | 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 PinspinMode(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でこの「ギタコン試作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 (アナログスティック対応あり)