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

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

計器の制御

KOMSIとarduinoを使ってOMSIと計器を連動させる場合、インジケータの場合のようにピンアサインを自由に決められるわけではなく、あらかじめ決められたピンにサーボモーターを接続して計器の指針を動かすという形になります。
そのピンアサインはKOMSIに付属してきたinoファイルをIDEで開いてソースを見れば分かりますが、以下のようになっていたのでここにメモしておきます。

(3)空気圧計
(5)エンジン温度計(水温計とは別)
(6)水温計
(9)速度計
(10)油圧計
(11)燃料計
(12)エンジン回転計

これらは、arduinoにサーボ―モーターを接続して指針を直接動かす方法を前提としています。
そのためKOMSIに付属するinoファイルのソースに手を加えずにそのまま使いたい場合は、計器にサーボモーターを取り付けるなどの改造が必要になります。
一方、元の計器をなるべく生かしたい場合はソースを変更する必要があり、それぞれの方法について解説します。
今回の製作では空気圧計のみサーボモーターを使い、それ以外の計器についてはなるべくオリジナルの状態を保つようにしました。


サーボモーターを使う方法

サーボモーターはリンク先のものを使用しましたが、arduinoに接続するだけでOMSIと連携して使えるようになるので便利です。
メーターパネル内にうまく埋め込むことさえできれば、こちらの方法が簡単です。

(サーボモーター)安いのでおすすめです
https://www.amazon.co.jp/waves-SG90-%E3%82%B5%E3%83%BC%E3%83%9C-%E3%83%A2%E3%83%BC%E3%82%BF%E3%83%BC-180%C2%B0/dp/B08HCQ8HNW

このサーボモーターを使う場合は、赤を+5V、黄をアサインされている出力ピン、茶をGNDに接続すると動作します。
本当はモーターをマイコン基板に直接つなぐのは良くないのですが、今回は消費電流も小さく、かつ1台だけだったのでモータードライブ用の回路は省略しています。

f:id:poplar1930:20210829090153p:plain

 ■元の計器を活用する方法

元の計器をなるべく温存して動かしたい場合は、ソースの変更と回路の作成が必要になります。回路はインジケータランプの制御と同様、フォトカプラを使った方法を考えました。計器により特性が異なりますので場当たり的ではありますが、可変抵抗を接続して適宜調整してください。(OMSI側で最大値にしたときに、計器の方も最大値を示すように可変抵抗を調整すればOK)

回路に計器をつなぐときですが、計器がメーターパネルの基板と接続されていると他の部分に影響して具合が悪いので今回は計器とつながっている回路のパターンを削って計器だけメーターパネルの回路から独立させ、そこに直接つなぐような方法をとりました。

 f:id:poplar1930:20210829094238p:plain

ただし、エンジン回転計だけは別な回路にしています。

f:id:poplar1930:20210829095409p:plain

 回路は以上ですが、次にソースの変更も必要なのでIDEで"lights_and_servos.ino"を開きます。

 f:id:poplar1930:20210829101045p:plain

水温計を例にとると、Servo3関数に wasser.write(aktueller_wert); という記述があるのですが、これをコメントアウトして上記のようにanalogWrite(6,aktueller_wert); と一文追加します。これは何をやっているかというと、aktueller_wertというのがOMSIから渡された計器の値でwasser.write()を使ってサーボモーターを制御するためのパルス信号を割り当てられたピンから出力する処理を無効にして、aktueller_wertの値に応じて指定したピン(ここでは6番)から0-5Vのアナログ信号を出力する処理に変更しています。これにより、フォトカプラに流れる電流がパルスではなくアナログ的に変化するので、それにつないでいる計器も追随して動くというわけです。

それともう一点、ソースの先頭にwasser.attach()という記述があるのですが、これはサーボモーターの制御のために特定のピンを割り当てる処理なので、analogWrite()を使うときはコメントアウトします。

あとは、arduinoに書き込んで再起動すればOKです。 

 

計器関係は以上ですが、燃料計については動作が異なるので調査中です。速度計については現状、tone()を使って任意の周波数のパルスを出力して電気式の速度計を動かすようなつくりにしていますが、tone()で使える周波数には下限があり、低速(20km/h以下)での走行に対応できないため、この辺も検討中です。