2017年5月14日日曜日

Arduino JoyStick Libraryで自作コントローラを作ろう:ジョイスティックを動かす

前回の書き込みから考えると、結構なブランクが空いていた。
申し訳ないです。

今回はAJL(Arduino JoyStick Library)で"Grove Thumb Joystick"と呼ばれる
ジョイスティックのモジュールからコントローラを作る。



まず、"Groove Thumb Joystick"とは、PS2のアナログスティックを模した
モジュールで、上から見て縦横に可変抵抗がついている。

縦方向および横方向に倒された大きさと方向は、可変抵抗の抵抗値
から求められるということが分かればOKだ。
この抵抗値がジョイスティックを傾けているX軸方向とY軸方向を
表していて、その値が下の写真の線から出力されるということである。



これ以上の仕様に関しては下記URLを参照してもらいたい。
[SeeedStudio Groove Thumb Joystick]
http://wiki.seeed.cc/Grove-Thumb_Joystick/
因みに購入先は秋月だ。
http://akizukidenshi.com/catalog/g/gM-09279/

================================================

前置きはこれぐらいにして、手順について説明する。
今回用意するものは、以下の通りである。

  • Arduino Leonardo
  • 通信用USB A-microBケーブル(前回トピック同様)
  • ジャンパ四本
  • SeeedStudio Groove Joystick


今回の結線はとても単純なので、写真だけ掲載する。


SeeedStudio Groove Joystick側とArduino Leonardo側で
直接結線する。今回は

  • JoyStick X(黄色) ー Arduino A0ピン
  • JoyStick Y(白色) ー Arduino A1ピン
  • JoyStick Vcc(赤色) ― Arduino Power 5Vピン
  • JoyStick GND(黒) ー Arduino Power GNDピン

の通りに結線してもらえれば、回路的にはOKだ。
結線ができたら、以下のプログラムを書き込んでもらいたい。
(トピックの大きさが大きくなってしまったため、今回はダウンロードして
閲覧してください。ご了承ください。)

[ジョイスティックの確認プログラム(右上の↓アイコンからダウンロードできます)]
https://drive.google.com/file/d/0B_eMFT79G3ctYkYyMElkMEJmLTQ/view?usp=sharing

これは、ジョイスティック側の可変抵抗値をアナログ値として
取得して、それをシリアル通信ポートへ出力するプログラムである。
メニューバーの"ツール"→"シリアルモニタ"でシリアルモニタを
起動して、ジョイスティックをグリグリ動かしたときに値が動いていればOKだ。

次に、このプログラムを使ってジョイスティックの倒した方向と値を紐づけていく。

ここで大事なのは、自分たちがジョイスティックを持つ基点を決めておくことだ。
ジョイスティックを上下反対に持っていれば、当然読み取り値も反対になるからだ。
今回は、以下の持ち方で考えていく(白い端子が左側に来るように持つ)。


次に、読み取り値を決める。

先ほどのシリアルモニタを開いて、右、左、上、下にジョイパッドを動かす。
また、Groove Thumb Joystickを使っているのであれば、一度ジョイスティックを
押し込んでみてもらいたい。

すると、シリアルモニタの値から自分の倒した方向の最小値と最大値が
X軸、Y軸方向に対してそれぞれ把握できるはずだ。
また、Groove Thumb Joystickを使っていた人であれば、押し込んだときに
X軸の値が1023と出力されたハズだ。

================================================

それぞれの最小値と最大値をメモしたら、以下のリンクのプログラムに沿って
コードを改変してもらいたい。ここでAJLを使う。
[ジョイスティックプログラム]
https://drive.google.com/file/d/0B_eMFT79G3ctUXRNSmF3b3ZDUGs/view?usp=sharing

プログラムは至ってシンプル。

setXAxisRange関数およびsetYAxisRange関数で、X軸Y軸方向の
最小値と最大値を決める。先ほどメモした値をそのまま放り込めばいい。

setButton関数で押されるボタンの番号と初期時のボタンの状態(初期化時に押されて
いないため0)について決定し、releaseButton関数およびpressButton関数で
該当ボタンが離されたことと押し込まれたことを決める。

setXAxis関数およびsetYAxis関数で、先ほどの各setRange関数で指定された
範囲の中でのジョイスティックの位置を決定する。今回は読み取ったアナログ値を
そのまま放り込めばいい。

これを確認するため、JoyToKeyからコントローラのテスト画面を呼び出して確認する。
まず、JoyToKeyを起動して、"設定"→"ジョイスティックの設定..."を起動する


"1.アナログスティックの調整・ボタンの確認"というタブをクリックして、
"ゲームコントローラの設定"をクリックする。


"Arduino Leonardo"を選択して、"プロパティ"をクリック


出てきたウィンドウで"テスト"のタブを選択すると、以下の画面になる。
このウィンドウから確認ができる。


ここで、左上の"+"マークが動いてくれればOK。
また、Groove Thumb JoyStickのユーザであれば、
押し込まれて"11"番ボタン(10じゃないよ!)が光ればよい。

================================================

ここで、あることに気が付いた人がいると思う。
ジョイパッドの上下が反転しているのだ。

これはAJLの仕様で、"最小値は下で最大値は上"と解釈
されてしまって、値の意味するところが反転しているためである。

ただ安心してもらいたい。修正は一行で済む。
2つめのAJL適用プログラムでいう所の35行目に

Y軸現在値(y_value)=(Y軸最大値+Y軸最小値)-Y軸現在値(y_value)

を入れれあげればいい。
手計算でもよいと思うが、Y軸最大値がY軸現在値に入ったときに計算結果が最小値
のものになって、逆にY軸最小値がY軸現在値に入ったときに計算結果が最大値の
ものになることから、なんとなく察しが付くはず。

コードは以下
[修正版ジョイスティックプログラム]
=======
#include "Joystick.h"

//可変抵抗をつなげるpin
const int x_pin = A0;
const int y_pin = A1;

//L3ボタン(11ボタン)に該当するジョイスティック押し込み
const int L3 = 10;

//可変抵抗の値
int x_value = 0;
int y_value = 0;

//AJLクラスオブジェクト
Joystick_ Joystick;

void setup() {
  // put your setup code here, to run once:
  //AJLの初期化
  Joystick.begin(true);

  Joystick.setXAxisRange(267,771);//519が中間値になるように設定
  Joystick.setYAxisRange(262,766);//514が中間値になるように設定

  //L3に該当するボタン
  Joystick.setButton(L3,0); 
}

void loop() {
  // put your main code here, to run repeatedly:

  //ジョイスティックの可変抵抗値読み取り
  x_value = analogRead(x_pin);//norm 519 MAX 771(left) min 251(right) push 1023
  y_value = analogRead(y_pin);//norm 514 MAX 778(under) min 244(top)

  y_value = 766+262-y_value;//上下反転

  if(x_value != 1023){
    //L3ボタン解除
    Joystick.releaseButton(L3);

    //ジョイスティック値設定
    Joystick.setXAxis(x_value);
    Joystick.setYAxis(y_value);
  }else{
       //L3ボタン押下
       Joystick.pressButton(L3);
  }


  delay(50);
}

=======





長くなってしまったが、これでAJLのジョイスティックに関するトピックは
終わりである。
次回は一度総まとめとして、ボタンとジョイスティック(可変抵抗)
を入力として、何かを作ってみようと思う。