Arduino If Abfrage mit 3 && Bedingungen.

OP #6684706
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
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
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 #6684750
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.
Gast #6684755
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
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
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.
Gast #6684799
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.
OP #6684803
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
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
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
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
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 #6685957
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.
Gast #6685971
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
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

Eine eigene Frage? Dieser Thread ist über 5 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.