ESP32でジョイスティックを使ってみよう【Arduino】
この記事では、ゲームコントローラーなどでおなじみのジョイスティックをArduino(ESP32)で使う方法を解説します。本記事ではESP32を使いましたが、M5Stackや他のArduino、Arduino互換機でも動作します。
ジョイスティックについて
Amazonなどでよく売られている格安のジョイスティックはGND、+5V(基準電圧)、VRX、VRY、SWの端子になってます。ジョイスティックには2つの可変抵抗が内蔵されており、X軸方向とY軸方向の動きに応じてそれぞれの可変抵抗が回転します。また、VRXとVRYの出力は基準電圧を可変抵抗で分圧した値になるようです。
ArduinoのADコンバータを使って、VRXとVRYの出力値を読み取ればジョイスティックの操作量を知ることができます。 ただし、今回使用したジョイスティックは基準電圧が+5Vと書かれてますが。ESP32を使う場合、GPIOの入力は3.3Vまでなのでジョイスティックにかける基準電圧も3.3Vとします。
また、ジョイスティックにはタクトスイッチが内蔵されてます。SWがそのタクトスイッチの出力です。ジョイスティックを垂直方向に押し込むとタクトスイッチがオンとなり、SWはアースと導通した状態になります。タクトスイッチが押されてない状態では、宙に浮いているため無限大の抵抗値を示します。このままですとSW端子には電圧変化がありませんので、__抵抗を介して電圧を掛ける__必要があります。このことを__プルアップ__と呼びます。プルアップ抵抗には__10kΩ__を使用するのが一般的なようです。 これでスイッチが宙に浮いてる時の出力を基準電圧と同じにできます。
またArduinoによっては、プログラミングでプルアップやプルダウンに設定可能な場合があります。ESP32も一部のGPIO端子でソフトウェアプルアップが可能になってます。
ESP32とジョイスティックの配線
さて、実際にESP32を使ってジョイスティックを配線してみましょう。次のように配線を行いました。
ESP32 | ジョイスティック |
---|---|
GND | GND |
3.3V | +5V |
G22 | VRX |
G33 | VRY |
G34 | SW |
先ほどESP32でもソフトウェアプルアップが使えると説明しましたが、GPIO34以降は内部プルアップ/プルダウンが無いようです。しかし、手持ちのESP32ではGPIO32でプルアップを試してもなぜかうまくできませんでした。 よってプルアップ抵抗を物理的に入れることにしました。皆さんはご自分の環境に合わせて設定してみてください。 通常、ソフトウェアのプルアップ/プルダウンは gpio_set_pull_mode(32, GPIO_PULLUP_ONLY); で設定します。
プログラム
ジョイスティックのXY、スイッチをシリアルプリンタに表示させるプログラムです。
const gpio_num_t VRX_PIN = GPIO_NUM_32;
const gpio_num_t VRY_PIN = GPIO_NUM_33;
const gpio_num_t SW_PIN = GPIO_NUM_34;
void setup() {
pinMode(VRX_PIN, INPUT);
pinMode(VRY_PIN, INPUT);
pinMode(SW_PIN, INPUT); // 10kΩで3V3にプルアップしておく
Serial.begin(115200);
}
void loop() {
int x_val = analogRead(VRX_PIN); // 0 - 4095
int y_val = analogRead(VRY_PIN);
int s_val = analogRead(SW_PIN);
Serial.printf("X: %d, Y: %d, S: %d\n", x_val, y_val, s_val);
delay(100);
}
思いの外簡単にジョイスティックの値を取得できてしまいました。ただし触ってなくても出力値が変動します。実用化の場合は、しきい値を設けてノイズを削除したほうが良いです。
ESP32の内蔵ADコンバータについて
ESP32には2つのADコンバータが内蔵されてます。逐次比較型(SAR)と呼ばれるADコンバータになってます。分解能は9〜12bitで、デフォルトでは12bitに設定されてます。よって、analogReadで読み取れれる値は0〜4095となります。 ADC1はGPIO32〜GPIO39までが割り当てられてます。ADC2はそれ以外のピンとなります。ただし、Wi-Fiなどの無線を利用するとADC2が利用できなくなるようです。しかも__一度でも無線を利用すると、再起動または内部レジスタを書き換える必要がある__ので注意が必要です。 さらにこれらのADコンバータには減衰器が設定されてます。通常0〜1Vの間で測定されるADコンバータですが、デフォルトでは-11dBに減衰(-11dBは約1/3.6倍)させられているため0〜3.6Vの値が測定できます。 これらのことはM5Stackシリーズを使用するときにも同じことが言えますので注意しましょう。