私はEuro Truck Simulator 2でハンドルコントローラー(ハンコン)を使っていますが、Hシフターも使ってみたいなぁと思うようになりました。前にウィンカーレバーを自作したので今回も同じように、Hシフターを作ってみることにしました。

はじめに断っておきますが、最終的に”使わない”という判断になりました。

Hシフターとは?

マニュアル車用のシフトノブで、H型の形状をしたものです。以下の写真のものは1~6速とリバースの計7つのポジションがあります。

私が使っているG923でも使用できるシフターが、オプションで販売されています。買ってもそんなに高くはなく、わざわざ作らなくてもいいかなとも思ったのですが、せっかく3Dプリンターも持ってるんだし試しに作ってみてもいいかなと。実物は触ったこともないので想像で作ってみることにしました。

構造

ウィンカーレバーと同様に、M5Stack ATOMにESP32-BLE-Gamepadライブラリを入れて、ゲームパッド扱いとしてPCに接続します。Thingiverseで検索すると結構ヒットします。機械的に構造が複雑で左右の動きと上下の動きがあります。

乗用車だと1~6速くらいですが、トラックの場合1~12速くらいまであります。しかし変更できるポジションは6+1しかないので、1~6と7~12に切り替えるためのスイッチが必要です。このスイッチをどこに付けるかが悩ましいところですが、シフトレバーのノブ内にスイッチを内蔵できると操作性が良くなります。

そこでレンジ切り替えスイッチの配線をシフトレバーの下部から引き出すことにしました。またシフトレバーは固定せずに、任意の場所にスライドする方式にしました。

I/Oの拡張

今回は8つのGPIOポートが必要だったのでExtend I/O 2 Unit (STM32F0)を使用しました。

このモジュールはI2C接続で8つのポートを制御できるスグレモノです。デジタル8入出力だけでなく、アナログ入力やPWM出力などもできるとか。これならGroveポートに接続するだけなので簡単です。

#include "M5_EXTIO2.h"  // https://github.com/m5stack/M5Unit-EXTIO2/
M5_EXTIO2 extio;
setup() {
  while (!extio.begin(&Wire, GPIO_M5SDA, GPIO_M5SCL, 0x45)) {
    delay(100);
  }
  extio.setAllPinMode(DIGITAL_INPUT_MODE);
}

data = extio.getDigitalInput(io);

使い方も簡単で、M5_EXTIO2ライブラリを使用すればgetDigitalInput()で状態を読むだけです。

リードスイッチと磁石でポジション判定

シフトがどのポジションに入っているかを判定するために、リードスイッチと磁石を使用しました。シフトレバーの軸の下に磁石が入っていて、近づくとスイッチがONになるという仕組みです。

当初はマイクロスイッチを使用するつもりでしたが、場所を食うので本体が大きくなってしまいます。リードスイッチなら近付いただけでONになるので、場所も取りませんし、10mmくらいの範囲なら磁場が届くので位置の調整も楽です。

ESP32だとGPIOにプルアップ/プルダウンの設定できるのですが、このI/O拡張ユニットにはそれらしき設定がありません。そこで今回はプルダウン抵抗を取り付け、Groveポートの5Vを抵抗で分圧して3.3VをI/Oに与える形にしました。

斜めの突起の理由

左から本体、固定板、フタです。本体の中に固定板を入れてフタをする構造になっているのですが、斜めに飛び出た突起がありますね。最初はこの構造はなかったのですが、シフトレバーをスライドさせると沈み込んで、内部で引っかかってしまう問題がありました。

そこでこのような形にして沈まないように補強させました。斜めにしたのはこの中を配線が動くスペースを確保するためで、3Dプリンターで出力できるように45度の角度で作ってあります。

組み立ててみると、勝手にレバーが戻ってしまう問題が発生

組み立ててシフトレバーを動かすと、勝手に位置が戻ってしまう問題に遭遇しました。こんな細い電線なのに結構引っ張る力があるんですね。内部で余裕をもって配線してあげてもだめ。そこでこのようにカールさせてみました。

カール状になったことで元の形状に戻ろうとする力が分散され、レバーが勝手に戻ってしまう力はだいぶ弱まりました。しかしそれでも動いてしまい、スイッチが勝手にOFFになってしまいます。そこで所定の位置に来たらレバーが止まるようにしてみました。上の画像の真ん中の固定板を拡大すると、突起が並んでいる箇所がありますが、ここに引っかかってレバーが戻らないようにしました。しかし突起を大きくすると動かすときに大きな力が必要になってしまうので、あまり大きくすることはできませんでした。

プログラム

今回作成したプログラムはGitHubにアップしました。ボタンの状態に変化があったときだけBLEでGamePadのデータを送信する形にしています。過去の状態を記憶しておく必要があったりして案外面倒なので、ボタンの処理をするためのクラスを作りました。おかげでメインプログラムはすっきりしたと思います。

PCとの接続

Bluetoothの設定画面から普通にデバイスを追加していくだけです。私は以前に作ったウィンカーレバーも接続していたので、同時に接続できるか心配でしたが、何度かやり直しているうちに繋がりました。しかしデバイス名(?)が2台とも「8軸16ボタンデバイスハット スイッチ付き」になってしまって、どっちがどっちだかわからなくなりました。

実際にプレイしてみた

ETS2でHシフターの設定を行い、実際に運転をしてみました。最初はWindowsではちゃんと認識してボタンの反応もできているのに、ETS2では認識しなくて何度もやり直しました。なぜかよくわかりませんがいつの間にか認識するようになりました。

運転して最初に気づいたのは、シフトレバーの位置とは全然違うギアに入ってしまう問題でした。どうやらこれは自分が運転しているトラックが原因で、ScaniaのRだったかSだったんですが、これが12+2速なんですよね。全部で14速あるのでレンジ切り替えスイッチ1つでは12速ぶんしかなく、足りません。

そこで12速のトラックを新たに購入して運転してみたところ、今度は正常にシフトチェンジができるようになりました。

マニュアル車はめんどくさい

あーーー教習所の悪夢を思い出した。。。

ギアチェンジするのにクラッチ踏まないといけないんですね。信号が変わって発進するときはガチャガチャ、ガチャガチャ、ガチャガチャ、速度を落とすときもガチャガチャ、停止状態から発信するときなんか半クラッチを踏まなければなりません。坂道では後ろに下がっていくわエンストするわ、マニュアル車めんどくさすぎ!全然ドライブに集中できなくて面白くないのでオートマチックに戻しました。w

LINEで送る
Pocket