ジョイスティックモジュールを使ってみる(サーボ動作も)(Arduino)

ゲーム機などに使われている、
2軸ジョイスティックモジュールを使ってみます。
モジュールからどんな情報が送られてくるのか、
その情報(値)を使ってサーボモーターを動作させてみます。

私のものは、いつもの大陸調達品です。

ジョイスティックモジュール1
ジョイスティックモジュール1
ジョイスティックモジュール2
ジョイスティックモジュール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/

回路図1
回路図1

※ジョイスティックモジュールによって接続端子の並び順が違います。
 データーシート等で確認して下さい。
 私のものは、配線図の上から順に、
  ・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待機
}

検証し、マイコンドードに書き込み実行してみます。

検証し、マイコンドードへ書き込み
検証し、マイコンドードへ書き込み
実際の回路1
実際の回路1

X軸、Y軸、プッシュスイッチの状態が数値で確認できます。

シリアルモニタのX軸、Y軸、プッシュスイッチの状態表示
シリアルモニタのX軸、Y軸、プッシュスイッチの状態表示

X軸、Y軸情報はアナログ値で、0 ~ 1023 となります。
モジュールの中はスライド抵抗のような仕組みなんでしょうか。
実際テスターで抵抗値を測定してみると
 4.5KΩ(左)←3.4KΩ(中央)→145Ω(右)
という値でした。
スティックのX軸、Y軸の中心位置(中立時)のアナログ値ですが、
動作範囲の値が 0 ~ 1023 と考えると、511.5 でしょうか。
私のモジュールでは、中立時、X軸が510、Y軸が513でした。

X軸、Y軸中立時のアナログ値表示
X軸、Y軸中立時のアナログ値表示

これは、モジュール自身で調整できるものなのか、
見た目には調整できそうなつまみなどはありません。
やはりソフト的に補正するものなのでしょうか。
このジョイスティックモジュールの操作では、
高い精度を必要とするものではないでしょうから、
誤差範囲ですね。

X軸、Y軸アナログ値
X軸、Y軸アナログ値

プッシュスイッチ情報はデジタル値で、
OFF時は 1、ON(プッシュ)時は 0 となります。
これは、スイッチをプルアップ接続しているためです。

プッシュスイッチデジタル値
プッシュスイッチデジタル値

では、このX軸情報を使って、
サーボモーターを動かしてみます。

Arduinoで受け取ったX軸の情報 0~1023 を、
角度情報 0~180 度に変換してサーボモータへ送ります。
今回使用するサーボモーターは、
 ・マイクロサーボ(SG92R)
  制御角:±約90度 (180度)
です。

マイクロサーボ(SG92R)
マイクロサーボ(SG92R)

 参考:
  秋月電子通商
  ・マイクロサーボ SG92R
    http://akizukidenshi.com/catalog/g/gM-08914/
    ¥500-

回路は図の通りです。

回路図2
回路図2

※モーター類は、消費電力が大きいので、
 サーボの種類や数によっては、別電源供給が一般的です。
 その場合の回路図です。

回路図3
回路図3

スケッチです。

// ジョイスティックモジュール情報取得表示
// 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軸の操作に合わせて、
サーボモーターが動作していると思います。

シリアルモニタのX軸、Y軸、スイッチ状態とサーボへの送信角度表示
シリアルモニタのX軸、Y軸、スイッチ状態とサーボへの送信角度表示
実際の回路2
実際の回路2

※スケッチ 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/