Zum Inhalt springen

Eisenbahn

Schlagwörter: 

Ansicht von 12 Beiträgen - 1 bis 12 (von insgesamt 12)
  • Autor
    Beiträge
  • #6637 Antworten
    Hans-Peter
    Teilnehmer

    Moin zusammen,
    ich brauche noch einmal Hilfe,
    Ab der 2. IF Anweisung läuft der Test nicht mehr weiter. Fehlermeldungen:

    ===========================

    Miniclub_Version_1:119:1: error: stray '@' in program
    
     @if (digitalRead(SG_2)==HIGH){
    
     ^
    
    Miniclub_Version_1:119:2: error: expected unqualified-id before 'if'
    
     @if (digitalRead(SG_2)==HIGH){
    
      ^~
    
    Miniclub_Version_1:127:5: error: expected unqualified-id before 'else'
    
       } else {
    
         ^~~~
    
    Miniclub_Version_1:131:3: error: expected unqualified-id before 'while'
    
       while (SG_3=LOW)
    
       ^~~~~
    
    Miniclub_Version_1:136:3: error: expected declaration before '}' token
    
       }
    
       ^
    
    exit status 1

    stray ‘@’ in program
    ====================================================
    So sieht das Programm aus:
    ====================================================

    //Variablendefinition
    
    //Gleis bestromen Pin 1 bis 10
    //Gleis 1 im Schattenbahnhof aussen
    int Gleis_1=1;
    //Gleis 2 im Schattenbahnhof innen
    int Gleis_2=2;
    //Gleis 3 im Bahnhof aussen
    int Gleis_3=3;
    //Gleis 4 im Schattenbahnhof innen
    int Gleis_4=4;
    //Gleis 5 Innengleis
    int Gleis_5=5;
    //Gleis 6 Abstellgleis im Schattenbahnhof
    int Gleis_6=6;
    //Ausßengleis bestromen
    int Aussengleis=7;
    
    //Weichen Schalten Pin 11-15
    //Weichen aus Gleis 1 schalten 
    int Weichen_Gleis_1=11;
    //Weichen aus Gleis 2 schalten
    int Weichen_Gleis_2=12;
    //Weichen aus Gleis 3 schalten
    int Weichen_Gleis_3=13;
    //Weichen aus Gleis 4 schalten
    int Weichen_Gleis_4=14;
    
    //Schaltgleise Pin 21-25
    //Schaltgleis Gleis 1
    int SG_1=21;
    //Schaltgleis Gleis 2
    int SG_2=22;
    //Schaltgleis Gleis 3
    int SG_3=23;
    //Schaltgleis Gleis 4
    int SG_4=24;
    //Schaltgleis Gleis 5
    int SG_5=25;
    
    void setup() {
      // Pindefinitionen
      pinMode(Gleis_1, OUTPUT);
      pinMode(Gleis_2, OUTPUT);
      pinMode(Gleis_3, OUTPUT);
      pinMode(Gleis_4, OUTPUT);
      pinMode(Gleis_5, OUTPUT);
      pinMode(Gleis_6, OUTPUT);
      pinMode(Aussengleis, OUTPUT);
      pinMode(Weichen_Gleis_1, OUTPUT);
      pinMode(Weichen_Gleis_2, OUTPUT);
      pinMode(Weichen_Gleis_3, OUTPUT);
      pinMode(Weichen_Gleis_4, OUTPUT);
      pinMode(SG_1, INPUT);
      pinMode(SG_2, INPUT);
      pinMode(SG_3, INPUT);
      pinMode(SG_4, INPUT);
      pinMode(SG_5, INPUT);
    
      //Startkonfiguartion
      //Gleis 1 und 2 im Schattenbahnhof belegt
      //Gleis 3 belegt
      //Gleis 5 im Bahnhof belegt
    
      // Weichen Grundstellung schalten
      //Weichen zum befahren von Gleis 1 schalten
    digitalWrite(Weichen_Gleis_1, HIGH);
    delay(500);
      //Weichen zum befahren von Gleis 4 schalten
    digitalWrite(Weichen_Gleis_4, HIGH);
    delay(500);
      //Gleis 5 bestromen
    digitalWrite(Gleis_5, HIGH);
      //Aussengleis 7 bestromen
    digitalWrite(Aussengleis, HIGH);
    
      //Startaktion
      //Gleis 1 für 2 sek. bestromen
    digitalWrite(Gleis_1, HIGH);
    delay(2000);
      //Gleid 4 für einfahrenden Zug bestromen
    digitalWrite(Gleis_4, HIGH);
    
    }
    
    void loop() {
      
      //Programmablauf:
      //Status: Gleis 1 - 1
      //        Gleis 2 - 1
      //        Gleis 3 - 1
      //        Gleis 4 - 0  
      //(0) Zug läuft von Gleis 1 in Gleis 4 (SG_4=HIGH) ein, bleibt stehen, schaltet die Weichen für Gleis 2 und 3 und bestromt Gleis 2
    if (digitalRead(SG_4)==HIGH){
        digitalWrite(Gleis_4, LOW);
        digitalWrite(Weichen_Gleis_3, HIGH);
        delay(500);
        digitalWrite(Weichen_Gleis_2, HIGH);
        delay(500);
        digitalWrite(Gleis_3, HIGH);
        digitalWrite(Gleis_2, HIGH);
      } else {
        digitalWrite(Gleis_6, LOW);
      }
      //Zug fährt von Gleis 3 nach Gleis 2. Programmablauf anhalten, bis der Zug in Gleis 2 einläuft (SG_2=HIGH)
      while (SG_2=LOW)
        delay(250);
      }
          
    
      
      //(1) Zug läuft von Gleis 4 in Gleis 2 ein (SG_2=HIGH), bleibt stehen, schaltet die Weichen für Gleis 1 und 4 und bestromt Gleis 1
      //Status: Gleis 1 - 1
      //        Gleis 2 - 0
      //        Gleis 3 - 1
      //        Gleis 4 - 1   
    @if (digitalRead(SG_2)==HIGH){
        digitalWrite(Gleis_4, LOW);
        digitalWrite(Weichen_Gleis_4, HIGH);
        delay(500);
        digitalWrite(Weichen_Gleis_1, HIGH);
        delay(500);
        digitalWrite(Gleis_3, HIGH);
        digitalWrite(Gleis_2, HIGH);
      } else {
        digitalWrite(Gleis_6, LOW);
      }
      //Zug fährt von Gleis 1 nach Gleis 3. Programmablauf anhalten, bis der Zug in Gleis 3 einläuft (SG_3=HIGH)
      while (SG_3=LOW)
        delay(250);
    
      
      }

    =======================================
    Die 1. und 2. anweisung sehen doch gleich aus. Wo ist der Fehler?

    Danke für eure Hilfe.

    #6638 Antworten
    Hans-Peter
    Teilnehmer

    das @ habe ich gelöscht
    -> @if (digitalRead(SG_2)==HIGH){
    die Zeile sieht jetzt so aus
    -> if (digitalRead(SG_4)==HIGH){

    Das ist die Fehlermeldung dazu:

    Miniclub_Version_1:119:1: error: expected unqualified-id before ‘if’

    if (digitalRead(SG_2)==HIGH){

    ^~

    Miniclub_Version_1:127:5: error: expected unqualified-id before ‘else’

    } else {

    ^~~~

    Miniclub_Version_1:131:3: error: expected unqualified-id before ‘while’

    while (SG_3=LOW)

    ^~~~~

    Miniclub_Version_1:136:3: error: expected declaration before ‘}’ token

    }

    ^

    exit status 1
    expected unqualified-id before ‘if’

    #6639 Antworten
    Hans-Peter
    Teilnehmer

    ich habs gefunden, gut wenn man drüber spricht.

    while (SG_2=LOW){
    delay(250);
    }

    //(1) Zug läuft von Gleis 4 in Gleis 2 ein (SG_2=HIGH), bleibt stehen, schaltet die Weichen für Gleis 1 und 4 und bestromt Gleis 1
    //Status: Gleis 1 – 1
    // Gleis 2 – 0
    // Gleis 3 – 1
    // Gleis 4 – 1
    if (digitalRead(SG_2)==HIGH){
    digitalWrite(Gleis_4, LOW);
    digitalWrite(Weichen_Gleis_4, HIGH);
    delay(500);
    digitalWrite(Weichen_Gleis_1, HIGH);
    delay(500);
    digitalWrite(Gleis_3, HIGH);
    digitalWrite(Gleis_2, HIGH);
    } else {
    digitalWrite(Gleis_6, LOW);
    }
    //Zug fährt von Gleis 1 nach Gleis 3. Programmablauf anhalten, bis der Zug in Gleis 3 einläuft (SG_3=HIGH)
    while (SG_3=LOW){
    delay(250);
    }

    }

    Danke :-)

    #6641 Antworten
    Stefan Hermann
    Administrator

    Ja cool, dass du es gefunden hast. Eine Anmerkung: Das einfache Gleichheitszeichen weist einen Wert zu. D.h. in diesem Fall:
    while (SG_3=LOW){ wird SG_3 auf LOW gesetzt. Somit ist die Abfrage wahr. Du musst wahrscheinlich eher das doppelte Gleichheitszeichen verwenden: while (SG_3==LOW){ Jetzt wird geprüft, ob SG_3 LOW ist oder nicht.

    Liebe Grüße :-)

    #6751 Antworten
    Hans-Peter
    Teilnehmer
    #6752 Antworten
    Franz-Peter
    Teilnehmer

    Hallo Hans-Peter,
    was willst Du denn damit schalten? Auch wenn es so beworben wird, aufgrund des verwendeten MosFets sind die Module für eine Ansteuerung mit Arduino eigentlich nicht geeignet. Zumindest nicht, wenn man wirklich höhere Ströme damit schalten will. Um voll durchzuschalten braucht der verwendete MosFet eine Eingangsspannung von 10V. Das kann der Arduino nicht liefern.
    Bei kleinen Strömen mag es noch gehen. Der Eingang kann dann direkt von einem Arduno-Pin angesteuert werden. Bei HIGH am Pin schaltet der Transistor ein.

    Gruß
    Franz-Peter

    #6754 Antworten
    Hans-Peter
    Teilnehmer

    Guten Morgen Franz-Peter,
    schalten will ich damit den Fahrstom für die Loks.
    Eingangsspannung 12V.
    Adruino ja 5V Schaltspannung :-)
    Ist auch so verkauft worden – jetzt nicht von Amazon, ich weiß nur grad nicht von wem ich die hab.
    Ich habe bei meinem Steuerungsaufbau 2 Schaltnetzteile, eines mit 5 V für die Steuerung und die LED’s, und eines mit 12V nur für den Fahrstrom.

    Frohe und besinnliche Weihnacht wünsch ich Dir und Deiner Familie.

    #6755 Antworten
    Franz-Peter
    Teilnehmer

    Hallo Hans-Peter
    Ist das für N-Lokomotiven? Dann sollte das schon funktionieren, so viel Strom ziehen die ja nicht. Auch H0 mag noch gehen.
    Ja ich weis, dass die für den Zweck verkauft werden. Aber technisch sind sie eigentlich ungeeignet. Man darf halt nicht alles glauben, was angepriesen wird ;) . Für die Ansteuerung vom Arduino brauchst Du eigentlich eine ‘Logic-Level-Mosfet’. Die kann ein Arduino komplett durchsteuern, so dass auch größere Ströme fließen können. Erkennbar sind diese oft am ‘L’ in der Typbezeichnung, z.B. der IRLZ44. Leider gibt es die kaum auf fertigen Modulen, da muss man also selber löten. Wesentlich teurer als die standard MosFets sind sie aber nicht, der Preisunterschied liegt eher im Cent-Bereich. Hier gibt’s was zu lesen dazu.
    Da die Loks induktive Lasten sind, solltest Du unbedingt auch eine Freilaufdiode einbauen ( ich vermute mal, dass die auf den Modulen nicht drauf ist ).

    Auch Dir und den Deinen wünsche ich eine schönes Weihnachtsfest
    Franz-Peter

    #6759 Antworten
    Stefan Hermann
    Administrator

    @Franz-Peter: Ah, das ist ja spannend. Das wusste ich auch noch nicht. Die bestelle ich gleich mal.

    #6760 Antworten
    Hans-Peter
    Teilnehmer

    Noch mal eine Frage zu Unterprogrammen:
    Ich möchte einige Routinen in unterprogrammen ablegeb, für die ich nur den Wert “SG_X” (welches Schaltgleis) betätigt wird,
    daruas folgen, welche Gleise mit PWM ansteigen bestromt (anfahren) werden bzw. welche Gleise mit PWM auf null (anhalten) gefahren werden.
    Ich hätte also die Variablen für die Schlatgleise, die Beschleunigungs- und Bremsgleise.
    Wie gehe ich das am Besten an?

    Euch einen guten Rutsch nach 2020 und eine gesegnetes, neues Jahr.

    #6761 Antworten
    Franz-Peter
    Teilnehmer

    Hallo Hans-Peter,
    wenn Du Funktionen einsetzt, kannst Du denen die erforderlichen Info’s als Parameter mitgeben.

    Zuerst solltest Du dich aber mal mit Arrays beschäftigen. Damit kannst Du dein Programm schonmal wesentlich kompakter und übersichtlicher machen. Der nächste Schritt wären dann die Funktionen ( so nennt man Unterprogramme in C/C++ ).

    @Stefan: ja, eigentlich sollte man in Arduino Projekten nur LL-MosFets einsetzen. Da ist man auf der sicheren Seite.

    guten Rutsch
    Franz-Peter

    #6763 Antworten
    Stefan Hermann
    Administrator

    @Franz-Peter: Ich werde demnächst mal meine Beiträge darauf umarbeiten. Ist wirklich eine gute Idee! Dir auch einen guten Rutsch. Liebe Grüße

Ansicht von 12 Beiträgen - 1 bis 12 (von insgesamt 12)
Antwort auf: Antwort #6754 in Eisenbahn
Deine Information: