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
2 Stepper parallel mit easydrivern Endlagen und Mittelstellung
17.06.2015, 09:44 (Dieser Beitrag wurde zuletzt bearbeitet: 17.06.2015 09:47 von murdok1980.)
Beitrag #1
2 Stepper parallel mit easydrivern Endlagen und Mittelstellung
Nachdem ich die Version mit den Servos verworfen habe, baue ich mein Projekt mit Servomotoren.
Zur Vorgeschichte. Ich möchte gleichzeitig und synchron laufend 2 Stepper ansteuern. Nach links von 0° bis 135° zum Endschalter und nach rechts von 0° bis -135° zum Endschalter. 0 Grad ist die Mittelstellung auch mit Schalter. Für die Schalter verwende ich Hallsensoren. Die Sensoren befinden sich nur an einem Stepper, weil der andere ja eigentlich synchron mitläuft. Für den Fall der Fälle kann ich aber auch manuell mit zwei Tastern nachjustieren.
Funktionieren tut soweit alles, außer wenn ich die Mittelstellung anfahre, bleibt der Stepper je nachdem ob ich von links oder rechts komme in 2 unterschiedlichen Positionen stehen. Das liegt wohl an der Funktion des Hall Sensors.
Mein Frage könnte man nicht sagen, das der Stepper noch ein gewisse Anzahl Schritte weiter fährt, damit er immer in der selben Mittelposition ankommt. Oder lässt man den Mittelsensor weg und zählt die Schritte bis zur Mitte.
Dafür müßte doch aber vor der void Schleife eine Initialisierung stattfinden, die erst einen Endschalter anfährt und dann bis zur Mitte zählt. Das ist mir aber bissl zu hoch ohne Hilfe.
Hier mal der aktuelle Sketch
Code:
Test Stepper links und rechts
// Mit Multischalter und Endlagen links und rechts
// Stopp bei erreichen der Mittelstellung
// mit 2 Steppern parallel und 2x EasyDriver 4.4
// Geschwindigkeit einstellbar
// Stepper Farben Orange an Motor A1, Pink an Motor A2, Gelb an Motor B1, Blau an Motor B2

int sleep      = A0; // Stopp Stepper 1 Anschluss an SLEEP 1
int sleep1     = A1; // Stopp Stepper 2 Anschluss an SLEEP 2
int dirpin     = 10; // Easy Driver Stepper 1 + 2 parallel
int steppin    = 11; // Easy Driver Stepper 1 + 2 parallel
int dirpin1    = 12; // Easy Driver Stepper 3 + 4 parallel
int steppin1   = 13; // Easy Driver Stepper 3 + 4 parallel
int cal_links  = A2; // Taster zum links kalibrieren
int cal_rechts = A3; // Taster zum rechts kalibrieren
                                                                                                                                                                                      
const int buttonPin1 = 2;              // Anschluss Multiswitch Kanal 1
const int buttonPin2 = 3;              // Anschluss Multiswitch Kanal 2
const int buttonPin3 = 4;              // Anschluss Endschalter 1  Stepper 1 + 2
const int buttonPin4 = 5;              // Anschluss Endschalter 2  Stepper 1 + 2
const int buttonPin5 = 6;              // Anschluss Schalter Mitte Stepper 1 + 2
const int buttonPin6 = 7;              // Anschluss Endschalter 1  Stepper 3 + 4
const int buttonPin7 = 8;              // Anschluss Endschalter 2  Stepper 3 + 4
const int buttonPin8 = 9;              // Anschluss Schalter Mitte Stepper 3 + 4

boolean altPin1;
boolean altPin2;
boolean altPin5;
boolean mitte = false;
boolean altPin8;
boolean mitte2 = false;

void setup()
{
  pinMode(sleep, OUTPUT);
  pinMode(sleep1, OUTPUT);
  pinMode(dirpin, OUTPUT);
  pinMode(steppin, OUTPUT);
  pinMode(dirpin1, OUTPUT);
  pinMode(steppin1, OUTPUT);
                                          
  Serial.begin(9600);

  pinMode(cal_links, INPUT_PULLUP);
  pinMode(cal_rechts, INPUT_PULLUP);
  pinMode(buttonPin1, INPUT_PULLUP);     // Anschluss Multiswitch Kanal 1
  pinMode(buttonPin2, INPUT_PULLUP);     // Anschluss Multiswitch Kanal 2

  pinMode(buttonPin3, INPUT_PULLUP);     // Anschluss Endschalter 1  Servo 1
  pinMode(buttonPin4, INPUT_PULLUP);     // Anschluss Endschalter 2  Servo 1
  pinMode(buttonPin5, INPUT_PULLUP);     // Anschluss Schalter Mitte Servo 1

  pinMode(buttonPin6, INPUT_PULLUP);     // Anschluss Endschalter 1  Servo 2
  pinMode(buttonPin7, INPUT_PULLUP);     // Anschluss Endschalter 2  Servo 2
  pinMode(buttonPin8, INPUT_PULLUP);     // Anschluss Schalter Mitte Servo 2
  altPin1 = digitalRead(buttonPin1);
  altPin2 = digitalRead(buttonPin2);
  altPin5 = digitalRead(buttonPin5);
  altPin8 = digitalRead(buttonPin8);

}
void loop()
{
  // Stepper 1 und 2 parallel

  if (digitalRead(buttonPin5) == LOW && altPin5 == HIGH)
  {
    mitte = false;
  }
  else if ((digitalRead(buttonPin1) == LOW && altPin1 == HIGH) || (digitalRead(buttonPin2) == LOW && altPin2 == HIGH))
  {
    mitte = true;
  }

  // Stepper 3 und 4 parallel

  if (digitalRead(buttonPin8) == LOW && altPin8 == HIGH)
  {
    mitte2 = false;
  }
  else if ((digitalRead(buttonPin1) == LOW && altPin1 == HIGH) || (digitalRead(buttonPin2) == LOW && altPin2 == HIGH))
  {
    mitte2 = true;
  }

  altPin1 = digitalRead(buttonPin1);
  altPin2 = digitalRead(buttonPin2);
  altPin5 = digitalRead(buttonPin5);
  altPin8 = digitalRead(buttonPin8);

  // Stepper 1 + 2

  if (digitalRead(buttonPin1) == LOW && digitalRead(buttonPin3) == HIGH && mitte)
  {
    Serial.println("Links drehen Stepper 1 + 2");
    digitalWrite(sleep, HIGH);
    digitalWrite(sleep1, HIGH);
    rotate(50, 0.05); //The motor rotates 100 steps clockwise with a speed of 0.1 (slow)
  }
  else if (digitalRead(buttonPin2) == LOW && digitalRead(buttonPin4) == HIGH && mitte)
  {
    Serial.println("Rechts drehen Stepper 1 + 2");
    digitalWrite(sleep, HIGH);
    digitalWrite(sleep1, HIGH);
    rotate(-50, 0.05); //The motor rotates 100 steps clockwise with a speed of 0.1 (slow)                              
                                  
  }
  else
  {
    Serial.println("Stop Stepper 1 + 2");
    digitalWrite(sleep, LOW);
    digitalWrite(sleep1, LOW);
  }
  
  // Kalibrierung links
  if (digitalRead(cal_links) == LOW)
  {
    digitalWrite(sleep, HIGH);
    digitalWrite(sleep1, LOW);
    rotate(20, 0.02); //The motor rotates 100 steps clockwise with a speed of 0.1 (slow)
    }
    
  // Kalibrierung rechts
  if (digitalRead(cal_rechts) == LOW)
  {
    digitalWrite(sleep, HIGH);
    digitalWrite(sleep1, LOW);
    rotate(-20, 0.02); //The motor rotates 100 steps clockwise with a speed of 0.1 (slow)
    }
  
  // Stepper 3 + 4

  if (digitalRead(buttonPin1) == LOW && digitalRead(buttonPin6) == HIGH && mitte2)
  {
    Serial.println("                         Links drehen Stepper 3 + 4");
    //myservo1.writeMicroseconds(SV2_links);
  }
  else if (digitalRead(buttonPin2) == LOW && digitalRead(buttonPin7) == HIGH && mitte2)
  {
    Serial.println("                         Rechts drehen Stepper 3 + 4");
    //myservo1.writeMicroseconds(SV2_rechts);
  }
  else
  {
    Serial.println("                         Stop Stepper 3 + 4");
    
  }
}
/* Funktion 1
The rotate function turns the stepper motor. Tt accepts two arguments: 'steps' and 'speed'*/
void rotate(int steps, float speed){
  /*This section looks at the 'steps' argument and stores 'HIGH' in the 'direction' variable if */
  /*'steps' contains a positive number and 'LOW' if it contains a negative.*/
  int direction;

  if (steps > 0){
    direction = HIGH;
  }else{
    direction = LOW;
  }

  speed = 1/speed * 70; //Calculating speed
  steps = abs(steps); //Stores the absolute value of the content in 'steps' back into the 'steps' variable

  digitalWrite(dirpin, direction); //Writes the direction (from our if statement above), to the EasyDriver DIR pin

  /*Steppin'*/
  for (int i = 0; i < steps; i++){
    digitalWrite(steppin, HIGH);
    delayMicroseconds(speed);
    digitalWrite(steppin, LOW);
    delayMicroseconds(speed);
  }
}
/* Funktion 2
The rotate function turns the stepper motor. Tt accepts two arguments: 'steps' and 'speed'*/
void rotate1(int steps, float speed){
  /*This section looks at the 'steps' argument and stores 'HIGH' in the 'direction' variable if */
  /*'steps' contains a positive number and 'LOW' if it contains a negative.*/
  int direction;

  if (steps > 0){
    direction = HIGH;
  }else{
    direction = LOW;
  }

  speed = 1/speed * 70; //Calculating speed
  steps = abs(steps); //Stores the absolute value of the content in 'steps' back into the 'steps' variable

  digitalWrite(dirpin1, direction); //Writes the direction (from our if statement above), to the EasyDriver DIR pin

  /*Steppin'*/
  for (int i = 0; i < steps; i++){
    digitalWrite(steppin1, HIGH);
    delayMicroseconds(speed);
    digitalWrite(steppin1, LOW);
    delayMicroseconds(speed);
  }
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.06.2015, 12:21
Beitrag #2
RE: 2 Stepper parallel mit easydrivern Endlagen und Mittelstellung
Sorry änder ich sofort.
Zum bereits vorhandenen Lösungsansatz.
In rotate (50, 0.05) bzw. rotate (-50, 0.05) stecken ja die Richtungsinformationen.
Ich müsste an der Stelle hier
else
{
Serial.println("Stop Stepper 1 + 2");
digitalWrite(sleep, LOW);
digitalWrite(sleep1, LOW);
das rotate einfügen
}
aber ich muss doch wissen aus welcher Richtung ich komme, denn danach richtet sich doch ob ich positiv oder negativ rotate schreibe.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.06.2015, 19:49 (Dieser Beitrag wurde zuletzt bearbeitet: 17.06.2015 19:57 von murdok1980.)
Beitrag #3
RE: 2 Stepper parallel mit easydrivern Endlagen und Mittelstellung
Jetzt steh ich ganz schön neben mir. Gestern lief der Sketch den ich gepostet habe einwandfrei und heute bekomme ich nen Kompilierungsfehler. Kann das viellecht jemand testen? Erledigt geht wieder. Aber das Problem mit dem Mittelschalter konnte ich noch nicht lösen. Über etwas Hilfe von den Experten hier würde ich mich freuen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.06.2015, 12:16
Beitrag #4
RE: 2 Stepper parallel mit easydrivern Endlagen und Mittelstellung
Ich denke ich könnte vor dem Befehl
digitalWrite(sleep, LOW);
digitalWrite(sleep1, LOW);
auch nen delay setzen aber das ist programmtechnisch unsauber und blockiert bestimmt weitere Funktionen.
Wie kann das anders gelöst werden.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.06.2015, 21:08
Beitrag #5
RE: 2 Stepper parallel mit easydrivern Endlagen und Mittelstellung
Also das mit dem delay geht natürlich nicht.
Hab jetzt nochmal den Sketch aufgeräumt und mich an der Funktion versucht. Die Funktion mit den definierten Schritten über die Mitte fahren geht jetzt. Ist nur noch nen kleiner Schönheitsfehler drin. Und zwar wenn der Stepper in der Mitte verzögert angehalten hat und ich wieder losdrehen will, dauert es immer erst 1-2 Sekunden bis er losläuft. Das stört etwas. Vielleicht kann ja jemand noch einmal nen Auge drauf werfen.
Code:
// Test Stepper links und rechts
// Mit Multischalter und Endlagen links und rechts
// Stopp bei erreichen der Mittelstellung
// mit 2 Steppern parallel und 2x EasyDriver 4.4
// Geschwindigkeit einstellbar
// Stepper Farben Orange an Motor A1, Pink an Motor A2, Gelb an Motor B1, Blau an Motor B2

int direction;

const int sleep      = A0; // Stopp Stepper 1 Anschluss an SLEEP 1
const int sleep1     = A1; // Stopp Stepper 2 Anschluss an SLEEP 2
const int dirpin     = 10; // Easy Driver Stepper 1 + 2 parallel
const int steppin    = 11; // Easy Driver Stepper 1 + 2 parallel
const int cal_links  = A2; // Taster zum links kalibrieren
const int cal_rechts = A3; // Taster zum rechts kalibrieren
                                                                                                                                                                                      
const int buttonPin1 = 2;              // Anschluss Multiswitch Kanal 1
const int buttonPin2 = 3;              // Anschluss Multiswitch Kanal 2
const int buttonPin3 = 4;              // Anschluss Endschalter 1  Stepper 1 + 2
const int buttonPin4 = 5;              // Anschluss Endschalter 2  Stepper 1 + 2
const int buttonPin5 = 6;              // Anschluss Schalter Mitte Stepper 1 + 2


boolean altPin1;
boolean altPin2;
boolean altPin5;
boolean mitte = false;
boolean altPin8;
boolean mitte2 = false;

void setup()
{
  pinMode(sleep, OUTPUT);
  pinMode(sleep1, OUTPUT);
  pinMode(dirpin, OUTPUT);
  pinMode(steppin, OUTPUT);
                                            
  Serial.begin(9600);

  pinMode(cal_links, INPUT_PULLUP);
  pinMode(cal_rechts, INPUT_PULLUP);
  pinMode(buttonPin1, INPUT_PULLUP);     // Anschluss Multiswitch Kanal 1
  pinMode(buttonPin2, INPUT_PULLUP);     // Anschluss Multiswitch Kanal 2

  pinMode(buttonPin3, INPUT_PULLUP);     // Anschluss Endschalter 1  Stepper 1 + 2
  pinMode(buttonPin4, INPUT_PULLUP);     // Anschluss Endschalter 2  Stepper 1 + 2
  pinMode(buttonPin5, INPUT_PULLUP);     // Anschluss Schalter Mitte Stepper 1 + 2

  altPin1 = digitalRead(buttonPin1);
  altPin2 = digitalRead(buttonPin2);
  altPin5 = digitalRead(buttonPin5);

}
void loop()
{
  // Stepper 1 und 2 parallel

  if (digitalRead(buttonPin5) == LOW && altPin5 == HIGH)
  {
    mitte = false;
  }
  else if ((digitalRead(buttonPin1) == LOW && altPin1 == HIGH) || (digitalRead(buttonPin2) == LOW && altPin2 == HIGH))
  {
    mitte = true;
  }

  altPin1 = digitalRead(buttonPin1);
  altPin2 = digitalRead(buttonPin2);
  altPin5 = digitalRead(buttonPin5);
  
  // Stepper 1 + 2

  if (digitalRead(buttonPin1) == LOW && digitalRead(buttonPin3) == HIGH && mitte)
  {
    Serial.println("Links drehen Stepper 1 + 2");
    digitalWrite(sleep, HIGH);
    digitalWrite(sleep1, HIGH);
    rotate(50, 0.05); //The motor rotates 100 steps clockwise with a speed of 0.1 (slow)
  }
  else if (digitalRead(buttonPin2) == LOW && digitalRead(buttonPin4) == HIGH && mitte)
  {
    Serial.println("Rechts drehen Stepper 1 + 2");
    digitalWrite(sleep, HIGH);
    digitalWrite(sleep1, HIGH);
    rotate(-50, 0.05); //The motor rotates 100 steps clockwise with a speed of 0.1 (slow)
                                  
  }
  else if (direction == LOW && digitalRead(buttonPin5) == LOW && altPin5 == LOW)
  {
    Serial.println("Stop Stepper 1 + 2");
    rotate(-1500, 0.05);
    digitalWrite(sleep, LOW);
    digitalWrite(sleep1, LOW);
  }
  
  else if (direction == HIGH && digitalRead(buttonPin5) == LOW && altPin5 == LOW)
  {
    Serial.println("Stop Stepper 1 + 2");
    rotate(1500, 0.05);
    digitalWrite(sleep, LOW);
    digitalWrite(sleep1, LOW);
  }
  else
  {
    Serial.println("Stop Stepper 1 + 2");
    digitalWrite(sleep, LOW);
    digitalWrite(sleep1, LOW);
  }
  
  // Kalibrierung links
  if (digitalRead(cal_links) == LOW)
  {
    digitalWrite(sleep, HIGH);
    digitalWrite(sleep1, LOW);
    rotate(20, 0.02); //The motor rotates 100 steps clockwise with a speed of 0.1 (slow)
    }
    
  // Kalibrierung rechts
  if (digitalRead(cal_rechts) == LOW)
  {
    digitalWrite(sleep, HIGH);
    digitalWrite(sleep1, LOW);
    rotate(-20, 0.02); //The motor rotates 100 steps clockwise with a speed of 0.1 (slow)
    }
}
/* Funktion 1
The rotate function turns the stepper motor. Tt accepts two arguments: 'steps' and 'speed'*/
void rotate(int steps, float speed){
  /*This section looks at the 'steps' argument and stores 'HIGH' in the 'direction' variable if */
  /*'steps' contains a positive number and 'LOW' if it contains a negative.*/
  
  // hier stand vorher int direction; das hab ich jetzt ganz am Anfang definiert

  if (steps > 0){
    direction = HIGH;
  }else{
    direction = LOW;
  }

  speed = 1/speed * 70; //Calculating speed
  steps = abs(steps); //Stores the absolute value of the content in 'steps' back into the 'steps' variable

  digitalWrite(dirpin, direction); //Writes the direction (from our if statement above), to the EasyDriver DIR pin

  /*Steppin'*/
  for (int i = 0; i < steps; i++){
    digitalWrite(steppin, HIGH);
    delayMicroseconds(speed);
    digitalWrite(steppin, LOW);
    delayMicroseconds(speed);
  }
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Bipolaren Stepper steuern DL8NAD 4 721 03.12.2015 22:38
Letzter Beitrag: Scherheinz
  Stepper 28BYJ-48 an UNO Symphonie 5 1.586 01.11.2015 09:07
Letzter Beitrag: Symphonie
  Accel Stepper Library für Schrittmotoren Problem Rampe fahren Schrittmotor 0 987 13.10.2015 21:03
Letzter Beitrag: Schrittmotor
  Anfänger und Stepper Cubiator 3 1.355 20.09.2015 17:52
Letzter Beitrag: Cubiator
  Stepper mit Feuchtesensor Warmbronner 9 1.419 02.08.2015 11:26
Letzter Beitrag: Scherheinz
  Stepper mit Arduino und Poti Hannes1984 3 958 01.08.2015 16:34
Letzter Beitrag: Scherheinz
Question MEHRERE Vorgänge parallel ausführen? Much 3 909 26.05.2015 13:39
Letzter Beitrag: tito-t
  Stepper und NeoPixel gleichzeitig paq 3 1.070 25.05.2015 10:33
Letzter Beitrag: rkuehle
  Serielle Kommunikation neben Programmablauf "parallel" ausführen bits10 1 799 16.03.2015 22:32
Letzter Beitrag: Bitklopfer
  Mehrere Schleifen parallel laufen lassen. Wie geht das?? Hendrik_Schutter 2 2.668 18.08.2014 11:19
Letzter Beitrag: Hendrik_Schutter

Gehe zu:


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