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
}
}