Hallo zusammen. Bisher konnte ich die meisten Probleme, die in der Vergangenheit auftauchten mit Hilfe dieses Forums gut lösen. Wer lesen kann ist zumeist klar im Vorteil ![]()
Jetzt jedoch bin ich mit einem letzten Problem meines Projektes am Ende allen Wissens und Möglichkeiten angekommen. Mein Projekt ist eine Drehscheiben-Steuerung für eine Spur1 Anlage. Die Hardware besteht aus einem Mega 2560, einem Nextion 7" Intelligent und einem Leadshine iEM 1708 Integrated Stepper Motor.
Auf Grund besserer Anpassungsmöglichkeiten habe ich zur FastAccelstepper Library gewechselt. Soweit scheint auch erst einmal alles ganz gut miteinander zu funktionieren. Allerding musste ich feststellen, dass sich bei Vor- und Rückwärtsbewegung nicht nur der Nullpunkt, sondern auch das Ziel im gleichen Maß in Richtung Plus verschieben. Der Schrittmotor macht 6400 Microsteps / Rev.
Wenn ich das Ziel 17700 eingebe, läuft er laut getCurrentPosition sauber nach vorne. mit dem Befehl moveTo(0); kommt er aber nicht wieder ganz dorthin zurück. Wenn ich jetzt moveTo(17700); läuft er wieder ordnungsgemäß nach vorne, wobei sich der Zielpunkt allerdings ebenfalls um den gleichen Betrag nach vorne verschoben hat, wie zuvor der Nullpunkt.
Beide Punkte driften also im gleichen Maß.
Hat dazu jemand eine Idee oder einen guten Vorschlag, wie ich das Problem in den Griff bekommen kann?

#include <Arduino.h>
#include <Nextion.h>
#include <AVRStepperPins.h> // Only required for AVR controllers
#include <FastAccelStepper.h>
#include <PWMServo.h>
uint32_t Schrittziel = 0;
short Position;
PWMServo sv1;
PWMServo sv2;
PWMServo sv3;
PWMServo sv4;
PWMServo sv5;
PWMServo sv6;
PWMServo sv7;
#define Relais 26 // Schuppenbeleuchtung
//Nextion Objekte Deklarieren
//(Seiten ID, Komponenten-ID, Komponentenname)
NexButton b1 = NexButton(0, 9, "b1"); //Horn
NexButton b2 = NexButton(0, 83, "b2"); //Reset
NexButton b3 = NexButton(0, 74, "b3"); //Stepper 50 Schritte zurück CCW
NexButton b4 = NexButton(0, 75, "b4"); //Stepper 10 Schritt zurück CCW
NexButton b5 = NexButton(0, 76, "b5"); //Stepper Stop
NexButton b6 = NexButton(0, 77, "b6"); //Stepper Run ohne Begrenzung
NexButton b7 = NexButton(0, 78, "b7"); //Stepper 10 Schritt vor CW
NexButton b8 = NexButton(0, 79, "b8"); //Stepper 50 Schritte vor CW
NexDSButton bt0 = NexDSButton(0, 59, "bt0"); //Schuppen Beleuchtung
NexDSButton bt1 = NexDSButton(0, 10, "bt1"); //Schuppen Servo Tor 1
NexDSButton bt2 = NexDSButton(0, 11, "bt2"); //Schuppen Servo Tor 2
NexDSButton bt3 = NexDSButton(0, 12, "bt3"); //Schuppen Servo Tor 3
NexDSButton bt4 = NexDSButton(0, 13, "bt4"); //Schuppen Servo Tor 4
NexDSButton bt5 = NexDSButton(0, 14, "bt5"); //Schuppen Servo Tor 5
NexDSButton bt6 = NexDSButton(0, 15, "bt6"); //Schuppen Servo Tor 6
NexNumber n1 = NexNumber(0, 57, "n1"); // Ziel-Position
NexTouch *nex_listen_list[] = { // deklarieren aller Funktions-Buttons auf dem Display
&b1,
&b2,
&b3,
&b4,
&b5,
&b6,
&b7,
&b8,
&bt0,
&bt1,
&bt2,
&bt3,
&bt4,
&bt5,
&bt6,
NULL
};
// Stepper einrichten Leadshine closed Loop
// mit TB6600 = 36,35,33
#define dirPinStepper 23 // grün
#define enablePinStepper 25 // grau
#define stepPinStepper 6 // gelb (Timer4 0C4A)
#define Hall_Sensor 22 // Signalleitung
#define Hall_Sensor_Plus 24 // 5V Spannungsversorgung
FastAccelStepperEngine engine = FastAccelStepperEngine();
FastAccelStepper *stepper = NULL;
void (*resetFunc)(void) = 0; // deklarieren der Hardware ResetFunction an Adresse 0
void forceStop();
void b1PushCallback(void *ptr) { //Horn
tone(52, 150, 500); //Pin, Frequency, Dauer
}
void b2PushCallback(void *ptr) { //Reset
resetFunc();
}
void b3PushCallback(void *ptr) { //Stepper 500 Schritte zurück CCW
stepper->move(-500);
}
void b4PushCallback(void *ptr) { //Stepper 100 Schritte zurück CCW
stepper->move(-100);
}
void b5PushCallback(void *ptr) { //Stepper Stop
stepper->forceStop();
}
void b6PushCallback(void *ptr) { //Stepper Run ohne Begrenzung
stepper->keepRunning();
}
void b7PushCallback(void *ptr) { //Stepper 100 Schritte vor CW
stepper->move(100);
}
void b8PushCallback(void *ptr) { //Stepper 500 Schritte vor CW
stepper->move(500);
}
void bt0PushCallback(void *ptr) { //Schuppenbeleuchtung
pinMode(Relais, OUTPUT);
Serial2.print("get bt0.val");
Serial2.write("\xff\xff\xff");
if ("bt0.val==1") {
digitalWrite(Relais, HIGH);
} else {
digitalWrite(Relais, LOW);
}
}
void bt1PushCallback(void *ptr) { //Servo Tor 1
Serial2.print("get bt1.val");
Serial2.write("\xff\xff\xff");
if ("bt1.val==1") {
sv1.write(90); // Schuppentor 1 AUF 90°
} else {
sv1.write(0); // Schuppentor 1 ZU 0°
}
}
void bt2PushCallback(void *ptr) { //Servo Tor 2
Serial2.print("get bt2.val");
Serial2.write("\xff\xff\xff");
if ("bt2.val==1") {
sv2.write(90); // Schuppentor 2 AUF 90°
} else {
sv2.write(0); // Schuppentor 2 ZU 0°
}
}
void bt3PushCallback(void *ptr) { //Servo Tor 3
Serial2.print("get bt3.val");
Serial2.write("\xff\xff\xff");
if ("bt3.val==1") {
sv3.write(90); // Schuppentor 3 AUF 90°
} else {
sv3.write(0); // Schuppentor 3 ZU 0°
}
}
void bt4PushCallback(void *ptr) { //Servo Tor 4
Serial2.print("get bt4.val");
Serial2.write("\xff\xff\xff");
if ("bt4.val==1") {
sv4.write(90); // Schuppentor 4 AUF 90°
} else {
sv4.write(0); // Schuppentor 4 ZU 0°
}
}
void bt5PushCallback(void *ptr) { //Servo Tor 5
Serial2.print("get bt5.val");
Serial2.write("\xff\xff\xff");
if ("bt5.val==1") {
sv5.write(90); // Schuppentor 5 AUF 90°
} else {
sv5.write(0); // Schuppentor 5 ZU 0°
}
}
void bt6PushCallback(void *ptr) { //Servo Tor 6
Serial2.print("get bt6.val");
Serial2.write("\xff\xff\xff");
if ("bt6.val==1") {
sv6.write(90); // Schuppentor 6 AUF 90°
} else {
sv6.write(0); // Schuppentor 6 ZU 0°
}
}
void setup() {
Serial.begin(115200);
Serial2.begin(115200); // nextion(17, 16); //Rx blau, TX gelb
engine.init(); // Initialisierung des Stepperencoders
stepper = engine.stepperConnectToPin(stepPinStepper);
Serial2.print("n1.val=0"); // Ziel-Position auf 0 setzen
Serial2.write("\xff\xff\xff");
Serial2.print("n2.pco=65535");
Serial2.write("\xff\xff\xff");
Serial2.print("n2.val=1"); // Ist-Position auf 1 setzen
Serial2.write("\xff\xff\xff");
Serial2.print("n3.val=0"); // Offset auf 0 setzen
Serial2.write("\xff\xff\xff");
pinMode(Hall_Sensor, INPUT_PULLUP);
pinMode(Hall_Sensor_Plus, OUTPUT);
//Geschwindigkeit und Beschleunigung des Steppers
if (stepper) {
stepper->setDirectionPin(dirPinStepper);
stepper->setEnablePin(enablePinStepper);
stepper->setAutoEnable(true);
}
// Referenzfahrt
stepper->setSpeedInHz(500); // Geschwindigkeit steps/s
stepper->setAcceleration(150); // Beschleunigung / Abbremsung steps/s²
Serial2.print("click m13,1");
Serial2.write("\xff\xff\xff");
digitalWrite(Hall_Sensor_Plus, HIGH);
delay(10);
digitalRead(Hall_Sensor == LOW);
while (digitalRead(Hall_Sensor) == HIGH) {
stepper->moveTo(-25600);
}
stepper->setCurrentPosition(0);
Serial2.print("n2.pco=0"); // Ist-Position Schriftfarbe auf Schwarz setzen
Serial2.write("\xff\xff\xff");
Serial2.print("n2.val=0"); // Ist-Position auf 0 setzen
Serial2.write("\xff\xff\xff");
Serial2.print("n0.val=10"); // Standard Zielvorgabe nach Neustart (Einfahrgleis)
Serial2.write("\xff\xff\xff");
Serial2.print("get n1.val"); // Abfrage der Anzeige Ziel
Serial2.write("\xff\xff\xff");
Serial2.print("get n2.val"); // Abfrage der Anzeige Ist
Serial2.write("\xff\xff\xff");
if ("n1.val==n2.val") {
digitalWrite(Hall_Sensor_Plus, LOW);
}
Serial2.print("click m13,0"); // Grundposition der Bühne nach Neustart
Serial2.write("\xff\xff\xff");
// Referenzfahrt Ende
stepper->setSpeedInHz(1700); // Geschwindigkeit steps/s
stepper->setAcceleration(400); // Beschleunigung / Abbremsung steps/s²
// Überwachung der Schalter und Servos
sv1.attach(41); // Schuppentor 1
sv2.attach(43); // Schuppentor 2
sv3.attach(45); // Schuppentor 3
sv4.attach(47); // Schuppentor 4
sv5.attach(49); // Schuppentor 5
sv6.attach(51); // Schuppentor 6
sv7.attach(53); // Bühnenverriegelung
b1.attachPush(b1PushCallback, &b1); // Horn
b2.attachPush(b2PushCallback, &b2); // Reset
b3.attachPush(b3PushCallback, &b3); // Stepper 10 Schritte zurück CCW
b4.attachPush(b4PushCallback, &b4); // Stepper 1 Schritt zurück CCW
b5.attachPush(b5PushCallback, &b5); // Stepper Stop
b6.attachPush(b6PushCallback, &b6); // Stepper keepRunning
b7.attachPush(b7PushCallback, &b7); // Stepper 1 Schritt vor CW
b8.attachPush(b8PushCallback, &b8); // Stepper 10 Schritte vor CW
bt0.attachPush(bt0PushCallback, &bt0); // Schalter Schuppenbeleuchtung
bt1.attachPush(bt1PushCallback, &bt1); // Schalter Schuppentor 1
bt2.attachPush(bt2PushCallback, &bt2); // Schalter Schuppentor 2
bt3.attachPush(bt3PushCallback, &bt3); // Schalter Schuppentor 3
bt4.attachPush(bt4PushCallback, &bt4); // Schalter Schuppentor 4
bt5.attachPush(bt5PushCallback, &bt5); // Schalter Schuppentor 5
bt6.attachPush(bt6PushCallback, &bt6); // Schalter Schuppentor 6
}
void loop() {
nexLoop(nex_listen_list);
n1.getValue(&Schrittziel); // Im Zusammenhang mit uint32_t Schrittziel = 0; (0 = Min_Val)
Serial2.print("get n1.val"); // Wert aus n1 abrufen
Serial2.write("\xff\xff\xff");
stepper->moveTo(Schrittziel); // Ziel anfahren
Position = stepper->getCurrentPosition();
if (stepper->isRunning()) {
Serial2.print("n2.bco=63488"); // Hintergrund- und Schriftfarbe von Ist-Position auf rot setzen
Serial2.write("\xff\xff\xff");
Serial2.print("n2.pco=65535");
Serial2.write("\xff\xff\xff");
} else {
Serial2.print("n2.bco=65535"); // Hintergrund- und Schriftfarbe von Ist-Position auf zurücksetzen
Serial2.write("\xff\xff\xff");
Serial2.print("n2.pco=0");
Serial2.write("\xff\xff\xff");
}
Serial2.print("n2.val=");
Serial2.print(Position); // Übertragen der Ist-Position an Nextion
Serial2.write("\xff\xff\xff");
}