Arduino If Abfrage mit 3 && Bedingungen.

OP #6684706
Lesenswert?

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

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:
1
bool tasterGedrueckt = (digitalRead(tasterPin) == HIGH);
2
bool hebelOffen = (digitalRead(IniPin) == HIGH);
3
bool motorInBewegung = myStepper.moving();
4

5
Serial.print("tasterGedrueckt=");
6
Serial.print(tasterGedrueckt, DEC);
7
Serial.print("hebelOffen=");
8
Serial.print(hebelOffen, DEC);
9
Serial.print("motorInBewegung=");
10
Serial.println(motorInBewegung, DEC);  
11

12
if ( tasterGedrueckt && hebelOffen && not motorInBewegung ) {
13
   ...
14
}

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
#6684738
Lesenswert?

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

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

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

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

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

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:
1
                     2,2kΩ
2
Sensor Ausgang o-----[===]-----+----------o Mikrocontroller Eingang
3
12V                            |            4,8V
4
                              |~|
5
                              |_| 1,5kΩ
6
                               |
7
       GND (-) o---------------+----------o GND

Diese Schaltung nennt man "Spannungsteiler".
#6685849
Lesenswert?

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

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

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

Man könnte den NPN nachrüsten:
1
                           +------o Eingang µC (mit Pull-Up)
2
                           |
3
Sensor      2,2kΩ        |/
4
Ausgang o---[===]---+----|      NPN
5
12V                 |    |\>
6
                   |~|     |
7
              220Ω |_|     |
8
                    |      |
9
    GND o-----------+------+------o GND

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

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 ;-))

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