Arduino: Schalter reagiert nur gelegentlich

Gast #5752381
Lesenswert?

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
Angehängte Dateien:
Gast #5752401
Lesenswert?

1
 if (on == 0) 
2
    {
3
      if (digitalRead(taster) ==LOW)
4
        {
5
         digitalWrite(relaisein,HIGH);
6
         if (digitalRead(taster) == HIGH)  **1
7
          {
8
          digitalWrite(relaisein,LOW);
9
          }
10
        }
11
        on = 1;
12
    }
**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
Gast #5752484
Lesenswert?

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
Gast #5752511
Lesenswert?

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
Angehängte Dateien:
#5752787
Lesenswert?

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.
#5752864
Lesenswert?

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
Gast #5752870
Lesenswert?

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.
Gast #5753836
Lesenswert?

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
Gast #5753868
Lesenswert?

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.
#5753962
Lesenswert?

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.
Gast #5754244
Lesenswert?

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
Angehängte Dateien:
#5754321
Lesenswert?

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.
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren