【ESP32】ゲーム用アクセルペダルの作り方

エクスプレッションペダルをアクセルペダルにする マイコン/Arduino

ETS2(EuroTruckSimulator2)などの車運転ゲームで使用できるフットペダルの作り方を紹介します。今回はただのON/OFFをするだけのボタンではなく、アクセルやブレーキなどのアナログな調整ができるペダルです。

今回のポイント

今回のポイントは次の2点です。

ペダルの準備

機械的に”ペダル”をつくるのはもちろん不可能ではありませんが、意外と厄介です。なぜなら足で踏むのは結構な力がかかるため、それなりに頑丈な構造が必要になるからです。そこで今回は音楽向けで使われるエクスプレッションペダルを使用します。

エクスプレッションペダルというのは音量や音のエフェクトなどを足で調節するためのペダルです(私は音楽とは全く無縁なので詳細はわかりません)。

今回使用したものは入手性も良く、値段もこの類の中では比較的安いNektar Technologyのエクスプレッションペダルです。

エクスプレッションペダルは自動でニュートラル位置に戻るといった機構はありません。
この点は自動車のアクセルペダル/ブレーキペダルとは違います。

エクスプレッションペダルについて

エクスプレッションペダルには内部に可変抵抗が仕込まれていて、ペダルの上げ下げでリンクを動かし、可変抵抗の軸を回す構造になっています。

エクスプレッションペダルNXP調整ノブ

エクスプレッションペダルNXP極性SW

端子はφ6.35の3極ジャックで可変抵抗の出力がつながっている、といえば電子工作をする人であれば簡単に理解できると思います。ちなみに、この商品には極性切り替えスイッチと0位置調整用(?)のダイヤルも付いています。言葉だけではわかりにくいので、図にしてみました。

エクスプレッションペダルの内部配線-極性1

エクスプレッションペダルの内部配線-極性2

これでお分かりいただけるかと思います。ごく単純な仕組みですのでゲーム用のフットコントローラーだけではなく、いろいろなDIY工作に使用できますね。ちなみに、可変抵抗の特性はAカーブ(*)と思われます。DIY用であればBカーブの方が使いやすいのですが、流用なのでしょうがないですね。

可変抵抗にはノブの回転角と抵抗値の変化量の関係が違うものが売られています。
回転角が0に近いときは抵抗値の変化が小さく、回転角が大きくなるにつれて変化量が大きくなるものをAカーブと呼びます。
一方、回転角に対して線形的に抵抗値が変化するものをBカーブと呼びます。
ペダルとつながっている可変抵抗の値が12kΩというのは違和感がありますが、実測でだいたいそのぐらいでした。使うときは各自確認をお願いします。

アナログ入力の問題

これまで紹介してきた方法では、ProMicroやESP32に標準で搭載されているアナログ/デジタルコンバーター(以下、ADC)を使用してきました。しかし、内蔵ADCは追加部品無しで使用できる反面、いくつかデメリットがあります。

  • 分解能がいまいち
  • ノイズが乗りやすい

ESP32のADCについては各所で検証がされていますが、スペック上は12bit(=4096段階)ですが線形性が悪く、実際に使えるのは半分以下という話もあります。半分の2000段階でも十分(高い分解能)に見えるかもしれませんが、ゲームの操作にはちょっと足りないかなという印象です。一方、ノイズに関しては致命的で小刻みに値が動くのでゲームでの使用には少し注意が必要です。移動平均を取るといったことで実用的な範囲に収まりますが、応答性とのバーターなのでパラメーターのチューニングが必要になります。また、ハードウェア的な対策としてコンデンサを取り付けるぐらいでは大きな改善は見込めません。

もちろん、用途にはよってはこの内蔵ADCでも十分なのですが、今回はADS1115というADCが搭載されたモジュールを使います。ADS1115は秋月電子、アマゾン、Aliexpressでも入手可能な有名なADコンバーターモジュールです。マイコンとの接続はI2Cですので電源/GNDを除けば必要な配線はSCLとSDAの2線のみです。しかも、1つのADSモジュールで4chの入力が可能なので不足しがちなマイコンの入出力ピンの使用を抑えることも可能です。

ADS1115のメリット

ADS1115

一方、ADS1115の分解能は16bit(=65536段階)あります。このぐらいあれば粗さは気にならないですし、ESP32の内蔵ADCと比べて線形性もよく値の端々まで使えますので、実効的な分解能の差はスペック以上です。

ノイズについては次のグラフを見てもらえばよくわかると思います。このグラフは、入力を一定に固定した状態で電圧をそれぞれ1000回読み取ったデータです。内蔵ADCとADS1115の最大レンジが同じになるように内蔵ADCの値を比例倍して揃えています。

オレンジ色がADS1115、青色が内蔵ADCです。設定した最大レンジに対して、内蔵ADCでは1%程度のばらつきが出てしまっています。1%のばらつきは無視できません。このノイズがでたままジョイスティックやハンドルを作ってしまうとゲーム内でジョイスティックやハンドルが常にプルプル震えるような現象が出てしまいます。一方、ADS1115の方はこのような現象は発生しません(少なくともゲーム画面では確認できません)。LPFやソフトウェア的な処理が不要になりますので、そういった点でもADS1115を使用する意味は大きいです。

ADCのばらつき比較

配線図

配線は次の図のようになります。エクスプレッションペダルは可変抵抗(ポテンショメーター)で代用しています。

ESP32とADS1115の接続図

スケッチ

ライブラリの追加

ADS1115を使うために、ArduinoIDEで”Adafruit_ADS1X15″というライブラリをインポートしてください。

ADS1x15ライブラリのインポート

スケッチ例

#include <Arduino.h>
#include <BleGamepad.h> //https://github.com/lemmingDev/ESP32-BLE-Gamepad
#include <Adafruit_ADS1X15.h>

//ゲームパッド宣言
BleGamepad bleGamepad("hundleController");
#define numOfButtons 1
#define enableX true
#define enableY true
#define enableZ false
#define enableRZ false
#define enableRX false
#define enableRY false
#define enableSlider1 false
#define enableSlider2 false

//ADコンバーター宣言
Adafruit_ADS1115 ads;

void setup()
{
  //ADコンバーター設定
  ads.setGain(GAIN_ONE);
  ads.begin();

  //ゲームパッド設定
  BleGamepadConfiguration bleGamepadConfig;
  bleGamepadConfig.setControllerType(CONTROLLER_TYPE_GAMEPAD);
  bleGamepadConfig.setWhichAxes(enableX, enableY, enableZ, enableRX, enableRY, enableRZ, enableSlider1, enableSlider2);
  bleGamepadConfig.setButtonCount(numOfButtons);
  bleGamepadConfig.setAxesMin(-32767);
  bleGamepadConfig.setAxesMax(32767);
  bleGamepad.begin(&bleGamepadConfig);
  bleGamepad.setAxes(0, 0);
}

void loop()
{
  float pedalRaw;
  int16_t jy;
  if (bleGamepad.isConnected())
  {
    pedalRaw=(float)ads.readADC_SingleEnded(0)*2.55-32767;
    jy=(int)pedalRaw; 
    bleGamepad.setAxes(0,jy);
    delay(10);
  }
}

スケッチの説明(補足)

ペダルはゲームパッドY軸に割り当てており、Y軸は±32767のレンジに設定しています。

ADS1115のゲイン設定は

ads.setGain(GAIN_ONE);//※以下参照

としてあります。この時、測定レンジは±4.096Vです。

また、ペダルの可変抵抗両端は0Vと3.3Vに接続していますので、3.3/4.096/2=0.4から、測定レンジの半分以下しか活用していない状態です(14~15bit相当)。今回は回路の単純化のためにこのような設定にしていますが、気になる方は抵抗で分圧してレンジを調整してください。

ADS1115のゲイン設定は以下の中から選べます。
GAIN_TWOTHIRDS: +/- 6.144V
GAIN_ONE:             +/- 4.096V
GAIN_TWO:            +/- 2.048V
GAIN_FOUR:           +/- 1.024V
GAIN_EIGHT:          +/- 0.512V
GAIN_SIXTEEN:      +/- 0.256V

これらを考慮して、読みだした値を補正することでレンジを合わせています。

(float)ads.readADC_SingleEnded(0)*2.55-32767;

まとめ

今回は音楽用のエクスプレッションペダルを使って、運転シミュレーションゲームで使える(アクセル)ペダルの作り方を紹介しました。

極性や調整ノブなど少しわかりにくい部分もあるのですが、基本的にはただの可変抵抗だと思えば使うのは難しくありません。

また今回使用したADS1115は十分な分解能を持っていますので、踏み込み量とジョイスティック出力値の補正などでデータを加工する余地が十分にあります。是非この組み合わせで自分だけのペダルを作ってみてください。

コメント

  1. ミシンのペダルでも代用できそう?
    なんとなく、音楽用の物よりも踏む力が弱くても機能しそうなイメージですが、どうでしょう?

    • ミシンのペダルは盲点でした。確かに使えそう。
      ただON/OFFするだけの物とアナログ的に調整できるものとあるみたいなんでその辺の見極めは必要そうです。

      エクスプレッションペダルにはポジション戻すためのバネがないんで、踏む力に関してはミシンの方が重そうな気がします。