ich bin neu in der Arduino Branche und stehe vor einem Problem bei meiner Steuerung.
Ich baue auf der Arbeit eine Steuerung die ein Hubwerk hoch und runter fahren soll.
Der Automatik Betrieb wird mit einem Taster gestartet und meine Automatik Variable wird auf 1 gesetzt.
Danach habe ich eine While Schleife gesetzt die solange Automatik == 1 ist das Hubwerk ein und ausfahren lässt. Mein Problem ist jedoch das ich nicht weiß wie ich eine Eingabekontrolle machen soll während ich in der Schleife festhänge.
Durch einen zweiten Taster (Stopp) soll die Schleife beendet werden nach ihrem Durchlauf.
Zurzeit müsste ich den Taster bis zu einer Abfrage in der Schleife gedrückt halten um die Variable wieder 0 zu setzen. Gibt es eine andere Möglichkeit ?
Du darfst nicht in einer Schleife fest hängen. Du hast ja schon eine große Schleife - Loop() - die wird immer wieder abgearbeitet.
Benutze kein delay(), das blockiert den ganzen Prozessor.
Schau Dir statt dessen BlinkWithoutDelay an.
Wenn es dann noch Probleme gibt, dann stelle den Sketch (in Codetags </> oben links hier rein und schreibe dazu, was Du erwartest und was es tut / nicht tut.
Meine Standardantwort zu Ablaufsteuerungen:
Eine Stichworte Sammlung für Google Suchen:
Endlicher Automat,
State Machine,
Multitasking,
Coroutinen,
Ablaufsteuerung,
Schrittkette,
BlinkWithoutDelay,
Milkypants:
Über hilfreiche Kommentare wäre ich sehr dankbar
Tommy hat ja schon delay() und BlinkWithoutDelay erwähnt. Das sind auf jeden Fall Stichworte zu Themen, die Du Dir bei Gelegenheit reinziehen solltest. Zur Vermeidung von delay() habe ich vor einiger Zeit das hier getextet. Vielleicht hilft das.
Ansonsten: Wenn Du in einer while()-Schleife eine Tastenabfrage machen willst, kannst Du das tun, wie sonst auch. Zum Beispiel:
while(1)
{
// bla
if(digitalRead(tasterpin)==0) // oder ==1, je nachdem
{
break; // führt zum Abbruch der Schleife
}
}
nachdem ich das Blinkwithoutdelay Beispiel durchgegangen bin habe ich den code mit millis versucht umzusetzen.
Ob dies funktioniert weiß ich leider noch nicht da ich schon ein Problem bei der Tasterabfrage habe.
Obwohl ich die nach den Tastern pull-down Widerstände eingebaut habe bekomme ich teilweise kurze High Signale bei offenem Taster.
Beim Messen der Spannung messe ich 0V also dürfte der Eingang eigenlich nicht High sein.
Dementsprechend schalten meine Relais sehr merkwürdig.
Die Relais die ich eingebaut habe sollen 24V schalten. Wenn ich an dem Ausgang des Arduinos also das 5V Schaltsignal für die Relais messe habe ich teilweise 0.1-0.2V anliege was ich auch nicht verstehe weil das Arduino doch nur 0 oder 5V schaltet, oder könnte das von dem kurzen High Signal vom Ein Taster kommen?
Die Serial Ausgabe hatte ich mal eingefügt um zu verfolgen wie oft meine Variable schaltet.
Ich bin derzeit ein wenig überfragt und hoffe das ihr Ideen habt bzw. irgendwelche Fehler im Code oder in meiner Denkweise findet.
Nur, wenn du an deinen Tastern überall extern Pull-Down Widerstände hast, dann haben die im Ruhezustand LOW Signal und bei Betätigung erst ein HIGH Signal inkl. prellen. Das prellen sollte bei dir nicht stören bzw. noch nicht.
Das bedeutet, in deiner Loop wird
if (S2 == LOW) { ...
permanent ausgeführt inkl. den delays darin.
Schaue dir am besten einen "endlosen Automaten" an. Das ist wie bei dir eine Zustandssteuerung.
Wegen deinem Spannungsproblem, zeige mal den Schaltplan bitte.
Ich hoffe das auf dem Schaltplan nun alles drauf ist. Es ist ein Sicherheitsventil verbaut das den Druck freigibt und ein Not-Aus-Relais was unter anderem dem Arduino den Strom nimmt.
Funktion der Anlage:
Bei Betätigung des Start Knopfes soll eine Hubvorichtung mit einem doppeltwirkenden Zylinder und einem Unterstützung Zylinder, der Dauerluft bekommt, in gewissen Abstände auf und abfahren bist der Stop Taster gedrückt wird.
Bei Betätigung des Stopp Taster soll das Hubwerk entweder direkt zurückfahren in Ausgangsposition
(was derzeit passiert) oder den Zyklus zuende fahren und dann in Ausgangsposition verbleiben(dazu ist mir noch kein Code eingefallen).
Festgestellte Probleme:
Durch den Befehl “Serial.println(“Automatik = 1”);” habe ich überwacht wann mein Start Taster gedrückt wird also dem Arduino ein HIGH Signal liefert. Dies geschah ziemlich regelmäßig bei eigentlich nicht gedrücktem Taster. Allerdings nicht so regelmäßig wie bei wirklich gedrücktem Taster.
Durch die kurzfristigen HIGH Signale schalten meine Relais nicht wie gewollt.
Pull-Down Widerstände sind am Start(NO-Kontakt) und auch am Stopp(NC-Kontakt) angebracht.
Die Ausgänge 4,5,6 schalten meine Relais für die Ventile, die Druckluft an die Zylinder weitergeben.
Obwohl der Ausgang 0V sein sollte schwankt er von 0 bis 0.11V hoch und runter.
bei HIGH Ausgängen liegen ganz normal 5V an.
die Bilder werden klarer.
Du schaltest wirklich an den Pins direkt Relais?
Was sind das für Relais? Kannst du die verlinken?
Weil eigentlich geht das nicht direkt, weil das Spulen sind.
Induktionsspannung ist für Halbleiter erstmal gefährlich ohne Schutzmaßnahmen.
Die Relais sind ziemlich groß da ich noch alte Teile aus der Firma benutzen wollte um die Kosten niedrig zu halten. Da die Relais ab 3.5V schalten können dachte ich das sie dafür nutzbar wären. Ich werde morgen einen Link oder Datenblatt dazu suchen und hochladen.
Na super hab mir die Relais nochmal genauer angeguckt. Es sind ssd Relais von celduc SIL867470 und mit bedauern musste ich feststellen das die Relais zwar 24 bis 510 v Schalten können jedoch AC und nicht DC -.-
Danke für eure Hilfe bis hierhin.
Werde nun mal für den arduino passende Relais bestellen
Ich habe mal geguckt und viele Relais habe ich gesehen schalten wenn sie auf GND gezogen werden. Damit hätte ich ja ein kurzes High Signal beim einschalten. Kann dies umgangen werden wenn ich beim initialisieren den Ausgang High setze ?
Habt ihr Empfehlungen für Relais?
Habe noch nicht viel mit Dioden gearbeitet. Habe dazu gelesen das die FreilaufDiode in sperrrichtung parallel geschaltet wird, ist das so korrekt ? Und muss die Diode nur bei der VersorgungSpannung des Relais eingebaut werden? Also bei den +5V oder auch bei meinen digitalen Ausgängen ?
Halbleiterrelais, da haste Schwein gehabt. Einem Relais oder Glühlampe ist es egal ob man ihr die Verbindung zu Masse oder zu plus unterbricht.
Müssen es unbedingt Relais sein?
Was sind das für Ventile die geschalten werden müssen? Spannung, Strom, Link?
Der klassische Weg wäre, und damit baulich kleiner, über Mosfets.
Damit sparst du dir die Probleme mit der Induktionsspannung.
Um deine Frage zu beantworten. Ja, du kannst den Pin zuerst mit digitWrite auf High setzen und danach als Ausgang setzen. Damit ist er so von Anfang an erstmal auf High.
Wenn es unbedingt SSR sein sollen, dann müßte man nach welchen mit PhotoMOS Innenleben suchen, die können Gleichspannung schalten und lassen sich jederzeit ausschalten. Nur sind die teurer als ein Mosfet, vorallen wenn sie Leistung schalten müssen.
Theoretisch müssen es keine Relais sein. Die Hauptsache ich kann die Ventile mit dem arduino ansteuern.
Die Ventile benötigen 24 DC und ca 2W.
Platzsparend würde mir auch entgegenkommen da mein Platz im Kasten sehr beschränkt ist.