HOME >> 鉄道模型自動運転システム > 卓上レイアウトで楽しもう 自動運転 その7の3
自動運転 その7の2のレイアウトでは運行状態を紹介しましたが、今回はその運行パターンとプログラムを紹介しましょう。、
■ 1編成前進走行の運行モデルの検討
幾つかの走行パターンを組み合わせて運行パターンを構成しました。 その組み合わせを下の表に示します。 そして、その走行パターンを実施する場合の、給電条件、ポイントの制御、さらにその区切りを検知するためのセンサ信号について、一覧表にまとめてみました。
最初にポイント駆動の作動チェックを兼ねて、ON/OFF操作を入れていますが、作動不良の早期発見にもなります。 また、中間チェックも無駄の様ですが、一つの安心感なのです。 こうして検討した結果を Step としてまとめ、プログラムに記述して行けばプログラムが完成するのです。 シーケンス制御のフローチャートですね。
このチャートをもとに、Arduino のスケッチに落し込む場合の注意として、Arduino のI/Oと周辺機器の関係付け、および信号レベルを整理しておく必要があります。 そして、センサ系は負論理で構成していますので、スタンバイ時は HIGH で、信号がONの場合は LOW になる事や、ポイント駆動は定位状態はLOW で反位はHIGHで制御することに注意しましょう。 さらに、ここでは給電はフィーダーを差込んだ側から見て、左方向に進む場合には“左”と示しており、FE1L_PINをON させます。 左方向に進む場合はその逆です。
こうして作成したスケッチを下に示します。 ポイントを操作する場合には、確実な作動を確保するために、時間遅れを挿入しています。
また、最終的にはプログラム実行時にその動きをチェックし、ポイント配線の方向や給電フィーダーの配線方向をチェックします。 もし、逆であれば、ユニットの配線を入れ替えれば簡単に適応できます。
// Takujo-7-1 // 2019.12.1 #define SEN1_PIN 19 #define SEN2_PIN 18 #define SEN3_PIN 17 #define SEN4_PIN 16 #define PWM_PIN 5 #define FE1R_PIN 3 #define FE1L_PIN 4 #define FE2R_PIN 6 #define FE2L_PIN 7 #define POINT1_PIN 8 #define POINT2_PIN 9 #define POINT3_PIN 10 #define POINT4_PIN 11 #define OPE_PIN 12 void setup() { pinMode(SEN1_PIN,INPUT); pinMode(SEN2_PIN,INPUT); pinMode(SEN3_PIN,INPUT); pinMode(SEN4_PIN,INPUT); pinMode(PWM_PIN,OUTPUT); pinMode(FE1R_PIN,OUTPUT); pinMode(FE1L_PIN,OUTPUT); pinMode(FE2R_PIN,OUTPUT); pinMode(FE2L_PIN,OUTPUT); pinMode(POINT1_PIN,OUTPUT); pinMode(POINT2_PIN,OUTPUT); pinMode(POINT3_PIN,OUTPUT); pinMode(POINT4_PIN,OUTPUT); pinMode(OPE_PIN,INPUT); Serial.begin(9600); } void loop() { int sen1; int sen2; int sen3; int sen4; int ope; int spe; digitalWrite(POINT1_PIN,HIGH); delay(500); digitalWrite(POINT2_PIN,HIGH); delay(500); digitalWrite(POINT3_PIN,HIGH); delay(500); digitalWrite(POINT4_PIN,HIGH); delay(500); digitalWrite(POINT1_PIN,LOW); delay(1000); digitalWrite(POINT2_PIN,LOW); delay(1000); digitalWrite(POINT3_PIN,LOW); delay(1000); digitalWrite(POINT4_PIN,LOW); delay(1000); digitalWrite(FE1L_PIN,LOW); digitalWrite(FE1R_PIN,LOW); digitalWrite(FE2L_PIN,LOW); digitalWrite(FE2R_PIN,LOW); analogWrite(PWM_PIN,0); ope = digitalRead(OPE_PIN); while (ope == HIGH) { //運行スイッチを待つ ope = digitalRead(OPE_PIN) ; delay(50); } digitalWrite(FE1L_PIN,HIGH); digitalWrite(FE2L_PIN,HIGH); for(spe=0;spe<256;spe++){ analogWrite(PWM_PIN,spe); delay(5); } sen3 = digitalRead(SEN3_PIN); while (sen3 == HIGH) { sen3 = digitalRead(SEN3_PIN); delay(5); } sen1 = digitalRead(SEN1_PIN); while (sen1 == HIGH) { sen1 = digitalRead(SEN1_PIN); delay(5); } digitalWrite(FE2L_PIN,LOW); digitalWrite(POINT1_PIN,HIGH); delay(500); digitalWrite(POINT4_PIN,HIGH); delay(500); digitalWrite(FE2R_PIN,HIGH);
sen4 = digitalRead(SEN4_PIN); while (sen4 == HIGH) { sen4 = digitalRead(SEN4_PIN); delay(5); } sen3 = digitalRead(SEN3_PIN); while (sen3 == HIGH) { sen3 = digitalRead(SEN3_PIN); delay(5); } digitalWrite(FE1L_PIN,LOW); digitalWrite(POINT2_PIN,HIGH); delay(500); digitalWrite(POINT1_PIN,LOW); delay(1000); digitalWrite(POINT3_PIN,HIGH); delay(50); sen4 = digitalRead(SEN4_PIN); while (sen4 == HIGH) { sen4 = digitalRead(SEN4_PIN); delay(5); } digitalWrite(FE1R_PIN,HIGH); delay(50); sen2 = digitalRead(SEN2_PIN); while (sen2 == HIGH) { sen2 = digitalRead(SEN2_PIN); delay(5); } digitalWrite(POINT2_PIN,LOW); delay(1000); sen1 = digitalRead(SEN1_PIN); while (sen1 == HIGH) { sen1 = digitalRead(SEN1_PIN); delay(5); } for(spe=255;spe>-1;spe--){ analogWrite(PWM_PIN, spe); delay(5); } delay(3000); digitalWrite(FE1R_PIN,HIGH); digitalWrite(POINT4_PIN,LOW); delay(1000); digitalWrite(POINT3_PIN,LOW); delay(1000); for(spe=0;spe<256;spe++){ analogWrite(PWM_PIN,spe); delay(5); } sen3 = digitalRead(SEN3_PIN); while (sen3 == HIGH) { sen3 = digitalRead(SEN3_PIN); delay(5); } sen1 = digitalRead(SEN1_PIN); while (sen1 == HIGH) { sen1 = digitalRead(SEN1_PIN); delay(5); } digitalWrite(POINT3_PIN,HIGH); delay(500); digitalWrite(FE2R_PIN,LOW); digitalWrite(POINT2_PIN,HIGH); delay(500); digitalWrite(FE2L_PIN,HIGH); sen2 = digitalRead(SEN2_PIN); while (sen2 == HIGH) { sen2 = digitalRead(SEN2_PIN); delay(5); } sen3 = digitalRead(SEN3_PIN); while (sen3 == HIGH) { sen3 = digitalRead(SEN3_PIN); delay(5); } digitalWrite(FE1R_PIN,LOW); digitalWrite(POINT3_PIN,LOW); delay(1000); digitalWrite(POINT2_PIN,LOW); delay(1000); digitalWrite(FE1L_PIN,HIGH); sen1 = digitalRead(SEN1_PIN); while (sen1 == HIGH) { sen1 = digitalRead(SEN1_PIN); delay(1); } for(spe=255;spe>-1;spe--){ analogWrite(PWM_PIN, spe); delay(5); } delay(3000); }
次に紹介する動画は、KATO のC12を使ってS系客車を牽引させたものです。 このようなミニレイアウトには持ってこいのモデルですね。
いくつかのトラブルがありましたが、無事に運行できようになりました。 組合せを変えたり2列車での運行などの検討も面白そうですね。 次回は、ハードについて報告することにします。
2019/12/3 作成