Lesson12 アナログジョイスティック
このレッスンでは、アナログジョイスティックモジュールの使用方法を学習します。アナログジョイスティックは、ゲームのコントローラのようにArduinoの制御装置をコントロールします。
必要な部品
必要な部品は以下になります。
- Elegoo UNO R3 x 1
- JoyStick Module x 1
- F-M Jumper Wire x 5
ジョイスティック(JoyStick Module)
ジョイスティックモジュールには、5V、GND、X軸、Y軸、キー(スイッチ)の5つのピンがあります。X軸、Y軸の向きの情報は、Arduinoのアナログインプットピンに繋くことで読み取りが可能になります。キーの情報はデジタルインプットピンで読み取り可能です。
回路をつくってみる
それでは実際に回路をつないでみます。
ジョイスティックには、5本のピンがありますが、上からGNDはArduinoのGND、+5Vは5V、VRxはA0、VRyはA1、SWはD2に繋ぎます。
プログラムを動かしてみる
チュートリアルに付属のコードを利用して実際に動かしてみる。
//www.elegoo.com
//2016.12.09
// Arduino pin numbers
const int SW_pin = 2; // digital pin connected to switch output
const int X_pin = A0; // analog pin connected to X output
const int Y_pin = A1; // analog pin connected to Y output
void setup() {
pinMode(SW_pin, INPUT);
digitalWrite(SW_pin, HIGH);
Serial.begin(9600);
}
void loop() {
Serial.print("Switch: ");
Serial.print(digitalRead(SW_pin));
Serial.print("\n");
Serial.print("X-axis: ");
Serial.print(analogRead(X_pin));
Serial.print("\n");
Serial.print("Y-axis: ");
Serial.println(analogRead(Y_pin));
Serial.print("\n\n");
delay(500);
}
それでは実際にPCと繋いで動かしてみたいと思います。結果はシリアルモニタに表示されます。
ジョイスティックのスイッチを押すと「Switch: 0」押さない状態だと「Switch: 1」と表示されます。Delayが500msなので0.5秒に1回、サンプリングしています。ジョイスティックの方は、初期値がX:499、Y:496 のようです。最大がそれぞれ 1023でした。
ちょっと地味ですね。少し気になったのがシリアルモニタがIDEの中から浮かして独立のウィンドウにすることが出来ませんでした。Windows版だけかもしれないですが…、将来的にはRaspberryPI上での制御を考えていますので、実験中だと思ってとりあえず気にしないことにします。
あまりにも地味すぎるので応用してみたいと思います。
応用編(2軸のサーボモータを動かしてみる)
さて、何か動かしたいと思いますが、やっぱりサーボモータですね。X軸とY軸で2台のマイクロサーボモータを繋いで回転させてみたいと思います。先ほどの回路をそのままにサーボモータを接続します。
プログラムを変更して、AnalogReadをServo.writeに接続してみます。
#include <Servo.h>
// Analog input min - max
#define AXIS_INPUT_MIN 0
#define AXIS_INPUT_MAX 1024
// Arduino pin numbers
const int SW_pin = 2; // digital pin connected to switch output
const int X_pin = A0; // analog pin connected to X output
const int Y_pin = A1; // analog pin connected to Y output
const int X_Servo_pin = 5; // X axis servo pin
const int Y_Servo_pin = 6; // Y axis servo pin
Servo servo_x;
Servo servo_y;
void setup() {
pinMode(SW_pin, INPUT);
digitalWrite(SW_pin, HIGH);
Serial.begin(9600);
servo_x.attach(X_Servo_pin);
servo_y.attach(Y_Servo_pin);
servo_x.write(90);
servo_y.write(90);
}
void loop() {
if (digitalRead(SW_pin) > 0) {
Serial.print("Switch: ON\n");
} else {
Serial.print("Switch: OFF\n");
}
// Joystick input -> Rectangle (0 - 180)
servo_x.write(map(analogRead(X_pin), AXIS_INPUT_MIN, AXIS_INPUT_MAX, 0, 180));
servo_y.write(map(analogRead(Y_pin), AXIS_INPUT_MIN, AXIS_INPUT_MAX, 0, 180));
delay(500);
}
動きがあるので動画にしてみました。
以上
コメント