ESP32でジョイスティックを使ってみよう【Arduino】

ESP32でジョイスティックを使ってみよう【Arduino】
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ジョイスティック
GNDGND
3.3V+5V
G22VRX
G33VRY
G34SW

先ほどESP32でもソフトウェアプルアップが使えると説明しましたが、GPIO34以降は内部プルアップ/プルダウンが無いようです。しかし、手持ちのESP32ではGPIO32でプルアップを試してもなぜかうまくできませんでした。

プルアップ抵抗
プルアップ抵抗
よってプルアップ抵抗を物理的に入れることにしました。皆さんはご自分の環境に合わせて設定してみてください。 通常、ソフトウェアのプルアップ/プルダウンは gpio_set_pull_mode(32, GPIO_PULLUP_ONLY); で設定します。

プログラム

ESP32とジョイスティック
ESP32とジョイスティック

ジョイスティックのXY、スイッチをシリアルプリンタに表示させるプログラムです。

cpp
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シリーズを使用するときにも同じことが言えますので注意しましょう。

関連記事

最後までご覧いただきありがとうございます!

▼ 記事に関するご質問やお仕事のご相談は以下よりお願いいたします。
お問い合わせフォーム

人気のArduino互換機
Arduinoで人気の周辺パーツ
あると便利な道具
Arduinoのオススメ参考書

▼ Arduino初心者向きの内容です。ほかのArduino書籍と比べて図や説明がとてもていねいで読みやすいです。Arduinoで一通りのセンサーが扱えるようになります。

▼ 外国人が書いた本を翻訳したものです。この手の書籍は、目からうろこな発見をすることが多いです。

▼ Arduinoの入門書を既に読んでいる方で、次のステップを目指したい人向きの本です。C言語のプログラミングの内容が中心です。ESP32だけでなく、ふつうのArduinoにも役立つ内容でした。

関連記事