皆さんこんばんは、Reveです。技術担当です。
さて今回は、お待ちかね(?)の自作ゲームコントローラー第2弾、です。
今回は、ジョイスティックでマウスカーソルをぐりぐり動かすコントローラーを作りましょう。
ちなみに、当方はゲーム機のNINTENDO 64でジョイスティックをはじめて知り、子供心に感動した覚えがあります。
懐かしいですね。くぅー、しびれるー(笑)
…まあこの話は置いといて、早速コントローラーを作りましょう。
(ジョイスティックってどんな部品?)
PS3とかXBOX 360とか、最近のゲーム機のコントローラーについてるぐりぐり動くアレ、以上!
…で終わるのも乱暴なので、下に詳細を書きます。
ちなみに、NINTENDO 64では3Dスティックと呼ばれてました まる
(詳しい説明)
ジョイスティックの概要については先ほどの説明で片付いてしまうので、ここでは電気的な特性を書きたいと思います。
特徴としては、縦横の傾きをそれぞれ電圧の高低で出力するセンサーとなっており、その電圧をマイコン(Arduino)側で読み取ることで、スティックの傾きを計測することが可能です。
また、スイッチが内蔵されており、スティックを押し込むとスイッチ入力をすることも可能です。
(回路の構成)
まず、今回使用する部品は以下のとおりです。
・Arduino Micro
・ブレッドボード
・ジョイスティック
・ジャンパーコード:5本
ただし当方では、前に紹介したものと別の製品を使用しますので、写真が一部、制作例と異なる部分があります。
ご了承くださいorz
ハノイに行く直前に、部品を買い忘れてました
それでは、回路の制作に入ります。
まず、Arduino Microをブレッドボードの片側中央に寄せる形で挿入します。
続いて、ジョイスティックに付属のケーブルをつなげます。
そして、ジョイスティックとArduinoをジャンパーコードで接続するわけですが、以下のように対応させます。
Arduinoピン | ジョイスティック端子 |
5V(電源) | VCC |
GND | GND |
A0 | VRx |
A1 | VRy |
13 | SW |
付属のケーブルはどちらもソケット型になっているので、用意したジャンパーコードを挿して、反対側をブレッドボードに挿してArduinoと接続します。Arduinoと接続するには、対応するピンが挿してある穴と同じ列のどこかにコードを挿せばOKです。
出来上がった回路はこのようになります。
(プログラム)
それでは、回路も完成したところでプログラムを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
; title="JoyStick_mouse.ino"]#define SW_ANSTICK 13 //ジョイスティックの傾きをマウスカーソルの移動量に変換する関数 int readAxis(int thisAxis, int range, int threshold) { int reading = analogRead(thisAxis); reading = map(reading, 0, 1023, 0, range); // ジョイスティックの出力を、0~rangeの間に変換 int distance = reading - (range / 2); // 値の中心を0にする if (abs(distance) < threshold) { // 計算値が任意の値(threshold)を下回る場合 distance = 0; // 移動量を0にする } return distance; } void setup() { pinMode(SW_ANSTICK, INPUT_PULLUP); // ジョイスティックのスイッチ入力を有効化 } void loop() { int valX = readAxis(A0, 12, 3); // 水平方向の移動量 int valY = readAxis(A1, 12, 3); // 垂直方向の移動量 Mouse.move(valX, valY, 0); // マウスカーソルを移動させる if(digitalRead(SW_ANSTICK) == LOW){ // ジョイスティックのスイッチが押されたら Mouse.press(MOUSE_LEFT); // マウスの左ボタンを押下 } else{ Mouse.release(MOUSE_LEFT); // マウス左ボタンの押下を解除 } delay(10); } |
ソース全体を見たところで、個別に処理内容を解説していきます。
まず、今回は独自の関数を設定しています。
この関数は、ジョイスティックの傾けた量をマウスカーソルの移動量に変換する役割を果たすものです。
アナログ入力で読み取った値をmap関数で任意の移動量に変換しています(-range/2 ~ range/2)。
また、あまり微細な変化で動かないよう、特定の値thresholdを下回る傾きでは動かないように制限します。
1 2 3 4 5 6 7 8 9 |
int readAxis(int thisAxis, int range, int threshold) { int reading = analogRead(thisAxis); // (b) reading = map(reading, 0, 1023, 0, range); // (c) int distance = reading - (range / 2); // (d) if (abs(distance) < threshold) { // (e) distance = 0; } return distance; } |
続いて、setup関数は飛ばして、loop関数を見てみます。
マウスカーソルの移動に関しては、先ほど実装した関数を使用して水平、垂直の2方向の移動量を求め、
Mouse.moveメソッドに与えてマウスカーソルを移動させます。
1 2 3 |
int valX = readAxis(A0, 12, 3); // 水平方向の移動量 int valY = readAxis(A1, 12, 3); // 垂直方向の移動量 Mouse.move(valX, valY, 0); // マウスカーソルを移動させる(三番目の0は、マウスホイールの移動量) |
そして、マウスクリックも以下のコードによって実現できます。
Mouse.pressメソッドで指定のボタンを押す操作を、Mouse.releaseメソッドで指定のボタンを離す操作を命令できます。
ここではジョイスティックの押し込みスイッチとマウスの左ボタンを対応させています。
1 2 3 4 5 6 |
if(digitalRead(SW_ANSTICK) == LOW){ // ジョイスティックのスイッチが押されたら Mouse.press(MOUSE_LEFT); // マウスの左ボタンを押下(MOUSE_LEFTは定数) } else{ Mouse.release(MOUSE_LEFT); // マウス左ボタンの押下を解除 } |
以上で解説は終わりです。
後は、プログラムをArduinoに書き込めばコントローラーの出来上がり。
(ゲームをやってみよう)
今回は、脱出ゲームというジャンルのゲームをプレイしましょう。
これは、どこかに閉じ込められたという設定の下、画面内のいろんな場所をクリックしながら脱出の手立てを探すというゲームです。最近では、実際の空間を舞台に、閉じ込められた場所から脱出を図るアトラクションも登場しています。
非常に多くのゲームが有志で制作されていますが、それらを集めたサイト(http://www.no1game.net/)から好みのものを探してみると良いでしょう。
制作したコントローラーを使ってプレイできますが、マウスとは一味違うゲーム体験になるかもしれません。
…まあ、操作性はよくなるわけではありませんが。むしろ悪くなったとか言わない
それでは、また会いましょう。さらば(・ω・)ノシ
(余談)
PlayStationでいうと、PS2以降のコントローラーはスティックの押し込みスイッチが、押された強さを判定できるそうです。
今回使用したスティックはスイッチ入力のON/OFFしかできないため、PlayStationのジョイスティックに近いとも言えます。
ちなみに当方は、あまりPlayStationはやったことありません。NINTENDO 64の方ばかりプレイしてました。
コメント