アナログジョイスティックモジュールをArduinoで動かします。
目次:
今回の目的
ELEGOOのチュートリアル「アナログジョイスティックモジュール」をチュートリアル通りに動かします。
※チュートリアルの文章(PDF日本語版含む)もスケッチもELEGOOのサイトから無料でダウンロードできました。
アナログジョイスティックモジュール
ジョイスティック(Joystick)です。ゲーム機のコントローラ等に使われている入力装置ですが、実際、ELEGOOのモジュールはPS2のコントローラに似ているようです。
通販サイトで「アナログジョイスティックモジュール」を検索すると、似たような外観のものが多数出てきます。
端子は5本。各端子はシルク表記から「GND」、「+5V」、「VRx」、「VRy」、「SW」。
どうやらこれは2軸式ジョイスティック(2-axis joystick)と呼ばれるもので、X方向、Y方向にそれぞれ2つの可変抵抗器が回転するよう構成されている模様。
スティックが初期位置で半分の抵抗値、一方に倒せば対応する可変抵抗器が減少、逆方向に倒せば増加し、この抵抗で分圧された電源電圧のアナログ値をマイコン(ここではArduino)で読み取ります。
このX方向、Y方向の読み取りがそれぞれ端子「VRx」、「VRy」に対応(「VR」は「Variable Resistor」の意でしょう)。
これでスティックの傾きをX方向、Y方向に同時に読み取る他、上下方向にスイッチとして押すことができます。これは2値で読み取り端子は「SW」。
リンク
器材接続
モジュールはArduino直結です。
シリアルモニタをパソコン画面で表示するため、USBをパソコンにつなぎます。
スケッチ
オリジナルのものを少し簡略化して行数減らしました。
void setup() {
pinMode(2, INPUT); // Arduino 2#ピンを入力に設定
digitalWrite(2, HIGH); // Arduino 2#ピンをHighにプルアップ
Serial.begin(9600); // シリアルポートを9,600bpsで開く
}
void loop() { // 以下延々と繰り返す
Serial.print("Switch: ");
Serial.println(digitalRead(2));
// Arduino 2#ピンをデジタル値読み取り、それをシリアル出力(スイッチ)
Serial.print("X-axis: ");
Serial.println(analogRead(0));
// Arduino A0#ピンのアナログ値読み取り、それをシリアル出力(X軸)Serial.print("Y-axis: ");
Serial.println(analogRead(1));
// Arduino A1#ピンのアナログ値読み取り、それをシリアル出力(Y軸)Serial.print("\n\n");
delay(500); // 500ms待ち
}
動作
パソコンのArduino IDEの「ツール」→「シリアルモニタ」でウインドウを立ち上げます。
まずはジョイスティックは触れずにおきます。
一定時間毎に出力が自動スクロールされて表示され続けます。
初期状態でX軸:507、Y軸:511で安定しております。analogRead関数の戻り値は0~1023ですので、ほぼほぼ真ん中の値が測定されている様子。
次はジョイスティックをぐるぐる回しました。
(図3ではスイッチが1のままですが、ジョイスティックを押せば0となりました)
オシロスコープを信号線に接続して、モジュールの出力電圧を確認しました。
時間軸は500ms/マス(スケッチのシリアル出力間隔に同じ)です。
なめらかにジョイスティックを回したつもりでしたが、電圧変化はがたがたになってしまいました。それでも連続的に電圧が変化していることがわかります。
なお、SWは5V(押さない)、0V(押す)の2値が測定されました。
ジョイスティックの動きと電圧の関係は図6の通りでした。
所感
意外にシンプルな内容でした。
ハード的には言ってしまえば可変抵抗器×2個、プッシュスイッチ×1個。それを5Vにぶら下げて分圧を出力しているだけ(スイッチは分圧もなし)。
前回までのスケッチがLessonを追うごとに複雑になり、今回はどんなスケッチやライブラリが出てくるのかと思っておりましたが、今回はライブラリ無し、関数もanalogRead、digitalReadとわかりやすいものでした。
また、ゲーム機という比較的身近なところで使われていた仕組みとして興味をもって取り組むことができました。
0 件のコメント:
コメントを投稿