Hallo allerseits,
ich habe folgendes Problem:
Beim Ansteuern eines Relais über einen Taster reagiert die Schaltung nur
gelegentlich.
Die Idee ist, ein Stromstoßrelais über einen Taster anzusteuern, später
sollen dazu noch verschiedene Einschaltdauern realisiert werden.
Das Relais hat zwei Steuerkreise und zwei Arbeitskreise, es muss also
auf unterschiedlichen Pins ein- und ausgeschaltet werden. Es soll aber
nur einen Taster geben.
Mein Script funktioniert zwar im Prinzip, aber nur gelegentlich. Sowohl
einschalten wie auch ausschalten erfordert manchmal mehrere Versuche.
Hab ich einen grundsätzlichen Denkfehler? Für Tipps währe ich dankbar.
Das script habe ich angehängt
Gerd
**1
hierfür besteht nur einen geringe einmalige chance
es wird nicht auf HIGH gewartet
wenn in diesem Augenblick nicht HIGH ist wird der pin nicht wieder auf
LOW gebracht
PS. so etwas nennt sich bistabiles Relais
die Hardware ...
das Board nennt sich elegoo mega2560 R3
der Taster ist ein ... 4 poliger Taster ohne irgendwelche Beschriftung.
Beides stammt wie auch das Steckbrett und so aus einem Starter Set
obiger Firma.
das Relais ist ein Omron G6AK-274P-ST-US 5V DC
und alles andere? Keine Ahnung, und ich bekomme langsam das Gefühl, ich
hab mich hier ein wenig übernommen ...
wobei das Problem nur die Schalter betrifft, wenn ich rein
softwaremässig ein und ausschalte klappt es prime
Gerd
Einen Schaltplan gibt es nicht, und ein Foto hilft wahrscheinlich nicht
viel, ich habs trotzdem mal drangehängt.
Ich kann mich aber nur wiederholen, ich bin wohl etwas naiv an die
Angelegenheit herangegangen und möchte auch keine Umstände machen. Es
ist auch kein wichtiges Projekt, sondern nur Spielzeug.
Das mit dem Entprellen krieg ich auf die Schnelle nicht geregelt, ich
versteh schon die Physik dahinter, aber nicht den Programmcode, da muss
ich mich erst mal mit vertraut machen.
Gerd
gerd schrieb:> Einen Schaltplan gibt es nicht, und ein Foto hilft wahrscheinlich nicht> viel, ich habs trotzdem mal drangehängt.
Unabhängig von Programm und Entprellung:
Kann der Ausgang das Relais überhaupt treiben? Es braucht immerhin 36mA
Strom, und es sieht so aus, als wenn das Relais direkt an den µC-Port
geht.
Das ist zuviel, auch wenn der µC nicht gleich kaputt geht. Sehr sinnvoll
bzw. nötig ist ein Transistor zum Treiben des Relais.
Hast Du eine Freilaufdiode am Relais? Ohne diese Diode zerstört das
Relais beim Abschalten den Port bzw. den Transistor.
Ist das Relais direkt am µC-Port angeschlossen (auch wenn er dann
überlastet wird) muss die Diode eine Schottky-Diode sein.
Dietrich L. schrieb:> Das ist zuviel, auch wenn der µC nicht gleich kaputt geht. Sehr sinnvoll> bzw. nötig ist ein Transistor zum Treiben des Relais.
Ja.
> Hast Du eine Freilaufdiode am Relais? Ohne diese Diode zerstört das> Relais beim Abschalten den Port
Nein, denn die Ausgänge sind Push-Pull Typen, außerdem wirken die
Bodydioden der Ausgangs-MOSFETs als Freilaufdioden. Glück gehabt.
> bzw. den Transistor.
Hat er nicht.
> Ist das Relais direkt am µC-Port angeschlossen (auch wenn er dann> überlastet wird) muss die Diode eine Schottky-Diode sein.
Nö. Er braucht gar keine. Und selbst wenn, ist Schottky hier keine
Sekunde nötig.
Relais mit Logik ansteuern
Moin,
> 36mA
Müßte gerade noch so gehen. Der Mega liefert m.W. maximal 40 mA pro Pin
und 200 mA pro Pingruppe.
Ist der Taster richtig angeschlossen? Jeweils 2 Beine sind intern
miteinander verbunden. (Ich muß immer nachmessen, weil ich mir das
einfach nicht merken kann.)
Und bei dem zweispuligen Relais benötigst Du natürlich auch zwei
Freilaufdioden.
Entprellen geht ganz einfach per Software, wobei der Pin (hier 3)
natürlich angepaßt werden muß.
1
int rote_Taste() {
2
int rt=digitalRead(3);
3
if (rt==LOW) {
4
delay(50);
5
rt=digitalRead(3);
6
if (rt==LOW) { return 1; }
7
}
8
return 0;
9
}
Die Auswertung im Programm geht dann ganz einfach
1
if (rote_Taste() ) {command; command; }
Ja, der Code ist nicht schön, weil er eine Verzögerung von 50ms enthält,
aber für die hier gestellte Aufgabe wird das wohl keine Rolle spielen.
Und noch ein Tip: Der Mega ist für die Aufgabe ein paar Nummern zu groß,
wenn alles klappt, dann würde ich auf einen Arduino Nano umsteigen, der
nur ein Zehntel der Fläche einnimmt.
Vielen Dank nochmal für die vielen Hinweise und Vorschläge.
Ich hab das mit dem Entprellen jetzt ausprobiert, hat keine Besserung
gebracht.
Zu den möglichen Problemen mit der Hardware:
folgendes Script funktioniert einwandfrei mit allen verwendeten
Bauteilen, nur halt ohne Taster.
______________________________________________________________________
__
void setup() {
pinMode (45,OUTPUT);
pinMode (43,OUTPUT);
}
void loop() {
int x = 0;
do {
digitalWrite(45,HIGH);
delay(10);
digitalWrite(45,LOW);
delay(500);
digitalWrite(43,HIGH);
delay(10);
digitalWrite(43,LOW);
delay(500);
x = x+1;
}
while (x < 5);
delay(1000);
}
______________________________________________________________________
ich gehe also davon aus, das einfach die Abfrage auf den Schalter
grundsätzlich falsch ist. Der Schalter funktioniert auch, nur halt nicht
jedes Mal. Manchmal hilft längeres drücken, manchmal hilft
mehrmalsdrücken, manchmal klappt es auch beim ersten Mal.
svensson schrieb:> Und noch ein Tip: Der Mega ist für die Aufgabe ein paar Nummern zu groß,> wenn alles klappt, dann würde ich auf einen Arduino Nano umsteigen, der> nur ein Zehntel der Fläche einnimmt.
Das war der Plan: auf dem (vorhandenen) großen Bord ausprobieren und
später auf einen Nano übertragen ^^.
Ich werde jetzt noch einmal ein paar Seiten über Schleifen lesen und
dann probier ich es noch mal von vorn.
Gute Nacht
Gerd
Du mußt noch den Zustand des Relais abfragen, sonst könnte es passieren
das Du dem Relais den Befehl "Einschalten" schickst obwohl es schon
eingeschalten ist. Dann passiert natürlich nichts.
Du müßtest also in Deinem Code noch vor //Einschalten den Zustand des
Relais abfragen und die Variable on entsprechend setzen.
Das Entprellen des Tasters ist natürlich auch wichtig. Die einfache if
Abfrage die Du da machst reicht an dieser Stelle nicht.
Da kannst Du Dich auf den Kopf stellen, solange Du das Tastenentprellen
nicht im Timerinterrupt machst, werden Dir Tastendrücke verloren gehen.
Die Mainloop soll ja was machen und das braucht eben Zeit.
Der Timerinterrupt nimmt sich regelmäßig ein kleines bischen Zeit, um
die Tasten zu entprellen und ein Tastenereignis in einem Flag abzulegen.
Die Mainloop braucht dann nur noch dieses Flag abfragen und die
entsprechende Aktion ausführen.
Vergiß also sämtliche Tastenroutinen, die nicht den Timerinterrupt
benutzen. Die werden Dir unweigerlich auf die Füße fallen, eher früher
als bald.
so, jetzt geht es^^
Wie gesagt, die Tastenabfrage war fehlerhaft, und zwar grundsätzlich.
Was ich nicht verstanden hatte war, das IF nicht auf den Eintritt der
Bedingung wartet. Da ich aber nur einen Taster für zwei Bedingungen
benutzen wollte musste halt der Code die Bedingungen eindeutiger
festlegen.
Wie gesagt, jetzt geht es, wobei irgendwas noch klemmt, wenn ich die
Ports nicht zu Beginn der Scheife auf low setzte bleibt der zweite (im
script 43) auf high, obwohl er ja eigentlich in der Schleife
zurückgesetzt wird. Aber das krieg ich bestimmt auch noch raus.
Falls es jemanden interessiert hänge ich das Script noch mal dran,
und nochmal Vieeeeelen Dank an alle, die mir hier geholfen haben, ich
hab viel gelernt von euch.
gerd
gerd schrieb:> so, jetzt geht es^^>> Wie gesagt, die Tastenabfrage war fehlerhaft, und zwar grundsätzlich.
Ist es immer noch.
> Was ich nicht verstanden hatte war, das IF nicht auf den Eintritt der> Bedingung wartet.
Warum sollte es das? Schon mal was von einem C-Buch gehört?
> zurückgesetzt wird. Aber das krieg ich bestimmt auch noch raus.
Da hab ich so meine Zweifel.
> Falls es jemanden interessiert hänge ich das Script noch mal dran,
Als "gutes" Beispiel, wie man es NICHT machen sollte. Das ist das
reinste Kauderwelsch! Und das liegt nicht nur an der kaputten
Formatierung, auch am "Konzept".
> und nochmal Vieeeeelen Dank an alle, die mir hier geholfen haben, ich> hab viel gelernt von euch.
Da habe ich au so meine Zweifel.
Siehe Anhang, so könnte das halbwegs gescheit aussehen.
Vielen Dank, noch einmal.
Dein Script funktioniert (natürlich) tadellos.
Dank auch für die Kritik und den Hinweis auf ein Buch.
Nehm ich mir zu Herzen.
gerd
Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.
Wichtige Regeln - erst lesen, dann posten!
Groß- und Kleinschreibung verwenden
Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang