Darf ich um Tipps zur Programmierung bitten?

Die internen Pullups sind mit ca. 50k ziemlich hochohmig.

Habe es mit 1kOhm Widerständen versucht. Statt bei jedem 3. bis 5. mal ist es nun erst beim 9. mal passiert. Dann habe ich 10kOhm probiert und damit ist es jetzt bei ca. 20 Versuchen kein einziges mal passiert. Ich löte die mal rein und schau, wie es weiter geht.

Was hast du mit der Abschirmung des Ethernet Kabels gemacht? Diese auf Masse zu legen kann auch helfen. Entweder einseitig (erst mal das probieren) oder beidseitig. Was da besser ist ist etwas kontrovers, hängt aber auch von der Anwendung ab

Die Abschirmung habe ich nicht auf Masse gelegt. Ich habe fertige Patchkabel verwendet und wollte da nichts aufschneiden um an die Abschirmung zu kommen.
Ich könnte höchstens das Steckergehäuse anzapfen. Dazu müsste ich aber irgendwie einen Schleifkontakt an der Buchse anbringen, der das Steckergehäuse berührt, wenn der Stecker angesteckt ist. Ich habe nämlich an beiden Teilen nur Steckbuchsen, damit ich die Kabel an und abstecken kann. Das hat den Vorteil, dass ich das Arduinoteil einfach abstecken, mit raus nehmen und dort mit einem kurzen Patchkabel an das Relaisteil anstecken kann.

Zu früh gefreut. Jetzt passiert es wieder sehr häufig. Habe auch mal versucht die Abschirmung mit Masse zu verbinden. Das bringt gar nichts.
Ich muss mal schauen, ob ich das per Software in den Griff bekomme.

Ist das Kabel überhaupt geschirmt? Es gibt ja auch UTP, was bei einfachen Kabeln sogar häufiger ist.

Es gibt auch Buchsen/Adapter, bei denen man an die Schirmung einfach rankommt

Nachdem ich Durchgang von einem Steckergehäuse zum anderen habe, gehe ich davon aus, dass das über die Schirmung erfolgt und das Kabel daher geschirmt ist.

Nachdem das Verbinden selbiger Steckergehäuse mit Masse nichts gebracht hat, brauche ich auch keine Buchse, wo man an die Schirmung kommt.

Nachdem das Verbinden selbiger Steckergehäuse mit Masse nichts gebracht hat

Ich habe ja das Steuergerät in dem der Arduino verbaut ist, mittels eines Cat5 Kabels mit einem anderen Teil, wo die Relais sitzen verbunden. Über diese Leitung laufen nun die Signale von den Endschaltern vom Relaisteil zum Arduinoteil und für die Relais vom Arduinoteil zum Relaisteil. Zusätzlich habe ich im Relaisteil 2 Taster vorgesehen, die es ermöglichen sollen, von dort ebenfalls den Arduino zu steuern, eben so, als würde man die Taster am Arduinoteil drücken. Diese Leitungen sind nun noch nicht im Relaisteil an Taster angeschlossen, aber im Arduinoteil bereits an die Tasterpins angeschlossen.

Die Endschalter sind OK, die Taster aber nicht?
Und für alle nimmst du jeweils verdrillte Adern-Pärchen?

Wenn du sagst, mit 10k PullUp ist es besser als mit 1k, liegt vermutlich das Problem ganz woanders.

Wenn ich den Arduino vom USB Kabel nehme und wieder anstecke, dann passiert es alle paar mal, dass eines der Relais eingeschalten wird

Mit dem USB Kabel machst du den Arduino stromlos, bzw. erzeugst einen Reset beim Einstecken ?

michael_x:
Die Endschalter sind OK, die Taster aber nicht?
Und für alle nimmst du jeweils verdrillte Adern-Pärchen?

Die Taster sind auch ok. Daran liegt es nicht. Ich habe keine Ahnung, woran es liegt, aber offenbar konnte eine Änderung im Sketch das Problem beheben. Jedenfalls tritt es seither nicht mehr auf.
Und ich verwende die Leiter einzeln. Brauche genau 8 Leiter für meine Anwendung und da ist das Patchkabel ideal. Zumindest theoretisch.

Wenn du sagst, mit 10k PullUp ist es besser als mit 1k, liegt vermutlich das Problem ganz woanders.

Ja, das liegt bestimmt ganz wo anders. Es hat sich dann gezeigt, dass es mit den 10k Pullup auch nicht besser war. Irgendwann kam der Fehler dann auch in kürzeren Abständen.

Mit dem USB Kabel machst du den Arduino stromlos, bzw. erzeugst einen Reset beim Einstecken ?

Ja.

Ich habe im Sketch 2 Funktionen, die ich in der setup Funktion aufrufe. Da werden die Pins initialisiert.
Mir ist dann aufgefallen, dass die Relaispins nicht explizit auf LOW gesetzt werden. Ist vermutlich auch nicht notwendig.
Hier sind die zwei Funktionen, die nacheinander in der setup Funktion aufgerufen werden

void InitInputPins () {
  // setting pin modes and attaching buttons
  pinMode(BtnUpPin, INPUT_PULLUP);
  BtnUp.attach(BtnUpPin);
  BtnUp.interval(5);
  BtnUp.update();

  pinMode(BtnDnPin, INPUT_PULLUP);
  BtnDn.attach(BtnDnPin);
  BtnDn.interval(5);
  BtnDn.update();

  pinMode(SwTopPin, INPUT_PULLUP);
  SwTop.attach(SwTopPin);
  SwTop.interval(20);

  pinMode(SwBotPin, INPUT_PULLUP);
  SwBot.attach(SwBotPin);
  SwBot.interval(20);

  // get endswitch states
  SwTop.update ();
  SwBot.update ();
  SwTopState = digitalRead (SwTopPin);
  SwBotState = digitalRead (SwBotPin);
}

void InitOutputPins () {
  pinMode(LedUpPin, OUTPUT);
  pinMode(LedCenterPin, OUTPUT);
  pinMode(LedDnPin, OUTPUT);
  pinMode(LedOnPin, OUTPUT);
  pinMode(RelUpPin, OUTPUT);
  pinMode(RelDnPin, OUTPUT);

  // set red LEDs to low and green LED to high, to show the initialisation is done
  digitalWrite(LedCenterPin, LOW);
  digitalWrite(LedOnPin, HIGH);

  // set the LEDs according to the state of the endswitches
  digitalWrite (LedUpPin, SwTopState);
  digitalWrite (LedDnPin, SwBotState);
}

Ich habe nun in der setup Funktion am Ende noch folgende Zeilen eingefügt:

  digitalWrite(RelDnPin, LOW);
  digitalWrite(RelUpPin, LOW);
  BtnUp.update();
  BtnDn.update();

Seither ist der Fehler kein einziges Mal aufgetreten.
Ich wollte dann wissen, ob das LOW setzen der Relaispins alleine auch reicht und habe die update Methoden der Buttons raus genommen. Dann ist der Fehler wieder aufgetreten.
Habe jetzt noch nicht getestet, was passiert, wenn ich nur die Button.update Zeilen drinnen lasse.

Nachdem es jetzt zu passen scheint, lasse ich es mal so.

Hallo,

wenn erneut Probleme würde ich einen kompletten und lesbaren Schaltplan an dieser Stelle verlangen ... :slight_smile:

Reicht eine Handzeichnung? Dann mache ich eine.

Hallo,

wenn die lesbar ist ist das okay.

Es ist immer sinnvoll während der Initialisierung Schaltausgänge auf bestimmte Pegel zulegen. Um ganz sicher zu gehen erst digitalWrite auf LOW und danach pinMode als Output. Dann zuckt der Ausgang ganz sicher nicht. Irgendwelche Statusvariablen sollte man auch schon vorher festlegen.

Doc_Arduino:
Es ist immer sinnvoll während der Initialisierung Schaltausgänge auf bestimmte Pegel zulegen. Um ganz sicher zu gehen erst digitalWrite auf LOW und danach pinMode als Output. Dann zuckt der Ausgang ganz sicher nicht. Irgendwelche Statusvariablen sollte man auch schon vorher festlegen.

Zuerst digitalWrite und dann erst pinMode als Output?
Nicht umgekehrt?

Zuerst digitalWrite und dann erst pinMode als Output?
Nicht umgekehrt?

Wenn es überhaupt einen Unterschied macht, und du auf OUTPUT schalten willst, dann ja :wink:

Meines Wissens sind alle Pins INPUT und LOW ohne Pullup nach Reset, und selbst der Bootloader hinterlässt Pin13 (LED_BUILTIN) in diesem Zustand, wenn er an den Programm-Anfang springt.

Angenommen, ein Pin wäre im Modus INPUT_PULLUP und du schaltest ihn auf OUTPUT, wäre er sofort HIGH. Machst du aber einen Pin erst LOW, wird im Zweifelsfall nur der interne Pullup-Widerstand deaktiviert, was egal ist, wenn du den Pin nicht mehr abfragst. Schaltest du dann auf OUTPUT, ist der Pin sofort LOW.

Ah, ok. Danke für die Erklärung. Ich schau mir mal meinen Sketch durch und stelle das gegebenenfalls richtig.
Jetzt habe ich mir mal Eagle Cad runter geladen und installiert. Ich muss mich da mal einarbeiten, damit ich vernünftige Schaltpläne zeichnen kann.
Kann man eh immer brauchen. Das Geschmiere, das ich gerade mit Papier und Bleistift fabriziert habe, will ich hier niemanden zumuten.

Hallo,

ich hatte schon unerklärliche Effekte nach einschalten vor langer Zeit, weshalb ich den Ausgangspegel vorher festlege und danach auf Ausgang "schalte", im setup. Das habe ich mir seitdem so angewöhnt wenn es bei einem Ausgang darauf ankommt.

michael_x:
Meines Wissens sind alle Pins INPUT und LOW nach Reset,

Nö, alle Pins sind INPUT und floating nach einem Reset.

So, ich habe mir jetzt Eagle Cad installiert, und ein Tutorial im Schnelldurchgang durchlaufen und einen Versuch einen Schaltplan zu zeichnen gestartet.
Ich denke, man kann erkennen, wie es sein soll, auch wenn mit Sicherheit eventuell vorhandene Konventionen nicht beachtet wurden. Bitte deshalb um Nachsicht. Ich habe keinerlei Vorbildung in Elektronik und das ist das erste mal, dass ich so einen Schaltplan zeichne.

Der graue Balken in der Mitte sollte die Trennung zwischen Steuereinheit und Schalteinheit darstellen. Das Teil links wird im Haus sein und das Teil rechts draußen beim Mast.
Die verwendeten Relais sind bis 10A ausgelegt, aber das wird vermutlich zu wenig sein. Deshalb werden die auch nur stärkere Relais schalten, die dann den Motor in die entsprechende Richtung drehen. Da muss ich abwarten, wie das Teil in Natura aussieht. Eventuell gibt es da schon eingebaute Relais, die ich dann einfach ansteuern kann.
Das ist aber nicht das Problem. Das kriege ich schon hin.

Den aktuellen Sketch habe ich auch nochmal beigelegt.

mastctrl.ino (6.88 KB)

functions.ino (14.1 KB)

Die Widerstände an den Tastern passen nicht:

http://www.devreyapimi.com/wp-content/uploads/2011/10/pull-up-pull-down.jpg

Da habe ich die falsch eingelötet. Mist. Eigentlich sollten die doch gar nicht notwendig sein, wenn man die internen Pullup Widerstände aktiviert, oder? Habe die erst auf Anraten zusätzlich eingebaut, um so eventuell mein Problem zu lösen.
Ich werde die morgen mal umlöten.