ich möchte mich erstmal hier im Forum vorstellen. Ich bin seit längerer Zeit stiller Mitleser und nach der Veröffentlichung der MobaTools bin ich endlich einen Schritt weiter mit meinem Anlagenbau gekommen. Ich setze die die MobaTools hauptsächlich zum Steuern von Servos und "Blinken" ein.
An dieser Stelle - l vielen Dank an microbahner für die tolle software.
Ich möchte nun die Bundeswehrfahrzeuge von meinem DC-Carsystem 1zu87 vor einem Tor steuern und habe den Ablauf in dem Sketch beschrieben. Wahrscheinlich durch die "delays" ist der Ablauf nach einschalten des arduinno nano fehlerhaft. Das Relais" RELAIS_A2" schaltet zu früh und das Fahrzeug rutscht durch.
/* Gesteuerter Ablauf für DC-Car System 1:87, "Bundeswehr" Auslösung durch Hallsensoren in der Fahrbahn, schaltbare Stoppimpulse werden vom DC-Car Funktionsdecoder erzeugt Fahrzeugverteilung durch unterschiedliche Polarität der Magneten am Fahrzeug
2020/ e69-fan */ const int HALL_1 = 3; //HALL_Sensor1 an Pin 3 vor Kasernentor const int HALL_2 = 4; //HALL_Sensor2 an Pin 4 nach Kontrollbereich const int servo2_Drehtor = 10; //Drehtor const int RELAIS_A2 = 6; //Relais_A2 an Pin 6 const int RELAIS_A3 = 7; //Blinkrelais an Pin 7 const byte autoOff = 1;
/*// IR1 im Wechsel mit IR2 "STOP vor Tor - FAHRT aus Kontrollbereich" "FAHRT durch Tor - STOP im Kontrollbereich"
// -------------------- STARTposition ------------------------------------------ // // beim Start stehen alle Relais auf HIGH/AUS, erstes LOW schaltet Relais EIN // */
Es ist die Delay die deine Wünsche stört. Wenn Delay genutzt wird stopt der ganze Ablauf des Programms. Es ist jetzt besser einen Timer zu nutzen. Davon gibt es manche Beispiele im Internet und bri YouTube. Such mal nach Interupt und Timer.
John
Fahre Märklin-system, unter Nutzung von CS3+ und IB-Basic und PC-Steuerung über Rocrail. Mitglied des 3railforum.nl und die M-Track Gruppe NL (www.mtrack-org) Lese und schreibe Niederländisch, Deutsch und Englisch. YouTubekanal: VT601
Hallo, hast Du dir schon mal mein Tutorial zu' Zeitsteuerungen ohne delay' angeschaut? Da habe ich erklärt wie das geht.
Edit: Link zumTutorial eingefügt. In der aktuellen Version der MobaTools heißt der EggTimer jetzt 'MoToTimer' ( 'EggTimer' funktioniert aber auch noch - bis auf weiteres ).
/* - Gesteuerter Ablauf für DC-Car System 1:87, "Bundeswehr" - Auslösung durch Hallsensoren in der Fahrbahn, - schaltbare Stoppimpulse werden vom DC-Car Funktionsdekoder erzeugt - Fahrzeugverteilung durch unterschiedliche Polarität der Magneten am Fahrzeug - Ablauf wird im Seriellen Monitor ausgegeben 2020/ e69-fan */ const int HALL_0 = A0; //Verteilung const int HALL_1 = A1; //HALL_Sensor1 const int HALL_2 = A2; //HALL_Sensor2
const int RELAIS_STOP = 2; //IR1 - IR2 const int RELAIS_BLINK = 3; //Blinkrelais const int RELAIS_HELI = 4; //Helikopter
const int servoVerteilung = 5; //Verteilung const int servo2_Drehtor = 6; //Drehtor
// -------------------- STARTposition ------------------------------------------ // // beim Start schalten alle Relais auf HIGH/AUS, LOW schaltet Relais EIN //
Hallo Wolfgang, was mir so auf den ersten Blick auffällt: deine Verwendung der geschweiften Klammern ist sehr 'kreativ' . Da musst Du dich unbedingt nochmal mit der genauen Verwendung und Syntax befassen - speziell im Zusammenhang mit 'switch' . Auch wenn es kompiliert, heißt das nicht, das es korrekt ist. Hinter die 'case' Zeilen gehört keine '{', aber der gesamte Switch-Block muss in einen Anweisungsblock { ... } . Also eine geöffnete hinter die switch-Anweisung, und die dann hinter dem letzten case-Block wieder schließen. Auch gehört zwischen das if (...) und die dazugehörige '{' kein Semikolon. Da sind auch ein paar drin. Das ist zwar rein syntaktisch nicht falsch, aber es macht nicht das, was Du willst. Oft ist es auch sinnvoll, in den Voreinstellungen die Warnungen einzuschalten. Viele der 'üblichen' Fehler, die zwar syntaktisch korrekt sind aber meist nicht das machen was man beabsichtigt, kennt der Compiler und warnt davor. Zwar ist nicht gleich jede Warnung wirklich ein Fehler, aber sehr oft hat der Compiler da schon recht und besser ist es so zu programmieren, dass (fast) gar keine Warnungen ausgegeben werden.
Alle 'attach' für die Servos gehören ins Setup. Das wird nur einmal zugeordnet. Auch setSpeed musst Du nur machen, wenn es sich wirklich ändert. Ansonsten reicht es einmal im setup.
Ich würde den Schritten 'sprechende' Namen geben ( entsprechend den Kommentaren ). Einfach durchnummeriren ist etwas nichtssagend, da könntest Du auch gleich bei den Zahlen 0...7 bleiben.
Ansonsten scheint es vom Grundprinzip ok zu sein. Ob das jetzt in allen Einzelheiten so passt, kann ich natürlich nicht nachvollziehen.
/* - Gesteuerter Ablauf für DC-Car System 1:87, "Bundeswehr" - Auslösung durch Hallsensoren in der Fahrbahn, - schaltbare Stoppimpulse werden vom DC-Car Funktionsdekoder erzeugt - Fahrzeugverteilung durch unterschiedliche Polarität der Magneten am Fahrzeug - Ablauf wird im Seriellen Monitor ausgegeben 2020/ e69-fan */ const int HALL_0 = A0; //Verteilung const int HALL_1 = A1; //HALL_Sensor1 const int HALL_2 = A2; //HALL_Sensor2
const int RELAIS_STOP = 2; //IR1 - IR2 const int RELAIS_BLINK = 3; //Blinkrelais const int RELAIS_HELI = 4; //Helikopter
const int servoVerteilung = 5; //Verteilung const int servo2_Drehtor = 6; //Drehtor
// -------------------- STARTposition ------------------------------------------ // // beim Start schalten alle Relais auf HIGH/AUS, LOW schaltet Relais EIN //
if (!digitalRead(HALL_0) && !Verteilung.moving() && !myTimer_Verteilung.expired() ) { Serial.println("HALL_0 wurde ausgelöst"); Serial.println("Fahrt Richtung Bundeswehr für *25000*"); Verteilung.write(50); //Richtung "Bundeswehr" myTimer_Verteilung.setTime(2500); //Servostellung "Bundeswehr" } if (myTimer_Verteilung.expired() ) { Verteilung.write(80); //Richtung "Zivil" Serial.println ("Grundstellung - Zivil"); } // --------------------- Helikopterstart ----------------------------------------- //
if (!digitalRead(HALL_1) && !HELIKOPTER.running() ) { HELIKOPTER.setTime( 50000 ); digitalWrite(RELAIS_HELI, LOW); Serial.println("Helikopter - für *50000* AN"); } if (HELIKOPTER.expired() ) { Serial.println("Helikoptereit *50000* abgelaufen"); digitalWrite( RELAIS_HELI, HIGH ); Serial.println("Helikopter - AUS"); } // xxxxxxxxxxxxxxxxxxxx Fahrt in die Bundeswehranlage xxxxxxxxxxxxxxxxxxxx //
switch (DC_Car) {
// ----------------------------------------------------------------- // case Start_HALL_1_AN:
if (!digitalRead(HALL_1) && !Wartezeit1.running() ) { Serial.println("HALL_1 wurde ausgelöst"); digitalWrite(RELAIS_BLINK, LOW); Serial.println("Blinklicht- AN"); Serial.println("Verzögerung - *5000*"); Wartezeit1.setTime( 5000 ); } if (Wartezeit1.expired() ) { DC_Car = Tor_wird_geoeffnet; } break; // ----------------------------------------------------------------- // case Tor_wird_geoeffnet:
if (BLINKRELAIS_Status == true) { Drehtor.write(40); Serial.println ("Tor wird geöffnet"); DC_Car = Tor_ist_offen; } break; // ----------------------------------------------------------------- // case Tor_ist_offen:
if (Drehtor.moving() == 0) { Tor_AUF.setTime( 5000 ); Serial.println ("Tor steht offen"); Serial.println ("Fahrzeug fährt in den Kontrollbereich"); Serial.println ("Fahrzeit - *5000*"); DC_Car = Fahrt_zur_Kontrolle; } break; // ----------------------------------------------------------------- // case Fahrt_zur_Kontrolle:
if (Tor_AUF.expired() ) { digitalWrite(RELAIS_STOP, LOW); // IR1_rot / IR_2_grün DC_Car = Kontrollanfang; } break; // ----------------------------------------------------------------- // case Kontrollanfang:
if (STOP_RELAIS_Status == true) { Serial.println ("Fahrzeug hält im Kontrollbereich"); Kontrollzeit.setTime (10000); Serial.println ("Kontrollzeit *10000*"); DC_Car = Kontrollende; } break; // ----------------------------------------------------------------- // case Kontrollende:
if (Kontrollzeit.expired() ) { digitalWrite(RELAIS_STOP, HIGH); // IR1_rot / IR_2_grün Serial.println ("Fahrzeug fährt aus dem Kontrollbereich in Richtung HALL_2"); DC_Car = HALL_2; } break; // ----------------------------------------------------------------- // case HALL_2:
if (!digitalRead(HALL_2) ) { Serial.println ("HALL_2 wurde ausgelöst"); Drehtor.write(140); //Tor wird geschlossen Serial.println ("Tor wir geschlossen"); Serial.println ("Schließdauer - *5000*"); Tor_ZU.setTime (5000); DC_Car = Tor_wird_geschlossen; } break; // ----------------------------------------------------------------- // case Tor_wird_geschlossen:
Es werden keine Fehler angezeigt - oder fehlt noch was ?
Wenn alles i.O. geht es zum nächsten Teil - das Fahrzeug muss ja noch tanken und dann den Bundeswehrbereich verlassen, mit Rücksicht auf die Vorfahrt des kreuzenden Zivilverkehr.
Zitat Es werden keine Fehler angezeigt - oder fehlt noch was ?
Das sagt nicht viel, und ob noch was fehlt kann man auch nicht so leicht erkennen. Die logischen Fehler im Sketch sind das, was immer schwierig zu finden ist. Der Compiler ist normalerweise recht einfach zufriedenzustellen. Ob der Sketch hinterher das macht, was Du willst, ist damit aber noch lange nicht gesagt. Deshalb sollte man auch die Funktionalität schrittweise prüfen. Also immer eine Funktionalität einbauen, und dann am 'lebenden Objekt' testen, ob die auch so funktioniert, wie DU dir das vorstellst. Erst dann das nächste einbauen. Hast Du den Sketch schonmal mit deiner echten HW laufen lassen? Bevor Du weitere Funktionalität hinzufügst, solltest Du das auf jeden Fall machen.