Projekte und Tutorials für Arduino › Foren › StartHardware-Forum › Eisenbahn
Schlagwörter: PWM Schnittstelle
- Dieses Thema hat 11 Antworten und 3 Teilnehmer, und wurde zuletzt aktualisiert vor 3 Jahren, 11 Monaten von Stefan Hermann.
-
AutorBeiträge
-
Hans-PeterTeilnehmer
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.
Hans-PeterTeilnehmerdas @ 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’Hans-PeterTeilnehmerich 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 :-)
Stefan HermannAdministratorJa 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 :-)
Hans-PeterTeilnehmerNoch ne Frage:
ich habe diesen Baustein (mehrfach):
https://www.amazon.de/ANGEEK-Switching-Modul-Treiber-Arduino-Raspberry/dp/B07JYHV475/ref=asc_df_B07JYHV475/?tag=googshopde-21&linkCode=df0&hvadid=310171387088&hvpos=1o4&hvnetw=g&hvrand=7812368140693266401&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=9044029&hvtargid=pla-634178210596&psc=1&th=1&psc=1&tag=&ref=&adgrpid=62111506059&hvpone=&hvptwo=&hvadid=310171387088&hvpos=1o4&hvnetw=g&hvrand=7812368140693266401&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=9044029&hvtargid=pla-634178210596
Wie schließe ich die an den Mega an, und wie programmiere ich sie?
Kann mir Jemand ein Beispiel geben?
Danke im Voraus.Franz-PeterTeilnehmerHallo 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-PeterHans-PeterTeilnehmerGuten 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.
Franz-PeterTeilnehmerHallo 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-PeterStefan HermannAdministrator@Franz-Peter: Ah, das ist ja spannend. Das wusste ich auch noch nicht. Die bestelle ich gleich mal.
Hans-PeterTeilnehmerNoch 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.
Franz-PeterTeilnehmerHallo 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-PeterStefan HermannAdministrator@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
-
AutorBeiträge