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
Du hast keinerlei Entprellung des Tasters. Hol das mal nach.
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
danke für die Hinweise, ich versuche mal, das zu verarbeiten gerd
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
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
Deine Tastenabfrage war fehlerhaft. Wie ieht den der überarbeitete Code aus?
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.
:
Bearbeitet durch User
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
Siehe auch Strukturierte Programmierung auf Mikrocontrollern http://www.amazon.de/Weniger-schlecht-programmieren-Kathrin-Passig/dp/3897215675/ref=sr_1_1?ie=UTF8&qid=1444238128&sr=8-1&keywords=weniger+schlecht+programmieren
Es geht sogar noch kürzer und übersichtlicher, denn die Funktion zum schalten des Relais wird hier im Beispiel schon drei mal verwednet.
so sollte auch gehen, hab aber das board nicht zum testen...
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.