Stepper motor too slow i dont know why

i m working on a projekt and i was wondering why my stepper motor isnt working properly, my projekt includes a touch screen ,a motor ,a driver and a 24v source.
my question is, is it that the code too complex is to run the motor or am i missing something.


/*************   Steuerung eines Feeder Systems über ein Touchscreen und Serielle-Kommunikation   *************/
/*********************************        mit hilfe einer Stepper Motor       *********************************/

#include <Adafruit_GFX.h>
#include <MCUFRIEND_kbv.h>
#include <TouchScreen.h>
#include <AccelStepper.h>

MCUFRIEND_kbv tft;

#define MINPRESSURE 200
#define MAXPRESSURE 1000

// Driver pins Definieren
#define STEP_PIN 52  
#define DIR_PIN 53 

#define TFT_CS 10
#define TFT_DC 9

// Die 6  Papier erkennung Transistore an Pins definieren
#define T6 26
#define T5 27
#define T4 28
#define T3 29
#define T2 30
#define T1 31


// Pins für die Touchscreen-Verbindung definieren
const int XP=8,XM=A2,YP=A3,YM=9; //320x480 ID=0x9488
const int TS_LEFT=170,TS_RT=977,TS_TOP=939,TS_BOT=178;

unsigned long startTime;                // Anfang zeit 
unsigned long currentTime;              // Laufende zeit
bool Abfrage = false;                   // Variable zur Überprüfung, ob eine Abfrage gesendet wurde
bool receivedResponse = false;          // Variable zur Speicherung, ob eine Antwort erhalten wurde
bool separieren = false;                // Blatt Separieren eingesetzt oder nicht
int feederSpeed ;                       // variable zum auslesen der Feeder geschwindigkeit
int feeder_PreFeed = feederSpeed/2;     // variable zum auslesen der PreFedd geschwindigkeit
int pixel_x, pixel_y;  
String kommand;                         // Mein Befehl an den Feeder
String myLowerKommand;                  // Mein Befehl Kleingeschrieben 


TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);                                                            // Touchscreen-Objekt erstellen
Adafruit_GFX_Button speed1_btn, speed2_btn, speed3_btn, stop_btn, send_btn, sep_btn, einzug_btn, PERK_btn;    // Buttons für die Geschwindigkeitsauswahl definieren und Andere Buttons

// Farben initialisieren
#define BLACK      0x0000
#define GREY       0x5555
#define DARKGREEN  0x05C0
#define GREEN      0x07E0
#define CYAN       0x07FF
#define BLUE       0x001F
#define MAGENTA    0xF81F
#define RED        0xF800
#define GOLD       0xDDC0
#define YELLOW     0xFFE0
#define WHITE      0xFFFF



AccelStepper myStepper(1, 52, 53);    // Stepper-Motor-Objekt erstellen.

// Funktion zum Auslesen der Touchscreen-Koordinaten
bool Touch_getXY(void)               
{
  TSPoint p = ts.getPoint();
  pinMode(YP, OUTPUT);      
  pinMode(XM, OUTPUT);
  digitalWrite(YP, HIGH);   // wegen TFT control pins.
  digitalWrite(XM, HIGH);
  bool pressed = (p.z > MINPRESSURE && p.z < MAXPRESSURE);
  if (pressed) {
    pixel_x = map(p.x, TS_LEFT, TS_RT, 0, tft.width()); 
    pixel_y = map(p.y, TS_TOP, TS_BOT, 0, tft.height());
  }
  return pressed;
}

void setup()
{ // Alle Pins T1 bis T6 als Eingang Pin für Sensor Daten zu lesen definieren.
  pinMode(T1 ,INPUT);
  pinMode(T2 ,INPUT);
  pinMode(T3 ,INPUT);
  pinMode(T4 ,INPUT);
  pinMode(T5 ,INPUT);
  pinMode(T6 ,INPUT);

  Serial.begin(115200);              // Serielle Kommunikation starten.
  Serial1.begin(115200, SERIAL_8N2); // Initialisiert die Kommunikation mit einem anderen Gerät mit Baudrate 19200 und 8 Datenbits, kein Paritätsbit und 2 Stopbits.
  
  myStepper.setMaxSpeed(2000);       // Geschwindigkeit setzen.
  myStepper.setAcceleration(50);     // Beschleunigung setzen.
  Serial1.println("LOSGEHTS");       // den Feeder signal geben, dass der Scanner Bereit ist.
  // TFT-Display initialisieren
  uint16_t ID = tft.readID();
  if (ID == 0xD3D3) ID = 0x9486; 
  tft.begin(ID);
  tft.setRotation(0);           
  tft.fillScreen(BLACK);

  // intialisiere die buttons für den Hubtisch hoch runter fahren.
  tft.fillTriangle (160, 280, 110, 340, 210, 340, GREEN); 
  tft.fillTriangle (160, 415, 110, 360, 210, 360, GREEN);

  // Buttons initialisieren
  speed1_btn.initButton(&tft,  80,  40, 100, 40, WHITE, GREEN, BLACK,  "Speed1", 2);
  speed2_btn.initButton(&tft, 240,  40, 100, 40, WHITE, GREEN, BLACK,  "Speed2", 2);
  speed3_btn.initButton(&tft,  80, 100, 100, 40, WHITE, GREEN, BLACK,  "Speed3", 2);
  stop_btn.initButton  (&tft, 240, 100, 100, 40, WHITE,   RED, BLACK,    "STOP", 2);
  send_btn.initButton  (&tft,  80, 170, 100, 40, WHITE,  CYAN, BLACK,    "SEND", 2);
  sep_btn.initButton   (&tft, 240, 170, 100, 40, WHITE,  CYAN, BLACK,     "Sep", 2);
  einzug_btn.initButton(&tft,  80, 230, 100, 40, WHITE,  CYAN, BLACK,  "einzug", 2);
  PERK_btn.initButton  (&tft, 240, 230, 100, 40, WHITE,  CYAN, BLACK, "Papier!", 2);   //PapierERKennung button 

  // Buttons ausblenden
  speed1_btn.drawButton(false);
  speed2_btn.drawButton(false);
  speed3_btn.drawButton(false);
  stop_btn.drawButton  (false);
  send_btn.drawButton  (false);
  sep_btn.drawButton   (false);
  einzug_btn.drawButton(false);
  PERK_btn.drawButton  (false);
}

void loop()
{  
  bool receivedResponse = false; 
  bool down = Touch_getXY(); // Überprüfen, ob ein Touch-Ereignis aufgetreten ist
  currentTime = millis();    // Speichert die aktuelle Zeit in currentTime

  boolean inside_triangle1 = ((pixel_x >= 110) && (pixel_x <= 210) && (pixel_y > 280) && (pixel_y <= 340));
  boolean inside_triangle2 = ((pixel_x >= 110) && (pixel_x <= 210) && (pixel_y > 360) && (pixel_y <= 415));

  // Wenn ein Touch-Ereignis aufgetreten ist, die Touch-Koordinaten abrufen
  if (down) {
    if (inside_triangle1) {
      Serial.println("UP");
    } 
    else if (inside_triangle2) {
      Serial.println("DOWN");
    }
  }

  // das Verhalten der Tasten Steuern, basierend auf den Positionen wo es gedrückt wird.
  speed1_btn.press(down && speed1_btn.contains(pixel_x, pixel_y));
  speed2_btn.press(down && speed2_btn.contains(pixel_x, pixel_y));
  speed3_btn.press(down && speed3_btn.contains(pixel_x, pixel_y));
  stop_btn.press  (down && stop_btn.contains  (pixel_x, pixel_y));
  send_btn.press  (down && send_btn.contains  (pixel_x, pixel_y));
  sep_btn.press   (down && sep_btn.contains   (pixel_x, pixel_y));
  einzug_btn.press(down && einzug_btn.contains(pixel_x, pixel_y));
  PERK_btn.press  (down && PERK_btn.contains  (pixel_x, pixel_y));

    // was passiert wenn einer der buttons gedrückt wird.    
    if (speed1_btn.isPressed()) {
      speed1_btn.drawButton (true);
      speed2_btn.drawButton(false);
      speed3_btn.drawButton(false);
      stop_btn.drawButton  (false);
      send_btn.drawButton  (false);
      setMotorSpeed(897);    // den Motorspeed einsetzen beim aufrufen der setMotorSpeed() funktion.
      myStepper.runSpeed();  // Diese Funktion führt den Schrittmotor mit der aktuell eingestellten Geschwindigkeit aus.
      feederSetSpeed(504); 
    }
    if (speed2_btn.isPressed()) {
      speed2_btn.drawButton (true);
      speed1_btn.drawButton(false);
      speed3_btn.drawButton(false);
      stop_btn.drawButton  (false);
      send_btn.drawButton  (false);
      setMotorSpeed(1023);
      myStepper.runSpeed();
      feederSetSpeed(574);
    }
    if (speed3_btn.isPressed()) {
      speed3_btn.drawButton (true);
      speed1_btn.drawButton(false);
      speed2_btn.drawButton(false);
      stop_btn.drawButton  (false);
      send_btn.drawButton  (false);
      setMotorSpeed(1349);
      myStepper.runSpeed();
      feederSetSpeed(765);
    }
    if (stop_btn.isPressed()) {
      stop_btn.drawButton   (true);
      speed1_btn.drawButton(false);
      speed2_btn.drawButton(false);
      speed3_btn.drawButton(false);
      send_btn.drawButton  (false);
      setMotorSpeed(0);
      myStepper.stop(); // Stepper Motor stoppen.
    }
    if (send_btn.isPressed()){ 
      send_btn.drawButton(true);
      Abfrage = true;
     
      myKommands();
    }
    if (sep_btn.isPressed()){ 
      if(!separieren){
        sep_btn.drawButton(true);
        separieren = true;
        Serial1.println("WSEPA:1");
        delay(500);
      }
      else { 
        sep_btn.drawButton(true);
        separieren = false;
        Serial1.println("WSEPA:0");
        delay(500);
      }
    }
    if(einzug_btn.isPressed()){
      einzug_btn.drawButton(true);
      Serial1.println("WFEED:i");
      setMotorSpeed(897);
      myStepper.runSpeed();
        
       while(digitalRead(T1) == LOW || digitalRead(T2) == LOW || digitalRead(T3) == LOW || digitalRead(T4) == LOW || digitalRead(T5) == LOW || digitalRead(T6) == LOW){
       // Motor weiter laufen lassen, da noch Papier erkannt wird.
        myStepper.runSpeed();
       }
    }
    else{
     // Stoppe den Motor, wenn kein Papier mehr erkannt wird.
      setMotorSpeed(0);
      myStepper.stop();
    }
  
    if (Abfrage && !receivedResponse && currentTime - startTime > 60000) {
      Serial.println("ERORR FEEDER ANTWORTET NICHT");   // Gibt eine Fehlermeldung aus, wenn innerhalb von 1 Minute keine Antwort erhalten wurde.
      startTime = currentTime;                          // Setzt die Startzeit auf die aktuelle Zeit.
    } 
  
    if(PERK_btn.isPressed())
    {
      PERK_btn.drawButton(true);
      papierErkennungAbfragen();
    }

  myStepper.runSpeed();
}

void setMotorSpeed(int motorSpeed)     // Funktion zum Setzen der Motorgeschwindigkeit.
{ 
  myStepper.setSpeed(motorSpeed);      // geschwindigkeit wert festlegen.
  myStepper.runSpeed();                // Motor betreiben.
}

void feederSetSpeed(int feederSpeed)  // setzt die Geschwindigkeit des Feeders auf Standard und Pre.
{
  Serial1.println("WSPEED:1,"+ String(feederSpeed));
  Serial1.println("WSPEED:2,"+ String(feeder_PreFeed)); // Pre-feed ist die hälfte der standard Geschwindigkeit.
}

void myKommands() // funktion für den befehl input an den feeder zu senden.
{
  String kommand = "";
  if(Serial.available()>0){
   char input = Serial.read();
    switch (input) {
      case '1':
        kommand = sendToFeeder("RFTYP", "");// Feeder Type einlesen
        break;
      case '2':
        kommand = sendToFeeder("RERR", ""); // Error einlesen
        break;
      case '3':
        kommand = sendToFeeder("RSEPA",""); // Papierseparierung einlesen
        break;
      case '4':
        kommand = sendToFeeder("RSPEED","");// Feeder geschwindigkeit einlesen 
        break;
      case '5':
        kommand = sendToFeeder("RDFEED5","");// Doppelblatterkennung einlesen
        break;
      case '6':
        kommand = sendToFeeder("RUSOFF5","");// Abgeschaltete Ultraschalsensoren zurücklesen
        break;
      case '7':
        kommand = sendToFeeder("RSTAINF","");// checken ob Büroklammern_Erkennung vorhanden ist
        break;
      default:                             
        Serial.println  ("Ungültiger Input");// Standardfall, wenn kein Case übereinstimmt
        break;
    }
  }
}

String sendToFeeder(String kommand, String response) // Funktion zum Senden von Befehlen an den Feeder und Empfangen von Antworten
{ 
  Serial1.println(0x0A + kommand);     // Sendet den Befehl an den pc über die serielle Verbindung
  delay(200); 
  
  while (Serial1.available()) 
  {
    response = Serial1.readString();
    myLowerKommand = kommand;
    myLowerKommand.toLowerCase();        // Kleinbuchstabenversion von myLowerKommand abrufen

   if (response.equals(myLowerKommand))  // Überprüfe, ob die Antwort mit myLowerKommand übereinstimmt
    {
      Serial.println(response);
    } else {
      Serial.println("FEHLER");
    }
    receivedResponse = true;
    startTime = currentTime;
  }
  return response;
}

void papierErkennungAbfragen()
{
  int count;
  int T1Status = digitalRead(T1);
  int T2Status = digitalRead(T2);
  int T3Status = digitalRead(T3);
  int T4Status = digitalRead(T4);
  int T5Status = digitalRead(T5);
  int T6Status = digitalRead(T6);

  // wenn einer der Sensoren auf LOW gestzt wird dann ist Papier da ,sonst ist der Scanner Ready um Papier rein zu ziehen
  if(T1Status == LOW || T2Status == LOW || T3Status == LOW || T4Status == LOW || T5Status == LOW || T6Status == LOW)
  { 
    Serial.println("Papier Da");
  }
  else {
    Serial.println("Scanner Ready, LOSGEHTS!"); // wenn alles auf HIGH gesetzt ist dann ist der Scanner Ready papier zu emfangen
  }
}

Laut Deiner deutschen Kommentare im Sketch würde ich sagen Du sprichst auch deutsch.

  1. mit einem Minimalsketch ( nur Ansteuerung des Motortreibers) funktioniert der Motor?
  2. genaue Fehlerbeschreibung: was wann wie nicht geht oder was wann anders als erwartet geht.

Grüße Uwe

1 Like

this not a question of code-complexity. It is a question of loop-executiontime.

Which means how long does it take to run down all lines of code inside function loop()

The AccelStepper-library needs the loop to run faster than the next step-pulse occurs or to use the blocking functions for he step-pulse-creation.
Sending data to a TFT-display needs quite some time.

Both options are IMHO unsatisfying.
I recommend that you use the MobaTools-library for driving the stepper-motors.

The mobatools-library creates the step-pulses based on a timer-interrupt in the background. This enables to create the step-pulses independant from the other code.

1 Like

ja genau mit einem minimal sketch funktioniert der motor auch die geschwindigkeit kann gändert werden.(zum beispiel wenn ich diesen code benutze #include <AccelStepper.h>

#define STEP_PIN 52
#define DIR_PIN 53

AccelStepper myStepper (1, 52, 53);

void setup() {
  Serial.begin(19200);

  myStepper.setMaxSpeed(2000);
  myStepper.setAcceleration(1); // full steps pro 10mm sind 178
}

void loop() {
 
  if (Serial.available() > 0) {
    int speedInput = Serial.read();
  
    if (speedInput != 0) 
    {
      set_Speed(speedInput);
    }
     Serial.println("eins");
    myStepper.run();  
  }
}

void set_Speed(int speedInput) {
  switch(speedInput) {
    case '1':
      myStepper.setSpeed(897);
      myStepper.run();
      Serial.println("eins");
      break;
    case '2':
      myStepper.setSpeed(1023);
      myStepper.run();
      Serial.println("zwei");
      break;
    case '3':
      myStepper.setSpeed(1349);
      myStepper.run();
      break;
    default:
      myStepper.setSpeed(897);
      Serial.println("def");
      break;
  }
}

nur wenn ich diesen langen code mit den ganzen buttons benutze, funktioniert der motor sehr langsam und nur wenn der button für speed gedrückt halte.

ok i will try to use it but not sure if it would work, thanks alot.

Der thread ist im deutschen Sub-Forum deshalb sollte die Sprache auch deutsch sein.
Ich bin viel im englischen Forum unterwegs deshalb ist mir das zuerst nicht aufgefallen.

1 Like

es ist nur meine erste frage hier und ich wusste nicht wie und in welche sprache ,ich die frage stellen soll.

Code immer als Code-section posten.
Das kann man auch nachträglich editieren.
Mit dem Bleistiftsymbol unterhalb deines Postings den editiermodus aktivieren
den Code markieren und dann den < code > Button anklicken.

1 Like

Kannst Du mal den Code in Tags setzen?
-> MIt dem Bleistift den Post editieren.
Den Code markieren
Dann den Button <code> im Editor anklicken und speichern.
achtung! Da muss nach "benutze" ein Zeilenumbruch rein!

1 Like

Das steht doch an falscher Stelle...
Schau in die Beispiele.

Nein das Problem war was anders wie @StefanL38 gesagt hat die library war zu langsam und es ist mit diesen MobaTools.h besser geworden aber ich habe immer noch paar Probleme mit dem Touch und die Geschwindigkeiten, danke dir trotzdem:)

Nein die AccelStepper-library ist nicht zu langsam.
Die Arbeistweise der AccelStepper-library erfordert das dein Code schnell abgearbeitet werden muss.

Die MobaTools ermöglichen, dass dein Code langsam sein kann und die Step-pulse trotzdem schnell ausgegeben werden, weil die MobaTools eine ganze andere Art der Step-pulserzeugung benutzen.

Ja genau danke für die Erklärung, mein Deutsch ist nicht so gut, das so zu erklären. Und ich danke dir für den Vorschlag.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.