ここではIoTマイコンである「ESP32 DevKitC 開発ボード」と「2軸ジョイスティックモジュール」を使って指定範囲のX、Y値を取得する方法を紹介します。
この記事を読むことで
ESP32でジョイスティックから値を取得する方法
XY値の取得範囲を変える方法
を知ることができます。
ジョイスティックをコントローラーのようにして使用したい方は是非ご覧ください!
それでは早速始めていきますね。
使用機器と環境構築
まずは使用機器・環境構築について紹介しておきます。
使用するESP32、ジョイスティック
まず使用するIoTマイコンのESP32は「ESP32-DevKitC-VE ESP32-WROVER-E開発ボード 8MB」になります。
こちらは 秋月電子通商:ESP32-開発ボード で購入しました。
なぜArduino ではなくESP32かというと、ESP32はBluetoothが使えるからです。
ジョイスティックから値を取得するだけならArduino で問題ありませんが、ESP32を使えばラズパイと無線(Bluetooth)で接続ができます。
Bluetooth接続できるなら、自作のコントローラーを作れるのではと思い調べてみたところ
Qiita:Raspberry PiからESP32のデータをBLEで読みだす
という記事を見つけました。
BLEでラズパイからESP32のデータを読み取れるということは、ESP32とジョイスティックを搭載したコントローラーを作れそうですよね。
これが事の始まりです。(-ω-)/
使用するジョイスティックはこちらの「2軸ジョイスティックモジュール センサープッシュ有り ケーブル付き」になります。
こちらも 秋月電子通商:2軸ジョイスティック より購入する予定です。
(今回は手持ちに上記のジョイスティックの互換機があったのでそちらを使います。)
環境構築
動作チェック環境は以下の通りです。
動作環境&必要なもの
OS:Windows10
IDE:Arduino IDE 1.8.9
ESP32 ボードマネージャ(Arduino IDE書き込み時に必須)
USB – Micro-B
ESP32本体
2軸ジョイスティック
ジャンパ線複数
抵抗
ブレッドボード
秋月電子で変えるものばっかりなので、電子工作に慣れている人は直ぐに揃えられるものとなっています。
ESP32でジョイスティックの値を取得する
準備ができたら、実際にジョイスティックの値を取得してみます。
ESP32とジョイスティックの配線
ESP32とジョイスティックの配線は以下のように配線します。
詳細は以下の通りです。
ESP32 ⇔ ジョイスティックGND ⇔ GND
5V ⇔ +5V
25PIN ⇔ VRx
26PIN ⇔ VRy
33PIN ⇔ SW
VRxとVRyはアナログで読み込み、SWはデジタルで読み込みをします。
ここで注意点としてESP32は、デジタル入出力するのが良くないということです。
上記URLのLang-shipの記事では
と書かれています。(抜粋&簡略)
なので、信号レベルを変換するために
Cepstrumの記事を参考に
ことにしました。
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); }
このプログラムでは
ために
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;
と記述しています。
計算方法としては簡単で
の範囲が
となるように「axis_max( = 4095) / 2」を引き算をして
となる数値(ここでは45.51)を割り算しているだけです。
ジョイスティックの取得値を「0 ~ 90」にしたい場合は
で算出することが可能です。
プログラムをコピペ&書き込みができたら、実際に動作確認をしてみましょう。
ESP32とジョイスティックの動作確認
では、Arduino IDEからシリアルモニタを開いて、ジョイスティックを動かしてみます。
上記のプログラムの場合、以下の向きが+方向の軸になります。
まずは+X方向を確認してみます。
X_axis:45
ちゃんと「X_axis:45」と表示されているのが確認できました。
続いて、-X方向の確認です。
X_axis:-45
こちらも、しっかりと「X_axis:-45」と表示されていますね。
続いて+Y方向の確認もしてみます。
Y_axis:45
こちらも問題ありませんね。
最後に-Y方向の確認です。
Y_axis:-45
こちらも問題ありません。
このように2軸ジョイスティックを使えば、簡単にX、Y軸方向の値を取得することが可能です。
最後に、SWの確認もしておきます。
SWはデフォルトで「1」を返し、スイッチをONにしたときに「0」を返します。
SW:1/0
スイッチを2回押して検証したところ、「SW:0」と表示されました。
これでジョイスティックを使った制御ができそうですね。
Arduino IDEを使ってジョイスティックを制御するときの参考になれば幸いです。
お疲れ様でした。