/* In dit prgm zijn meerdere programma's ingebracht: - 'run': draait het spoorboekjs - 'wissel': wisseltest - 'reed': lezen reed contacten - 'traject': heen en weer rijden, onder meer om snelheden te bepalen - 'allon': alles onder stroom - 'alloff': alles uit - 'clear': leegt de lees-string - 'quit': verlaat sommige modules */ /*start situatie - mijnloc2 in mijn (sp2) - Eggerbahn 1 op K, sp9 - tram op I sp10 */ #include //test programma variabelen char rx_byte = 0; String rx_str = ""; String rx_str_old = ""; int teller; int teller1; int teller2; int testPin1=12; //op deze pin kan 5V worden gezet om opnieuw prgm uit te voeren int helpb = 1; int helpe = 1; const int nop = 99; int allCount = 0; //definieren sporen pinnen int sp1 = 22; // 1 int sp2 = 24; // 2 int sp3 = 26; // 3 int sp4 = 28; // 4 int sp5 = 30; // 5 int sp6 = 32; // 6 int sp7 = 34; // 7 int sp8 = 36; // 8 pin losgemaakt, onduidelijke aansturing int sp9 = 38; // 9 int sp10 = 40; // 10 int sp11 = 42; // 11 int sp12 = 44; // 12 int sp13 = 46; // 13 //definieren pinnen rijrichting en snelheid int dirPin1 = 8; int dirPin2 = 9; int pwmPin = 13; //definieren pinnen reedcontacten int rc_a = 23; // A int rc_b = 25; // B int rc_c = 27; // C int rc_d = 29; // D int rc_e = 31; // E int rc_f = 33; // F int rc_g = 35; // G int rc_h = 37; // H int rc_i = 39; // I int rc_j = 41; // J int rc_k = 43; // K int rc_l = 45; // L int rc_m = 47; // M //definieren pinnen wissels int w10=2; int w11=3; int w20=4; int w21=5; int w30=6; int w31=7; //Deur variabelen Servo myServo; int angle; int doorPin1=10; int doorOpen = 73; int doorClose=17; int deur; int deurOud; //programma besturingsdata int safeUnsafe; //Geeft aan of loc aangegeven REED heeft bereikt = 1 bij rijden //int cycles; //Is aantal regels in spoorboekje int cycleCount; //geeft aan hoeveel stappen gezet zijn in spoorboekje char tekst[20]; //wordt geprint vanuit prnt($) int ritTel1=0; int stopReed1; //wordt geladen vanuit spoorboekje int stopReed2; //extra variabele voor test- en uitbreidingsdoelen, wordt geladen vanuit spoorboekje int pinLaag = 23; //geeft laagste pin voor reed-metingen aan int pinHoog = 47; //geeft hoogste pin voor reed-metingen aan int blokLaag=22; //geeft laagste pin voor blok pinnen aan int blokHoog=46; //geeft hoogste pin voor blok pinnen aan int rijRichting1; //'1' bepaalt dat trein wegrijdt van de mijn int speedControl; //bepaalt snelheid van de trein int richting; //rijrichting, 1 = weg, 0 - terug int loc1 = 1; //identificeert loc1 int loc2 = 2; //identificeert loc2; nu nog niet geimplementeerd int reedVal; //globale variabele voor lezen reed int pauze; //geeft tijd aan dat er pauze is in het spoorboekje /*rij data waarde '0' geeft aan dat laatste blok bereik waarde '9' geeft aab dat wissel niet gezet wordt */ int rijweg [20][11]={ {sp2,sp3,sp4,sp5,sp6,0,0,w10,w20,9}, //#00 {sp2,sp3,sp4,sp5,sp6,sp7,0,w10,w20,9}, //#01 {sp4,sp9,0,0,0,0,0,w11,9,9}, //#02 {sp4,sp5,sp9,0,0,0,0,w11,w20,9}, //#03 {sp4,sp5,sp6,sp9,0,0,0,w11,w20,9}, //#04 {sp5,sp10,0,0,0,0,0,9,w21,w30}, //#05 {sp5,sp6,sp10,0,0,0,0,9,w21,w30}, //#06 {sp5,sp12,0,0,0,0,0,9,w21,w31}, //#07 {sp5,sp6,sp12,0,0,0,0,9,w21,w31}, //#08 {sp10,0,0,0,0,0,0,9,9,9}, //#09 {sp9,0,0,0,0,0,0,9,9,9}, //#10 {sp6,sp7,0,0,0,0,0,9,9,9}, //#11 {sp5,sp6,0,0,0,0,0,9,9,9}, //#12 {sp4,sp5,0,0,0,0,0,9,w20,9}, //#13 {sp3,sp4,0,0,0,0,0,w10,9,9}, //#14 {sp12,sp13,0,0,0,0,0,9,9,9}, //#15 {sp5,sp12,sp13,0,0,0,0,9,9,9} //#16 }; /* de verticale rij is het locnummer, horizontaal de snelheid vooruit, achteruit, reserve, reserve //let op: loc#0 is dus locomotief 1!!!!!!!!!!! */ /* int locInfo[4][4]={ {90,85,0,0}, //loc 0 {85,80,0,0}, //loc 1 {100,100,0,0}, //loc 2 {75,73,0,0}, //loc 3 }; */ int locInfo[4][4]={ {95,85,0,0}, //loc 0 Mijn loc nieuw {100,100,0,0}, //loc1 Egger 4 {140,120,0,0}, //loc 2 goederentram {125,115,0,0}, //loc 3 }; //let op: loc#0 is dus locomotief 1!!!!!!!!!!!//cycles is gelijk aan # entries in 'spoorboek' (let op: eerste regel ='0'!!) //wanneer geen stopReed nodig is wordt de tekst 'nop' ingevuld int cycles=21; //NB: cyclecount is incl. '0' !! //loc# gebruik: 0,1,2,3 = regel# cf locInfo int spoorboek [22] [7]={ {0,0,rc_e,1,0,0}, //lok# 0 op spoor # 6,,--,0 {1,3,rc_d,1,0,0}, //lok# 1 op spoor # 5,,--,1 {2,9,rc_j,1,0,0}, //lok# 2 op spoor # 10,,--,2 {0,11,rc_f,1,0,0}, //lok# 0 op spoor # 7,,--,3 {1,12,rc_e,1,0,0}, //lok# 1 op spoor # 6,,--,4 {2,5,rc_d,1,0,0}, //lok# 2 op spoor # 5,,--,5 {2,13,rc_c,0,0,0}, //lok# 2 op spoor # 4,,--,6 {1,6,rc_i,0,0,0}, //lok# 1 op spoor # 10,,--,7 {2,14,rc_b,0,2000,0}, //lok# 2 op spoor # 3,,--,8 {2,14,rc_c,1,2000,0}, //lok# 2 op spoor # 4,,--,9 {2,2,rc_l,0,0,0}, //lok# 2 op spoor # 9,,--,10 {0,1,rc_a,0,0,0}, //lok# 0 op spoor # 2,,--,11 {1,5,rc_d,1,0,0}, //lok# 1 op spoor # 5,,--,12 {1,7,rc_h,0,0,0}, //lok# 1 op spoor # 12,,--,13 {2,10,rc_k,0,0,0}, //lok# 2 op spoor # 9,,--,14 {0,0,rc_e,1,0,0}, //lok# 0 op spoor # 6,,--,15 {2,3,rc_d,1,0,0}, //lok# 2 op spoor # 5,,--,16 {0,11,rc_f,1,0,0}, //lok# 0 op spoor # 7 --17 {2,5,rc_i,0,0,0}, //lok# 2 op spoor # 10,,--,18 {1,7,rc_d,1,1500,0}, //lok# 1 op spoor # 5 --19 {1,3,rc_k,0,0,0}, //lok# 1 op spoor # 9 --20 {0,1,rc_a,0,0,0}, //lok# 0 op spoor # 2,,--,21 }; void setup(){ //initialisatie //myServo.attach(doorPin1); Serial.begin(115200); Serial.println("AllIn_20200108"); //initieren alle blokken (HIGH: er wordt GEEN stroom doorgelaten) for (teller1=blokLaag;teller1<(blokHoog+1);teller1=teller1+2){ digitalWrite (teller1,HIGH); delay(15); pinMode(teller1,OUTPUT); } //initieren rijrichting en snelheid digitalWrite (dirPin1,0); digitalWrite (dirPin2,0); digitalWrite (pwmPin,0); pinMode (dirPin1,OUTPUT); pinMode (dirPin2,OUTPUT); pinMode (pwmPin,OUTPUT); //inintieren wissels digitalWrite (w10,HIGH); digitalWrite (w11,HIGH); digitalWrite (w20,HIGH); digitalWrite (w21,HIGH); digitalWrite (w30,HIGH); digitalWrite (w31,HIGH); pinMode (w10,OUTPUT); pinMode (w11,OUTPUT); pinMode (w20,OUTPUT); pinMode (w21,OUTPUT); pinMode (w30,OUTPUT); pinMode (w31,OUTPUT); //initieren deur angle = doorClose; pinMode (doorPin1,OUTPUT); //initieren reedcontacten for (teller=pinLaag;teller < (pinHoog+1);teller=teller+2) { pinMode (teller,INPUT_PULLUP); } //setten test gerelateerde data pinMode(testPin1,INPUT); digitalWrite(testPin1,LOW); Serial.println("einde INIT"); Serial.println(" start testen" ); } void loop(){ rx_str=""; input(); if (rx_str_old== "reed"){ reedRead(); prnt("einde reedRead"); } if (rx_str_old== "niks"){ niks(); } if (rx_str_old== "wissel"){ wisselTest(); } if (rx_str_old== "clear"){ rx_str = ""; rx_str_old=""; prntln("input string leeg"); } if (rx_str_old== "allon"){ blokStroom(); } if (rx_str_old== "alloff"){ blokOff(); } if (rx_str_old== "traject"){ traject(); } if (rx_str_old== "run"){ allCount = allCount+1; Serial.print(" overall cycles: "); Serial.println(allCount); runTrain(); } //einde void loop } void runTrain(){ prntln("start spoorboekverwerking"); cycleCount = 0; deur = 0; deurOud = 0; Serial.println(); while (cycleCount <= (cycles)){ input(); if (rx_str=="quit"){ Serial.println("quitted"); return; } prnt("cycleCount: "); // aangeven: waar zijn we? Serial.println(cycleCount); //inlezen data pauze = spoorboek [cycleCount] [4]; deur = spoorboek [cycleCount] [5]; if ((deur == 1) && (deurOud != 0)){ openDoor(); } if ((deur == 0) && (deurOud != 1)){ closeDoor(); } deurOud = deur; stopReed1=spoorboek[cycleCount][2]; // bepaal stopplaats prnt("stopReed pin is: "); reedLetter(stopReed1); rijden(cycleCount); // set blokken, wissels, rijrichting en snelheid safeUnsafe=1; delay (2000); //zorgt er voor dat reed bij wegrijden reed niet wordt geactiveerd if (stopReed1 != "nop"){ checkReed(stopReed1); // prgm blijft in checkReed zolang loc niet boven reed is stoppen(cycleCount); // alleen de blokken die onder stroom staan stroom weghalen } safeUnsafe=0; delay(1000); // om te snel heen en weer rijden te voorkomen 1 sec wachten if (pauze){ delay (pauze); Serial.println("prgm pauze"); pauze = 0; } cycleCount=cycleCount+1; // klaar voor volgende regel van het spoorboekje Serial.println(); } //gereed voor volgende cyclus cycleCount=0; prntln("Einde run"); rx_str = ""; } //_________________________________________________________________________ //hieronder de subroutines van runtrain void rijden(int localTeller){ // blokken "aan" zetten; let op: LOW is stroom wel, HIGH is stroom niet for (int localTel2 = 0;localTel2 < 7;localTel2++){ if (rijweg[spoorboek[localTeller][1]][localTel2]> 0){ digitalWrite(rijweg[spoorboek[localTeller][1]][localTel2],LOW); prnt ("spoor aan: "); spoorLetter (rijweg[spoorboek[localTeller][1]][localTel2]); } } // wissels zetten for (int arRijweg = 7;arRijweg <= 9;arRijweg++){ if (rijweg[spoorboek[localTeller][1]][arRijweg] != 9){ digitalWrite(rijweg[spoorboek[localTeller][1]][arRijweg],LOW); //set wissel start delay(30); digitalWrite(rijweg[spoorboek[localTeller][1]][arRijweg],HIGH); //set wissel end } } // richting bepalen richting = spoorboek[cycleCount][3]; if ((richting < 0) || (richting > 1)){ prnt("foute richting "); niks(); } if (richting == 0){ digitalWrite(dirPin1,HIGH); digitalWrite(dirPin2,LOW); speedControl= locInfo[spoorboek[cycleCount][0]][1]; analogWrite(pwmPin,speedControl); prnt("richting 0 pwm = "); Serial.println(speedControl); } if (richting==1){ digitalWrite(dirPin1,LOW); digitalWrite(dirPin2,HIGH); speedControl=locInfo[spoorboek[cycleCount][0]][0]; analogWrite(pwmPin,speedControl); prnt("locsnelheid (richting = 1): "); Serial.println(speedControl); Serial.println("dirPinnen:"); } prnt("einde rijden routine"); } void checkReed(int pin){ reedVal=digitalRead(pin); while (reedVal==1){ reedVal=digitalRead(pin); if (reedVal==0){ return; } } } void stoppen(int localTeller){ digitalWrite(dirPin1,LOW); // beide 0 is stop digitalWrite(dirPin2,LOW); // beide 0 is stop digitalWrite(speedControl,LOW); //ook output naar 0 brengen op PWM Serial.print("stopppen; localTeller= "); Serial.println(localTeller); for (int localTel2 = 0;localTel2 < 7;localTel2++){ if (rijweg[spoorboek[localTeller][1]][localTel2]> 0){ digitalWrite(rijweg[spoorboek[localTeller][1]][localTel2],HIGH); // HIGH is GEEN stroom prnt("spoor uit: "); spoorLetter(rijweg[spoorboek[localTeller][1]][localTel2]); } } Serial.println("einde stoppen"); } void prnt(char a[]){ //voor printen Serial.print(a); } void prntln(char a[]){ //voor printen met line feed Serial.println(a); } void spoorLetter(int localSpoor){ switch (localSpoor){ case 22: Serial.println("1"); break; case 24: Serial.println("2"); break; case 26: Serial.println("3"); break; case 28: Serial.println("4"); break; case 30: Serial.println("5"); break; case 32: Serial.println("6"); break; case 34: Serial.println("7"); break; case 36: Serial.println("8"); break; case 38: Serial.println("9"); break; case 40: Serial.println("10"); break; case 42: Serial.println("11"); break; case 44: Serial.println("12"); break; case 46: Serial.println("13"); break; default: break; } } void reedLetter(int localReedVal){ switch (localReedVal){ case 23: Serial.println("A"); break; case 25: Serial.println("B"); break; case 27: Serial.println("C"); break; case 29: Serial.println("D"); break; case 31: Serial.println("E"); break; case 33: Serial.println("F"); break; case 35: Serial.println("G"); break; case 37: Serial.println("H"); break; case 39: Serial.println("I"); break; case 41: Serial.println("J"); break; case 43: Serial.println("K"); break; case 45: Serial.println("L"); break; case 47: Serial.println("M"); break; default: break; } } void openDoor(){ while (angledoorClose){ angle=angle-5; Serial.print("angle: "); Serial.println(angle); myServo.write(angle); delay(100); } } //_________________________________________________________________________ void traject(){ prntln("voor deze module moet er een analoge input op A0 zijn"); speedControl = (analogRead(A0)/4); //"aan" zetten sporen 3,4,5 en 6 digitalWrite (sp3,LOW); digitalWrite (sp4,LOW); digitalWrite (sp5,LOW); digitalWrite (sp6,LOW); //we willen starten in de '1' richting, maar de PROC draait de waarde direct om rijRichting1=0; testRijRichting(); digitalWrite(dirPin1,LOW); digitalWrite(dirPin2,HIGH); analogWrite(pwmPin,0); while (rx_str!="quit"){ if (rx_str=="quit"){ return; } speedControl = (analogRead(A0)/4); Serial.println(speedControl); analogWrite(pwmPin,speedControl); helpb = digitalRead(rc_b); helpe = digitalRead(rc_e); if (((helpb==0) && (rijRichting1 == 0)) || ((helpe==0) && (rijRichting1 == 1))){ digitalWrite(dirPin1,0); digitalWrite(dirPin2,0); digitalWrite(pwmPin,0); testRijRichting(); } input(); } blokOff(); prntln("Einde traject test"); } void testRijRichting(){ rijRichting1=1-rijRichting1; delay(500); if (rijRichting1==0){ digitalWrite(dirPin1,HIGH); digitalWrite(dirPin2,LOW); analogWrite(pwmPin,analogRead(A0/4)); } if (rijRichting1==1){ digitalWrite(dirPin1,LOW); digitalWrite(dirPin2,HIGH); analogWrite(pwmPin,analogRead(A0/4)); } } // wisseltest void wisselTest(){ digitalWrite(w10,LOW); delay(30); digitalWrite(w10,HIGH); delay(500); digitalWrite(w11,LOW); delay(30); digitalWrite(w11,HIGH); delay(500); digitalWrite(w10,LOW); delay(30); digitalWrite(w10,HIGH); delay(500); digitalWrite(w20,LOW); delay(30); digitalWrite(w20,HIGH); delay(500); digitalWrite(w21,LOW); delay(30); digitalWrite(w21,HIGH); delay(500); digitalWrite(w20,LOW); delay(30); digitalWrite(w20,HIGH); delay(500); digitalWrite(w30,LOW); delay(30); digitalWrite(w30,HIGH); delay(500); digitalWrite(w31,LOW); delay(30); digitalWrite(w31,HIGH); delay(500); digitalWrite(w30,LOW); delay(30); digitalWrite(w30,HIGH); delay(500); rx_str = ""; Serial.println("einde wisseltest"); } //reedRead voor lezen reedcontacten void reedRead(){ Serial.println("Lezen reedcontacten"); while (rx_str == "reed"){ for (int teller=pinLaag;teller < pinHoog+1;teller++){ if (digitalRead(teller)==0){ switch (teller){ case 23: Serial.println("A"); break; case 25: Serial.println("B"); break; case 27: Serial.println("C"); break; case 29: Serial.println("D"); break; case 31: Serial.println("E"); break; case 33: Serial.println("F"); break; case 35: Serial.println("G"); break; case 37: Serial.println("H"); break; case 39: Serial.println("I"); break; case 41: Serial.println("J"); break; case 43: Serial.println("K"); break; case 45: Serial.println("L"); break; case 47: Serial.println("M"); break; default: break; } } } input(); } } void input(){ if(Serial.available() != 0) { rx_str=""; while (Serial.available() > 0){ rx_byte = Serial.read(); delay(20); if (rx_byte != '\n'){ rx_str += rx_byte; Serial.println(rx_str); } } if ((rx_str_old!=rx_str) && (rx_str !="")){ Serial.println(rx_str); rx_str_old=rx_str; } } } void blokStroom(){ //initieren alle blokken (HIGH: er wordt GEEN stroom doorgelaten) // LET OP: LOW betekent dat stroom WORDT DOORGELATEN !!!! for (teller1=blokLaag;teller1<(blokHoog+1);teller1=teller1+2){ digitalWrite (teller1,LOW); delay(30); pinMode(teller1,OUTPUT); } digitalWrite(dirPin1,0); digitalWrite(dirPin1,1); digitalWrite(pwmPin,250); rx_str = ""; } void blokOff(){ //initieren alle blokken (HIGH: er wordt GEEN stroom doorgelaten) // LET OP: LOW betekent dat stroom WORDT DOORGELATEN !!!! for (teller1=blokLaag;teller1<(blokHoog+1);teller1=teller1+2){ digitalWrite (teller1,HIGH); delay(30); pinMode(teller1,OUTPUT); } digitalWrite(dirPin1,0); digitalWrite(dirPin1,0); digitalWrite(pwmPin,0); rx_str = ""; } void niks(){ Serial.print("void niks, make pin 12 HIGH"); Serial.println(" or give new command "); int fork=digitalRead((testPin1)); if ((fork == 0) or (rx_str="niks")){ fork=digitalRead((testPin1)); input(); } Serial.println("relax"); rx_str = ""; }