路線バス運転シミュレータ開発記

OMSIを使って路線バスの運転シミュレータを製作しています。備忘録的にゆるーく書いていきたいと思いますので、お付き合いいただければ幸いです。

入出力部分の基本設計

以前(OMSIの導入 - 路線バス運転シミュレータ開発記)で述べた通り、OMSIを操作する場合、G27のようなハンドルコントローラーを使用すればキーボードやマウスによる操作と異なり、より実感的な操作ができますが、これでも以下のような問題点があります。

 ■操作の種類が多い(メインスイッチON/OFFやワイパーの速度変更・間欠動作の有無まである)ため、G27についているボタンだけではすべての操作を割り当てることができず、キーボードを操作しなければいけない場面が多いこと

 

この問題は、カスタマイズした運転台を製作するときに障害になります。仮にハンドルコントローラーのスイッチから接点を引き出して実車のランプスイッチやワイパースイッチなどを動作させようとしたくても、そもそもハンドルコントローラー側のスイッチが足りなくてそういった操作を割り当てられないのであれば意味がありません。幸いこの問題についてはUSBのジョイパッドなどを増設してOMSIで割り当てることのできるボタン数を増やせば解決するかと思います。
なお、キーボードから接点を取り出すやり方はお勧めできません。確かに入力接点がたくさんあってコストパフォーマンスは良いのですが、同時に複数のキーがONになった場合の処理を考えなければならなかったり、単にトグルスイッチのON/OFFで制御するのが難しく回路の工夫が必要になる場合があるからです。
さらに、キーボードはシステムと直結しているので、別のソフトウェアにフォーカスが移った時に誤動作する可能性があり、そういったことを考慮するとやらないほうが無難です。それでもキーボードを使いたいという場合は、通常のキーボードとOMSI入力用のキーボードをUSB切替器のようなもので切り替えて使用するような実装方法が考えられます。

 

■入力はできても出力ができないためバスの挙動にあわせて各種メーター類を動作させることができない

 

実はこれが最大の問題で、実物の運転台のパネルを使用するとなると、OMSIの動きと同期して運転台パネル上の表示灯やメーター類を動作させなければなりません。しかし、G27をはじめとするハンドルコントローラーには元々こういった機能がないのでランプやメーターの接点だけ取り出して動かすというような単純な方法は使えません。出力は入力の時のように簡単にはいかないというわけです。

 そこでどうするかというと、OMSIにはプラグインDLLを開発して機能を拡張できるようなつくりになっているので、これを使ってOMSIと外部デバイスとの間の通信を行うようなプログラムを開発すれば解決しそうです。以前、BVEで鉄道の運転シミュレータを開発したときはこのような方法をとって外部デバイスと通信していました。

ただ、Youtubeなどで海外での例を見ていくうちに、実はKOMSIというこうした役割をもったプラグインDLLがすでに開発されており、大抵の場合これを使用しているようでした。
このKOMSIというプラグインですが、下の図のようにArduinoボードが接続され、あらかじめ起動してあるKOMSI ServerとOMSIの起動時に呼び出されるKOMSI Clientとが通信してOMSIの内部情報(例えばウインカーが点灯しているなど)を出力するような仕組みになっていて、KOMSI ServerとArduinoボード間はCOMポートを使ったシリアル通信を使っています。
ここで、表示灯や計器とArduinoとの間に制御回路を設ける理由は、Arduinoの出力が0Vから5Vで行われるのに対し、一般的なバスの表示灯では24Vで点灯しますし、計器類も種類によって稼働電圧や変動幅が違うからです。つまり、Arduinoから出力された電圧の変動信号を実際に表示灯や計器が動作するように電圧を変換してあげなければならないのです。また、仮に5Vの電圧で動作したとしてもArduinoのようなマイコン基板ではLEDのような小さな負荷を動作させるのが限界で、大きな電流を流すような使い方をすると基板の中のチップが故障してしまいますので、基板に直接負荷をつなぐのはよくありません。

f:id:poplar1930:20210609150039p:plain

システム概念図

以下の動画はKOMSIによる実装例です。

youtu.be

KOMSIの良いところは計器情報を除いて、OMSIの情報を決め打ちで特定の番号のピンに出力するようなつくりになっておらず、別に用意されているツールで何番のピンには何の情報を出力するというような割り当てが柔軟にできることです。
これにより、車両データの修正や運転台側のハードウェア仕様が変わってもある程度対応できるかと思います。

ところで、KOMSIに似たものにSimHubというものがありますが、こちらは様々なゲームに対応しているので汎用性は高いですが、OMSIには部分的にしか対応していないのでOMSIに特化したコントローラーを開発するのであればKOMSIを使うのがベストかと思います。
ただ、SimHubはKOMSIと違い、Euro Truck Simulatorにも対応しているので、運転台コントローラーをバスとトラックで共通化してKOMSIとSimHubで切り替えて使えるようにすれば、OMSIとEuro Truck Simulator両方で使えるようなものにすることも可能だと思います。
ちなみに今回は汎用性の高いものではなく、OMSIで使用することを前提とし、バスの運転台を忠実に再現することを目的としていますので、この部分については触れないことにします。

 なお、KOMSIのプラグインDLLは以下のサイトからダウンロードすることができます。http://pulle76.de/