// Every-12-1
// 2020.11.27
// Arduino Nano Every を使用する。
// PWM周波数を15.7kHzにする。

#define  UNTEN 13
#define  VOL   A0
#define  GEN   A1
#define  S1SIN   17
#define  S2SIN   19
#define  SEN1  16
#define  SEN2  18
#define  SEN3  20
#define  SEN4  21
#define  F11  9
#define  F12  6
#define  F31  5
#define  F32  3
#define  P1  11
#define  P2  10
#define  P3  8
#define  P4  7

  int i;
  int sen1;
  int sen2;
  int sen3;
  int sen4;
  int vol;
  int unten;
  int gen;

void setup() {
  pinMode(UNTEN,INPUT);
  pinMode(VOL,INPUT);
  pinMode(GEN,INPUT);
  pinMode(SEN1,INPUT);
  pinMode(SEN2,INPUT);
  pinMode(SEN3,INPUT);
  pinMode(SEN4,INPUT);
  pinMode(F11,OUTPUT);
  pinMode(F12,OUTPUT);
  pinMode(F31,OUTPUT);
  pinMode(F32,OUTPUT);
  pinMode(S1SIN,OUTPUT);
  pinMode(S2SIN,OUTPUT);
  pinMode(P1,OUTPUT);
  pinMode(P2,OUTPUT);
  pinMode(P3,OUTPUT);
  pinMode(P4,OUTPUT);
  
  TCA0.SINGLE.CTRLA = 0b0101; //PWM周波数の変更
  
  analogWrite(F11,0);
  analogWrite(F12,0);
  analogWrite(F31,0);
  analogWrite(F32,0);
  digitalWrite(S1SIN,HIGH); //信号は赤
  digitalWrite(S2SIN,HIGH); //信号は赤
  digitalWrite(P1,HIGH);
  delay(8000);
  digitalWrite(P2,HIGH);
  delay(8000);
  digitalWrite(P3,HIGH);
  delay(8000);
  digitalWrite(P4,HIGH);
  delay(8000);
  digitalWrite(P1,LOW);
  delay(8000);
  digitalWrite(P2,LOW);
  delay(8000);
  digitalWrite(P3,LOW);
  delay(8000);
  digitalWrite(P4,LOW);
  delay(8000);

}

void loop() {
  unten = digitalRead(UNTEN);
  while (unten == LOW) {
    unten = digitalRead(UNTEN);
    analogWrite(F11,0);
    analogWrite(F12,0);
    analogWrite(F31,0);
    analogWrite(F32,0);
  }

//****** 右回り周回モード ************
  digitalWrite(S2SIN,LOW);  //信号を緑にする
  digitalWrite(P2,HIGH);    //P2を反位に
  delay(16000); 
  for(i=50;i<255;i++){      //加速する
    vol=analogRead(VOL)/4;
    delay(200);
    analogWrite(F11,vol*i/255);
    analogWrite(F31,vol*i/255);
  }

  sen3 = digitalRead(SEN3);  //S3を待つ
  while (sen3 == HIGH) {
    vol=analogRead(VOL)/4;
    delay(10);
    analogWrite(F11,vol);
    analogWrite(F31,vol);
    sen3 = digitalRead(SEN3);
  }
  digitalWrite(P2,LOW);       //P2を正位に
  delay(8000);
  
  sen4 = digitalRead(SEN4);  //S4を待つ
  while (sen4 == HIGH) {
    vol=analogRead(VOL)/4;
    delay(10);
    analogWrite(F11,vol);
    analogWrite(F31,vol);
    sen4 = digitalRead(SEN4);
  }
  
  sen3 = digitalRead(SEN3);  //S3を待つ
  while (sen3 == HIGH) {
    vol=analogRead(VOL)/4;
    delay(10);
    analogWrite(F11,vol);
    analogWrite(F31,vol);
    sen3 = digitalRead(SEN3);
  }
  digitalWrite(P1,HIGH);    //P1を反位に
  delay(8000);
  digitalWrite(S2SIN,HIGH);  //信号を赤にする

  sen1 = digitalRead(SEN1);
  while (sen1 == HIGH) {
    vol=analogRead(VOL)/4;
    delay(10);
    analogWrite(F11,vol);
    analogWrite(F31,vol);
    sen1 = digitalRead(SEN1);
  }  
  for(i=255;i>-1;i--){     //減速
    gen=analogRead(GEN)/3;
    vol=analogRead(VOL)/4;
    analogWrite(F11,vol*i/255);
    analogWrite(F31,vol*i/255);
    delay(gen);
  }
  analogWrite(F11,0);    //停車
  analogWrite(F31,0);    //停車
  delay(32000);
  
//****** 左回り交代モード ************
  digitalWrite(S1SIN,LOW);  //信号を緑にする
  digitalWrite(P1,HIGH);    //P1を反位に
  delay(8000);
  digitalWrite(P2,HIGH);    //P2を反位に
  delay(8000);
  digitalWrite(P3,HIGH);    //P3を反位に
  delay(8000);
  digitalWrite(P4,HIGH);    //P4を反位に
  delay(8000);

  for(i=50;i<255;i++){      //加速する
    vol=analogRead(VOL)/6;
    delay(200);
    analogWrite(F32,vol*i/255);
  }

  sen2 = digitalRead(SEN2);  //S2を待つ
  while (sen2 == HIGH) {
    vol=analogRead(VOL)/6;
    delay(10);
    analogWrite(F32,vol);
    sen2 = digitalRead(SEN2);
  }
  digitalWrite(S1SIN,HIGH);  //信号を赤にする
  for(i=255;i>-1;i--){       //減速
    gen=analogRead(GEN)/2;
    vol=analogRead(VOL)/6;
    analogWrite(F32,vol*i/255);
    delay(gen);
  }
  analogWrite(F32,0);      //停車
  digitalWrite(P1,LOW);
  delay(8000);
  digitalWrite(P2,LOW);
  delay(8000);
  digitalWrite(P3,LOW);
  delay(8000);
  digitalWrite(P4,LOW);
  delay(8000);

//****** 左回り周回モード ************
  digitalWrite(S1SIN,LOW);  //信号を緑にする
  digitalWrite(P1,HIGH);    //P1を反位に
  delay(16000); 
  for(i=50;i<255;i++){      //加速する
    vol=analogRead(VOL)/4;
    delay(200);
    analogWrite(F12,vol*i/255);
    analogWrite(F32,vol*i/255);
  }

  sen3 = digitalRead(SEN3);  //S3を待つ
  while (sen3 == HIGH) {
    vol=analogRead(VOL)/4;
    delay(10);
    analogWrite(F12,vol);
    analogWrite(F32,vol);
    sen3 = digitalRead(SEN3);
  }
  digitalWrite(P1,LOW);       //P1を正位に
  delay(8000);
  
  sen4 = digitalRead(SEN4);  //S4を待つ
  while (sen4 == HIGH) {
    vol=analogRead(VOL)/4;
    delay(10);
    analogWrite(F12,vol);
    analogWrite(F32,vol);
    sen4 = digitalRead(SEN4);
  }
  
  sen3 = digitalRead(SEN3);  //S3を待つ
  while (sen3 == HIGH) {
    vol=analogRead(VOL)/4;
    delay(10);
    analogWrite(F12,vol);
    analogWrite(F32,vol);
    sen3 = digitalRead(SEN3);
  }
  digitalWrite(P2,HIGH);     //P2を反位に
  delay(8000);
  digitalWrite(S1SIN,HIGH);  //信号を赤にする
  
  sen2 = digitalRead(SEN2);
  while (sen2 == HIGH) {
    vol=analogRead(VOL)/4;
    delay(10);
    analogWrite(F12,vol);
    analogWrite(F32,vol);
    sen2 = digitalRead(SEN2);
  }  
  for(i=255;i>-1;i--){       //減速
    gen=analogRead(GEN)/3;
    vol=analogRead(VOL)/4;
    analogWrite(F12,vol*i/255);
    analogWrite(F32,vol*i/255);
    delay(gen);
  }
  analogWrite(F12,0);       //停車
  analogWrite(F32,0);       //停車
  delay(32000);
  
//****** 右回り交代モード ************
  digitalWrite(S2SIN,LOW);  //信号を緑にする
  digitalWrite(P1,HIGH);    //P1を反位に
  delay(8000);
  digitalWrite(P2,HIGH);    //P2を反位に
  delay(8000);
  digitalWrite(P3,HIGH);    //P3を反位に
  delay(8000);
  digitalWrite(P4,HIGH);    //P4を反位に
  delay(8000);

  for(i=50;i<255;i++){      //加速する
    vol=analogRead(VOL)/6;
    delay(200);
    analogWrite(F31,vol*i/255);
  }

  sen1 = digitalRead(SEN1);  //S1を待つ
  while (sen1 == HIGH) {
    vol=analogRead(VOL)/6;
    delay(10);
    analogWrite(F31,vol);
    sen1 = digitalRead(SEN1);
  }
  digitalWrite(S2SIN,HIGH);  //信号を赤にする
  for(i=255;i>-1;i--){       //減速
    gen=analogRead(GEN)/2;
    vol=analogRead(VOL)/6;
    analogWrite(F31,vol*i/255);
    delay(gen);
  }
  analogWrite(F31,0);        //停車
  digitalWrite(P1,LOW);
  delay(8000);
  digitalWrite(P2,LOW);
  delay(8000);
  digitalWrite(P3,LOW);
  delay(8000);
  digitalWrite(P4,LOW);
  delay(8000);
  
}