Ich weiß nicht, ob der Titel richtig gewählt ist, aber es geht um
folgendes:
Ich habe einen Aufbau, wo ein Schrittmotor eine Scheibe immer einen
bestimmten Winkel dreht und dann anhält. Die Scheibe wird im Stillstand
mit einem Hebelspanner festgehalten. Also soll sich der Vorgang nur
starten lassen, wenn der Hebel offen ist.
Dazu missten ein induktiver Sensor (Balluff bes m12me-psc40b-s04g-003)
die Endlage des Hebels, wenn er definitiv offen ist. Über ein Relais
wird ein Digitaler Pin geschaltet. Dieser ist als "IniPin" definiert.
Ich habe dann die Abfrage so aufgestellt:
1
if ( digitalRead(tasterPin) == HIGH && digitalRead(IniPin) == HIGH && not myStepper.moving() ) {
2
myStepper.doSteps( stepsProTaster );
3
delay(25000);
Ich weiß nicht, wo der Fehler ist, aber so ignoriert er den
Sensoreingang
bzw. den übers Relais geschaltete.
Übersehe ich irgendwas oder geht das grundsätzlich so nicht?
not schrieb:> Ich kann mir nicht vorstellen, dass das kompiliert.
Tut es aber, es passiert auch das erwartete.
An dem gezeigte Code-Fragment ist kein Fehler erkennbar. Überprüfe ob
dein Sensor wirklich die erwarteten Werte liefert. Zum Beispiel so:
Wenn du dieses Problem gelöst hast, schau dir mal die von Johannes
empfohlene Statemachine an. Ich habe dazu mal einen Aufsatz geschrieben,
der demonstriert, wie man das mit Arduino umsetzen kann:
http://stefanfrings.de/multithreading_arduino/index.html
Stephan H. schrieb:> Ich habe dann die Abfrage so aufgestellt:> if ( digitalRead(tasterPin) == HIGH && digitalRead(IniPin) == HIGH &&> not myStepper.moving() ) {
not ist KEIN C-Schlüsselwort. C++ weiß ich nicht.
Ok, es ist ein C++ Schlüsselwort, geht also im Arduino.
https://en.cppreference.com/w/cpp/keyword/not> myStepper.doSteps( stepsProTaster );> delay(25000);
Das ist Mist^3! Deine CPU pennt für 25s! Siehe Multitasking.
> Ich weiß nicht, wo der Fehler ist, aber so ignoriert er den> Sensoreingang> bzw. den übers Relais geschaltete.
Logisch, siehre oben! DU braucht eines Schleife, welche jeweils einen
Schritt macht und dann max. 1ms wartet. Wenn man die 25.000 mal aufruft,
sind das auch 25s, allerdings auch mit 25.000 Abfragen deiner Eingänge!
Stefan ⛄ F. schrieb:> Tut es aber, es passiert auch das erwartete.
OK, mein Fehler. Wieder etwas gelernt. Das gibts auch in C in der
iso646.h und C++ hat das als alternative tokens im Standard. Wusste ich
nicht.
Tut mir leid, da irrtümlich einen Fehler gesehen zu haben.
Stephan H. schrieb:> Dazu missten ein induktiver Sensor (Balluff bes m12me-psc40b-s04g-003)> die Endlage des Hebels, wenn er definitiv offen ist. Über ein Relais> wird ein Digitaler Pin geschaltet. Dieser ist als "IniPin" definiert.
Warum so ein Aufwand. Bei einem Sensor mit NPN-Ausgang (z.B. BES
M12ME-NSC40B-S04G-003) könntest du dir den Zirkus mit dem Relais sparen.
Oder, wenn du Wert auf die galvanische Trennung legst, wäre ein
Optokoppler bei den Anfordernissen eines digitalen Eingangs-Pins
naheliegender.
Wolfgang schrieb:> Stephan H. schrieb:>> Dazu missten ein induktiver Sensor (Balluff bes m12me-psc40b-s04g-003)>> die Endlage des Hebels, wenn er definitiv offen ist. Über ein Relais>> wird ein Digitaler Pin geschaltet. Dieser ist als "IniPin" definiert.>> Warum so ein Aufwand. Bei einem Sensor mit NPN-Ausgang (z.B. BES> M12ME-NSC40B-S04G-003) könntest du dir den Zirkus mit dem Relais sparen.>> Oder, wenn du Wert auf die galvanische Trennung legst, wäre ein> Optokoppler bei den Anfordernissen eines digitalen Eingangs-Pins> naheliegender.
Der Haken ist, dass der Sensor mindestens 12 Volt zu futtern haben will.
Diese 12 Volt schaltet er auch durch. 12 Volt auf einen Eingang geben?
Mh, nicht so gut, glaube ich. Und mit Widerständen wollte ich jetzt
nicht noch anfangen.
Stephan H. schrieb:> Der Haken ist, dass der Sensor mindestens 12 Volt zu futtern haben will.> Diese 12 Volt schaltet er auch durch. 12 Volt auf einen Eingang geben?
Ein NPN-Ausgang schaltet nicht die Betriebsspannung auf den Ausgang. Das
ist ein Open-Kollektor/-Drain Ausgang mit NPN-BJT bzw. N-MOSFET nach Gnd
(s. Datenblatt "Wiring Diagrams".
Die Last hängt zwischen Ausgang und Plus, im Fall des direkten
Anschlusses an den IO-Pin also ein Pull-Up-Widerstand an die VCC des
Controllers.
p.s. Wenn du einen Spannungsteiler vor den Eingang des µC schaltest,
kannst du auch den PNP-Sensor ohne Relais anschließen. Der
Spannungsteiler stellt dann die Last für den Sensorausgang dar.
Wolfgang schrieb:> Ein NPN-Ausgang schaltet nicht die Betriebsspannung auf den Ausgang. Das> ist ein Open-Kollektor/-Drain Ausgang mit NPN-BJT bzw. N-MOSFET nach Gnd> (s. Datenblatt "Wiring Diagrams".
Also hier schaltet er aber das durch, was ich rein gebe.
Sonst könnte ich das 12V Relais ja nicht schalten.
Das hängt an GND und dem geschalteten Ausgang.
Vermutlich ist da intern was gebrückt oder so.
Stephan H. schrieb:> Und mit Widerständen wollte ich jetzt nicht noch anfangen.
Naja, aber das ist wesentlich einfacher als mit einem Relais. Es sei
denn, du willst Potenzialtrennung. Dann wäre als Alternative ein
Optokoppler nicht schlecht - braucht allerdings auch 2 Widerstände ;-)
Die Sache mit den Relais ist schon in Ordnung. Ich würde es so lassen,
wenn es funktioniert und die Verzögerung durch das Relais kein Problem
ist.
Mit Widerständen würde es so gehen:
Stefan ⛄ F. schrieb:> Mit Widerständen würde es so gehen:> 2,2kΩ> Sensor Ausgang o-----[===]-----+----------o Mikrocontroller Eingang> 12V | 4,8V> |~|> |_| 1,5kΩ> |> GND (-) o---------------+----------o GND>> Diese Schaltung nennt man "Spannungsteiler".
Die Widerstände sollten deutlich hochohmiger sein, um den Strom durch
die Schutzdioden des µC klein genug zu halten, wenn der µC noch nicht
versorgt ist (z.B. beim Einschaltvorgang oder wenn die Versorgung des
Sensors völlig unabhängig von der des µC ist).
Andreas B. schrieb:> Dietrich L. schrieb:>> Ich sehe das anders. In diesem "Wiring Diagrams" wird>> Das ist ein pnp Ausgang. Wolfgang sprach aber von einem npn Ausgang
Eben, und genau das hat dieser Sensor ja nicht. Wolfgang hat das aber
behauptet:
Wolfgang schrieb:> Das> ist ein Open-Kollektor/-Drain Ausgang mit NPN-BJT bzw. N-MOSFET nach Gnd> (s. Datenblatt "Wiring Diagrams".
Lies mal seinen Beitrag davor.
Wolfgang schrieb:> Stephan H. schrieb:>> Dazu missten ein induktiver Sensor (Balluff bes m12me-psc40b-s04g-003)>> die Endlage des Hebels, wenn er definitiv offen ist. Über ein Relais>> wird ein Digitaler Pin geschaltet. Dieser ist als "IniPin" definiert.>> Warum so ein Aufwand. Bei einem Sensor mit NPN-Ausgang (z.B. BES> M12ME-NSC40B-S04G-003) könntest du dir den Zirkus mit dem Relais sparen.
Dietrich L. schrieb:> Die Widerstände sollten deutlich hochohmiger sein, um den Strom durch> die Schutzdioden des µC klein genug zu halten
Kann man machen, aber dann wird das ganze wieder empfindlich was EMV
angeht. Dagegen müsste man dann wiederum Maßnahmen treffen.
Andreas B. schrieb:> Lies mal seinen Beitrag davor.>> Wolfgang schrieb:>> ...>> Warum so ein Aufwand. Bei einem Sensor mit NPN-Ausgang (z.B. BES>> M12ME-NSC40B-S04G-003) könntest du dir den Zirkus mit dem Relais sparen.
Ja, du hast recht! Diesen Beitrag habe ich übersehen.
Oder man verwendet anstelle des Transistors ein Relais :-)
Oder einen Optokoppler. In beiden Fällen hätte man eine
Potentialtrennung und muss sich wenig Gedanken um Seiteneffekte machen.
Stefan ⛄ F. schrieb:> Kann man machen, aber dann wird das ganze wieder empfindlich was EMV> angeht. Dagegen müsste man dann wiederum Maßnahmen treffen.
Als einfache Maßnahme kann man ja den Spannungsteiler niederohmig lassen
und dann noch einen hochohmigeren Längswiderstand vor den µC-Eingang
schalten.
Das sind dann aber schon 3 Widerstände, wo Stephan H. doch schrieb:
Stephan H. schrieb:> Und mit Widerständen wollte ich jetzt nicht noch anfangen.
... und das Relais hatte er wohl noch rumliegen und es musste weg ;-))