Forum: Mikrocontroller und Digitale Elektronik Arduino: Schalter reagiert nur gelegentlich


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von gerd (Gast)


Angehängte Dateien:

Bewertung
-1 lesenswert
nicht 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

von Entpreller (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Du hast keinerlei Entprellung des Tasters. Hol das mal nach.

von Einer (Gast)


Bewertung
0 lesenswert
nicht 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

von gerd (Gast)


Bewertung
0 lesenswert
nicht lesenswert
danke für die Hinweise, ich versuche mal, das zu verarbeiten

gerd

von Falk B. (falk)


Bewertung
0 lesenswert
nicht lesenswert
gerd schrieb:
> danke für die Hinweise, ich versuche mal, das zu verarbeiten

Wie sieht deine Hardware aus? Was für ein Taster wird verwendet? 
Interner oder externer Pull-Up? Externer RC-Filter?

https://www.mikrocontroller.net/articles/Entprellung#Einfacher_Taster

von gerd (Gast)


Bewertung
0 lesenswert
nicht 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

von Falk B. (falk)


Bewertung
0 lesenswert
nicht lesenswert
Ein Schaltplan wäre jetzt nett, siehe Netiquette.

von gerd (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

von Dietrich L. (dietrichl)


Bewertung
1 lesenswert
nicht 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.

von Falk B. (falk)


Bewertung
0 lesenswert
nicht 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

von svensson (Gast)


Bewertung
0 lesenswert
nicht 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.

von gerd (Gast)


Bewertung
0 lesenswert
nicht 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

von svensson (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Deine Tastenabfrage war fehlerhaft. Wie ieht den der überarbeitete Code 
aus?

von Zeno (Gast)


Bewertung
0 lesenswert
nicht 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.

von Peter D. (peda)


Bewertung
0 lesenswert
nicht 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.

von gerd (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

von Falk B. (falk)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

: Bearbeitet durch User
von gerd (Gast)


Bewertung
1 lesenswert
nicht lesenswert
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

von Falk B. (falk)


Bewertung
0 lesenswert
nicht lesenswert

von Falk B. (falk)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Es geht sogar noch kürzer und übersichtlicher, denn die Funktion zum 
schalten des Relais wird hier im Beispiel schon drei mal verwednet.

von Shadow (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
so sollte auch gehen, hab aber das board nicht zum testen...

Antwort schreiben

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

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.