INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Arduino mit Schrittmotor und Lichtschranken
15.01.2021, 22:01
Beitrag #1
Arduino mit Schrittmotor und Lichtschranken
Hallo zusammen,

ich versuche mich gerade in der Programmierung eines Uno für einen Aufzug für meine Modellbahn.
Der Arduino soll per Taster aktiviert werden und zwischen zwei Positionen mit jeweils einem Endschalter in Form einer Lichtschranke hin und her fahren.

Ich habe bisher folgenden Code:
Code:
Eisenbahnaufzug mit Schrittmotor und zwei Lichtschranken als Endpositionen



// Definiere Schrittmotorausgänge und Schrittmodus:
#define dirPin 2
#define stepPin 3
#define stepsPerRevolution 200
// Definiere Pin 12 als Tastereingang:
const byte Taster_Pin = 12;
//Definiere obere und untere Lichtschranke:
const byte Lichtschranke_oben = 8;
const byte Lichtschranke_unten = 7;
int messwert_oben=0; //Unter der Variablen "messwert_oben" wird später der Messwert der oberen Lichtschranke gespeichert.
int messwert_unten=0; //Unter der Variablen "messwert_unten" wird später der Messwert der unteren Lichtschranke gespeichert.



void setup() {
  // Deklariere Ausgänge Schrittmotor und Eingang Taster/Lichtschranken:
  pinMode(stepPin, OUTPUT);
  pinMode(dirPin, OUTPUT);
  pinMode(Taster_Pin, INPUT_PULLUP);     // Taster
  pinMode(Lichtschranke_oben, INPUT_PULLUP);  //Lichtschranke oben
  pinMode(Lichtschranke_unten, INPUT_PULLUP);  //Lichtschranke unten

  
}

void loop() {{
  if(digitalRead(Schalter_Pin) { messwert_oben = 1; } else { messwert_oben = 0; }     //Aufzug steht in oberer Position
  messwert_oben=digitalRead(8); //Die Signalausgabe der oberen Lichtschranke wird ausgelesen und unter der Variable „messwert“ gespeichert. Wenn die Lichtschranke unterbrochen wird, speichert der Mikrocontroller den Wert "1", ansonsten "0".
  messwert_unten=digitalRead(7); //Die Signalausgabe der oberen Lichtschranke wird ausgelesen und unter der Variable „messwert“ gespeichert. Wenn die Lichtschranke unterbrochen wird, speichert der Mikrocontroller den Wert "1", ansonsten "0".

        while messwert_unten = 0                //Aufzug fährt solange nach unten, bis die untere Lichtschranke erreicht ist
           digitalWrite(dirPin, HIGH);
           digitalWrite(stepPin, HIGH);
           if messwert_unten == 1

}
{      
if(digitalRead(Schalter_Pin) { messwert_oben = 0; } else { messwert_oben = 1; }     //Aufzug steht in unterer Position
  messwert_oben=digitalRead(8); //Die Signalausgabe der oberen Lichtschranke wird ausgelesen und unter der Variable „messwert“ gespeichert. Wenn die Lichtschranke unterbrochen wird, speichert der Mikrocontroller den Wert "1", ansonsten "0".
  messwert_unten=digitalRead(7); //Die Signalausgabe der oberen Lichtschranke wird ausgelesen und unter der Variable „messwert“ gespeichert. Wenn die Lichtschranke unterbrochen wird, speichert der Mikrocontroller den Wert "1", ansonsten "0".

        while messwert_oben = 0                 //Aufzug fährt solange nach oben, bis die obere Lichtschranke erreicht ist
           digitalWrite(dirPin, HIGH);
           digitalWrite(stepPin, HIGH);
           if messwert_oben == 1

}}

Gleich folgende Fragen dazu:
-Kann ich den Pin 7 für die zweite Lichtschranke verwenden?
-Ist die while-Schleife geeignet für die Endlosdrehung bis zum Erreichen der unteren Lichtschranke?
-Falls ja, ist mir nicht ganz klar, wie ich diese Funktion beende

...die Drehrichtung ist natürlich noch an die jeweilige Position der Lichtschranken anzupassen.

Vielen Dank für Eure Hilfe...Hoffentlich ist es nicht ganz Kraut und RübenBlush

LG Markus
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.01.2021, 22:06 (Dieser Beitrag wurde zuletzt bearbeitet: 15.01.2021 22:06 von GuaAck.)
Beitrag #2
RE: Arduino mit Schrittmotor und Lichtschranken
Hallo,

so kann da niemand was zu sagen, da gibt es ja jede Menge syntaktische Fehler, insbesondere Klammern und geschweifte Klammern fehlen. Lasse den Code mal automatisch formatieren, compiliere ihn. Wenn das fehlerfrei geht, dann versteht man den Code wohl auch.

Gruß
GuaAck
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.01.2021, 22:52
Beitrag #3
RE: Arduino mit Schrittmotor und Lichtschranken
Hallo,

danke für die Antwort. Sorry, das hätte ich gleich machen sollen.
Auto-Formatierung habe ich jetzt gemacht und der Sketch wird auch problemlos kompilliert. Einiges hat sich beim nochmaligen Drüberschauen auch geklärt.
Folgendes ist rausgekommen:
Code:
//Eisenbahnaufzug mit Schrittmotor und zwei Lichtschranken als Endpositionen



// Definiere Schrittmotorausgänge und Schrittmodus:
#define dirPin 2
#define stepPin 3
#define stepsPerRevolution 200
// Definiere Pin 12 als Tastereingang:
const byte Taster_Pin = 12;
//Definiere obere und untere Lichtschranke:
const byte Lichtschranke_oben = 8;
const byte Lichtschranke_unten = 7;
int messwert_oben = 0; //Unter der Variablen "messwert_oben" wird später der Messwert der oberen Lichtschranke gespeichert.
int messwert_unten = 0; //Unter der Variablen "messwert_unten" wird später der Messwert der unteren Lichtschranke gespeichert.



void setup() {
  // Deklariere Ausgänge Schrittmotor und Eingang Taster/Lichtschranken:
  pinMode(stepPin, OUTPUT);
  pinMode(dirPin, OUTPUT);
  pinMode(Taster_Pin, INPUT_PULLUP);     // Taster
  pinMode(Lichtschranke_oben, INPUT_PULLUP);  //Lichtschranke oben
  pinMode(Lichtschranke_unten, INPUT_PULLUP);  //Lichtschranke unten


}

void loop() {
  messwert_oben=digitalRead(8); //Die Signalausgabe der oberen Lichtschranke wird ausgelesen und unter der Variable „messwert“ gespeichert. Wenn die Lichtschranke unterbrochen wird, speichert der Mikrocontroller den Wert "1", ansonsten "0".
  messwert_unten=digitalRead(7); //Die Signalausgabe der oberen Lichtschranke wird ausgelesen und unter der Variable „messwert“ gespeichert. Wenn die Lichtschranke unterbrochen wird, speichert der Mikrocontroller den Wert "1", ansonsten "0".

      if (digitalRead(Taster_Pin) == HIGH); {
    

      while (messwert_oben = 1);                //Aufzug fährt solange nach unten, bis die untere Lichtschranke erreicht ist
                        digitalWrite(dirPin, HIGH);
                        digitalWrite(stepPin, HIGH);
                        if (messwert_unten == 1);

  }
{

      while (messwert_unten = 1);                 //Aufzug fährt solange nach oben, bis die obere Lichtschranke erreicht ist
                         digitalWrite(dirPin, HIGH);
                        digitalWrite(stepPin, HIGH);
                        if (messwert_unten == 1);

}
}

Hoffentlich sind grobe Fehler jetzt beseitigtBig Grin

Danke und LG
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.01.2021, 23:12 (Dieser Beitrag wurde zuletzt bearbeitet: 15.01.2021 23:16 von GuaAck.)
Beitrag #4
RE: Arduino mit Schrittmotor und Lichtschranken
Hallo,
sieht schon besser aus, aber der automatische Formatierer macht das anders.

"digitalRead(8)" ist unschön. Besser:
Code:
const word PinIstOpen=8;
...digitalRead(PinIstOben);

Und hier hängt es:
Code:
void loop() {
  messwert_oben=digitalRead(8);
....
  while (messwert_oben = 1);                //Aufzug fährt solange nach unten, bis die

Wie soll sich "messwert_oben" ändern, Du liest es ja nicht neu ein.

Und hier ist die Bedingung wohl immer erfüllt, also hängt das Programm:
Code:
if (messwert_unten == 1);

Gruß
GuaAck
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.01.2021, 10:55 (Dieser Beitrag wurde zuletzt bearbeitet: 16.01.2021 10:56 von Tommy56.)
Beitrag #5
RE: Arduino mit Schrittmotor und Lichtschranken
(15.01.2021 23:12)GuaAck schrieb:  Besser:
Code:
const word PinIstOpen=8;
...digitalRead(PinIstOben);
Wobei ich word für einen Pin am UNO für oversized halte.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.01.2021, 11:09 (Dieser Beitrag wurde zuletzt bearbeitet: 16.01.2021 16:43 von hanebambel.)
Beitrag #6
RE: Arduino mit Schrittmotor und Lichtschranken
Hallo und vielen Dank für die Hilfe,

ich habe noch nicht ganz kapiert...
Ich möchte ja in der ersten while-Schleife, dass der Motor solange dreht, bis
Code:
messwert_unten == 1
ist, bzw. umgekehrt wenn es in die andere Richtung geht.
Wie muss ich denn die Bedingung formulieren, bzw. wie muss ich denn die Werte neu einlesen, damit die Schleife bei der Endposition stoppt?
Hab mir damit etwas schwer getan, weil ich ja nur die beiden Zustände 0 und 1 einlesen kann...aber vermutlich habe ich einen Denkfehler...Huh

Code:
if (messwert_unten == 1)
wäre ja dann erst erreicht, wenn die untere Lichtschranke unterbrochen wird.

Danke euch und LG,

Markus
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.01.2021, 22:45 (Dieser Beitrag wurde zuletzt bearbeitet: 16.01.2021 22:47 von hanebambel.)
Beitrag #7
RE: Arduino mit Schrittmotor und Lichtschranken
Neuer Versuch:

Code:
//Eisenbahnaufzug mit Schrittmotor und zwei Lichtschranken als Endpositionen



// Definiere Schrittmotorausgänge und Schrittmodus:
#define dirPin 2
#define stepPin 3
#define stepsPerRevolution 200

// Definiere Pin 12 als Tastereingang:
const byte Taster_Pin = 12;
//Definiere obere und untere Lichtschranke:
const byte Lichtschranke_oben = 8;
const byte Lichtschranke_unten = 7;
int messwert_oben = 0; //Unter der Variablen "messwert_oben" wird später der Messwert der oberen Lichtschranke gespeichert.
int messwert_unten = 0; //Unter der Variablen "messwert_unten" wird später der Messwert der unteren Lichtschranke gespeichert.




void setup() {
  // Deklariere Ausgänge Schrittmotor und Eingang Taster/Lichtschranken:
  pinMode(stepPin, OUTPUT);
  pinMode(dirPin, OUTPUT);
  pinMode(Taster_Pin, INPUT_PULLUP);     // Taster
  pinMode(Lichtschranke_oben, INPUT_PULLUP);  //Lichtschranke oben
  pinMode(Lichtschranke_unten, INPUT_PULLUP);  //Lichtschranke unten


}

void loop() {
  messwert_oben = digitalRead(8); //Die Signalausgabe der oberen Lichtschranke wird ausgelesen und unter der Variable „messwert“ gespeichert. Wenn die Lichtschranke unterbrochen wird, speichert der Mikrocontroller den Wert "1", ansonsten "0".
  messwert_unten = digitalRead(7); //Die Signalausgabe der oberen Lichtschranke wird ausgelesen und unter der Variable „messwert“ gespeichert. Wenn die Lichtschranke unterbrochen wird, speichert der Mikrocontroller den Wert "1", ansonsten "0".

  if (digitalRead(Taster_Pin) == HIGH); {
    if (digitalRead(8) ) {
      messwert_oben = 1;
    } else {
      messwert_oben = 0;
    }
    if (digitalRead(7) ) {
      messwert_unten = 1;
    } else {
      messwert_unten = 0;
    }



    while ((messwert_unten = 1) == true); {             //Aufzug fährt solange nach unten, bis die untere Lichtschranke erreicht ist
      digitalWrite(dirPin, HIGH);

      // Schrittmotor dreht eine ganze Umdrehung im Uhrzeigersinn
      for (int i = 0; i < stepsPerRevolution; i++) {
        // Die folgenden Zeilen sind ein Schritt
        digitalWrite(stepPin, HIGH);
        delayMicroseconds(500);
        digitalWrite(stepPin, LOW);
        delayMicroseconds(500);


      }
    }


    while ((messwert_oben = 1) == true); {             //Aufzug fährt solange nach oben, bis die untere Lichtschranke erreicht ist
      digitalWrite(dirPin, LOW);

      // Schrittmotor dreht eine ganze Umdrehung entgegen dem Uhrzeigersinn
      for (int i = 0; i < stepsPerRevolution; i++) {
        // Die folgenden Zeilen sind ein Schritt
        digitalWrite(stepPin, HIGH);
        delayMicroseconds(500);
        digitalWrite(stepPin, LOW);
        delayMicroseconds(500);


      }
    }
  }
}

Der Motor soll jeweils solange weiterdrehen, bis die untere Lichtschranke (Pin 7) unterbrochen wird. Und umgekehrt.
Es gibt nur diese zwei Zustände: Entweder unten 1, dann ist oben 0 (Aufzug steht unten), oder umgekehrt (Aufzug steht oben).

Würde das mehr Sinn machen?

LG und vielen Dank hier ins Forum,
Markus

PS: digitalRead habe ich jetzt mal gelassen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.01.2021, 22:47 (Dieser Beitrag wurde zuletzt bearbeitet: 16.01.2021 22:47 von Tommy56.)
Beitrag #8
RE: Arduino mit Schrittmotor und Lichtschranken
Warum probierst Du es nicht einfach aus und sagst uns was passiert?

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Schrittmotor Geschwindigkeit steuern!!!! Rumpl-X 11 913 26.12.2020 15:02
Letzter Beitrag: Nichtraucher
  Accelstepper libary und Schrittmotor Lothileinchen 11 3.143 22.01.2020 21:30
Letzter Beitrag: Lothileinchen
  Wert von einem Arduino zu einem zweiten Arduino senden Thorsten_S 9 3.546 14.10.2019 14:48
Letzter Beitrag: Thorsten_S
  Wegbegrenzung für Schrittmotor Scouter 62 10.747 10.02.2019 13:48
Letzter Beitrag: Scouter
  Projekt Portionierer mit Schrittmotor, Bluetooth hilfe Flieger 3 2.066 09.08.2018 13:02
Letzter Beitrag: Hilgi
  Endschalter für Schrittmotor clemens5555 10 6.432 18.04.2018 14:37
Letzter Beitrag: Tommy56
  Schrittmotor mit Puls/Richtung Steuern Günni 6 4.716 19.01.2018 10:30
Letzter Beitrag: Tommy56
  Schrittmotor Geschwindigkeit mit Wägezelle + HX711 Modul steuern Schrittmotor 10 6.755 30.08.2017 23:45
Letzter Beitrag: hotsystems
  Firmata (Daten senden an den Arduino und empfangen vom Arduino) comfan 6 6.281 29.04.2017 14:29
Letzter Beitrag: hotsystems
  Schrittmotor mit l298n Sequenz huber5093 10 5.831 26.04.2017 15:06
Letzter Beitrag: huber5093

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste