
ハンドルコントローラー(ハンコン)に取り付けるウィンカーを作りました。3年前にも同じようなものを作ったのですが、今回はLEDとサウンドでよりウィンカーっぽく仕上げてみました。BLE接続のゲームパッドとして動作するので実際のゲームでも使用することが可能です。(Forza Horizon 6では使えません。ただ光って音が鳴るだけのおもちゃです)
本記事ではサウンド再生やLEDの点灯がある方を中心に解説していきますが、コントローラーだけ作る方法についても補足していきます。
目次
・きっかけ
・今回作るもの
・使用するマイコン
・使用する電子部品
・回路図
・ケースの3Dプリント
・組み立て
・Windowsでペアリング
・ETS2の設定
・カスタマイズ
・余談
きっかけ
私は普段トラックで荷物を運送するゲーム Euro Truck Simulator 2 (ETS2)で遊んでいるのですが、Forza Horizon 6という日本を舞台にしたレースゲームがグラフィックがとても綺麗で気になっていました。でもVR対応してないしなぁ、と思ってたらなるるるるなさんがVR modを公開!素晴らしすぎる~。早速FH6を購入してVRでプレイしてみました。
このゲームは街並みの作り込みが凄くて景色をゆっくり眺めたいんですよね。レースゲームだけど、レースしないでゆっくり走っていたい。VRでプレイしていると本当に車を運転しているかのような感覚になるんですが、曲がるときにウィンカーを出さないことに違和感を覚えました。まぁレースゲームにウィンカーなんてないのが普通ですが。まったり走るならウィンカーは欲しい!ということで前回作ったハンコン用のウィンカーをアップデートすることにしました。
今回作るもの
ETS2のコントローラーとしての機能は維持しつつ、FH6でも遊べるようにします。音声の再生が必要なので、今回はスピーカー内蔵のM5Stack VoiceS3Rを使用しました。
機能
・ウィンカーとハザードのLED点滅 (New)
・LEDに合わせてカチッ、カチッという音を鳴らす (New)
・BLE接続のゲームコントローラーとして動作
使用するマイコン
今回製作したもの(音を鳴らしたい場合)
・M5Stack VoiceS3R
以後、 [LED/SPKあり] と記述します。特に記述がない場合は [LED/SPKあり] を前提としています。
LEDやスピーカーが不要な場合
・M5Stack AtomS3 Lite がおすすめ
以後、 [LED/SPKなし] 記述します。
使用する電子部品
| 部品名 | LED/SPKあり | LED/SPKなし |
|---|---|---|
| ユニバーサル基板 47x72mm | 1 | |
| ATOMIC DIY Proto Kit for ATOM seriesなど | 1 | |
| ピンヘッダー 1×40 | 1 | |
| 高輝度LED Green (VF=3.0-3.2V IF=20mA) | 2 | |
| 抵抗 1/4W 100Ω | 2 | |
| 抵抗 1/4W 1KΩ | 2 | |
| 3Pトグルスイッチ 中点OFF付 1回路2接点 | 2 or 1 | 2 or 1 |
| トランジスタ 2SC1815 | 2 | |
| スリムロボットケーブル 3m | 1 | 1 |
| 皿ねじ タッピング M2 8mm | 8 or 4 | 8 or 4 |
ウィンカーだけ使いたい場合は、トグルスイッチは1つでかまいません。私はETS2でも使いたかったのでウィンカー用とシフト用の2つのスイッチを使いました。
回路図
回路はユニバーサル基板で作成しました。

LEDの電流制限抵抗(100Ω)は、LEDが高輝度タイプ VF=3.0-3.2V IF=20mA のスペックに合わせています。抵抗値の計算はChatGPTに丸投げすると便利です。
ケースの3Dプリント
本体とスイッチのケースは3Dプリンターで作成します。STLファイルは Thingiverse にアップしました。Turn_Signal_Switch.3mfに一式入ってるので、このファイルを開くと楽です。

スイッチのレバーは5cm、7cm、10cmの3種類入っているので、好きなものを使ってください。私はウィンカー用が7cm、シフト用が5cmを使ってます。プレート2にあるのはLEDが透過する矢印のパーツで、半透明フィラメントで作ります。
組み立て
準備ができたらさっそく組み立てていきましょう。
スイッチの配線
スイッチにケーブルを配線します。今回使用したスリムロボットケーブル 3mはとてもやわらかくて細いのでおすすめです。必要なケーブルの長さは30~35cmくらいです。はんだ付けしたらケースに固定します。
スイッチの組み立て
スイッチにレバーを取り付けます。写真のように、ラジオペンチでスイッチのレバーの部分をもって3Dプリントしたレバーを押し込みます。硬い場合は少しグリグリしながら押してみてください。レバーの向きは、溝の向きを写真と同じにしてください。

必ずラジオペンチでスイッチのノブの部分を持ってください。本体側を持ってノブを押し込むと中の接点が壊れます。
レバーを取り付けたらタッピングねじでフタをします。

3Dプリント品のネジ止めって設計するのが結構面倒なんですが、タッピングねじを使うと穴だけ作っておけばいいので超おすすめです!
基板の作成
ケースやパーツの位置と重ならないように、ユニバーサル基板に部品を配置していきます。

裏はこんな感じ。

ケーブルをケースに通して基板に接続します。

グラつかないようにM5Stack VoiceS3Rの下にスペーサーを置きます。

本体のフタは一度閉めると開けるのが大変なので、一旦ここまでできたらプログラムの動作確認をしましょう。
プログラム
プログラムは GitHub にアップロードしました。設定が必要な箇所は以下の部分です。
// 基本設定
#define PLAY_SOUND true // ウインカーの音を再生する
#define USE_HAZARD true // 本体ボタンをハザードにするM5Stack VoiceS3Rでウィンカーのサウンドを鳴らしたい場合は PLAY_SOUND をtrueにします。
USE_HAZARDをtrueにすると、M5Stackの本体のボタンでハザードランプが点滅します。ETS2で別の機能に割り当てたい場合はfalseにします(例えばトレーラーの切り離しなど)。M5Stackの本体のボタンもゲームで使用可能です。
動作確認
M5Stackにプログラムを書き込んだらプログラムの動作確認をします。ウィンカーのレバーを倒してLEDが光るか。シリアルコンソールに認識したスイッチの情報が出るので、それぞれが期待通りになるか確認します。

もし向きが逆だった場合はプログラムのGPIO番号を入れ替えましょう。大丈夫そうならフタをします。

フタはカチッと嵌め込むタイプなので、外すときは隙間にマイナスドライバーを入れると開けられます。
ハンコンに固定する
ハンコンへの取り付けはアクリル両面テープを使うと便利です。厚みがあって弾力性があり、剥がしても跡が残らないスグレモノです。

本体の固定

ウィンカーレバーの固定

シフトの固定

余ったケーブルは本体に押し込んでおきました。
Windowsでペアリング
ここから先はETS2のコントローラーとして使う場合の設定です。
ペアリング
Windows 11の設定のBluetoothとデバイス>デバイス「デバイスの追加」>Bluetoothを選択すると “ETS2 Turnsignal Switch” が出てくるのでペアリングします。

電源を入れるとすぐにペアリングモードに入ります。ボタン操作は不要です。
動作チェック
Windows 11の設定のBluetoothとデバイス>デバイス>その他のデバイスとプリンターを開くと “ETS2 Turnsignal Switch” があるので、右クリックでゲームコントローラーの設定を選択します。

「8軸16ボタンデバイス」を選択してプロパティを押します。

スイッチを倒したり、ボタンを押して、ボタンのところのランプがつくことを確認します。ボタン12~16まで反応することを確認します。本体のボタン(ボタン12)については押したときに一瞬だけ押す仕様なので、押してもすぐに消えます。

ちなみにボタンの番号は、プログラムのこの部分で指定しています。
// ゲームパッドの割り当て
#define BTN_WINKER_LEFT BUTTON_16
#define BTN_WINKER_RIGHT BUTTON_15
#define BTN_GEAR_FORWARD BUTTON_14
#define BTN_GEAR_BACK BUTTON_13
#define BTN_TRAILER_SW BUTTON_12これを変えれば任意のボタン番号に変えられます。
ETS2の設定
次はETS2を起動してコントローラーの設定画面を開きます。
ゲーム内の設定
コントローラーのプルダウンメニューから「8軸16ボタンデバイス」を追加します。

画面をスクロールして、オートマチックギアボックスのドライブとリバースを、今回作成したシフトのスイッチに割り当てます。これはトランスミッションの設定をリアルオートマチックにしている場合の設定です。

キー&ボタンの設定画面を開き、左ウィンカーと右ウィンカーを、今回作成したウインカーのスイッチに割り当てます。ウインカーは倒しっぱなしではなく、レバーを倒したらすぐに戻してください。

ただし、この設定だと正常に操作できません。この設定はボタン操作を想定したもので、今回使用したスイッチのように、ずっとONのままになっている入力装置では正常に機能しません。
設定ファイルの編集
EST2を終了したら、設定ファイルをテキストディターで編集します。設定ファイルがあるフォルダを開きます。
例: C:\Users\ユーザー\Documents\Euro Truck Simulator 2\steam_profiles\xxxx複数のプロフィールを作成した場合はフォルダが分かれているので、変更したいプロフィールのフォルダを開きます。どれかわからない場合は一番日付が新しいのをひらくとよいでしょう。controls.sii というファイルを探し、編集する前にファイルをバックアップしておきます。
controls.siiをメモ帳などで開き、mix lblinkerで検索して以下のような行を見つけます。
config_lines[411]: "mix lblinker `keyboard.lbracket?0 | joy3.b15?0 | semantical.lblinker?0`"
config_lines[412]: "mix lblinkerh `semantical.lblinkerh?0`"
config_lines[413]: "mix rblinker `keyboard.rbracket?0 | joy3.b16?0 | semantical.rblinker?0`"
config_lines[414]: "mix rblinkerh `semantical.rblinkerh?0`"この例では joy3.b15?0 と joy3.b16?0 が今回追加したボタン(スイッチ)です。実際の値は人によって異なるので読み替えてください。このボタンの割り当てを lblinker から lblinkerh の方へ移動します。rblinker についても同様です。
以下が変更例です。”|” の区切りを忘れずに。編集したら保存して閉じます。
config_lines[411]: "mix lblinker `keyboard.lbracket?0 | semantical.lblinker?0`"
config_lines[412]: "mix lblinkerh `joy3.b15?0 | semantical.lblinkerh?0`"
config_lines[413]: "mix rblinker `keyboard.rbracket?0 | semantical.rblinker?0`"
config_lines[414]: "mix rblinkerh `joy3.b16?0 | semantical.rblinkerh?0`"lblinkerh の h はHOLDされているボタン、という意味ですかね?? 前はこんな設定をした記憶はなかったのですが、仕様が変わったんでしょうか。それとも別の場所に設定項目があるのかわかりませんが、とりあえずこれで使えるようになるはずです。
ゲームを起動
これでETS2を起動すれば、レバーでウィンカーの操作ができるようになるはずです。
ちなみにウィンカーは自動的にオフにならないので、手動で元に戻す必要があります。慣れれば自然にできるようになります。普通の車はハンドルを元に戻すと自動的にウィンカーレバーが戻りますが、今回作成したレバーはただくっつけただけなので、もちろんハンドル操作とは連動していません。
ETS2の設定に「ウインカーを自動で消灯」という設定がありますが、これはオフにしてください。この設定をオンにすれば確かに自動的にウィンカーはオフになりますが、レバーは傾いたままです。最初はめんどくさいと思うかもしれませんがすぐ慣れます。
それでは快適な配送ライフを楽しんでください!
カスタマイズ
サウンドを変更したい場合
ウィンカーのカチッカチッって音を変更したい場合は、サウンドファイルを用意します。ONのときとOFFの時の2種類の音声が必要です。Audacityのようなサウンドエディターでそれぞれの音を取り出し、WAV形式のファイルで保存します。

次はWAVファイルをソースコード化します。Lang-shipさんのWAV変換ツールを使うと便利です。

2つ作成したら変数名をwav_onとwav_offにして、sound_data1.hとsound_data2.hに保存します。最後にサンプリングレートと音の周期を設定します。
uint32_t SAMPLE_RATE = 48000; // サンプリングレート
uint32_t INTERVAL_MS = 341; // オンの音とオフの音の周期音の周期とは、カッチン、カッチンという音の鳴る間隔です。単位はmsです。
余談
そういえば、今までずっとあったプログラムのバグが取れました。PCとBLEでペアリングして接続状態になっているとき、特定のUnity製のゲームが落ちる問題がありました。
これが問題のプログラム。
void setup() {
bleGamepad.begin();
}そして、こちらが修正版。
BleGamepadConfiguration config;
void setup() {
config.setButtonCount(16);
config.setHatSwitchCount(0);
config.setWhichAxes(true,true,true,true,true,true,true,true);
bleGamepad.begin(&config);
}setHatSwitchCount(0) を設定してあげないと一部のUnity製ゲームが落ちるようです。Timberbornをはじめ、いろいろなゲームでおきます。どっちかっていうとUnityのバグなんですが、まさかこれが原因とは気づかないですよね。