// MEGA-4-2
// 2021.3.12
// Arduino MEGA 2560 を使用する。
// PWM周波数を31kHzにする。
#define UNTEN 55
#define STRT 54
#define VOL A2
#define GEN A3
#define CH1 58
#define CH2 59
#define CH3 60
#define CH4 61
#define SEN1 63
#define SEN2 64
#define SEN3 68
#define SEN4 69
#define SEN5 66
#define F11 12
#define F12 11
#define F21 10
#define F22 9
#define F31 5
#define F32 4
#define F41 3
#define F42 2
#define F51 41
#define F52 43
#define F12PWM 8
#define F3PWM 7
#define F4PWM 6
#define P1 23
#define P2 25
#define P3 22
#define P4 24
#define P5 29
#define P6 31
#define S6SIN 38
#define S7SIN 44
#define BUZZ 47
int i;
int vol;
int gen;
void setup() {
pinMode(UNTEN,INPUT);
pinMode(STRT,INPUT);
pinMode(VOL,INPUT);
pinMode(GEN,INPUT);
pinMode(CH1,INPUT);
pinMode(CH2,INPUT);
pinMode(CH3,INPUT);
pinMode(CH4,INPUT);
pinMode(SEN1,INPUT);
pinMode(SEN2,INPUT);
pinMode(SEN3,INPUT);
pinMode(SEN4,INPUT);
pinMode(SEN5,INPUT);
pinMode(F11,OUTPUT);
pinMode(F12,OUTPUT);
pinMode(F21,OUTPUT);
pinMode(F22,OUTPUT);
pinMode(F31,OUTPUT);
pinMode(F32,OUTPUT);
pinMode(F41,OUTPUT);
pinMode(F42,OUTPUT);
pinMode(F51,OUTPUT);
pinMode(F52,OUTPUT);
pinMode(F12PWM,OUTPUT);
pinMode(F3PWM,OUTPUT);
pinMode(F4PWM,OUTPUT);
pinMode(P1,OUTPUT);
pinMode(P2,OUTPUT);
pinMode(P3,OUTPUT);
pinMode(P4,OUTPUT);
pinMode(P5,OUTPUT);
pinMode(P6,OUTPUT);
pinMode(S6SIN,OUTPUT);
pinMode(S7SIN,OUTPUT);
pinMode(BUZZ,OUTPUT);
TCCR4B = (TCCR4B & 0b11111000) | 0x01; //Timer4を31KHzにする
analogWrite(F12PWM,0);
analogWrite(F3PWM,0);
analogWrite(F4PWM,0);
digitalWrite(F11,LOW);
digitalWrite(F12,LOW);
digitalWrite(F21,LOW);
digitalWrite(F22,LOW);
digitalWrite(F31,LOW);
digitalWrite(F32,LOW);
digitalWrite(F41,LOW);
digitalWrite(F42,LOW);
digitalWrite(F51,LOW);
digitalWrite(F52,LOW);
digitalWrite(S6SIN,HIGH);
digitalWrite(S7SIN,HIGH);
delay(500);
digitalWrite(P1,HIGH);
delay(500);
digitalWrite(P2,HIGH);
delay(500);
digitalWrite(P3,HIGH);
delay(500);
digitalWrite(P4,HIGH);
delay(500);
digitalWrite(P5,HIGH);
delay(500);
digitalWrite(P6,HIGH);
delay(500);
digitalWrite(P1,LOW);
delay(500);
digitalWrite(P2,LOW);
delay(500);
digitalWrite(P3,LOW);
delay(500);
digitalWrite(P4,LOW);
delay(500);
digitalWrite(P5,LOW);
delay(500);
digitalWrite(P6,LOW);
delay(500);
}
void mode1(){ //1番ホーム外周右回り
vol=analogRead(VOL)/4;
delay(10);
analogWrite(F3PWM,vol*40/255);
digitalWrite(F31,HIGH); //室内灯点灯
digitalWrite(S6SIN,LOW);
tone(BUZZ,523,1500);
delay(2000);
for(i=40;i<255;i++){ //加速する
vol=analogRead(VOL)/4;
delay(10);
analogWrite(F3PWM,vol*i/255);
}
analogWrite(F12PWM,vol);
digitalWrite(F11,HIGH);
digitalWrite(F21,HIGH);
digitalWrite(F51,HIGH);
while (digitalRead(SEN4) == HIGH) { //S4を待つ
vol=analogRead(VOL)/4;
delay(10);
analogWrite(F12PWM,vol);
}
digitalWrite(S6SIN,HIGH); //駅の信号を赤にする
while (digitalRead(SEN1) == HIGH) { //S1を待つ
vol=analogRead(VOL)/4;
delay(10);
analogWrite(F12PWM,vol);
analogWrite(F3PWM,vol);
}
for(i=255;i>20;i--){ //減速
gen=analogRead(GEN)/12;
vol=analogRead(VOL)/4;
delay(5);
analogWrite(F3PWM,vol*i/255);
delay(gen);
}
delay(1000);
digitalWrite(F11,LOW); //停車
digitalWrite(F21,LOW);
digitalWrite(F31,LOW);
digitalWrite(F51,LOW);
return;
}
void mode2() { //2番ホーム外周左回
digitalWrite(P1,HIGH);
delay(500);
digitalWrite(P2,HIGH);
delay(500);
vol=analogRead(VOL)/4;
delay(10);
analogWrite(F4PWM,vol*40/255);
digitalWrite(F42,HIGH); //室内灯点灯
digitalWrite(S7SIN,LOW);
tone(BUZZ,523,1500);
delay(2000);
for(i=40;i<255;i++){ //加速する
vol=analogRead(VOL)/4;
delay(10);
analogWrite(F4PWM,vol*i/255);
}
analogWrite(F12PWM,vol);
digitalWrite(F12,HIGH);
digitalWrite(F22,HIGH);
digitalWrite(F52,HIGH);
while (digitalRead(SEN3) == HIGH) { //S3を待つ
vol=analogRead(VOL)/4;
delay(10);
analogWrite(F12PWM,vol);
analogWrite(F4PWM,vol);
}
digitalWrite(S7SIN,HIGH); //駅の信号を赤にする
while (digitalRead(SEN2) == HIGH) { //S2を待つ
vol=analogRead(VOL)/4;
delay(10);
analogWrite(F12PWM,vol);
analogWrite(F4PWM,vol);
}
for(i=255;i>20;i--){ //減速
gen=analogRead(GEN)/12;
vol=analogRead(VOL)/4;
delay(5);
analogWrite(F4PWM,vol*i/255);
delay(gen);
}
delay(1000);
digitalWrite(F12,LOW); //停車
digitalWrite(F22,LOW);
digitalWrite(F42,LOW);
digitalWrite(F52,LOW);
delay(500);
digitalWrite(P1,LOW);
delay(500);
digitalWrite(P2,LOW);
delay(500);
return;
}
void mode3(){ //1番ホームから外周右回りし、リバースして2番ホームへ
vol=analogRead(VOL)/4;
delay(10);
analogWrite(F3PWM,vol*40/255); //室内灯点灯
digitalWrite(F31,HIGH);
digitalWrite(S6SIN,LOW);
tone(BUZZ,523,1500);
delay(2000);
for(i=40;i<255;i++){ //加速する
vol=analogRead(VOL)/4;
delay(10);
analogWrite(F3PWM,vol*i/255);
}
analogWrite(F12PWM,vol);
digitalWrite(F11,HIGH);
digitalWrite(F51,HIGH);
while (digitalRead(SEN5) == HIGH) { //S5を待つ
vol=analogRead(VOL)/4;
delay(10);
analogWrite(F12PWM,vol);
}
digitalWrite(P5,HIGH);
delay(500);
digitalWrite(F11,LOW);
digitalWrite(F12,HIGH);
digitalWrite(P3,HIGH);
delay(500);
digitalWrite(P1,HIGH);
analogWrite(F4PWM,vol);
digitalWrite(F42,HIGH);
digitalWrite(S7SIN,HIGH); //駅の信号を赤にする
delay(500);
while (digitalRead(SEN2) == HIGH) { //S2を待つ
vol=analogRead(VOL)/4;
delay(10);
analogWrite(F4PWM,vol);
}
for(i=255;i>20;i--){ //減速
gen=analogRead(GEN)/12;
vol=analogRead(VOL)/4;
delay(5);
analogWrite(F4PWM,vol*i/255);
delay(gen);
}
delay(1000);
digitalWrite(F42,LOW); //停車
digitalWrite(F12,LOW);
digitalWrite(F31,LOW);
digitalWrite(F51,LOW);
digitalWrite(P1,LOW);
delay(500);
digitalWrite(P3,LOW);
delay(500);
digitalWrite(P5,LOW);
return;
}
void mode4(){ //2番ホームから内周を左回りし、リバースして1番ホームへ
digitalWrite(P2,HIGH);
delay(500);
vol=analogRead(VOL)/4;
delay(10);
analogWrite(F4PWM,vol*40/255); //室内灯点灯
digitalWrite(F42,HIGH);
digitalWrite(S7SIN,LOW);
tone(BUZZ,523,1500);
delay(2000);
for(i=40;i<255;i++){ //加速する
vol=analogRead(VOL)/4;
delay(10);
analogWrite(F4PWM,vol*i/255);
}
analogWrite(F12PWM,vol);
digitalWrite(F22,HIGH);
digitalWrite(F52,HIGH);
while (digitalRead(SEN5) == HIGH) { //S5を待つ
vol=analogRead(VOL)/4;
delay(10);
analogWrite(F4PWM,vol);
analogWrite(F12PWM,vol);
}
digitalWrite(P6,HIGH); //リバース設定
delay(500);
digitalWrite(F22,LOW);
digitalWrite(F21,HIGH);
digitalWrite(P4,HIGH);
delay(500);
digitalWrite(P2,LOW);
analogWrite(F3PWM,vol);
digitalWrite(F31,HIGH);
digitalWrite(S6SIN,HIGH);
delay(500);
while (digitalRead(SEN1) == HIGH) { //S1を待つ
vol=analogRead(VOL)/4;
delay(10);
analogWrite(F12PWM,vol);
analogWrite(F3PWM,vol);
}
for(i=255;i>20;i--){ //減速
gen=analogRead(GEN)/12;
vol=analogRead(VOL)/4;
delay(5);
analogWrite(F3PWM,vol*i/255);
delay(gen);
}
delay(1000);
digitalWrite(F31,LOW); //停車
digitalWrite(F21,LOW);
digitalWrite(F52,LOW);
digitalWrite(P2,LOW);
delay(500);
digitalWrite(P4,LOW);
delay(500);
digitalWrite(P6,LOW);
return;
}
void mode5(){ //1番ホームから右回り出発して、左回りリバースして2番ホームの列車と交代
digitalWrite(P1,LOW);
delay(500);
digitalWrite(P3,HIGH);
delay(500);
digitalWrite(P5,HIGH);
delay(500);
vol=analogRead(VOL)/4;
delay(10);
analogWrite(F3PWM,vol*40/255); //室内灯点灯
digitalWrite(F31,HIGH);
digitalWrite(S6SIN,LOW);
tone(BUZZ,523,1500);
delay(2000);
for(i=40;i<255;i++){ //加速する
vol=analogRead(VOL)/4;
delay(10);
analogWrite(F3PWM,vol*i/255);
}
analogWrite(F12PWM,vol);
digitalWrite(F11,HIGH);
digitalWrite(F52,HIGH);
while (digitalRead(SEN5) == HIGH) { //S5を待つ
vol=analogRead(VOL)/4;
delay(10);
analogWrite(F12PWM,vol);
analogWrite(F3PWM,vol);
}
digitalWrite(F11,LOW);
digitalWrite(F12,HIGH);
digitalWrite(P3,LOW);
delay(500);
digitalWrite(P1,HIGH);
delay(500);
digitalWrite(P5,LOW);
delay(500);
while (digitalRead(SEN3) == HIGH) { //S3を待つ
vol=analogRead(VOL)/4;
delay(10);
analogWrite(F12PWM,vol);
}
analogWrite(F4PWM,vol*50/255);
digitalWrite(F42,HIGH);
digitalWrite(F22,HIGH);
digitalWrite(S7SIN,LOW);
for(i=50;i<255;i++){ //2番線の列車を発車を発車させる
vol=analogRead(VOL)/4;
delay(5);
analogWrite(F4PWM,vol*i/255);
}
digitalWrite(P2,HIGH); //リバース設定
delay(500);
digitalWrite(P4,HIGH);
delay(500);
digitalWrite(P6,HIGH);
delay(500);
digitalWrite(F42,HIGH);
digitalWrite(F52,LOW);
digitalWrite(F51,HIGH);
digitalWrite(S7SIN,HIGH);
while (digitalRead(SEN2) == HIGH) { //S2を待つ
vol=analogRead(VOL)/4;
delay(10);
analogWrite(F12PWM,vol);
analogWrite(F4PWM,vol);
}
for(i=255;i>20;i--){ //減速
gen=analogRead(GEN)/12;
vol=analogRead(VOL)/4;
delay(5);
analogWrite(F4PWM,vol*i/255);
delay(gen);
}
while (digitalRead(SEN4) == HIGH) { //S4を待つ
vol=analogRead(VOL)/4;
delay(10);
analogWrite(F12PWM,vol);
}
digitalWrite(S6SIN,HIGH);
digitalWrite(F22,LOW);
digitalWrite(F21,HIGH);
digitalWrite(P4,LOW);
delay(500);
digitalWrite(P2,LOW);
delay(500);
while (digitalRead(SEN1) == HIGH) { //S1を待つ
vol=analogRead(VOL)/4;
delay(10);
analogWrite(F12PWM,vol);
analogWrite(F3PWM,vol);
}
for(i=255;i>20;i--){ //減速
gen=analogRead(GEN)/12;
vol=analogRead(VOL)/4;
delay(5);
analogWrite(F3PWM,vol*i/255);
delay(gen);
}
delay(1000);
digitalWrite(F12,LOW);
digitalWrite(F21,LOW);
digitalWrite(F31,LOW);
digitalWrite(F42,LOW);
digitalWrite(F51,LOW);
digitalWrite(P1,LOW);
delay(500);
digitalWrite(P6,LOW);
delay(500);
return;
}
void mode6(){ //1番ホームから右回り出発して、2番ホームへ
vol=analogRead(VOL)/4;
delay(10);
analogWrite(F3PWM,vol*40/255); //室内灯点灯
digitalWrite(F31,HIGH);
digitalWrite(S6SIN,LOW);
tone(BUZZ,523,1500);
delay(2000);
for(i=40;i<255;i++){ //加速する
vol=analogRead(VOL)/4;
delay(10);
analogWrite(F3PWM,vol*i/255);
}
analogWrite(F12PWM,vol);
digitalWrite(F11,HIGH);
digitalWrite(F51,HIGH);
while (digitalRead(SEN5) == HIGH) { //S5を待つ
vol=analogRead(VOL)/4;
delay(10);
analogWrite(F12PWM,vol);
analogWrite(F3PWM,vol);
}
digitalWrite(P1,HIGH);
delay(500);
digitalWrite(P2,HIGH);
delay(500);
digitalWrite(F21,HIGH);
analogWrite(F4PWM,vol*40/255); //室内灯点灯
digitalWrite(F41,HIGH);
tone(BUZZ,523,1500);
delay(2000);
for(i=40;i<255;i++){ //加速する
vol=analogRead(VOL)/4;
delay(10);
analogWrite(F4PWM,vol*i/255);
}
delay(1000);
while (digitalRead(SEN2) == HIGH) { //S2を待つ
vol=analogRead(VOL)/4;
delay(10);
analogWrite(F12PWM,vol);
analogWrite(F4PWM,vol);
}
for(i=255;i>20;i--){ //減速
gen=analogRead(GEN)/12;
vol=analogRead(VOL)/4;
delay(5);
analogWrite(F4PWM,vol*i/255);
delay(gen);
}
digitalWrite(P1,LOW);
delay(500);
digitalWrite(P2,LOW);
delay(500);
while (digitalRead(SEN1) == HIGH) { //S1を待つ
vol=analogRead(VOL)/4;
delay(10);
analogWrite(F12PWM,vol);
analogWrite(F3PWM,vol);
}
while (digitalRead(SEN4) == HIGH) { //もう一周させてS4を待つ
vol=analogRead(VOL)/4;
delay(10);
analogWrite(F12PWM,vol);
analogWrite(F3PWM,vol);
}
digitalWrite(S6SIN,HIGH);
while (digitalRead(SEN1) == HIGH) { //S1を待つ
vol=analogRead(VOL)/4;
delay(10);
analogWrite(F12PWM,vol);
analogWrite(F3PWM,vol);
}
for(i=255;i>20;i--){ //減速
gen=analogRead(GEN)/12;
vol=analogRead(VOL)/4;
delay(5);
analogWrite(F3PWM,vol*i/255);
delay(gen);
}
delay(1000);
digitalWrite(F11,LOW);
digitalWrite(F21,LOW);
digitalWrite(F31,LOW);
digitalWrite(F41,LOW);
digitalWrite(F51,LOW);
return;
}
void loop(){
if (digitalRead(UNTEN)==HIGH || digitalRead(STRT)==HIGH){
if (digitalRead(CH1)==HIGH && digitalRead(CH2)==HIGH && digitalRead(CH3)==HIGH && digitalRead(CH4)==HIGH){
if (digitalRead(SEN1)==HIGH){ //ホームに列車はいるか?負論理
tone(BUZZ,262,1000);
delay(1500);
tone(BUZZ,262,1000);
delay(1500);
tone(BUZZ,262,1000);
delay(1500);
} else {
mode1();
}
} else if (digitalRead(CH1)==LOW && digitalRead(CH2)==HIGH && digitalRead(CH3)==HIGH && digitalRead(CH4)==HIGH){
if (digitalRead(SEN2)==HIGH){ //ホームに列車はいるか?負論理
tone(BUZZ,262,1000);
delay(1500);
tone(BUZZ,262,1000);
delay(1500);
tone(BUZZ,262,1000);
delay(1500);
} else {
mode2();
}
} else if (digitalRead(CH1)==HIGH && digitalRead(CH2)==LOW && digitalRead(CH3)==HIGH && digitalRead(CH4)==HIGH){
if (digitalRead(SEN1)==HIGH && digitalRead(SEN2)==LOW){ //ホームに列車はいるか?負論理
tone(BUZZ,262,1000);
delay(1500);
tone(BUZZ,262,1000);
delay(1500);
tone(BUZZ,262,1000);
delay(1500);
} else {
mode3();
}
} else if (digitalRead(CH1)==LOW && digitalRead(CH2)==LOW && digitalRead(CH3)==HIGH && digitalRead(CH4)==HIGH){
if (digitalRead(SEN2)==HIGH && digitalRead(SEN1)==LOW){ //ホームに列車はいるか?負論理
tone(BUZZ,262,1000);
delay(1500);
tone(BUZZ,262,1000);
delay(1500);
tone(BUZZ,262,1000);
delay(1500);
} else {
mode4();
}
} else if (digitalRead(CH1)==HIGH && digitalRead(CH2)==HIGH && digitalRead(CH3)==LOW && digitalRead(CH4)==HIGH){
if (digitalRead(SEN1)==HIGH){ //1番ホームに列車が居ない場合は中止。負論理
tone(BUZZ,262,1000);
delay(1500);
tone(BUZZ,262,1000);
delay(1500);
tone(BUZZ,262,1000);
delay(1500);
} else if (digitalRead(SEN2)==HIGH){ //2番ホームに列車が居ない場合は中止。負論理
tone(BUZZ,262,1000);
delay(1500);
tone(BUZZ,262,1000);
delay(1500);
tone(BUZZ,262,1000);
delay(1500);
} else {
mode5();
}
} else if (digitalRead(CH1)==LOW && digitalRead(CH2)==HIGH && digitalRead(CH3)==LOW && digitalRead(CH4)==HIGH){
if (digitalRead(SEN1)==HIGH){ //1番ホームに列車が居ない場合は中止。負論理
tone(BUZZ,262,1000);
delay(1500);
tone(BUZZ,262,1000);
delay(1500);
tone(BUZZ,262,1000);
delay(1500);
} else if (digitalRead(SEN2)==HIGH){ //2番ホームに列車が居ない場合は中止。負論理
tone(BUZZ,262,1000);
delay(1500);
tone(BUZZ,262,1000);
delay(1500);
tone(BUZZ,262,1000);
delay(1500);
} else {
mode6();
}
} else if (digitalRead(CH1)==HIGH && digitalRead(CH2)==LOW && digitalRead(CH3)==LOW && digitalRead(CH4)==HIGH){
if (digitalRead(SEN1)==HIGH){ //ホームに列車はいるか?負論理
tone(BUZZ,262,1000);
delay(1500);
tone(BUZZ,262,1000);
delay(1500);
tone(BUZZ,262,1000);
delay(1500);
} else {
mode1();
mode3();
mode2();
mode4();
}
} else if (digitalRead(CH1)==LOW && digitalRead(CH2)==LOW && digitalRead(CH3)==LOW && digitalRead(CH4)==HIGH){
if (digitalRead(SEN1)==HIGH){ //1番ホームに列車が居ない場合は中止。負論理
tone(BUZZ,262,1000);
delay(1500);
tone(BUZZ,262,1000);
delay(1500);
tone(BUZZ,262,1000);
delay(1500);
} else if (digitalRead(SEN2)==HIGH){ //2番ホームに列車が居ない場合は中止。負論理
tone(BUZZ,262,1000);
delay(1500);
tone(BUZZ,262,1000);
delay(1500);
tone(BUZZ,262,1000);
delay(1500);
} else {
mode5();
mode6();
}
}
delay (1000);
}
}