電車でGOマスコンで鉄道模型を運転できる液晶付パワーパックを作った

半年くらいずっと開発していた電車でGOコントローラ対応のパワーパックがついに完成しました。
電車でGOコントローラのプラグを直接接続してマスコン鉄道模型を運転できます。


動画でも紹介しているのでぜひご覧ください。

youtu.be

基本仕様


基本的な仕様は以下の通りです。

  • PWM制御
  • 12V / 2A出力
  • 常点灯対応
  • USB端子、プレステ端子装備で計3種類のコントローラーの直接接続に対応
  • 2.2インチTFT液晶を装備、スピードメーター風の出力計とマスコン位置表示
  • デュアルコアCPUでPWMパルスをミリ秒単位で制御することで低速安定性向上
  • コントローラなしで通常のボリューム式PWMパワーパックとしても使用可能

スマホスタンドを使って本物の運転台のように運転することができます。

対応コントローラー

以下の3種類の電車でGOコントローラーに対応しています。

・瑞起 Nintendo Switch用ワンハンドルコントローラー
・プレステ用 ツーハンドルコントローラー SLPH-00051
・プレステ用 ワンハンドルコントローラー TCPP-20001

旅情編用や新幹線用など、他のプレステ2用の電車でGOコントローラーも対応できたらいいな、
とは思っているんですがいかんせん中古相場が高いので手を出せないでいます・・・

表面 操作部


スイッチは電源と正転/逆転切り替え、つまみは上が常点灯出力、下が加速倍率の設定つまみです。
加速倍率のつまみは通常のボリューム式パワーパックとして使う時は出力つまみになります。

画面表示


メイン画面ではマスコン位置とスピードメーター風の出力計が表示されています。
メーターは0km/hで常点灯出力値、120km/hで最大出力(設定で制限可)になります。



コントローラ側のボタンで設定画面を開くことができ、細かい設定項目を変更できるようになっています。

背面 端子類

右側にプレステ端子とUSB端子があり、ここに電車でGOコントローラを接続します。
両方同時に接続することができ、使いたいコントローラ上のボタン長押しで切り替えができます。

左側は電源のDCジャックとレール出力用のユーロブロックのレセプタクルです。

自作系のパワーパックではスピーカー用のプッシュターミナルが使用されることがほとんどですが、個人的にはユーロブロックが最強だと思っています。

プラグ接続で簡単に抜き差しができ、プラグの作成は配線をむき出しにしてドライバーでねじ止めするだけです。
ただしレセプタクルが基板に半田付けして使う前提なので設計が大変というのはあります。

ハードウェア

自分で設計したメイン基板の他に液晶とUSBの2つのモジュール基板を使っており、それぞれピンヘッダで接続する3層構造になっています。

マイコン
マイコン秋月電子で売っているESP32-WROOM-32Eを使用しました。
初めての表面実装半田付けだったんですが、端子間隔1.27mmと広めなので結構すぐ慣れて簡単にできるようになりました。

・モータードライバIC
モータードライバは秋月電子で売っているTB67H450モータドライバモジュールを使用しました。

・液晶パネル
液晶パネルはAmazonで売っているMSP2202の互換品と思われるものを使用しました。
Lovyan GFXが対応しているILI9341という液晶ドライバを使用しているそうです(この辺よくわかってない)

・USBホスト基板
USBホスト基板はM5Stack用のUSBホストモジュールから基板だけ取り出して使用しました。

・専用ケース
専用のアクリルケースを「はざいや」で作成していただきました。

WEB上で専用の設計フォームを使えるので電子工作の専用ケースを作りたい方にもおすすめです。
縦横高さ好きなサイズで制作でき、穴あけや面取りなどさまざま加工に対応しています。

元々フィギュアなどのディスプレイ用の透明アクリルケース向けだと思うので、
ケースと蓋を固定するには四隅に3.2mmの穴を開けてもらい両雌ネジの六角スペーサーを使いました。
底面側にねじ止め式のゴム足をつけると便利です。

今回のケースは加工費込みで5500円ほどでした。
安くはないですがこの価格で1個からの小ロットでオーダーメイドケースを作ってくれるのは破格だと思います。

基板設計


基板の設計にはKicadを使用しました。
かなり頑張って設計したのでスイッチやコネクタ、ボリュームも含めて基板上に全てのパーツを配置し面倒な配線作業をなくすことができました。

ソフトウェア

開発言語はArduinoでライブラリは

  • USB Host Library Rev. 2.0(USBホストモジュール)
  • Psx(プレステコントローラー読み取り)
  • Lovyan GFX(液晶パネル描画)

などを使用させていただきました。
こういう便利なライブラリがたくさんあるのはArduino環境の強みですね。

ただコントローラから送られた値の取得はライブラリがやってくれますが、
それが実際マスコンのどの位置に相当するのか、どのボタンを押したのか、というのは自力で解析する必要がありました。

速度計算

内部の動作的にはあらかじめ決められた加速度と経過時間で速度を計算し、それをPWMのデューティ比に変換して出力を制御しています。
速度域毎の加速特性はニコニコ大百科にあったE231系のものを参考にさせてもらいました。

こんな感じの加速曲線になっています(実際は直線だけど・・・)

これはマスコンノッチが最大の時のグラフなのでノッチを下げれば加速度も落ちるようになっています。

カスタムPWM制御

低速時のトルク強化のためソフトウェアでPWMを細かく制御しています。

PWM周波数は20000Hzなのですが、PWM制御では周波数が高くなるほど低速域でのトルクが落ちるようです。
周波数を50Hzなど極端に下げればトルクは上がりますが、可聴音域に入るのでノイズがでてしまいます。

それを解消するためにいろいろなブログを漁ったりして、解決法を探りました。

最終的に行き着いた解決法は以下の記事で紹介されていたKATOのハイパーDXのパルスを真似することでした。
note.com

こちらの記事によればハイパーDXではパルスの幅が細かく変化しているようです。

通常のPWMパワーパックはデューティ比がつまみの位置に応じた値で一定になっています。

これを保持デューティ比と最低デューティ比の二つを設定して

保持デューティ比→減少→最低デューティ比→上昇→保持デューティ比→減少・・・

という動作を高速で繰り返すようにしました。
最低デューティ比を上げると平均のデューティ比が上がるので車両の速度が上がります。
詳しい動作と考察については別記事で解説しようと思います。

この動作のためには高速かつ一定間隔で常時デューティ比をいじる必要があります。
タイマー割り込みで制御してもよかったんですが、USBやプレステコントローラとの通信中に割り込み発生しても大丈夫なものかよくわからなかったのと、
ESP32はデュアルコアになっていてWiFiBluetoothを使わなければ1コアしか使われないため、余っているコアで常にデューティ比を制御するようにしました。

結果としてうまくいっているようで超低速から走り出してくれます。