ESP32でジョイスティック(アナログスティック)を使い方とLEDを使った応用も!!

ESP32でジョイスティック(アナログスティック)を使い方とLEDを使った応用も!!

今回はジョイスティックの使い方を使ってみたいと思います。
アマゾンにてセットで売られており安く購入することができます。

ジョイスティックの仕組み


ゲームのコントローラーでよく使われているジョイスティックですが、
仕組みは簡単で可変抵抗が2個あり、縦方向と横方向にセットされています。
横は左から右にかけて抵抗が大きくなり、縦は下から上にかけて抵抗が大きくなります。

ジョイスティックにスイッチがある場合もあります。
ピンに「SW」があればスイッチ付きです。


手順

ここからは、ESP32を使用しジョイスティックを傾けた時の数値をみたいと思います。
ESP32をARDUINO IDEで使用する場合は過去の記事「画像付きで分かりやすく解説!ESP32を始める際に必要な設定を覚えよう!」で解説してありますのでもし、まだの方は参考にしてください。


配線

下記のように配線します。

ESP32      ジョイスティック
GND GND
5V +5V
4 VRX
0 VRY
2 SW

プログラム作成

プログラムは下記となります。

#include <Arduino.h>                      //ARDUINO IDE の場合は記入不要

#define read_x  4                         //X軸(横軸)
#define read_y  0                         //7軸(縦軸)
#define read_sw 2                         //スイッチ

int x_axis, y_axis, sw;

void setup() {
  Serial.begin(115200);
  delay(100);
  Serial.printf("%s - run\n",__func__);
  pinMode(read_x, INPUT);
  pinMode(read_y, INPUT);
  pinMode(read_sw, INPUT_PULLUP);
}

void loop() {
  x_axis = analogRead(read_x);
  y_axis = analogRead(read_y);
  sw     = digitalRead(read_sw);
  
  Serial.print("x=");
  Serial.print(x_axis);
  Serial.print(" y=");
  Serial.print(y_axis);
  Serial.print(" switch ");
  if(sw == 1){                //スイッチを離したとき
    Serial.println("OFF");
  }else{                     //スイッチを押したとき
    Serial.println("ON");
  }
  delay(500);
}

中心の時

x=2839 y=2767 switch OFF

右に倒したとき

x=0 y=2768 switch OFF

左に倒したとき

=4095 y=2818 switch OFF

上に倒したとき

x=2834 y=0 switch OFF

下に倒したとき

x=2811 y=4095 switch OFF

スイッチを押したとき

x=2835 y=2765 switch ON

最大数値は4095となります、もしArduinoを使用した場合最大1023となります。
手を離してジョイスティックが中心の時の理想は半分の2047あたりなのですが、
あまりよくない品物なのか約2800で大きくなってしまいました。
多少のズレなら問題ないのですが流石にズレが大きいです。
まぁ、電子工作で特に精度のいらないモノを作るのであれば、
プログラムで中心を2800にするしかなさそうです。


LEDを光らせよう!

ジョイスティックを傾けた方向にLEDを光らせたいと思います。

先ほどの配線に下記を追加します。

ESP32LED
19左側LED
21上側LED
22右側LED
23下側LED

プログラムは下記に変更します。

#include <Arduino.h>                      //ARDUINO IDE の場合は記入不要

#define read_x  4                         //X軸(横軸)
#define read_y  0                         //7軸(縦軸)
#define read_sw 2                         //スイッチ
#define left    19                        //左側led
#define up      21                        //上側led
#define right   22                        //左側led
#define down    23                        //下側led

int x_axis, y_axis, sw;

void setup() {
  Serial.begin(115200);
  delay(100);
  Serial.printf("%s - run\n",__func__);
  pinMode(read_x, INPUT);
  pinMode(read_y, INPUT);
  pinMode(read_sw, INPUT_PULLUP);
  pinMode(left, OUTPUT);
  pinMode(up, OUTPUT);
  pinMode(right, OUTPUT);
  pinMode(down, OUTPUT);
}

void loop() {
  x_axis = analogRead(read_x);
  y_axis = analogRead(read_y);
  sw     = digitalRead(read_sw);
  
  Serial.print("x=");
  Serial.print(x_axis);
  Serial.print(" y=");
  Serial.print(y_axis);
  Serial.print(" switch ");
  if(sw == 1){                //スイッチを離したとき
    Serial.println("OFF");
  }else{                     //スイッチを押したとき
    Serial.println("ON");
  }

  if(x_axis == 0){
    digitalWrite(left, HIGH);
    digitalWrite(up, LOW);
    digitalWrite(right, LOW);
    digitalWrite(down, LOW);
  }else if(x_axis == 4095){
    digitalWrite(left, LOW);
    digitalWrite(up, LOW);
    digitalWrite(right, HIGH);
    digitalWrite(down, LOW);
  }else if(y_axis == 0){
    digitalWrite(left, LOW);
    digitalWrite(up, HIGH);
    digitalWrite(right, LOW);
    digitalWrite(down, LOW);
  }else if(y_axis == 4095){
    digitalWrite(left, LOW);
    digitalWrite(up, LOW);
    digitalWrite(right, LOW);
    digitalWrite(down, HIGH);
  }else{
    digitalWrite(left, LOW);
    digitalWrite(up, LOW);
    digitalWrite(right, LOW);
    digitalWrite(down, LOW);
  }
  delay(500);
}

これでジョイスティックを傾けた方向にLEDが光るようになりました!


最後に

これで基本の使い方は終わりました。
ジョイスティックは個体差があり、精度を良くする場合細かい調整が必要です。
ラジコン等沢山使い道がありますので色々試してみてください!!