Hallo Leute ich habe eine Arduino Schaltung für nen Kumpel zusammengebaut bei welcher folgender Code verwendet wurde.
Leider läuft die Schaltung noch ein wenig unzuverlässig was Fehlerströme etc. angeht da die Sensoren nur als INPUT definiert sind und auf jeden Furz reagieren. Ich habe schon 3 Widerstände eingesetzt in die Schaltung und gedacht dass jetzt Ruhe wäre aber ist es leider noch nicht ganz.
Wenn ich die 3 INPUT Pins jetzt als INPUT_PULLUP definiere und gleichzeitig die 3 Widerstände aus meiner Schaltung rausnehme müsste ja zumindest die Fehlauslösungen durch Fehlerströme aufhören oder sehe ich das falsch?
Die Schaltung selber ist schon komplett verlötet und aufgebaut da möchte ich nur sehr ungern nochmal was dran ändern (außer die 3 Widerstände wieder raus nehmen).
Laut wiki wird aber wenn man die Inputs als INPUT_PULLUP definiert die Funktion invertiert was eher schlecht wäre. Kann man das ganze nicht von der Software Seite irgendwie lösen dass die ganze Verkabelung gleich bleibt und die INPUTs nicht so störanfällig reagieren?
Kann ich also alle INPUT Pins als INPUT_PULLUP definieren und im code einfach vor jedes digitalRead der Pins ein ! hinschreiben um den Wert umzukehren?
Viele Grüße
//You need to download the JLed library! / JLED Library muss insatlliert sein!
#include <jled.h>
String LiftStatus;
auto ledSchalter = JLed(11).Breathe(4000).Forever().DelayAfter(0);
auto ledSchalterFast = JLed(11).Breathe(1000).Forever().DelayAfter(0);
void setup() {
pinMode(7, INPUT); // Endschalter oben / Limitswitch TOP
pinMode(5, INPUT); // Schalter / Taster / Main Button
pinMode(9, INPUT); // Endschalter unten / Limitswitch Bottom
pinMode(3, OUTPUT); // Lift nach oben / Relais 1 / Relay 1
pinMode(4, OUTPUT); // Lift nach unten / Relais 2 / Relay 2
//An Pin 11 = Schalter LED / Pin 11 = LED of the switch
if (digitalRead(7) == HIGH) {
LiftStatus = "oben";
} else {
LiftStatus = "unten";
}
}
void loop() {
ledSchalter.Update();
{
if (digitalRead(5) == HIGH) {
if (LiftStatus == "unten") {
while (!(digitalRead(7) == HIGH)) {
digitalWrite(3, HIGH);
ledSchalterFast.Update();
}
LiftStatus = "oben";
}
} else {
digitalWrite(3, LOW);
}
if (digitalRead(5) == HIGH) {
if (LiftStatus == "oben") {
while (!(digitalRead(9) == HIGH)) {
digitalWrite(4, HIGH);
ledSchalterFast.Update();
}
LiftStatus = "unten";
}
} else {
digitalWrite(4, LOW);
}
}
}
Also keine Sensoren, sondern Taster oder Schalter die einen Kontakt schließen.
Somit brauchst du zwingend Pullup-Widerstände oder Pulldown-Widerstände.
Diese kannst du als externe Widerstände hinzubauen, oder eben als Pullup-Widerstände die internen Widerstände verwenden.
Wenn anschließend immer noch Störungen auftreten, kann man die Widerstände kleiner auswählen.
Treten immer noch Störungen auf, hilft auch abgeschirmte Kabel.
Die externen Widerstände haben es besser gemacht aber reichen nicht aus.
Ist es also möglich das Programm wie oben beschrieben anzupassen ?
"Kann ich also alle INPUT Pins als INPUT_PULLUP definieren und im code einfach vor jedes digitalRead der Pins ein ! hinschreiben um den Wert umzukehren?"
Wäre das neue Programm dann Äquivalent zu dem Programm oben?
Warum deine Eingänge invertiert sind, verstehe ich allerdings nicht.
Wie das zu bewerten ist, hängt davon ab, ob du Pullup-Widerstände oder Pulldown-Widerstände verwendest.
Das hast du bei den externen noch nicht geschrieben.
Ein externer Pullup-Widerstand hat die selbe Funktionen eines internen Pullup-Widerstand.
Ich will eigentlich gar nichts invertieren aber wenn ich diesen Ausschnitt aus dem Wiki richtig verstanden habe muss ich das ja, da sich INPUT_PULLUP genau andersrum verhält als INPUT.
Zitat aus dem Arduino Wiki:
There are 20K pullup resistors built into the Atmega chip that can be accessed from software. These built-in pullup resistors are accessed by setting the pinMode() as INPUT_PULLUP. This effectively inverts the behavior of the INPUT mode, where HIGH means the sensor is off, and LOW means the sensor is on.
Ob ich Pullup / Pulldown Widerstände verwendet habe weiß ich tatsächlich nicht aber hier ist ein exakter Schaltplan der verbauten Schaltung (die Widerstände würde ich ja auch aus der Schaltung komplett entfernen wenn ich mit INPUT_PULLUP arbeite):
(Anbei als PDF)
Ok, am Schaltbild kann man erkennen, dass die Taster/Schalter auf 5V schalten.
Dabei brauchst du Pulldown-Widerstände, damit es funktioniert.
Bei Pullup-Widerständen funktioniert deine Schaltung nicht.
Mit Pullup-Widerständen musst du die Schalter auf GND legen und auf LOW abfragen, also einiges umbauen.
agmue:
Hübsche Zeichnung, sieht man hier viel zu selten.
PullDown!
Geht nicht, dann müßten die Taster/Schalter nach GND schalten.
Die 4,7 kΩ könntest Du noch auf 1 kΩ verkleinern.
Oh hätte eigentlich gedacht dass ich es wenn mit höheren Widerständen probieren muss aber da hab ich wohl geirrt.
Dann probiere es erst einmal mit 1k Widerständen das ist am wenigsten Arbeit. Macht es Sinn die Widerstände so nah wie möglich an den Arduino zu löten (also das die Kabellängen zwischen Widerstand und Arduino sehr kurz sind)?
alex3480:
Oh hätte eigentlich gedacht dass ich es wenn mit höheren Widerständen probieren muss aber da hab ich wohl geirrt.
Dann probiere es erst einmal mit 1k Widerständen das ist am wenigsten Arbeit. Macht es Sinn die Widerstände so nah wie möglich an den Arduino zu löten (also das die Kabellängen zwischen Widerstand und Arduino sehr kurz sind)?
Ja, kleiner geht immer.
Aber nimm Pulldown-Widerstände, dicht am Arduino.
Wieso verwendest Du als Statusvariable einen String?
Wieso macht Du einen so komplizierten Konstrukt:
while (!(digitalRead(7) == HIGH))
einfacher ist es
while (digitalRead(7) == LOW)
oder weil die entschalter Wechsler sind nimmst Du einfach den NC Kontakt statt des NO.
Die Entscheidungsfindung ob den NO oder NC Kontakt zu verwenden erfolgt durch Analyse der Schaltung / Projekt. Da ein geschlossener Schalter einen Querstrom erzeugt; ein offener aber nur einen Leckstrom ist der Endschalter so zu nutzen daß möglichst wenig geschlossen ist. Bei einem Motor der immer von Endausschlag zu Endausschlag fährt ist das unerheblich weil meist immer ein Endschalter betätigt ist und der andere nicht.
Was ist das runde hellblaue Ding in der Mitte?
Relaismodule entsprechen selten den gesetzliche Vorgaben um sie mit 230VAC betreiben zu können.
Ursprünglich sollte für den Endschalter oben zwei Endschalter in Reihe verwendet werden.
Ist aber momentan nur ein einzelner Endschalter. Aber aus Interesse in wie fern würde es einen Unterschied machen wenn es zwei Endschalter in Reihe wären? ist doch auch nichts anderes als einer oder sehe ich das falsch?
alex3480:
Ursprünglich sollte für den Endschalter oben zwei Endschalter in Reihe verwendet werden.
Ist aber momentan nur ein einzelner Endschalter. Aber aus Interesse in wie fern würde es einen Unterschied machen wenn es zwei Endschalter in Reihe wären? ist doch auch nichts anderes als einer oder sehe ich das falsch?
Bei zweien kommt es immer drauf an, wie die angeschlossen und verbaut sind.
Ob geschlossen oder offen.
Da macht es schon einen Unterschied.
alex3480:
Aber aus Interesse in wie fern würde es einen Unterschied machen wenn es zwei Endschalter in Reihe wären? ist doch auch nichts anderes als einer oder sehe ich das falsch?
Man kann mehrere Endschalter verwenden um nach einem oberer und unterer Stop noch ein Notstop zu haben. Der Notstop blockiert den Motor. Der Motor kann nicht einfach aus einem notstop zurückgefahren werden. Praktisch sind die Endschalter und Notausschalter aber nicht in Reihe geschaltet sondern die Notausschalter schalten die Stromversorgung des Motors aus.
Was möglicherweise noch garnicht angesprochen wurde:
Schalter sollten einzeln über twisted pair Leitungen angeschlossen werden, um Einstreuungen in die Kabel zu minimieren. Wer es ganz exakt mag, kann die Pullup/down Widerstände an den Wellenwiderstand der Kabel anpassen. Die gemeinsamen Potentiale (Gnd oder Vcc) sollten erst am Eingang der Auswerteschaltung (Arduino...) zusammengefaßt werden. Wenn dabei zweipolige Stecker verwendet werden, können die einzelnen Schalter einfacher ausgetauscht werden, es besteht aber auch die Gefahr von Verwechslungen beim Anstöpseln.
Ähnliches (twisted pair) gilt auch für Versorgungsleitungen, dort aber um die Abstrahlungen zu minimieren. Dabei kommt es auch nicht auf einen definierten Wellenwiderstand an, die Leitungen sollten aber möglichst verdrillt werden und keinesfalls über einzelne Drähte auf unterschiedlichen Wegen verlegt werden.
Für sicherheitsrelevante Elemente (Endstop...) kann auch eine Überwachung auf Kabelbruch eingeführt werden. Dabei kann die Industrienorm (4-20mA) zugrundegelegt werden, d.h. es fließen immer mindestens 4mA durch einen Widerstand parallel zum Schalter, 0mA bedeuten einen Kabelbruch, abgefallenen Stecker...