ジョイスティックモジュールを使ってみる(サーボ動作も)(Arduino)
ゲーム機などに使われている、
2軸ジョイスティックモジュールを使ってみます。
モジュールからどんな情報が送られてくるのか、
その情報(値)を使ってサーボモーターを動作させてみます。
私のものは、いつもの大陸調達品です。
参考:
・AliExpress
デュアル軸xyジョイスティックモジュール
https://ja.aliexpress.com/
¥50- 程度
・aitendo
ジョイスティックモジュール [JOY10K-5P]
https://www.aitendo.com/product/10187
¥245-
・秋月電子通商
2軸ジョイスティックモジュール センタープッシュ有り ケーブル付
https://akizukidenshi.com/catalog/g/gM-08763/
¥850-
では、
ジョイスティックモジュールとArduinoを接続して、
どのような情報が送られてくるか確認してみます。
回路は図の通りです。
この回路図の作図には fritzing を利用させて頂いております。
https://fritzing.org/home/
※ジョイスティックモジュールによって接続端子の並び順が違います。
データーシート等で確認して下さい。
私のものは、配線図の上から順に、
・GND:グランド
・5V:電源(5V)
・VRx:X軸情報(X軸電圧)
・VRy:Y軸情報(Y軸転圧)
・SW:プッシュスイッチ情報
です。
PC と Arduino を接続して、
ボード、シリアルポートを設定します。
では、スケッチです。
このスケッチは、X軸、Y軸の情報(電圧)を
アナログデータ(0~1023)として、
プッシュSWの状態を、デジタルデータとして、
受信しシリアルモニタに表示するものです。
// ジョイスティックモジュール情報取得表示
// 使用ピン設定
const int VRx_Pin = A0; // X軸値取得ピン設定
const int VRy_Pin = A1; // X軸値取得ピン設定
const int SW_Pin = 7; // プッシュスイッチ取得ピン設定
// 情報取得変数設定
int X_Pos; // X軸情報格納変数
int Y_Pos; // Y軸情報格納変数
bool SW_St; // プッシュスイッチ情報格納変数
void setup() {
// put your setup code here, to run once:
// シリアルモニタ初期化
Serial.begin(115200);
// 使用ピン設定
pinMode(SW_Pin, INPUT_PULLUP); // プルアップ指定
}
void loop() {
// put your main code here, to run repeatedly:
// 情報取得
X_Pos = analogRead(VRx_Pin); // X軸情報取得
Y_Pos = analogRead(VRy_Pin); // Y軸情報取得
SW_St = digitalRead(SW_Pin); // プッシュスイッチ情報取得
// シリアルモニタへ出力
Serial.print("X:");
Serial.print(X_Pos);
Serial.print(" ,Y:");
Serial.print(Y_Pos);
Serial.print(" ,S:");
Serial.println(SW_St);
delay(500); // 500ms待機
}
検証し、マイコンドードに書き込み実行してみます。
X軸、Y軸、プッシュスイッチの状態が数値で確認できます。
X軸、Y軸情報はアナログ値で、0 ~ 1023 となります。
モジュールの中はスライド抵抗のような仕組みなんでしょうか。
実際テスターで抵抗値を測定してみると
4.5KΩ(左)←3.4KΩ(中央)→145Ω(右)
という値でした。
スティックのX軸、Y軸の中心位置(中立時)のアナログ値ですが、
動作範囲の値が 0 ~ 1023 と考えると、511.5 でしょうか。
私のモジュールでは、中立時、X軸が510、Y軸が513でした。
これは、モジュール自身で調整できるものなのか、
見た目には調整できそうなつまみなどはありません。
やはりソフト的に補正するものなのでしょうか。
このジョイスティックモジュールの操作では、
高い精度を必要とするものではないでしょうから、
誤差範囲ですね。
プッシュスイッチ情報はデジタル値で、
OFF時は 1、ON(プッシュ)時は 0 となります。
これは、スイッチをプルアップ接続しているためです。
では、このX軸情報を使って、
サーボモーターを動かしてみます。
Arduinoで受け取ったX軸の情報 0~1023 を、
角度情報 0~180 度に変換してサーボモータへ送ります。
今回使用するサーボモーターは、
・マイクロサーボ(SG92R)
制御角:±約90度 (180度)
です。
参考:
秋月電子通商
・マイクロサーボ SG92R
http://akizukidenshi.com/catalog/g/gM-08914/
¥500-
回路は図の通りです。
※モーター類は、消費電力が大きいので、
サーボの種類や数によっては、別電源供給が一般的です。
その場合の回路図です。
スケッチです。
// ジョイスティックモジュール情報取得表示
// X軸情報によるサーボモーター動作制御
// インクルード宣言(Servoライブラリ利用宣言)
#include <Servo.h>
// オブジェクト生成
Servo servo;
// 使用ピン設定
const int VRx_Pin = A0; // X軸値取得ピン設定
const int VRy_Pin = A1; // X軸値取得ピン設定
const int SW_Pin = 7; // プッシュスイッチ取得ピン設定
const int SR_Pin = 3; // サーボモーターへの角度出力ピン設定
// 情報取得変数設定
int X_Pos; // X軸情報格納変数
int Y_Pos; // Y軸情報格納変数
bool SW_St; // プッシュスイッチ情報格納変数
int SR_Pos; // サーボ角度出力角度情報格納変数
void setup() {
// put your setup code here, to run once:
// シリアルモニタ初期化
Serial.begin(115200);
// 使用ピン設定
pinMode(SW_Pin, INPUT_PULLUP); // プッシュスイッチ(プルアップ指定)
servo.attach( SR_Pin );
}
void loop() {
// put your main code here, to run repeatedly:
// 情報取得
X_Pos = analogRead(VRx_Pin); // X軸情報取得
Y_Pos = analogRead(VRy_Pin); // Y軸情報取得
SW_St = digitalRead(SW_Pin); // プッシュスイッチ情報取得
// X軸情報を使ってサーボへの角度生成
// 0~1023の軸情報より0~180の角度情報を計算
SR_Pos = int( X_Pos * ( 180.0 /1023.0 ) );
servo.write( SR_Pos ); // 指定角度をサーボへ出力
// シリアルモニタへ出力
Serial.print("X:");
Serial.print(X_Pos);
Serial.print(" ,Y:");
Serial.print(Y_Pos);
Serial.print(" ,S:");
Serial.print(SW_St);
Serial.print(" ,SR:");
Serial.println(SR_Pos);
delay(250); // 250ms待機
}
検証し、マイコンドードに書き込み実行してみます。
シリアルモニタには、
X軸、Y軸、スイッチ状態に加え、
サーボモーターへの送信角度が表示されています。
ジョイスティックのX軸の操作に合わせて、
サーボモーターが動作していると思います。
※スケッチ loop( )関数内の、待機時間が
・delay(250); // 250ms待機
としていますので、この時間を短くすれば、サーボモーターの
反応動作もスムースになると思いますが、限度はあります。
以前の私が掲載したサーボモーター関連ページです。
・マイクロサーボを使ってみる
https://shinog.jp/computer/arduino/%e3%83%9e%e3%82%a4%e3%82%af%e3%83%ad%e3%82%b5%e3%83%bc%e3%83%9c%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6%e3%81%bf%e3%82%8b/
・L293D モータードライバーシールド を使ってみる
https://shinog.jp/computer/arduino/l293d-%e3%83%a2%e3%83%bc%e3%82%bf%e3%83%bc%e3%83%89%e3%83%a9%e3%82%a4%e3%83%90%e3%83%bc%e3%82%b7%e3%83%bc%e3%83%ab%e3%83%89-%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6%e3%81%bf%e3%82%8b/