Sensoren

Hallo Leute,

ich bin neu in der Welt des Arduinos und habe bin bis jetzt bei der Taster abfrage. Ich wollte 3 Sensoren (wollte mit Tastern simulieren) an ein Förderband machen wenn am 1. und 2. Sensor etwas erkannt wird soll das Förderband laufen ( mit einem 24V Gleichstrom Motor) wenn das Objekt am 3 Sensor angekommen ist soll das Förderband Stehen bleiben. Kann mir einer mit dem Programm Weiterhelfen ? Danke schon mal :)

onal13: Kann mir einer mit dem Programm Weiterhelfen ?

Zeichne das, was Du erreichen möchtest, am besten als Programmablaufplan auf. Wenn Du das hast, ist es nur noch ein kleiner Schritt zum fertigen Code. Eine andere Sache ist die Ansteuerung des Bandes - das erledigst Du am besten mit einem passenden Transistor.

Falls neue Fragen auftauchen, bis Du hier auf jeden Fall richtig.

Gruß

Gregor

Nachtrag: Sieh Dich am besten auch schon einmal nach den passenden Sensoren um. Mit Tastern kann man zwar gut simulieren, aber wenn Du am Ende Probleme bekommst, weil die Sensor-Informationen eine spezielle Behandlung benötigen, ist das blöd. Was für Sensoren geeignet sind, hängt davon ab, was Du erfassen möchtest. Kannst Du dazu etwas sagen?

Und du solltest dir im Klaren sein, was für einen Sensor du verwenden willst.

Nicht alle Sensoren reagieren wie ein Taster.

gregorss: Zeichne das, was Du erreichen möchtest, am besten als Programmablaufplan auf. Wenn Du das hast, ist es nur noch ein kleiner Schritt zum fertigen Code.

was ist ein Programmablaufplan? Ich glaube nicht das es nur ein kleiner Schritt zum fertigen code ist da ich noch sehr wenig Erfahrung habe das ich erst bei if-abfragen bin. Was für Sensoren ich später nehme ist eigentlich unwichtig ich muss es erstmal schaffen sie mit Tastern zu Simulieren. Würdest du mit eventuell mit dem Code helfen ? Wäre echt nett:)

https://de.wikipedia.org/wiki/Programmablaufplan

onal13: was ist ein Programmablaufplan?

Sieh Dir den Wikipedia-Artikel an. Solche Ablaufpläne sind schnell verstanden. Die „Übersetzung“ in ein Programm ist dann wirklich nicht mehr schwierig. In C bzw. C++ zu programmieren ist zwar erstmal etwas Ungewohntes, vor allem wegen der syntaktischen Eigenheiten, aber das Vorgehen, zuerst einen PAP zu zeichnen, ist sehr gut zum Lernen geeignet.

Das mit den Sensoren darfst Du nicht unterschätzen. Ich bin diesbezüglich schon gegen viele Wände gerannt.

Gruß

Gregor

PS: Lerne fluchen :-)

onal13: Ich wollte 3 Sensoren (wollte mit Tastern simulieren) an ein Förderband machen wenn am 1. und 2. Sensor etwas erkannt wird soll das Förderband laufen ( mit einem 24V Gleichstrom Motor) wenn das Objekt am 3 Sensor angekommen ist soll das Förderband Stehen bleiben.

Ich interpretiere das und als "Senor1 und Sensor2 sollen das Band starten können" und nicht als "eine Betätigung von Sensor1 und Sensor2 gleichzeitig starten das Band".

Eine Aktivierung des Endschalters stoppt das Band unabhänging von den Sensoren 1 und 2.

Statt einer Steuerungsstufe für das 24V Förderband schaltet mein Beispiel nur die eingebaute LED.

// Sensoren schließen nach GND
const byte pSensor1 = 5;
const byte pSensor2 = 6;
const byte pSensor3 = 7;
const byte pFoerderband = LED_BUILTIN;

void setup() {
  pinMode(pSensor1, INPUT_PULLUP);
  pinMode(pSensor2, INPUT_PULLUP);
  pinMode(pSensor3, INPUT_PULLUP);
  pinMode(pFoerderband, OUTPUT);
}

void loop() {
  // läuft das Förderband?
  if (digitalRead(pFoerderband)) {
    // Endschalter betätigt?
    if (digitalRead(pSensor3) == LOW) {
      // na dann machen wir das Ding aus
      digitalWrite(pFoerderband, LOW);
    }
  } else {
    // Endschalter frei?
    if (digitalRead(pSensor3) == HIGH) {
      // einer von den Startschaltern betätigt?
      if (digitalRead(pSensor1) == LOW || digitalRead(pSensor2) == LOW) {
        // na dann machen wir das Ding an
        digitalWrite(pFoerderband, HIGH);
      }
    }
  }
}

Wenn man in #6 den Endschalter nach außen nimmt, ergibt das diese Variante:

// Sensoren schließen nach GND
const byte pSensor1 = 5;
const byte pSensor2 = 6;
const byte pSensor3 = 7;
const byte pFoerderband = LED_BUILTIN;

void setup() {
  pinMode(pSensor1, INPUT_PULLUP);
  pinMode(pSensor2, INPUT_PULLUP);
  pinMode(pSensor3, INPUT_PULLUP);
  pinMode(pFoerderband, OUTPUT);
}

void loop() {
  if (digitalRead(pSensor3)) {   // Endschalter frei?
    // einer von den Startschaltern betätigt?
    if (!digitalRead(pSensor1) || !digitalRead(pSensor2)) {
      // na dann machen wir das Ding an
      digitalWrite(pFoerderband, HIGH);
    }
  } else {
    digitalWrite(pFoerderband, LOW);    // na dann machen wir das Ding aus
  }
}

Zwei klasse kurze Sketche! Um das so schlank und klar hinzubekommen, hätte ich mindestens ein paar Stunden gebraucht.

Nur eine Sache finde ich etwas unglücklich, und zwar die Abfrage der Startschalter in agmues Code. In Whandalls Code wird explizit auf LOW getestet – was ich für besser verständlich halte. Beim negierenden Ausrufezeichen in agmues Code muss man um eine Ecke mehr denken. Für Anfänger ist das IMO eine Ecke zu viel.

Gruß

Gregor

Code funktioniert Super Dankeschön aber warum werden die Sensoren nach Masse Abgefragt?

Damit ausser dem Schalter keine externe Beschaltung notwendig ist.

onal13:
neu in der Welt des Arduinos und habe bin bis jetzt bei der Taster abfrage

Dann sollte dir Button und INPUT_PULLUP schon begegnet sein.

Damit du nicht hier auf das Forum für Speziallösungen genau für deine Fragen angewiesen bist, hilft es oft auch, andere Beispiele anzusehen und zu verstehen, und einfach mal ausprobieren und knobeln. Das Erfolgserlebnis ist für die meisten, die überhaupt Spass an Arduino-Gefummel haben, deutlich größer.

Whandall: Damit ausser dem Schalter keine externe Beschaltung notwendig ist.

Versteh ich nicht

Versuch es mal ohne und erlebe floating inputs.

Kann man auch recherchieren...

onal13: Versteh ich nicht

Zweifelst du die Notwendigkeit eines Pullup oder Pulldown generell an?

Einfache Logik: 1. Verwendest du einen Pulldown, dann muss der Schalter/Taster zwischen Vcc und Pin. 2. Verwendest du einen Pullup, dann muss der Schalter/Taster zwischen Pin und GND.

Da die ATMegas schon Pullup eingebaut haben, kann man die auch verwenden. Variante 2 ist das Mittel der Wahl.

Ein Digital-Input ist was anderes als ein Lichtschalter (bei dem die Lampe aus ist, wenn der Schalter offen ist) Unbeschaltete Eingänge sind generell weder LOW noch HIGH, sondern undefiniert. Aber, da du dich schon mit Taster-Abfrage beschäftigt hast, sollte dir das eigentlich klar sein. Dein "versteh ich nicht" ist uns also unverständlich. Oder anders rum: Taster anschliessen und einlesen ist nicht trivial, sieh dir die Tutorials an.

michael_x: Ein Digital-Input ist was anderes als ein Lichtschalter (bei dem die Lampe aus ist, wenn der Schalter offen ist) Unbeschaltete Eingänge sind generell weder LOW noch HIGH, sondern undefiniert.

Wobei "undefiniert" heißt, daß er ja nach eingefangenen Störungen mal HIGH mal LOW ist, und das ziemlich willkürlich und unvorhersehbar.

Grüße Uwe

michael_x: ... Taster anschliessen und einlesen ist nicht trivial ...

Naja ...weniger als einen Taster anzuschließen und abzufragen geht fast nicht. Das gehört zu den einfachsten aller einfachen Sachen. Insofern ist das durchaus trivial. Okay, es ist schwieriger, als eine Null als „nichts“ zu interpretieren :-)

Gruß

Gregor

PS: Damit der OP auch etwas vom Lesen hat: Ein unbeschalteter Analogeingang eignet sich hervorragend, um mit dessen Wert den Zufallsgenerator zu initialisieren.

Naja ...weniger als einen Taster anzuschließen und abzufragen geht fast nicht

OK, bei "fast" stimme ich dir zu;) Nicht umsonst wird gern Blink als Minimal-Sketch genommen, möglichst mit der eingebauten LED, damit LED-Polarität und Vorwiderstand keine "nicht-trivialen" Probleme bereiten.

gregorss: In Whandalls Code wird explizit auf LOW getestet ...

Nicht konsequent (außer die Betonung liegt auf "LOW"):

Whandall:  if (digitalRead(pFoerderband)) { ...    if (digitalRead(pSensor3) == LOW) {

gregorss: Beim negierenden Ausrufezeichen in agmues Code muss man um eine Ecke mehr denken.

Nunja, einen logischen Wert auf seinen logischen Wert zu testen, wenn ein logischer Wert benötigt wird, sehe ich als eine Ecke zu viel an, da der Compiler nicht zwischen true/false und HIGH/LOW unterscheidet.

Wenn Du "besser verständlich" in "anfängerfreundlicher" änderst, dann stimme ich aber der zusätzlichen Ecke und Deiner Aussage gerne zu :)