// Every-11-4
// 2020.11.14
// Arduino Nano Every を使用する。
// PWM周波数を15.7kHzにする。

#define  UNTEN 11
#define  VOL   A0
#define  SIN   13
#define  SEN1  12
#define  SEN2  15
#define  SEN3  21
#define  SEN4  17
#define  SEN5  16
#define  SEN6  20
#define  SEN7  19
#define  SEN8  18
#define  F11  9
#define  F12  6
#define  F21  5
#define  F22  3
#define  P1  7
#define  P2  4
#define  P3  2
#define  P4  8
#define  P6  10

  int i;
  int sen1;
  int sen2;
  int sen3;
  int sen4;
  int sen5;
  int sen6;
  int sen7;
  int sen8;
  int vol;
  int unten;

void setup() {
  pinMode(UNTEN,INPUT);
  pinMode(VOL,INPUT);
  pinMode(SEN1,INPUT);
  pinMode(SEN2,INPUT);
  pinMode(SEN3,INPUT);
  pinMode(SEN4,INPUT);
  pinMode(SEN5,INPUT);
  pinMode(SEN6,INPUT);
  pinMode(SEN7,INPUT);
  pinMode(SEN8,INPUT);
  pinMode(F11,OUTPUT);
  pinMode(F12,OUTPUT);
  pinMode(F21,OUTPUT);
  pinMode(F22,OUTPUT);
  pinMode(SIN,OUTPUT);
  pinMode(P1,OUTPUT);
  pinMode(P2,OUTPUT);
  pinMode(P3,OUTPUT);
  pinMode(P4,OUTPUT);
  pinMode(P6,OUTPUT);
  
  TCA0.SINGLE.CTRLA = 0b0101; //PWM周波数の変更
  
  analogWrite(F11,0);
  analogWrite(F12,0);
  analogWrite(F21,0);
  analogWrite(F22,0);

  digitalWrite(P1,HIGH);
  delay(8000);
  digitalWrite(P2,HIGH);
  delay(8000);
  digitalWrite(P3,HIGH);
  delay(8000);
  digitalWrite(P4,HIGH);
  delay(8000);
  digitalWrite(P6,HIGH);
  delay(8000);
  digitalWrite(P1,LOW);
  delay(8000);
  digitalWrite(P2,LOW);
  delay(8000);
  digitalWrite(P3,LOW);
  delay(8000);
  digitalWrite(P4,LOW);
  delay(8000);
  digitalWrite(P6,LOW);
  delay(8000);
}

void loop() {
  unten = digitalRead(UNTEN);
  while (unten == LOW) {
    unten = digitalRead(UNTEN);
    analogWrite(F11,0);
    analogWrite(F12,0);
    analogWrite(F21,0);
    analogWrite(F22,0);
    digitalWrite(SIN,HIGH); //信号は赤
  }

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

  sen3 = digitalRead(SEN3);  //S3を待つ
  while (sen3 == HIGH) {
    vol=analogRead(VOL)/4;
    delay(10);
    analogWrite(F11,vol);
    sen3 = digitalRead(SEN3);
  }

  sen4 = digitalRead(SEN4);  //S4を待つ
  while (sen4 == HIGH) {
    vol=analogRead(VOL)/4;
    delay(10);
    analogWrite(F11,vol);
    analogWrite(F21,vol);
    sen4 = digitalRead(SEN4);
  }
  digitalWrite(P1,HIGH);    //P1を反位に
  delay(8000);
  
  sen5 = digitalRead(SEN5);  //S5を待つ
  while (sen5 == HIGH) {
    vol=analogRead(VOL)/4;
    delay(10);
    analogWrite(F11,vol);
    analogWrite(F21,vol);
    sen5 = digitalRead(SEN5);
  }

  sen4 = digitalRead(SEN4);  //S4を待つ
  while (sen4 == HIGH) {
    vol=analogRead(VOL)/4;
    delay(10);
    analogWrite(F11,vol);
    analogWrite(F21,vol);
    sen4 = digitalRead(SEN4);
  }

  sen5 = digitalRead(SEN5);  //S5を待つ
  while (sen5 == HIGH) {
    vol=analogRead(VOL)/4;
    delay(10);
    analogWrite(F11,vol);
    analogWrite(F21,vol);
    sen5 = digitalRead(SEN5);
  }
  digitalWrite(P2,HIGH);    //P2を反位に
  delay(8000);
  digitalWrite(P3,HIGH);    //P3を反位に
  delay(8000);

  sen6 = digitalRead(SEN6);  //S6を待つ
  while (sen6 == HIGH) {
    vol=analogRead(VOL)/4;
    delay(10);
    analogWrite(F11,vol);
    analogWrite(F21,vol);
    sen6 = digitalRead(SEN6);
  }
  analogWrite(F21,0);
  delay(500);
  analogWrite(F22,vol);

  sen4 = digitalRead(SEN4);  //S4を待つ
  while (sen4 == HIGH) {
    vol=analogRead(VOL)/4;
    delay(10);
    analogWrite(F11,vol);
    analogWrite(F22,vol);
    sen4 = digitalRead(SEN4);
  }
  analogWrite(F11,0);
  digitalWrite(P2,LOW);    //P2を定位に
  delay(8000);
  digitalWrite(P3,LOW);    //P3を定位に
  delay(8000);
  analogWrite(F12,vol);
  digitalWrite(P1,LOW);    //P1を定位に
  delay(8000);
  digitalWrite(SIN,HIGH); //信号を赤

  sen2 = digitalRead(SEN2);
  while (sen2 == HIGH) {
    vol=analogRead(VOL)/4;
    delay(10);
    analogWrite(F12,vol);
    analogWrite(F22,vol);
    sen2 = digitalRead(SEN2);
  }  
  for(i=255;i>50;i--){     //減速
    vol=analogRead(VOL)/4;
    delay(500);
    analogWrite(F12,vol*i/255);
    analogWrite(F22,0);
  }
  analogWrite(F12,0);    //停車
  delay(32000);
  
//****** 交換モード ************
  digitalWrite(SIN,LOW);  //信号を緑にする
  delay(16000); 

  digitalWrite(P4,HIGH);    //P4,5を反位に
  delay(8000);
  
  for(i=50;i<255;i++){    //加速する
    vol=analogRead(VOL)/6;
    delay(200);
    analogWrite(F11,vol*i/255);
    analogWrite(F22,vol*i/255);
  }

  sen3 = digitalRead(SEN3);  //S3を待つ
  while (sen3 == HIGH) {
    vol=analogRead(VOL)/6;
    delay(10);
    analogWrite(F11,vol);
    analogWrite(F22,vol);
    sen3 = digitalRead(SEN3);
  }

  sen7 = digitalRead(SEN7);  //S7を待つ
  while (sen7 == HIGH) {
    vol=analogRead(VOL)/6;
    delay(10);
    analogWrite(F11,vol);
    analogWrite(F22,vol);
    sen7 = digitalRead(SEN7);
  }
  analogWrite(F11,0);
  analogWrite(F22,0);
  digitalWrite(P4,LOW);    //P4,5を定位に
  delay(8000);
  analogWrite(F12,vol);
  analogWrite(F22,vol);

  sen2 = digitalRead(SEN2);
  while (sen2 == HIGH) {
    vol=analogRead(VOL)/6;
    delay(10);
    analogWrite(F12,vol);
    analogWrite(F22,vol);
    sen2 = digitalRead(SEN2);
  }  
  for(i=255;i>50;i--){      //減速
    vol=analogRead(VOL)/6;
    delay(500);
    analogWrite(F12,vol*i/255);
    analogWrite(F22,0);
  }
  analogWrite(F12,0);      //停車
  delay(32000);
}