“SOCD"とは? SOCD クリーナー とは?
“SOCD” とは “Simultaneous Opposite Cardinal Directions” の頭文字を繋げた略語です。 直訳すると「主要方向の同時(入力)」といったとこでしょうか。
様するに、上vs下、右vs左など方向として相反するキーを入力した状態を表わす言葉です。
「SOCD クリーナー」とは SOCD 時に、相反する方向キーを同時にアクティブにしないようにするための、ハードないしソフトウェアを示す言葉です。
なぜ SOCD の処理が必要になるの?
左右もしくは上下同時押し時には、適切な処理が必要になります。
レバーコントローラ、ジョイスティックや十字キーは、 構造上左右などの相反する方向を同時に入力することが不可能です。
ところが、キーボードや Hitbox では左右のキーの同時押しができてしまいます。
PC ゲームの場合、必然的に同時押し時の挙動を考慮してプログラムされています。 ですが、ゲームコンソールなど、同時押しもとから不可能な場合、SOCDが考慮されていないことがあります。
なので、SOCD 入力可能なコントローラーでは、コントローラ側で SOCD 入力時の処理をする必要があります。
Hitbox の SOCD クリーナー
Hitbox Arcadeの「Hitbox」は今やレバーレスコントローラの代名詞的存在です。
その Hitbox は SOCD クリーナーをコントローラの一機能として搭載しています。
Hitbox の SOCD クリーナーの動作は以下の通りです。
- 左右同時押し ニュートラル(左右両方OFF)
- 上下同時押し 上優先
となっています。
この挙動には利点があります。 ニュートラル動作を利用した「素早い入力」が可能なためです。
この記事では、この挙動を実現する電子回路を設計してみようと思います。
設計だけじゃなく実際電子回路を作成してコントローラに搭載したいと考えていますが、それはまた後で記事にします。
左右同時押 - ニュートラル動作
動作
左右同時押しニュートラル挙動の、実際のスイッチ入力と、ゲーム側で発生させたい入力の対応関係を表にまとめます。
入力(コントローラ) L / R | 出力(ゲームにて発生) $O_L$ / $O_R$ | |
---|---|---|
OFF / OFF | OFF / OFF | 入力 = 出力 |
OFF / ON | OFF / ON | 入力 = 出力 |
ON / ON | OFF / OFF | 左右同時押しで、 出力 L / R 両方ともOFF |
ON / OFF | ON / OFF | 入力 = 出力 |
ON = 電圧が低い = “0”、OFF = 電圧が高い = “1” として、論理を真理値表にまとめます。
ON = 電圧が低い とするのは、ゲームコントローラのスイッチ入力はローアクティブがほとんどのためです。。
入力L | 入力R | 出力 $O_L$ | 出力 $O_R$ | |
---|---|---|---|---|
1 | 1 | 1 | 1 | 入力 = 出力 |
1 | 0 | 1 | 0 | 入力 = 出力 |
0 | 0 | 1 | 1 | 左右同時押しで、 出力 L / R 両方ともOFF |
0 | 1 | 0 | 1 | 入力 = 出力 |
ここから $O_L$、$O_R$ の論理式を求めると、
$$ O_L = \overline{ L \cdot \overline{R} } $$ $$ O_R = \overline{ \overline{L} \cdot R } $$
です。
ロジック自体はかなり簡単ですね。
これなら少数のトランジスタとダイオードの組み合わせで動作を実現できそうです。
次節で、回路例とシミュレータでの動作確認を示します。
回路とシミュレーション結果
以下、考えた回路を回路シミュレータ CircuitJS1 に入力したものです。
極力最小構成となるように回路をデザインしました。
Tr1 と Tr2 があるブロックが $O_L=\overline{ \overline{L} \cdot R}$ を出力し、Tr3 と Tr4 を使ったブロックが $O_R=\overline{ L \cdot \overline{R}}$ を出力しています。
$O_L$ のブロックを例に、動作を説明すると以下の通りです。
- NPNトランジスタ Tr1 が Left-Swithc の入力に応じて、信号レベルを反転しコレクタに出力
- Tr2 のベース端子にて、Tr1 のコレクタと、ダイオードを介した右スイッチ入力を並列で受け、AND 動作をする
- Tr2 がベース端子の信号を反転し、 $ O_L = \overline{ \overline{L} \cdot R}$ となる
- 黄色の枠で圍んだ $5k\Omega$ は、コントローラー側の入力端子のプルアップ抵抗
- Week-Pull-up だと思うので、$5k\Omega$ は実際よりかなり低いかもしれない
- ON時のベース電流が若干足りなくなる場合は、ベース端子をプルアップしている $10k\Omega$ の抵抗を小くするなりして調整
- シミュレータ上 $h_{FE}=100$ と控え目な設定だったので、実際にベース電流が足りなくなることは無いと思う
ダイオードの順方向電圧はトランジスタON時の $V_{BE}$ よりある程度小さい必要があります。
そうでないと、トランジスタをOFFしきれません。ショットキーバリアダイオードなどの低 $V_F$ ダイオードを使う必要があります。
シミュレータでは、小信号用ショットキーバリアダイオード 1N5711 を使っています。
同型品を供給している STMicroelectronics のデータシートによると $V_F$ は最大でも “0.41V@1mA,25degC” とのことです。
STMicroelectronic 1N5711 製品ページ
NPNトランジスタの $V_{BE}$ は恐らく 0.6V くらいなので、実際に回路を作るときはもうすこし $V_F$ の低いダイオードを選んだほうが安心かな・・・という気がします。
- L-ON / R-OFF
- L-ON / R-ON
入力Lのみ ON すると、出力は Low でアサートされます。入力 LR が両方とも ON のときは出力 LR 両方とも Hight ネゲートされています。
意図どおり動作していそうです。
上下同時押し - 上方向優先動作
動作
上下同時押し時の上方向優先を実現するには、以下の動作をさせればOKです。
入力U | 入力D | 出力 $O_U$ | 出力 $O_D$ | |
---|---|---|---|---|
1 | 1 | 1 | 1 | 入力 = 出力 |
1 | 0 | 1 | 0 | 入力 = 出力 |
0 | 0 | 0 | 1 | 左右同時押しで、 出力 L / R 両方ともOFF |
0 | 1 | 0 | 1 | 入力 = 出力 |
Note: ON = 電圧が低い = “0”、OFF = 電圧が高い = “1”
なので論理式は、
$$ O_U = U $$ $$ O_D = \overline{ \overline{D} \cdot U } $$
上方向はスイッチの出力をそのまま伝えるだけ、下方向のロジックは、左右同時押ニュートラルと同じです。
回路
以下回路図です。
スイッチを切り替えた際の動作です。
- U-ON / D-OFF
- U-ON / D-ON
UD を同時押しした場合、下方向はネゲートという点で左右同時押しと同じ挙動です。
結論
以上、左右同時押しニュートラル、上下同時押し上優先の回路でした。
かなり簡単な回路構成で作れそうなので(重要)、実際に回路を作成してみようと思います。
ブレッドボードで試作してからの方がいいようにも思うんですが、まあ・・・単純なのでいきなりプリント基板で作ってもいいかな・・・と思っています。
(うーん・・・フラグかな?)
左右同時押し 後押し優先タイプ・・・?
Hitbox Arcade の Hitbox が 左右同時押しニュートラルタイプを採用していることもあり、 これがデファクトスタンダードかな・・・という雰囲気があるのですが、もう一つ有力な仕様があります。
それが、左右同時押し時に後から入力された方向が有効になるという仕様です。
例えば、左を押した状態で、さらに右を押したら右方向が有効 になる・・・という動作です。
個人的にはですが、後押し優先の方が直感的で分りやすいんじゃないかな・・・と思いますが、どうでしょうかね?
ですが、回路を作って工作しようとなると明らかにニュートラルタイプより複雑そうです。 順序論理回路が必要です。
正直工作する気にならないのですが、論理回路を導くところまではやってみようかな・・・と思います。 頭の体操のためです。
ということで、次のトピックは「左右同時押し 後押し優先論理回路の導出」にしようと思います。
以上です。