Show page source of ギタコン試作2 #110036

== ギタコンの自作 試作2

ギタコン試作1で出たいくつかの問題を修正します。
(ギタコン作成のための環境構築が既に終わっているので、ここから先は楽ちんです)

[[PageOutline(start=3)]]

=== 試作2で使うもの一覧
追加で使う部品は、試作1から変更ありません。

=== 試作1の問題点一覧
 1. 最初のキーアサイン時に、なぜかLEFTが自動設定されて、上入力が入りっぱなしになる
 2. 反応が悪い(反応が遅い)
 3. チャタリングする
 4. ボタンが使いにくい (これは試作3で対応します)
 5. ボタンが足らない (これも試作3で対応します)
 6. コントローラーを動かしてのwailingができない (試作4で対応します)
 7. 筐体が無い (試作5で対応します)

ここでは、1~3について改善をしていきます。

=== 最初のキーアサイン時の動作異常を改善する
「最初のキーアサイン時に、なぜかLEFTが自動設定されて、上入力が入りっぱなしになる」現象について。
これが発生する理由は、Joystick Libraryの仕様上、軸入力(X,Y,Z)が全部(中央値ではなく)0で初期化されるためです。
X軸の入力における0は左を、Y軸の入力における0は上を意味するため、
キーアサインの変更を始めた瞬間にまずX軸入力(0=左)が取り込まれてLEFTがアサインされ、
その後Y軸入力(0=上)に反応して上が入り続けます。

# 左も入りっぱなしになっていますが、キーアサインの画面で左を入力しても意味がない


この現象は、Joystick Libraryに「軸入力は使わない」ことを宣言することで、発生させなくすることができます。

具体的には、以下のようにします。

JoystickButton.ino のスケッチを開いて、14行目あたりを
{{{
Joystick_ Joystick();
}}}
から
{{{
Joystick_ Joystick(
  JOYSTICK_DEFAULT_REPORT_ID, JOYSTICK_TYPE_GAMEPAD,
  4, 0,                 // Buttons, Hat Switch Count
  false, false, false,  // X,Y,Z Axis
  false, false, false,  // Rx, Ry, Rz Axis
  false, false,         // rudder, throttle
  false, false, false   // accelerator, break, steering
);
}}}
に変更します。 
これで、「ボタンを4つ使い、それ以外の軸入力は使わないジョイパッド」として動作するようになるため、
先の問題は発生しなくなります。


=== 反応が悪いのを改善する
試作1のギタコンを使ってみてすぐにわかることは、ボタンの反応が悪いこと。

こうなる理由は簡単で、Arduino Leonardoでのボタンのスキャン間隔が50msになっていることです。
(描画3フレームごとに1回、ボタンの入力をチェックしているような状態)

これも、スケッチの修正で対応できます。JoystickButton.ino のスケッチを開いて、最後にある

{{{
  delay(50);
}}}
を、
{{{
  delay(1);
}}}
にします。簡単ですね。

=== チャタリングを改善する
私のところでは発生しなかったのですが・・・原理的には必ず発生するはずですので、現象と対策について記載します。

チャタリングとは、簡単に言うと、ごく短時間の間にスイッチのON/OFFが連続して入ってしまう現象のことを指します。

具体的には・・・例えばスイッチを押したときの動作を考えてください。
金属の接点がつながって電流が流れるようになりスイッチがONになる・・・のですが、
スイッチがつながる瞬間に、物理的に金属が振動して、ごく短い時間(数ms~数十ms)の間にONとOFFが数回切り替わってしまいます。
従って、入力がシビアな音ゲーで使うギタコンでこの問題が発生するのは、致命的となります。

# ちなみに、試作1で使ったタクトスイッチの場合、同タクトスイッチの仕様書によるとこの振動時間は最大5msとのことです。

さて、それでは、この問題をどのように解決すればよいのでしょうか。

ソフトウェアでの解決策と、ハードウェアでの解決策があります。

ソフトウェアでの解決策は、「ボタンの状態が切り替わったら、以後数msの間は、万が一状態変化があっても無視する」ようにすることです。
これはArduino Leonardo側でスケッチを修正して対策してもよいし、DTXMania本体のソースコードを修正して対策してもよいです。

# 具体的な修正コードは後日記載します

ハードウェアでの解決策は、シュミットトリガ回路を追加すること・・・ですが、ボタンの種類によって、チャタリングの発生時間が異なるため、それに応じて抵抗値とコンデンサ容量を計算してもらうことがちょっと面倒なことと、何より数msの入力遅延を引き起こすことから、今回は使いません。(コンデンサを使う=電荷をバッファする=バッファする時間だけ入力遅延が発生する)

# ご参考: チャタリングについては、[http://www.kumikomi.net/archives/2009/05/ioledrs-232.php?page=3 この辺]や[http://www.geocities.jp/zattouka/GarageHouse/micon/circuit/Chattering.htm この辺]が参考になりました。