HOME >> 鉄道模型自動運転システム > 卓上レイアウトで楽しもう 自動運転 その6
今回は、リバース線のあるレイアウトを実験してみました。 リバース線のスムースな制御と速度設定ボリュームによる走行速度の制御法について実験しました。
■ 自動運転その6の検討
最初にリバース線の有るレイアウトとして下に示すような単純なレイアウトを考えました。 リバース線の反対側は、二つのホームのある駅として、ここから出発して、また同じホームに戻ってくる誠に単純なレイアウトと運行です。 でも、意外と手こずりましたよ。
レイアウトパターンを決めたら、その運行パターンを決めて、センサの位置と制御に合わせたギャップの位置を検討します。
TOMIXのポイントは、完全選択式ですから、手動で運転する場合にはギャップを考える必要はありません。 操作としては、電車がリバース線に入ってくると、一度電車を停止させ、ポイントの切替と進行方向の変更の操作を実施しまう。 自動運転の場合にはこれを自動で実施し、さらに停車させることなくスムースに走らせようと目論んでいるのです。
このため、リバース線に入ってきたことを検知するセンサが必要となります。 上のイラストのセンサ3です。 次に、センサ3で電車が来た事を検知すると、ポイントを切り替えて進行方向を逆にする操作を入れるのですが、この操作は同時に、かつ一瞬にして実施しなければ電車はギクシャクしてしまうはずです。 実験していないのでその様子は分かりません。 電車のモータの慣性に期待することも可能なのですが、制御を勉強しようとする目的には反します。 そこで、制御によってスムースな運行を実現できることを考えてみましょう。
とはいっても、いたって単純に考えました。 まず、ポイントが切り替わってもそのまま走行出来るようにリバース線上に給電ポイントを設け、その先のポイントとの間にギャップを設けておきます。 すると、ポイントが切り替わっても電気的には衝突しませし、電車はそのまま走行します。 そして、この間に本線上の進行方向を逆転させておきます。 電車がギャップ地点に到達した時点では、線路の極性は合致していますので、そのままスムースに運行していきます。 こうして、リバース線上に、給電ポイントとギャップを設置しました。
運行パターンを考えておきます。
そして、ポイント2を切替てホーム2の電車を同じように運行させればよいのです。 こうして交互の電車を走らせることが出来るのです。 ここで、本線上の給電は、加速と減速、および正逆の進行方向制御が必要です。 しかし、リバース線上の給電ポイントでは、右回り方向しか運行させないようにすると、進行方向の制御は不要となります。 ただし、速度制御は本線と同じにしておく必要があります。 減速加速の制御も不要なのです。 意外と単純な制御で実施出来そうですね。
■ ハードの工作
線路構成は。上右の写真のとおりですが、リバース線を結ぶ部分は、C140-30°とC246-15°の曲線を使用して45°の角度としています。 これは8字の走行時の交差が90°になる事を踏まえて構成したものです。 また、TCSセンサレールは2個しか持っていませんでしたので、ワンタッチセンサをひとつ使用しています。 下左の写真。 さらに、ホーム部分とリバース部分の干渉をさけるために、本線のカーブはC177-60°曲線を使用しています。
.
この設置した線路の状態を確認するために、制御系の配線が未完の状態ですが、パワーユニットを使用して電車を走らせ、線路構成に異常がないことを確認しました。 右上の写真。
電気回路では、新たに速度設定用の可変抵抗や、運開始のスイッチを設置することにしたため、操作盤を工作しました。 今後の回路の発展を考えて、スイッチやボリュームを追加できるように余裕のある操作盤としています。 回路構成は、最終的には右のような回路にしています。
最初は5V電源として、Arduino の5Vを使用していましたが、原因不明の不具合対策のひとつとして、Arduinoの負担軽減の(?)のために、定電圧ユニットから取るようにしました。 これは、マイコンをPICマイコンに変更しても、各ユニットの電源としてそのまま対応出来る事も考慮したからです。
速度設定ボリュームは、当初は10KΩを使用していましたが、これも原因不明の不具合対策として、登山電車のシステムと同じ、1KΩに変更しています。
運行開始スイッチは、10KΩを使ったプルダウン回路として、D13ポートに入力させていました。 しかし、これも原因不明の不具合対策として、D10ポートに変更しています。 このため、D10、D11、そしてD12ポートを使っての信号機の設置を諦めてしまいました。 なんでも、D13ポートは特殊な使い方をしているポートの様で、素人は使わない方が良いとの事、逃げの一手だそうです。
下の写真は、不具合値対策で四苦八苦している時の状態です。
■ テスト走行の結果
いろいろな不具合がありました。
原因が分からないため、あれこれトライしながらなんとか安定して運行出来るようになりました。 速度調整が不安定なのは、電車のモータ特性とのマッチングだったり、ボリューム電圧のA/D変換の不安定さだったのではないかと想定します。 このため、アナログ系の入力をそれ以外の用途に使うことを止め、5V電源を独立させたりしていますが、的を得た対策だったかどうかは不明です。
■ やっと仕上がったシステム
修正したレイアウトを下に示す。 車止めへの激突を避けるために線路端を伸ばしています。 センサの作動確保が第一なのでこれは意味がないのですが、気休めですね。 Bトレの車両が軽いため、ワンタッチセンサの作動では反応しないとみて、重りを追加しましましたがさほど改善されませんでした。 動力車の重さが頼りです。
操作盤も、余分な事は止めて配線重視の工作としました。
センサの処理回路とポイント駆動回路は、先回のものをそのまま使用し操作盤に固定しました。 Arduinoも固定しています。 給電制御のための回路は、小型のブレッドボードを使って配線しています。
// Takujo-6-2
// 2019.11.23
#define SEN1_PIN 2
#define SEN2_PIN 3
#define SEN3_PIN 4
#define PWM_PIN 5
#define FE1R_PIN 6
#define FE1L_PIN 7
#define POINT1_PIN 8
#define POINT2_PIN 9
#define OPE_PIN 10
void setup()
{
pinMode(SEN1_PIN,INPUT);
pinMode(SEN2_PIN,INPUT);
pinMode(SEN3_PIN,INPUT);
pinMode(PWM_PIN,OUTPUT);
pinMode(FE1R_PIN,OUTPUT);
pinMode(FE1L_PIN,OUTPUT);
pinMode(POINT1_PIN,OUTPUT);
pinMode(POINT2_PIN,OUTPUT);
pinMode(OPE_PIN,INPUT);
Serial.begin(9600);
}
void loop() {
int sen1;
int sen2;
int sen3;
int ope;
int spe;
int i;
ope = digitalRead(OPE_PIN);
while (ope == HIGH) { //運行スイッチを待つ
ope = digitalRead(OPE_PIN) ;
delay(50);
}
// 電車1の運行
digitalWrite(POINT1_PIN,LOW); //ホーム1
delay(50);
digitalWrite(POINT2_PIN,LOW);
digitalWrite(FE1R_PIN,HIGH); //右回り
digitalWrite(FE1L_PIN,LOW);
for(i=0;i<256;i++){ //発車する
spe = analogRead(0);
delay(1);
spe = i*spe/4;
analogWrite(PWM_PIN,spe);
delay(2);
}
sen3 = digitalRead(SEN3_PIN);
while (sen3 == HIGH) {
spe = analogRead(0);
delay(1);
spe = i*spe/4;
analogWrite(PWM_PIN,spe);
sen3 = digitalRead(SEN3_PIN);
delay(2);
}
digitalWrite(POINT2_PIN,HIGH); //リバース切り替え
delay(50);
digitalWrite(FE1R_PIN,LOW); //左回り
digitalWrite(FE1L_PIN,HIGH);
sen1 = digitalRead(SEN1_PIN);
while (sen1 == HIGH) { //ホーム到着?
spe = analogRead(0);
delay(1);
spe = i*spe/4;
analogWrite(PWM_PIN,spe);
sen1 = digitalRead(SEN1_PIN);
delay(2);
}
for(i=255;i>-1;i--){ //減速して停車
spe = analogRead(0);
delay(1);
spe = i*spe/4;
analogWrite(PWM_PIN,spe);
delay(2);
}
delay(3000);
// 電車2の運行
digitalWrite(POINT1_PIN,HIGH); //ホーム2
delay(50);
digitalWrite(POINT2_PIN,LOW);
digitalWrite(FE1R_PIN,HIGH); //右回り
digitalWrite(FE1L_PIN,LOW);
for(i=0;i<256;i++){ //発車する
spe = analogRead(1);
delay(1);
spe = i*spe/4;
analogWrite(PWM_PIN,spe);
delay(2);
}
sen3 = digitalRead(SEN3_PIN);
while (sen3 == HIGH) {
spe = analogRead(1);
delay(1);
spe = i*spe/4;
analogWrite(PWM_PIN,spe);
sen3 = digitalRead(SEN3_PIN);
delay(2);
}
digitalWrite(POINT2_PIN,HIGH); //リバース切り替え
delay(50);
digitalWrite(FE1R_PIN,LOW); //左回り
digitalWrite(FE1L_PIN,HIGH);
sen2 = digitalRead(SEN2_PIN);
while (sen2 == HIGH) { //ホーム到着?
spe = analogRead(1);
delay(1);
spe = i*spe/4;
analogWrite(PWM_PIN,spe);
sen2 = digitalRead(SEN2_PIN);
delay(2);
}
for(i=255;i>-1;i--){ //減速して停車
spe = analogRead(1);
delay(1);
spe = i*spe/4;
analogWrite(PWM_PIN,spe);
delay(2);
} delay(3000);
}
下左の写真は、5V定電圧ユニットと電源系の配線盤です。 配電盤は操作盤側に固定しても良かったですが、回路的に今後も修正されるものと想定してフリーの状態にしています。
操作盤は穴だらけですが、今後の発展を期待しましょう。 また、コンセントは、Arduino 用の9V用と、DC12V用のACアダプタを使用しています。
■ 制御プログラム
スケッチ(制御プログラム)を右に示す。 最初は登山鉄道のシステムを参考にして、センサ検知ループの遅延時間として、delay(50) を使っていました。 しかし、今回のセンサでは検知時間が短いため、この遅延時間内に補足されずに通過してしまう現象が発生し、不具合となった原因の一つと推定しました。 そこで、遅延時間として、delay(2) にしてサイクルを回すことにしました。
また、A/D 変換の時間が 100μ秒ぐらいかかるとのことでしたので、次のステップに移る前に delay(1) を入れています。
電車1と電車2の違いは、停車するホームの違いですから、ポイント1の切替と到着センサの違いだけで後は全く同じです。
■ Bトレでの運行
Bトレの4両編成の電車を使って走らせてみました。 同じような制御内容ですが、停車位置が下の写真のように明らかに違います。 Bトレ車両の重さと、センサのセンシング能力の違いではないかと推定しています。 センサ処理回路のLEDの点灯状態を見ていても、その違いは明らかです。
走行状態の動画を紹介しましょう。
■ 登山電車車両を走らせる
Bトレ車両との走行ぐらいの比較のために、小型の電車であるTOMIXmp箱根登山鉄道ベルニナ号を持ち出して走行させました。
ここでも、新旧二つのタイプの走行能力の差が明確であり、新しいモデルは走行が非常にスムースです。 旧型はまだギクショクした動きであり、PWM制御のチューニングが必要かも知れません。
■ まとめ
リバース線路でのスムースな運行方法は確認できましたが、PWM制御にはまだ問題ですね。 Arduino のPWM周波数 980Hz は、制御サイクルでは言えば 1msec 相当ですから、delay(1) やdelay(2) では、干渉しまくりでうなりが生じている心配があります。 制御サイクルを延ばすとか、周波数を上げることなどを検討すべきかも知れません。
2019/11/24 作成