// 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);
  }
}