INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Projekt Stellwerk Arduino
22.06.2020, 06:45 (Dieser Beitrag wurde zuletzt bearbeitet: 22.06.2020 09:50 von DB Nico.)
Beitrag #1
Projekt Stellwerk Arduino
Hallo Leute Smile

ich habe ein kleines Problem mit meinen Quellcode.
vlt könnt Ihr mir Helfen. Smile

Der Arduino Uno soll folgenden Ablauf haben, wenn er vom RAspberry eine 1 oder 2 bekommt:

0. LED Signal HAlt soll leuchten
1. Befehlserkennung
2. LED soll leuchten das ein Befehl eingegangen ist
3. Schiebeschalter soll in die richtige Stellung gebracht werden
4. Servo soll umlaufen
5. Nach drücken eines Button soll die Befehls LED und Signal HAlt LED ausgehen und die LED für Signal angehen.
6. Rückmeldung an Raspberry das Befehl ausgeführt wurde.

Zurzeit leuchten die LEDs wie sie wollen und sobald beide Befehle übertagen wurden leuchten fast alle LED gleichzeitig, egal welche Stellung der Servo hat


Code:
#include <Servo.h>
#include <Wire.h>

Servo myservo;

#define SLAVE_ADD 0x08
#define SERVO   9
int mode = 0;
int prevMode = 0;
int servoPos = 0;                                 //Weichenantrieb
int targetServoPos = 0;
const int SWITCH = 2;
int switchState = 0;
const int buttonPin = 4;
int buttonState = 0;                            // Weichenhebel                           // Fahrstraßenfestlegung
const int led_1 = 7;
const int led_2 = 8;
const int led_3 = 12;
const int led_4 = 13;
int led_1State = 0;                               // Befehlsempfang
int led_2State = 0;                               // Rotausleuchtung
int led_3State = 0;                               // Signal auf Fahrt Fahrstraße A/2
int led_4State = 0;                               // Signal auf Fahrt Fahrstraße B/2
long currentMillis = 0;
long previousMillis = 0;
int interval = 50;
bool state = false;
void setup()
{
  myservo.attach(SERVO);
  Serial.begin(9600);
  Wire.begin(SLAVE_ADD);
  Wire.onReceive(receiveData);
  Wire.onRequest(sendData);
  Serial.println("Ready!");
  previousMillis = millis();
  pinMode(led_1, OUTPUT);
  pinMode(led_2, OUTPUT);
  pinMode(led_3, OUTPUT);
  pinMode(led_4, OUTPUT);
  pinMode(SWITCH, INPUT);
  pinMode(buttonPin, INPUT);
}
void loop()
{  
buttonState = digitalRead(buttonPin);
switchState = digitalRead(SWITCH);
  
    if (mode == 1){                         // Befehl Fahrstraße A/2
      digitalWrite(led_1, HIGH);            // Befehlsausleuchtung
      
    }
      if (switchState == HIGH){           // Weichenhebel
      
         targetServoPos = 50;               // Weiche stellt sich um
           }
              if (buttonState == HIGH){   // Fahrstraßenhebel+Signalhebel
                digitalWrite(led_1, LOW);
                digitalWrite(led_4, LOW);
                digitalWrite(led_2, LOW);
                digitalWrite(led_3, HIGH);   // Signal geht auf Fahrt
           }            
    
   else if (mode == 2){                     // Befehl Fahrstraße B/2
      digitalWrite(led_1, HIGH);            // Befehlsausleuchtung
          
      if (switchState == LOW){           // Weichenhebel
               targetServoPos = 100;              // Weiche stellt sich um
            }
              if (buttonState == HIGH){   // Fahrstraßenhebel
                digitalWrite(led_1, LOW);
                digitalWrite(led_3, LOW);
                digitalWrite(led_2, LOW);
                digitalWrite(led_4, HIGH);   // Signal geht auf Fahrt
              }
                }
  else{            
    digitalWrite(led_1, LOW);
    digitalWrite(led_2, HIGH);              // Rotausleuchtung Signal
    digitalWrite(led_3, LOW);              
    digitalWrite(led_4, LOW);
  }
  currentMillis = millis();
  if (currentMillis - previousMillis > interval) {
    previousMillis = currentMillis;

    if (servoPos < targetServoPos) {
      servoPos += 2;
    }
    else if (servoPos > targetServoPos) {
      servoPos -= 2;
    }
    myservo.write(servoPos);
  }
}
void receiveData(int byteCount){
  mode = Wire.read();
  Serial.print("I2C Master: ");
  Serial.println(mode);
  state = (mode ==1)
  ? 1
  : 2;
}
void sendData(){
  Wire.write(mode);
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.06.2020, 09:43
Beitrag #2
RE: Projekt Stellwerk Arduino
Stelle Deinen Sketch bitte in Codetags.
Wie das geht, steht hier.
Das kannst Du auch noch nachträglich ändern.

Außerdem entferne bitte die unnötigen Leerzeilen und formatiere den Code ordentlich (<Strg>+T in der IDE hilft Dir dabei).

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.06.2020, 10:15
Beitrag #3
RE: Projekt Stellwerk Arduino
Was mir mal so auf den ersten Blick aufgefallen ist:

Das hier:
Code:
else if (mode == 2) {                    // Befehl Fahrstraße B/2
sollte doch eher ein else zu folgendem if sein:
Code:
if (mode == 1) {                        // Befehl Fahrstraße A/2
oder?
So wie Du die geschweifen Klammern gesetzt hast, ist das aber nicht der Fall.

Ausserdem: Wo wird eigentlich 'mode' wieder zurückgesetzt, wenn der Befehl ausgeführt wurde?

Und wer soll den Schiebeschalter betätigen? So ganz ist mir der Ablauf noch nicht klar - vor allem im Zusammenhang mit dem Sketch.
Es wäre auch wesentlich leichter zu verstehen, wenn Du den Variablen und Pinnummern Namen geben würdest, die auch zur jeweiligen Funktionalität passen. So allgemein mit 'led_1' oder 'buttonState' ist das recht nichtssagen und erschwert das Verständnis des Sketches ( übrigens sicher auch für dich, wenn Du da nach ein paar Wochen Pause mal wieder reinschaust ).

Eigentlich ist das ganze ein Musterbeispiel für einen 'Zustandsautomaten' Wink

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.06.2020, 12:01
Beitrag #4
RE: Projekt Stellwerk Arduino
also statt else if nur else?

das habe ich tatsächlich vergessen... komisch ^^
reciht da am ende einfach reset mode?

ja das wäre wirklich besser, weil ich das teilprojekt weitergeben muss.

Zustandautomaten musst du mir mal etwas näher bringen.... komme mit dem code der da geschrieben ist nicht wirklich klar.
Aber so wie er beschrieben ist ist es genau das was ich brauche
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.06.2020, 13:40
Beitrag #5
RE: Projekt Stellwerk Arduino
(22.06.2020 12:01)DB Nico schrieb:  also statt else if nur else?
Nein, das else if ist schon ok. Die Klammern sind falsch gesetzt:
Code:
if (mode == 1){                         // Befehl Fahrstraße A/2
      digitalWrite(led_1, HIGH);            // Befehlsausleuchtung
      
    // }  <<---------------- die hier
      if (switchState == HIGH){           // Weichenhebel
    ......
           }            
   } // <<< muss hier hin
   else if (mode == 2){                     // Befehl Fahrstraße B/2
Sonst wird z.B. der Weichenhebel da immer abgefragt mit entsprechendem Setzen der Led's und nicht nur im Mode 1

(22.06.2020 12:01)DB Nico schrieb:  das habe ich tatsächlich vergessen... komisch ^^
reciht da am ende einfach reset mode?
'reset gibt's da eher nicht Wink - einfach mode = 0;


(22.06.2020 12:01)DB Nico schrieb:  Zustandautomaten musst du mir mal etwas näher bringen.... komme mit dem code der da geschrieben ist nicht wirklich klar.
Aber so wie er beschrieben ist ist es genau das was ich brauche
Ich hatte für meine Modellbahnkollegen mal eine Tutorial geschrieben. Da ging es primär zwar darum, wie man ohne delay() programmiert. Es kommt aber auch ein Zustandsautomat zum Einsatz. Vielleicht hilft dir das ja auch.

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.06.2020, 14:03
Beitrag #6
RE: Projekt Stellwerk Arduino
ahhhhh ^^
da hat sich der kriebel versteckt.
Habe ich übersehen.

Lese ich mir gerade durch. Danke dir.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.06.2020, 10:35 (Dieser Beitrag wurde zuletzt bearbeitet: 23.06.2020 10:54 von DB Nico.)
Beitrag #7
Wink RE: Projekt Stellwerk Arduino
Hallo Mirco.
Ich habe mir aufmerksam deine Anleitung durchgelesen und muss sagen Top.
Sehr gut Erklärt und hat mich etwas weitergebracht.
Nun will ich es genau so Aufziehen.
Ich habe mal die Grundlogik entworfen, nur kann ich diese noch nicht in deinen Code umsetzten (jedenfall nicht alles) und brauche nochmal deine Hilfe.

Mein Konzept und meinen Lageplan sowie Verschlussplan findet Ihr im Anhang.


PS.: Habe dort leider B1 statt B2 und W2 statt W1 geschrieben ^^
nicht das es da zu Verwirrungen kommt...der Lageplan ist richtig
B2 und W1 sind 2 einzelne Arduinos.


Angehängte Datei(en) Thumbnail(s)
   

.docx  Logik Chausen.docx (Größe: 21,16 KB / Downloads: 4)
.xlsx  Verschlussplan Bf Chausen W1 & B2.xlsx (Größe: 55,1 KB / Downloads: 2)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.06.2020, 15:10 (Dieser Beitrag wurde zuletzt bearbeitet: 23.06.2020 15:13 von MicroBahner.)
Beitrag #8
RE: Projekt Stellwerk Arduino
Ok ... da hast Du dir was vorgenommen...
Für meinen Bahnhof habe ich auch so ein vorbildnahes Stellwerk gebaut. Ok, der Bahnhof ist etwas größer, und es wird auch der Fahrstrom der Züge gesteuert. Aber die Entwicklung hat ca. ein Jahr gedauert - und ich musste nicht programmieren lernen Big Grin .
Wie sieht das denn bei dir aus - kann da immer nur eine Fahrstraße aktiv sein oder ist z.B. von der einen Seite eine Einfahrt möglich, wenn auf der anderen Seite ein Zug von einem anderen Gleis ausfährt? Wenn ich deine Liste richtig verstehe, soll immer nur einen Fahrstraße gleichzeitig möglich sein?

Bei meinem Stellwerk gibt es nicht nur einen Zustandsautomaten. Da hat jede Fahrstraße einen eigenen ( und jedes Gleis - für die Überwachung - auch ). Und gibt es bei dir Belegtmeldungen, oder muss die Gleisbelegung der Bediener kontrollieren und überwachen ( damit keinen falsche Fahrstraße eingestellt wird ).

P.S. sind dir Arrays und/oder Strukturen ein Begriff? Wenn man so etwas vernünftig umsetzen will, braucht man das auf jeden Fall.

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Projekt: Bewegunsmeldung per Lorawan Bodycocoon 23 1.079 19.05.2020 14:05
Letzter Beitrag: GuaAck
  Kleines Projekt mit RFID Stefu1987 31 1.382 11.05.2020 20:24
Letzter Beitrag: Retian
  Neuling mit Fragen für sein Projekt Inferno481 8 722 19.04.2020 20:53
Letzter Beitrag: Tommy56
  Erstes Projekt Ampelsteuerung HankfromHell 13 815 02.04.2020 21:56
Letzter Beitrag: hotsystems
  Blutiger Anfänger/ Projekt: Visuelle Takthilfe bencha 17 1.408 01.03.2020 17:45
Letzter Beitrag: Tommy56
  Projekt Haushaltsplaner Eisverkäufer 1 587 06.11.2019 13:00
Letzter Beitrag: Tommy56
  Wert von einem Arduino zu einem zweiten Arduino senden Thorsten_S 9 1.947 14.10.2019 14:48
Letzter Beitrag: Thorsten_S
  Hilfe für Kita-Projekt gesucht. cyberiss 8 1.932 06.08.2019 07:57
Letzter Beitrag: Der Hobbyelektroniker
  Projekt Abfüllstation georg_sr 14 2.561 03.11.2018 20:57
Letzter Beitrag: Joergi-1911
  Projekt Werkstattheizung Joergi-1911 15 3.358 24.10.2018 18:59
Letzter Beitrag: Joergi-1911

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste