Forum: Mikrocontroller und Digitale Elektronik Arduino If Abfrage mit 3 && Bedingungen.


von Stephan H. (maronis_d)


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?

von not (Gast)


Lesenswert?

Stephan H. schrieb:
> && not myStepper.moving()

Ich kann mir nicht vorstellen, dass das kompiliert.

&& (!myStepper.moving()) scheint mir richtiger...

von Johannes S. (Gast)


Lesenswert?

Und das Programm wartet 25s im delay() und kümmert sich in dieser Zeit 
auch nicht um Endschalter.
Da sollte man sich erstmal etwas zu ‚statemachine‘ ansehen.
https://www.mikrocontroller.net/articles/Statemachine

von Stefan F. (Gast)


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

von Falk B. (falk)


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!

von not (Gast)


Lesenswert?

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.

von Wolfgang (Gast)


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.

von Stephan H. (maronis_d)


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.

von Wolfgang (Gast)


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.

von Wolfgang (Gast)


Lesenswert?

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.

von Stephan H. (maronis_d)


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.

von Dietrich L. (dietrichl)


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".

Ich sehe das anders. In diesem "Wiring Diagrams" wird (+) 
durchgeschaltet:
https://publications.balluff.com/pdfengine/pdf?type=pdb&id=237643&con=de&ws=appoval

von Dietrich L. (dietrichl)


Lesenswert?

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

von Stefan F. (Gast)


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".

von Dietrich L. (dietrichl)


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

von Andreas B. (bitverdreher)


Lesenswert?

Dietrich L. schrieb:
> Ich sehe das anders. In diesem "Wiring Diagrams" wird

Das ist ein pnp Ausgang. Wolfgang sprach aber von einem npn Ausgang

von Dietrich L. (dietrichl)


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".

von Andreas B. (bitverdreher)


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.

von Stefan F. (Gast)


Lesenswert?

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.

von Dietrich L. (dietrichl)


Lesenswert?

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.

von Stefan F. (Gast)


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.

von Dietrich L. (dietrichl)


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

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
Noch kein Account? Hier anmelden.