注目キーワード
  1. Photoshop
  2. Python
  3. Raspberry Pi
  4. Arduino

ESP32でジョイスティックからXY値、SW値を取得してみた

ここではIoTマイコンである「ESP32 DevKitC 開発ボード」と「2軸ジョイスティックモジュール」を使って指定範囲のX、Y値を取得する方法を紹介します。

 

この記事を読むことで

ESP32でジョイスティックから値を取得する方法

XY値の取得範囲を変える方法

を知ることができます。

 

ジョイスティックをコントローラーのようにして使用したい方は是非ご覧ください!

それでは早速始めていきますね。

 

使用機器と環境構築

まずは使用機器・環境構築について紹介しておきます。

 

使用するESP32、ジョイスティック

まず使用するIoTマイコンのESP32は「ESP32-DevKitC-VE ESP32-WROVER-E開発ボード 8MB」になります。

esp32-joystick-01

こちらは 秋月電子通商:ESP32-開発ボード で購入しました。

 

なぜArduino ではなくESP32かというと、ESP32はBluetoothが使えるからです。

ジョイスティックから値を取得するだけならArduino で問題ありませんが、ESP32を使えばラズパイと無線(Bluetooth)で接続ができます。

Bluetooth接続できるなら、自作のコントローラーを作れるのではと思い調べてみたところ

 

Qiita:Raspberry PiからESP32のデータをBLEで読みだす

 

という記事を見つけました。

BLEでラズパイからESP32のデータを読み取れるということは、ESP32とジョイスティックを搭載したコントローラーを作れそうですよね。

これが事の始まりです。(-ω-)/

 

使用するジョイスティックはこちらの「2軸ジョイスティックモジュール センサープッシュ有り ケーブル付き」になります。

esp32-joystick-02

こちらも 秋月電子通商:2軸ジョイスティック より購入する予定です。

(今回は手持ちに上記のジョイスティックの互換機があったのでそちらを使います。)

 

環境構築

動作チェック環境は以下の通りです。

 

動作環境&必要なもの

OS:Windows10

IDE:Arduino IDE 1.8.9

ESP32 ボードマネージャ(Arduino IDE書き込み時に必須)

USB – Micro-B

ESP32本体

2軸ジョイスティック

ジャンパ線複数

抵抗

ブレッドボード

秋月電子で変えるものばっかりなので、電子工作に慣れている人は直ぐに揃えられるものとなっています。

 

ESP32でジョイスティックの値を取得する

準備ができたら、実際にジョイスティックの値を取得してみます。

 

ESP32とジョイスティックの配線

ESP32とジョイスティックの配線は以下のように配線します。

 

esp32-joystick-00

 

詳細は以下の通りです。

 

ESP32   ⇔  ジョイスティックGND   ⇔  GND

5V    ⇔  +5V

25PIN   ⇔  VRx

26PIN   ⇔  VRy

33PIN   ⇔  SW

VRxとVRyはアナログで読み込み、SWはデジタルで読み込みをします。

 

ここで注意点としてESP32は、デジタル入出力するのが良くないということです。

 

Lang-ship:ESP32のGPIO入力について

 

上記URLのLang-shipの記事では

デジタル入出力の信号レベルが5Vとなるので、3.3V系のESP32には良くない

と書かれています。(抜粋&簡略)

なので、信号レベルを変換するために

 

Cepstrum:5V系・3.3V系信号レベル変換

 

Cepstrumの記事を参考に

33PIN ⇔ SW間へ10kΩの抵抗を挟む

ことにしました。

 

3.3V系のマイコンに過電圧・過電流が加われば、当然故障の原因になりますよね。

なので、上記に気を付けて配線を行いました。

 

Arduino IDEでESP32にプログラムを書き込む

ESP32とジョイスティックの配線が終わったら、Arduino IDEでESP32にプログラムを書き込んでいきます。

ESP32の「AnalogRead()」はArduino と違い、0~4095の範囲で値を取得します。

そのことを踏まえ、ジョイスティックの値を取得します。

 

ESP32_joystick.ino

// Get VRX and VRY data from joystick module
const int JOY_STICK_VRX = 26;
const int JOY_STICK_VRY = 25;
const int PUSH_BUTTON = 33;
  
void setup() {
  pinMode(JOY_STICK_VRX, INPUT);
  pinMode(JOY_STICK_VRY, INPUT);
  pinMode(PUSH_BUTTON, INPUT_PULLUP);
  Serial.begin(115200);
}

void loop() {
  // AnalogRead range of ESP32 is 0 to 4095
  float x_axis = analogRead(JOY_STICK_VRX);
  float y_axis = analogRead(JOY_STICK_VRY);
  int sw = digitalRead(PUSH_BUTTON);
  int axis_max = 4095;

  // Convert joy stick value from -45 to 45
  x_axis = (x_axis - axis_max / 2) / 45.51;
  y_axis = (y_axis - axis_max / 2) / 45.51;
  
  Serial.print("X_axis: ");
  Serial.print(x_axis, 0);  // round off to the first dicimal place
  Serial.print("\n");
  Serial.print("Y-axis: ");  // round off to the first dicimal place
  Serial.print(y_axis, 0);
  Serial.print("\n");
  Serial.print("SW: ");
  Serial.print(sw);
  Serial.print("\n\n");
  delay(500);
}

 

このプログラムでは

ジョイスティックの取得範囲を -45°~ 45°にする

ために

int axis_max = 4095;

// Convert joy stick value from -45 to 45
x_axis = (x_axis - axis_max / 2) / 45.51;
y_axis = (y_axis - axis_max / 2) / 45.51;

と記述しています。

 

計算方法としては簡単で

0 ~ 4095

の範囲が

-2047 ~ 2048

となるように「axis_max( = 4095) / 2」を引き算をして

2048 ➡ 45

となる数値(ここでは45.51)を割り算しているだけです。

 

ジョイスティックの取得値を「0 ~ 90」にしたい場合は

x_axis /= 45.51

で算出することが可能です。

 

プログラムをコピペ&書き込みができたら、実際に動作確認をしてみましょう。

 

ESP32とジョイスティックの動作確認

では、Arduino IDEからシリアルモニタを開いて、ジョイスティックを動かしてみます。

上記のプログラムの場合、以下の向きが+方向の軸になります。

esp32_axis_check

 

まずは+X方向を確認してみます。

X_axis:45

esp32-joystick-04

ちゃんと「X_axis:45」と表示されているのが確認できました。

 

続いて、-X方向の確認です。

X_axis:-45

esp32-joystick-03

こちらも、しっかりと「X_axis:-45」と表示されていますね。

 

続いて+Y方向の確認もしてみます。

Y_axis:45

esp32-joystick-06

 

こちらも問題ありませんね。

 

最後に-Y方向の確認です。

Y_axis:-45

esp32-joystick-05

こちらも問題ありません。

 

このように2軸ジョイスティックを使えば、簡単にX、Y軸方向の値を取得することが可能です。

 

最後に、SWの確認もしておきます。

SWはデフォルトで「1」を返し、スイッチをONにしたときに「0」を返します。

SW:1/0

esp32-joystick-07

スイッチを2回押して検証したところ、「SW:0」と表示されました。

 

これでジョイスティックを使った制御ができそうですね。

Arduino IDEを使ってジョイスティックを制御するときの参考になれば幸いです。

お疲れ様でした。

esp32-joystick-topthumbnail
学びに関する情報をチェック!