7M4MON, 2021.Dec.1
『電車でGO!コントローラでTSマスコンをエミュレートしてBVEで遊ぶ。』 でArduinoから電車でGO!のコントローラを扱うことができましたので、次は、電車でGO!のコントローラを使って、鉄道模型を運転します。
- 電源は DC12V のACアダプタを使用します。Nゲージなら 2A程度の電流容量があれば十分です。
- フィーダーはネジ式の端子台に接続します。モータードライバICにサーマルシャットダウン機能がありますが、念の為、ポリヒューズを付けています。
- モータードライバは 東芝 TA8428K です。気休めに放熱板をつけていて、Nゲージならほんのり温くなる程度です。
- マイコンは Arduino Nano (ATMega328P) です。プログラム開発は、Arduino IDEを使用しています。
- 表示部はTM1637 の4桁7セグLED と WS2812B の 12LEDリングです。コントローラーの懐中時計用の窪みに設置できるように、直径50mm程度のリングをチョイスしました。表示器は時計にもなります。
- 走行スピードはPWMで制御していますが、Duty比が小さいと走り出しません。そのため、最小Duty比を設定するための半固定抵抗と設定モード切替スイッチを設けています。設定可能範囲は0~25%です。電気機関車はDuty比を上げる傾向にあるなど、車両により若干異なるようです。
- 各ボタン(Start,Select,A,B,C)を押すと、警笛音や発車メロディ等、5種類の音がなります。再生はJQ6500のGPIO制御ですが、マイコンポートでのHi-Zはうまく動作しなかったので、各ポートにデジトラ(RN1201)を追加しています。
- 他、接続図などは下ブロック図のようになっています。
- 電車でGOコントローラの制御部は、『電車でGO!コントローラでTSマスコンをエミュレートしてBVEで遊ぶ。』 からの流用です。Gyokimae氏の自作ライブラリを使用し、KeKe115sさんの電GOコントローラーをArduinoで読み取るサンプルを参考にしています。
- 20ms毎にタイマ割り込みが入り、コントローラの状態を読み出し、処理を行います。すべての処理をこのタイマ割り込みで行い、メインループに処理はありません。
- マスコンハンドルの位置を読みだしたら、位置に応じて加減速計算処理を行い、速度を決定します。 この計算は2048段階で行っていますが、analogWrite は256段階ですのでPWMセット時には3ビット右シフトをしています。
- 20msのタイマ割り込みは表示や計算で処理を分割し、5つに分散させています。そのため、実際にPWMのパルス幅を更新するのは100ms毎です。
- 電源投入時はレバーサの状態は「切」になっています。スタートボタン長押しで 中立→前進→中立→後退 に状態遷移します。
- セレクトボタン長押しでパワーパックモードへ切り替えます。パワーパックモードはマスコン位置1~5でダイレクトにスピードを決定します。
- PWMのセット範囲は0~255ですが、表示範囲は0~100なので、255→100となるように、固定小数点演算をしています。具体的には、255*201÷2^9=51255÷512=100(小数点以下切り捨て)です。
- リングLEDはスピードの段階を8色で表現しています。満了したら白にして、次のLEDを点灯して色を変えていきます。速度ゼロのときは赤となります。
- リングLEDの最下はレバーサの状態を表し、停止(赤)/前進(緑)/後退(青)となっています。