HOME >> 鉄道模型自動運転システム > 卓上レイアウトで楽しもう 自動運転 その4
今回は、自動運転その3に信号機を追加し、発車と停車時に速度制御を追加しました。 また、レイアウト上にストラクチャを置い飾ってみました。
■ レイアウトの構成
線路配置は自動運転 その3と同じです。 電気回路は、回路図のように信号機の回路を配線しました。 また、レイアウト上には、手持ちのストラクチャを置い飾ってみました。 中央には12月が近い事もあって「LED電子工作集 > D-5 クリスマスツリー用イルミネーション」で作ったイルミネーションを置いてみました。
ゴチャゴチャとランダムに置いてしまって、意味のない配置ですが、賑やかの方がいいでしょう。 何しろ配線もゴチャゴチャですから!
システムの説明の前に、作動状態をご覧ください。
// Takujo-3-4
// 2019.11.16
#define SEN1_PIN 2
#define SEN2_PIN 3
#define SOKUDO_PIN 5
#define MIGI_PIN 6
#define HIDARI_PIN 7
#define POINT2_PIN 8
#define POINT1_PIN 9
#define SGAG_PIN 11
#define SGAY_PIN 12
#define SGAR_PIN 13
#define SGBG_PIN 17
#define SGBY_PIN 18
#define SGBR_PIN 19
void setup()
{
pinMode(SEN1_PIN,INPUT);
pinMode(SEN2_PIN,INPUT);
pinMode(SOKUDO_PIN,OUTPUT);
pinMode(MIGI_PIN,OUTPUT);
pinMode(HIDARI_PIN,OUTPUT);
pinMode(POINT1_PIN,OUTPUT);
pinMode(POINT2_PIN,OUTPUT);
pinMode(SGAG_PIN,OUTPUT);
pinMode(SGAY_PIN,OUTPUT);
pinMode(SGAR_PIN,OUTPUT);
pinMode(SGBG_PIN,OUTPUT);
pinMode(SGBY_PIN,OUTPUT);
pinMode(SGBR_PIN,OUTPUT);
digitalWrite(SGAG_PIN,HIGH);
digitalWrite(SGAY_PIN,HIGH);
digitalWrite(SGAR_PIN,LOW);
digitalWrite(SGBG_PIN,HIGH);
digitalWrite(SGBY_PIN,HIGH);
digitalWrite(SGBR_PIN,LOW);
Serial.begin(9600);
}
void loop() {
int sen1;
int sen2;
int i;
digitalWrite(SGAR_PIN,HIGH);
digitalWrite(SGAG_PIN,LOW);
digitalWrite(POINT1_PIN, LOW);
delay(50);
digitalWrite(POINT2_PIN, LOW);
digitalWrite(MIGI_PIN, HIGH);
digitalWrite(HIDARI_PIN, LOW);
for(i=0;i<256;i++){
analogWrite(SOKUDO_PIN, i);
delay(5);
}
Serial.println("1");
delay(2000);
digitalWrite(SGAG_PIN,HIGH);
digitalWrite(SGAY_PIN,LOW);
sen2 = digitalRead(SEN2_PIN) ;
while (sen2 == HIGH) {
sen2 = digitalRead(SEN2_PIN) ;
}
digitalWrite(SGAY_PIN,HIGH);
digitalWrite(SGAR_PIN,LOW);
for(i=255;i>-1;i--){
analogWrite(SOKUDO_PIN, i);
delay(5);
}
digitalWrite(MIGI_PIN, LOW);
delay(3000);
Serial.println("2");
digitalWrite(SGBR_PIN,HIGH);
digitalWrite(SGBG_PIN,LOW);
digitalWrite(POINT1_PIN, HIGH);
delay(50);
digitalWrite(POINT2_PIN, HIGH);
digitalWrite(MIGI_PIN, LOW);
digitalWrite(HIDARI_PIN, HIGH);
for(i=0;i<256;i++){
analogWrite(SOKUDO_PIN, i);
delay(5);
}
Serial.println("3");
delay(2000);
digitalWrite(SGBG_PIN,HIGH);
digitalWrite(SGBY_PIN,LOW);
sen1 = digitalRead(SEN1_PIN) ;
while (sen1 == HIGH) {
sen1 = digitalRead(SEN1_PIN) ;
}
digitalWrite(SGBY_PIN,HIGH);
digitalWrite(SGBR_PIN,LOW);
for(i=255;i>-1;i--){
analogWrite(SOKUDO_PIN,i);
delay(5);
}
digitalWrite(HIDARI_PIN, LOW);
delay(3000);
Serial.println("4");
}
■ システムの説明
回路構成は先回の状態から信号機回路を接続してもので、回路図とおりの配線が実施されている状態です。 なお、今回の信号機の回路では、ポートをシンク(電流を吸い込む状態)で使用しています。 許容される電流値は max 40mA とのことですので、それ以上の電流を流すと、Arduino は死んでしまいます。このため、電流制限用の抵抗の使用を忘れないようにしましょう。
下の写真は、追加設定した左側の信号機です。
また、次の写真は右側に信号機です。 この鉄道にはどういう訳か入場信号きが設置されていません。
また、配線もグチャグチャになって来ました。
次に、この回路構成をもとに作成したプログラムについて紹介します。
最初に、ポート名とポート番号の関係を #define 命令で記述しておきます。 次に初期設定にて、ポートの入出力を pinMode 命令で指定します。 入力ポートはセンサ信号の二つのポーだけで、後は全て出力ポートです。
そして、信号機を赤色が点灯するように設定しておきます。 TOMIXの信号機を使っていますので、点灯させるにはポートをLOW に設定すると電流が流れて点灯します。 出力ポートをシンク状態にして点灯させるのです。
また、センサのON/OFF状態を示すsen1 とsen2 と、給電電圧のヂューティ比を示す i を整数として定義しておきます。
最初に、手前のホームの信号を青に、ポイントを操作します。 ここで確実にポイントが作動するように二つのポイント指令の間には、少し時間を空けておきます。 つぎに、右周りに進行するようにモータドライバの方向を指定しておいて、速度調整ピンのヂューティ比を上げて行きます。
ヂューティ比は 0 から 255 まで、5msec 毎に上げて行くようにしています。 これで電車は発車して右周りに走行していきますが、2秒後に信号を黄色に変えて、一周してくるのを待ちます。
駅に到着するとセンサが感知しますので、信号を赤に変えて減速させます。 停止すると3秒間待って、今度は同じ動作を反対側のホームに適応させます。 今度は左回に電車は走行して元のホーム戻ってくると、プログラム最初に戻って同じ動作を繰り返します。
なお、要所要素には、Serial.println("X"); の命令を入れていますが、プログラムの進行状態をチェックするために挿入しているもので、作動が完全に確認できれば消してしまっても影響ない命令です。
■ 作動状態
事前に各要素のチェックと修正を実施していましたので、プログラム(Arduino ではスケッチと呼ぶ)は一発で問題無く動きました。 これは気持ちがいいですね。 やはりステップ・バイ・ステップの確認が必要です。 動作状態の動画を紹介します。
単純なシーケンスですが、ぼんやりと眺めているのも楽しいですね。
でも、何度か遊んでいるうちに、ミスを発見しました。 最初のスタートが逆走から始まってしまい止まらないのです。 原因はすぐに分かりました。 制御系電源と動力系電源の投入時期の違いによるものです。 一般的にこのようなシステムではモータ等の暴走を抑えるため、最初に制御系の電源を投入してから、動力系の電源を投入しますが、今回のプログラムでは制御系のプログラムが先に進んでしまい、動力系の電源を投入した時点では、制御プログラムがどこにいるかで様子が異なってくるのです。
これは、初期設定の問題ですが、今回はその配慮が不足していたのです。 「登山鉄道 新自動運転システム 構想」(2018/2/22)ように、運行開始ボタンの設定は正解だったのです。 対策として、この様なスイッチを設けるか、あるいはプログラムの最初に3秒の待ち時間を入れるの改良が必要ですね。
また、手前のゴチャゴチャした配線が気になってきます。 ユニバーサルボードを使って固定回路を作れば、もっとコンパクトに、かつテーブルの下などに隠すことが出来ますが、一通り遊んだ後は解体するのが今回の習わしですので目をつぶることにしましょう。
次回のテーマとしては、レイアウトを少し変形したり、あるいは他のマイコンを使うなどの方法も考えているのですが、一晩おいてから次の遊び方を考えることにします。
2019/11/17 作成