ESP32とArduino開発環境を使ってETS2用のハンドルコントローラーを作りましたのでその方法を紹介します。ETS2ガチ勢ではないので最小限の費用でラフなものを作ることを目的にしています。
ETS2ってなに?
ETS2というのはEuroTruckSimulator2というゲームの略で、タイトルの通りトラックを運転するゲームです。運転といってもレースのような要素はなく、時間内に荷物を所定の場所に届けるといった内容がメインです。
スピード違反でつかまる(罰金)のこともありますし、無茶な運転でトラックが横転したりするとお金を取られたりしますが、基本はまったり運転や景色を楽しむ感じですね。断じてスピードを競うレースゲームではありません。
本格的にやるのであれば、市販のハンドルコントローラーやペダルセットなどを買うのが一番だと思うのですが私は緩く楽しめればよいので最小限の費用で、かつ必要十分な性能を持ったハンコンを作ってみようと思ったわけです。
構成
車の運転シミュレーションではなんといっても必要なのはハンドル!ですので、ハンドル機能だけを実現することを考えました。ほかのボタンの追加などはあとでどうにでもなります。
肝心のセンサー部
ポテンショメーター(可変ボリューム)をつかうか、ロータリーエンコーダーを使うかの2択あります。それぞれメリット・デメリットがありますが、今回はロータリーエンコーダーを使いました。
ポテンショメーターのメリットデメリット
ロータリーエンコーダーのメリットデメリット
使ったモノ
メリットデメリットを考えて、今回はロータリーエンコーダーを使用しました。1回転600パルスの高分解能タイプです。秋月などでは1回転24パルスのものが100円程度で販売されていますが、分解能が低いと動きがぎくしゃくしてしまうのでここはケチれません。また、軸受けにベアリングまで搭載されていますので強度もそこそこあります。
ハンドル
今回はヨドバシの段ボールを積み重ねてハンドルを作りました。実車用のハンドルも2000円程度から購入できますが、不要になったときに気軽に捨てられないのと、どう考えても邪魔なので今回はやめておきました。
ハンドル、Qiilu 350mm / 14in ステアリング、ユニバーサルレーシングカードリフトステアリングホイール交...
ヨドバシの段ボールはA4サイズなので、円形で切り取ってしまうとかなり小さくなってしまうためこんな形で切り取りました。縦方向がA4サイズの短手方向です。完全に小学生の夏休みの工作ですね。
段ボールとは言え、木工用ボンドで10層近く重ねれば結構な強度になります。
ロータリーエンコーダーの軸には秋月電子で購入したサトーパーツの”メタルツマミ(ノブ) K-59-M Φ30mm×16mm”をとりつけ、ハンドル側にこれとぴったりの穴を設けて押し込みました。強度的にはちょっと不安ですがとりあえず。
そこそこしっかりしていて強度があったので、ロータリーエンコーダー本体を固定する台座はNexus5Xの空き箱です。費用0円。この辺も夏休みの工作感満載です。ちなみに、円形部分の切り出しはOLFAのラチェット式のコンパスカッターをお勧めします。
マイコン
マイコンは例によってESP32を使用しました。以前の記事でも書きましたが、Amazonで販売されているESP32はBluetoothの挙動があやしげなものが多いので商品リンクは張りません。これなら動くよっていうモノがありましたら是非コメント欄でお教えください。
これに関しては秋月などでの購入が確実かもしれません。
配線図
今回使ったロータリーエンコーダーはオープンコレクタ式ですので、格安のロータリーエンコーダーとは配線が少し違います。A相-GND,B相-GND間はただのスイッチではないので電源供給が必要です。
オープンコレクタなので、本来プルアップ抵抗が必要ですがESP32の内部プルアップを使用したので抵抗は取り付けていません。
Arduino スケッチ
これについては前回の記事と全く同じ構成で大丈夫です。まったく洗練されていないソースコードで恥ずかしいですが一応。ETS2ではデフォルトではX軸がハンドル操作として割り当てられているのでそれに合わせてあります。ちなみにY軸がアクセル/ブレーキ軸です。
#include <Arduino.h>
#include <BleGamepad.h>
#define numOfButtons 1
#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
BleGamepad bleGamepad("hundleController");
//ロータリーエンコーダー設定
#define PinEnc1A 16
#define PinEnc1B 17
volatile int Counter1 = 0;
int ar=0;
void ROTALY() {
if(digitalRead(PinEnc1A)==0)
{
if(digitalRead(PinEnc1B)==0)
{
Counter1++;
}
else
{
Counter1--;
}
}
}
void setup(){
//入力ピン設定
pinMode(PinEnc1A, INPUT_PULLUP);
pinMode(PinEnc1B, INPUT_PULLUP);
//ロータリーエンコーダー割り込み設定
attachInterrupt(PinEnc1A, ROTALY, FALLING);
//ゲームパッド設定
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);
}
void loop(){
if (bleGamepad.isConnected()){
if (Counter1 > 0) {
if(ar>(-32666))
{
ar-=30;
bleGamepad.setAxes(ar);
Counter1--;
}
else{
Counter1=0;
}
}
else if (Counter1 < 0){
if(ar<32666){
ar+=30;
bleGamepad.setAxes(ar);
Counter1++;
}
else{
Counter1=0;
}
}
}
else{
Counter1=0;
delay(1);
}
}
使用感
作ったものの使用感はこんな感じです↓
事故っといていうのもなんですが、かなり運転がしやすくなりました。以前はジョイスティックや小さなつまみをハンドルに見立ててETS2を遊んでいたのですが、実写に近いサイズになるとこの程度のツクリのものでもリアリティが上がります。
また、今回は非接触式のロータリーエンコーダーを使っていますので軸がスッカスカだったのですが、ゆるく遊ぶ部分にはこのぐらいが良いかもしれません。段ボール製ですのであまり負荷もかけられませんし。気になる人は多少フリクションをかけるなどの工夫もありかもしれません。
追記:ペダルの自作方法の記事も書きました!
コメント