HOME >> 鉄道模型工作室 > 新しいモニタ画面を作る その2
Processing を使った運転台コントローラを作るため、まず操作するモニタ画面から手を付け、スイッチやレバーの動きの動作を組込んだ。 今回は、取り込んだデータをもとに、走行させる鉄道模型の車速を計算し、さらに、給電制御用のPWMデューティ値の計算ロジックを検討した。
■ 車速の計算ロジック
参考にしたサンプルプログラムの解析は途中であきらめているので、自分独自のロジックで実行することにした。 これは、「マイコン式の運転操作台を作ろう 制御ロジック」(2021/4/17)にて曲がりなりにも実施した経験があったからである。
この時のロジックをそのまま応用しても良いが、今回は別の方法を検討した。 計算の基本部分は、実際の電気動力車が搭載している直巻き式直流モータの特性を模擬して、モータの回転数とトルク( ここでは車速と加減速度となるのだが)、その関係を双曲線特性になるように設定した。
計算する車速(スケールスピード)を v とし、加減速度を dv とすると、
加減速度: dv = a / ( v + b ) - c
として、係数 a、 b、 c をいろいろ変えて dv の値を計算しグラフに表示した。 その結果を下に示す。
この様な検討には EXCELのグラフは便利である。 三つの係数を代えると計算結果はすぐさまグラフにに示されるので、イメージ合わない場合は係数値を修正して行くのである。 さらに、計算結果をProcessing のプルグラムに書き込んで動きをみて最終的に判断した。 判断の基準となったポイントは、
この加減速度を dv を用いて車速 v は、プログラムの実行サイクル毎に、
車速: v = v + dv
を計算していく事になる。 その様子は、力行時の車速の上昇具合を見ながら設定するが、プログラムの最後に設けた delay() コマンドで最終調整すれば良いと考えている。
■ PWM制御のデューティ値の計算方法
計算された車速は、速度計上の針として表示するが、一方で制御マイコンである Arduino のPWM制御用としてデューティ値を出力する必要がある。 今回の場合、その値は、0〜99 までの整数を出力させる。 その理由は、PWMのキャリア周波数を 20kHz に設定している為である。 「Arduino Uno のPWMキャリア周波数を20kHzにする」(2020/4/4)を参照してください。
そこで、目的の車速になるようにデューティ値を計算すればよいのですが、ここで問題となるのが、動力車のモデル毎にその関係は千差万別なのです。 これは鉄道模型の宿命であり、モータ特性、減速ギヤ比、動輪直径、そして各部の摩擦や電圧降下などが影響しています。 DCCシステムのように走行中のモータ回転数を検出して速度を制御する方式では、車速を設定することができるのですが、如何せん、コントローラによる車速制御では無理な話なのです。
そこで、近似的に、走行させる動力車の特性を考慮して、それらしい電圧、即ちデューティ値を出力させることになります。 この動力特性については、今まで多くの実験をして来たので、データは豊富にあるのですが、ここでは幾つかのグループに分けて設定することにしました。 「新ATSに挑戦 多くの列車を走らせよう」(2019/2/11)を参考にして、「マイコン式の運転操作台を作ろう 制御ロジック」(2021/4/17)に示す方法を活用することにしました。
その後の検討結果、コアレスモータに於いても同様な処理が適応できることが分かったので、この内容も活用します。 何故なら、今回使用するモータドライバは、東芝製のTB6612 を使用しているため、コアレスモータでも、デューティ比と車速が直線的関係を保っているからです。 「モータドライバとPWM制御 まとめ」(2021/5/28)参照。
計算方法は、レンジレバーで設定したランクを読み取り、あらかじめ関係付けておいた係数を掛け合わせてデューティ値とした。 さらに、微調整レバーで読み取った値を成形した0〜100までのデータに 0.15 を掛けて修正値として、先に計算したデューティ値に加算した。 これは、動力車が走り始めるためのデューティ値となるように底上げするものである。 これはまた、常灯式コントローラ機能としても働くのである。
計算プロセスは、
//車速を計算する notch = vol1[0]; dv = a[notch]/(v+b[notch])-0.5; //加減速度を計算 v = v + dv; if (v<0){v=0;} if (v>250){v=250;} range = vol1[1]; //Duty値を求める dt = floor(c[range]*v/100); if (dt>99){dt=99;} dt = dt + floor(vol1[2]*0.15); //微調整
として一気に計算する。 レンジの係数は、int [ ] c = {64,56,48,40,32,24,16,8} として計算しているが、この係数は本来は小数点2ケタの値であるが、100倍して整数として扱っている。 また、係数 c は前記の加減速度の計算式で使用している c とは別物です。
■ 出力処理
必要な計算を終えたので、車速を計器に表示する事と、デューティ値をシリアル通信として発信する事を実施させます。 この処理は、
stroke(#FF0000); //速度計の針表示 strokeWeight(6); strokeCap(SQUARE); pos = floor(420+2*v); line(pos,142,pos,197); myPort.write(dt); //デューティ値を出力 delay(50);
として記述しました。 最後に delay(50) を記述して void draw() のサイクル時間を調整しています。
■ テスト走行の実施
まず、給電制御の機能のみで卓上レイアウトを使ってテスト走行を実施した。 その様子を下に示す。
今回は、信号機も追加したレイアウトとしているので、配置を変えている。 まず全体を右に 90°回転させ、プラットフォームが正面にきて、二つの信号機がみえるようにしている。
また、駅の周りの配置も少し変更している。
走行させた動力車は、KATO のC12で、12m級の客車を3両牽引させている。 マスコン、進行方向設定、緊急ブレーキ、レンジ設定、微調整など問題なく機能し、常灯機能もOKであった。 まずは、結果オーライである。
******************************************************************
次回は、ポイントと信号機の操作と、実際の制御機器との連携をはかることにしよう。
2021/9/24 作成