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を光らせたいと思います。
先ほどの配線に下記を追加します。
ESP32 | LED |
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が光るようになりました!
最後に
これで基本の使い方は終わりました。
ジョイスティックは個体差があり、精度を良くする場合細かい調整が必要です。
ラジコン等沢山使い道がありますので色々試してみてください!!
-
前の記事
RaspberryPiとUSBカメラを使って動画配信をしてみました(Mjpg-Streamer)!! 2021.07.11
-
次の記事
記事がありません