// Every-16-6
// 2021.1.24
// Arduino Nano Every を使用する。
// PWM周波数を15.7kHzにする。
#define VOL A6
#define GEN A7
#define SEN1 11
#define SEN2 12
#define SEN3 2
#define SEN4 14
#define CH1 15
#define CH2 16
#define CH3 17
#define CH4 18
#define UNTEN 19
#define F11 10
#define F12 9
#define F21 6
#define F22 5
#define P12 8
#define P34 7
#define P5 4
#define P6 3
int i;
int vol;
int gen;
void setup() {
pinMode(VOL,INPUT);
pinMode(GEN,INPUT);
pinMode(SEN1,INPUT);
pinMode(SEN2,INPUT);
pinMode(SEN3,INPUT);
pinMode(SEN4,INPUT);
pinMode(CH1,INPUT);
pinMode(CH2,INPUT);
pinMode(CH3,INPUT);
pinMode(CH4,INPUT);
pinMode(UNTEN,INPUT);
pinMode(F11,OUTPUT);
pinMode(F12,OUTPUT);
pinMode(F21,OUTPUT);
pinMode(F22,OUTPUT);
pinMode(P12,OUTPUT);
pinMode(P34,OUTPUT);
pinMode(P5,OUTPUT);
pinMode(P6,OUTPUT);
TCA0.SINGLE.CTRLA = 0b0101; //PWM周波数の変更
analogWrite(F11,0);
analogWrite(F12,0);
analogWrite(F21,0);
analogWrite(F22,0);
digitalWrite(P12,HIGH);
delay(8000);
digitalWrite(P34,HIGH);
delay(8000);
digitalWrite(P5,HIGH);
delay(8000);
digitalWrite(P6,HIGH);
delay(8000);
digitalWrite(P12,LOW);
delay(8000);
digitalWrite(P34,LOW);
delay(8000);
digitalWrite(P5,LOW);
delay(8000);
digitalWrite(P6,LOW);
delay(8000);
}
void mode1(){
if (digitalRead(SEN1)==LOW){ //ホームに列車はいるか?負論理
digitalWrite(P12,LOW);
delay(8000);
digitalWrite(P34,LOW);
delay(8000);
digitalWrite(P5,LOW);
delay(8000);
digitalWrite(P6,LOW);
delay(8000);
vol=analogRead(VOL)/4;
delay(100);
analogWrite(F11,vol*50/255); //室内灯点灯
analogWrite(F21,vol*50/255);
delay(8000);
for(i=50;i<255;i++){ //加速する
vol=analogRead(VOL)/4;
delay(200);
analogWrite(F11,vol*i/255);
analogWrite(F21,vol*i/255);
}
while (digitalRead(SEN3) == HIGH) { //S3を待つ
vol=analogRead(VOL)/4;
delay(100);
analogWrite(F11,vol);
analogWrite(F21,vol);
}
while (digitalRead(SEN4) == HIGH) { //S4を待つ
vol=analogRead(VOL)/4;
delay(100);
analogWrite(F11,vol);
analogWrite(F21,vol);
}
while (digitalRead(SEN1) == HIGH) { //S1を待つ
vol=analogRead(VOL)/4;
delay(100);
analogWrite(F11,vol);
analogWrite(F21,vol);
}
for(i=255;i>50;i--){ //減速
gen=analogRead(GEN)/8;
vol=analogRead(VOL)/4;
delay(100);
analogWrite(F11,vol*i/255);
analogWrite(F21,vol*i/255);
delay(gen);
}
delay(8000);
analogWrite(F11,0); //停車
analogWrite(F21,0);
}
delay(8000);
return;
}
void mode2() {
if (digitalRead(SEN2)==LOW){ //ホームに列車はいるか?負論理
digitalWrite(P12,HIGH);
delay(8000);
digitalWrite(P34,LOW);
delay(8000);
digitalWrite(P5,LOW);
delay(8000);
digitalWrite(P6,LOW);
delay(8000);
vol=analogRead(VOL)/4;
delay(100);
analogWrite(F12,vol*50/255); //室内灯点灯
analogWrite(F22,vol*50/255);
delay(8000);
for(i=50;i<255;i++){ //加速する
vol=analogRead(VOL)/4;
delay(200);
analogWrite(F12,vol*i/255);
analogWrite(F22,vol*i/255);
}
while (digitalRead(SEN4) == HIGH) { //S3を待つ
vol=analogRead(VOL)/4;
delay(100);
analogWrite(F12,vol);
analogWrite(F22,vol);
}
while (digitalRead(SEN3) == HIGH) { //S4を待つ
vol=analogRead(VOL)/4;
delay(100);
analogWrite(F12,vol);
analogWrite(F22,vol);
}
while (digitalRead(SEN2) == HIGH) { //S1を待つ
vol=analogRead(VOL)/4;
delay(100);
analogWrite(F12,vol);
analogWrite(F22,vol);
}
for(i=255;i>50;i--){ //減速
gen=analogRead(GEN)/8;
vol=analogRead(VOL)/4;
delay(100);
analogWrite(F12,vol*i/255);
analogWrite(F22,vol*i/255);
delay(gen);
}
delay(20000);
analogWrite(F12,0); //停車
analogWrite(F22,0);
}
delay(8000);
return;
}
void mode3(){
if (digitalRead(SEN1)==LOW){ //ホームに列車はいるか?負論理
digitalWrite(P12,LOW);
delay(8000);
digitalWrite(P34,LOW);
delay(8000);
digitalWrite(P5,LOW);
delay(8000);
digitalWrite(P6,LOW);
delay(8000);
vol=analogRead(VOL)/4;
delay(100);
analogWrite(F11,vol*50/255); //室内灯点灯
analogWrite(F21,vol*50/255);
delay(8000);
for(i=50;i<255;i++){ //加速する
vol=analogRead(VOL)/4;
delay(200);
analogWrite(F11,vol*i/255);
analogWrite(F21,vol*i/255);
}
while (digitalRead(SEN3) == HIGH) { //S3を待つ
vol=analogRead(VOL)/4;
delay(100);
analogWrite(F11,vol);
analogWrite(F21,vol);
}
digitalWrite(P6,HIGH); //リバース設定
delay(8000);
digitalWrite(P34,HIGH);
delay(8000);
digitalWrite(P12,HIGH);
delay(8000);
analogWrite(F21,0);
analogWrite(F22,vol);
while (digitalRead(SEN4) == HIGH) { //S4を待つ
vol=analogRead(VOL)/4;
delay(100);
analogWrite(F11,vol);
analogWrite(F22,vol);
}
digitalWrite(P6,LOW); //リバース設定を戻す
delay(8000);
analogWrite(F11,0);
analogWrite(F12,vol);
analogWrite(F22,vol);
while (digitalRead(SEN3) == HIGH) { //S3を待つ
vol=analogRead(VOL)/4;
delay(100);
analogWrite(F12,vol);
analogWrite(F22,vol);
}
digitalWrite(P34,LOW);
delay(30000);
while (digitalRead(SEN2) == HIGH) { //S2を待つ
vol=analogRead(VOL)/4;
delay(100);
analogWrite(F12,vol);
analogWrite(F22,vol);
}
for(i=255;i>50;i--){ //減速
gen=analogRead(GEN)/8;
vol=analogRead(VOL)/4;
delay(100);
analogWrite(F12,vol*i/255);
analogWrite(F22,vol*i/255);
delay(gen);
}
delay(8000);
analogWrite(F12,0); //停車
analogWrite(F22,0);
}
delay(8000);
return;
}
void mode4(){
if (digitalRead(SEN2)==LOW){ //ホームに列車はいるか?負論理
digitalWrite(P12,HIGH);
delay(8000);
digitalWrite(P34,LOW);
delay(8000);
digitalWrite(P5,LOW);
delay(8000);
digitalWrite(P6,LOW);
delay(8000);
vol=analogRead(VOL)/4;
delay(100);
analogWrite(F12,vol*50/255); //室内灯点灯
analogWrite(F22,vol*50/255);
delay(8000);
for(i=50;i<255;i++){ //加速する
vol=analogRead(VOL)/4;
delay(200);
analogWrite(F12,vol*i/255);
analogWrite(F22,vol*i/255);
}
while (digitalRead(SEN4) == HIGH) { //S4を待つ
vol=analogRead(VOL)/4;
delay(100);
analogWrite(F12,vol);
analogWrite(F22,vol);
}
digitalWrite(P5,HIGH); //リバース設定
delay(8000);
digitalWrite(P34,HIGH);
delay(8000);
digitalWrite(P12,HIGH);
delay(8000);
analogWrite(F12,0);
analogWrite(F11,vol);
while (digitalRead(SEN3) == HIGH) { //S3を待つ
vol=analogRead(VOL)/4;
delay(100);
analogWrite(F11,vol);
analogWrite(F22,vol);
}
digitalWrite(P5,LOW); //リバース設定を戻す
delay(8000);
analogWrite(F22,0);
analogWrite(F21,vol);
analogWrite(F11,vol);
while (digitalRead(SEN4) == HIGH) { //S4を待つ
vol=analogRead(VOL)/4;
delay(100);
analogWrite(F21,vol);
analogWrite(F11,vol);
}
digitalWrite(P12,LOW);
delay(30000);
while (digitalRead(SEN1) == HIGH) { //S1を待つ
vol=analogRead(VOL)/4;
delay(100);
analogWrite(F21,vol);
analogWrite(F11,vol);
}
for(i=255;i>50;i--){ //減速
gen=analogRead(GEN)/8;
vol=analogRead(VOL)/4;
delay(100);
analogWrite(F21,vol*i/255);
analogWrite(F11,vol*i/255);
delay(gen);
}
delay(8000);
analogWrite(F11,0); //停車
analogWrite(F21,0);
}
delay(8000);
return;
}
void mode5(){
if (digitalRead(SEN1)==HIGH){ //ホームに列車が居ない場合は中止。負論理
return;
}
if (digitalRead(SEN2)==HIGH){ //ホームに列車が居ない場合は中止。負論理
return;
}
digitalWrite(P12,LOW);
delay(8000);
digitalWrite(P34,LOW);
delay(8000);
digitalWrite(P5,LOW);
delay(8000);
digitalWrite(P6,LOW);
delay(8000);
vol=analogRead(VOL)/4;
delay(100);
analogWrite(F11,vol*50/255); //室内灯点灯
analogWrite(F21,vol*50/255);
delay(8000);
for(i=50;i<255;i++){ //加速する
vol=analogRead(VOL)/4;
delay(200);
analogWrite(F11,vol*i/255);
analogWrite(F21,vol*i/255);
}
while (digitalRead(SEN3) == HIGH) { //S3を待つ
vol=analogRead(VOL)/4;
delay(100);
analogWrite(F11,vol);
analogWrite(F21,vol);
}
digitalWrite(P6,HIGH); //リバース設定
delay(8000);
digitalWrite(P34,HIGH);
delay(8000);
digitalWrite(P12,HIGH);
delay(8000);
analogWrite(F21,0);
analogWrite(F22,vol);
while (digitalRead(SEN4) == HIGH) { //S4を待つ
vol=analogRead(VOL)/4;
delay(100);
analogWrite(F11,vol);
analogWrite(F22,vol);
}
digitalWrite(P6,LOW); //リバース設定を戻す
delay(8000);
analogWrite(F11,0);
analogWrite(F12,vol);
analogWrite(F22,vol);
while (digitalRead(SEN3) == HIGH) { //S3を待つ
vol=analogRead(VOL)/4;
delay(100);
analogWrite(F12,vol);
analogWrite(F22,vol);
}
digitalWrite(P34,LOW);
delay(30000); //ホームの列車が出ていくまで待つ。
while (digitalRead(SEN2) == HIGH) { //S2を待つ
vol=analogRead(VOL)/4;
delay(100);
analogWrite(F12,vol);
analogWrite(F22,vol);
}
delay(8000);
digitalWrite(P34,HIGH); //ホーム2を遮断して列車を停止させる。
delay(8000);
while (digitalRead(SEN3) == HIGH) { //S3を待つ
vol=analogRead(VOL)/4;
delay(100);
analogWrite(F12,vol);
analogWrite(F22,vol);
}
digitalWrite(P5,HIGH);
delay(8000);
analogWrite(F22,0);
analogWrite(F21,vol);
delay(8000);
while (digitalRead(SEN4) == HIGH) { //S4を待つ
vol=analogRead(VOL)/4;
delay(100);
analogWrite(F12,vol);
analogWrite(F21,vol);
}
analogWrite(F12,0);
analogWrite(F11,vol);
digitalWrite(P12,LOW); //ホーム1に入線させる
delay(8000);
while (digitalRead(SEN1) == HIGH) { //S1を待つ
vol=analogRead(VOL)/4;
delay(100);
analogWrite(F21,vol);
analogWrite(F11,vol);
}
for(i=255;i>50;i--){ //減速
gen=analogRead(GEN)/8;
vol=analogRead(VOL)/4;
delay(100);
analogWrite(F11,vol*i/255);
analogWrite(F21,vol*i/255);
delay(gen);
}
delay(8000);
analogWrite(F11,0); //停車
analogWrite(F21,0);
delay(8000);
return;
}
void loop(){
if (digitalRead(UNTEN)==HIGH){
if (digitalRead(CH1)==HIGH && digitalRead(CH2)==HIGH && digitalRead(CH3)==HIGH && digitalRead(CH4)==HIGH){
mode1();
} else if (digitalRead(CH1)==LOW && digitalRead(CH2)==HIGH && digitalRead(CH3)==HIGH && digitalRead(CH4)==HIGH){
mode2();
} else if (digitalRead(CH1)==HIGH && digitalRead(CH2)==LOW && digitalRead(CH3)==HIGH && digitalRead(CH4)==HIGH){
mode1();
mode1();
} else if (digitalRead(CH1)==LOW && digitalRead(CH2)==LOW && digitalRead(CH3)==HIGH && digitalRead(CH4)==HIGH){
mode2();
mode2();
} else if (digitalRead(CH1)==HIGH && digitalRead(CH2)==HIGH && digitalRead(CH3)==LOW && digitalRead(CH4)==HIGH){
mode1();
mode2();
} else if (digitalRead(CH1)==LOW && digitalRead(CH2)==HIGH && digitalRead(CH3)==LOW && digitalRead(CH4)==HIGH){
mode3();
} else if (digitalRead(CH1)==HIGH && digitalRead(CH2)==LOW && digitalRead(CH3)==LOW && digitalRead(CH4)==HIGH){
mode4();
} else if (digitalRead(CH1)==LOW && digitalRead(CH2)==LOW && digitalRead(CH3)==LOW && digitalRead(CH4)==HIGH){
mode5();
}
delay (8000);
}
}