Hallo zusammen.
Ich würde sagen ich bin ein Anfänger was Codes angeht.
Leider stehe ich seit einiger Zeit auf dem schlauch und komme nicht weiter. Auch durchs durchlesen diverser Anleitungen bin ich weitergekommen und hoffe auf diesem Wege, das mir jemand weiterhelfen kann. Vielleicht verfolge ich auch den falschen Lösungsansatz.
Erstmal zur aktuell verwendeten Hardware:
-Arduino Nano
-TB6560 Driver
https://de.aliexpress.com/item/32811945260.html
alternativ hätte ich noch den FUYU driver
https://de.aliexpress.com/item/32589549569.htm
-FUYU Linearführung
FUYU FSK40 Linearführung Bühne Schiene Bewegung Tisch Ball Schraube Antrieb Nema 23 Motor Modul für CNC 3d Drucker teile|linear guide rail|guide raillinear guide - AliExpress 600mm
Ziel:
Durch einen Befehl vom Nextion display (hier jedoch gerade noch nicht relevant) soll der Schlitten mit einer Startrampe nach unten Fahren und mittels eines Gewichtssensor Stoppen, sobald dieser z.B. einen Wert von 1kg bekommt. Danach soll er noch eine Bremsrampe Fahren bis er zum stehen kommt.
Sobald die weiteren Abläufe Durgeführt sind, wird er wieder zum Ausgangspunkt hochgefahren.
Also Startrampe-Max Speed- und wenn das Signal vom Homebutton kommt wieder die Bremsrampe ausführen und dann stehen bleiben.
Zum Problem:
Die einzelnen Rampen zu fahren konnte ich ohne Library programmieren. Jedoch bringe ich nicht die gewünschte Geschwindigkeit des Schlitten hin. Dies hatte ich folgendermaßen gelöst:
#include <math.h>
int Mot1Step = 4; //Mot1 Step
int Mot1Dir = 5; //Mot1 DIR
int PulseDelay = 2; //Delay HIGH/LOW Mikrosekunden
//-----------------------------------------
//##### Anfang lineare Rampe ####
float BeschleunigungsFaktor = 3;
float Highspeed = 300.0; //Mikrosekunden
float Rampenlaenge = 400.0; //Rampenlaenge Steps
float Fahrtlaenge = 3000.0; //Rampenlaenge Steps
float Bremslaenge = 300.0; //Rampenlaenge Steps
float Beschleunigung = Highspeed * BeschleunigungsFaktor;
float RampenCoeff = float(Beschleunigung / Rampenlaenge); //Rampenkoeffizient
//##### Ende lineare Rampe ######
//-----------------------------------------
//###########################
void setup()
{
pinMode(Mot1Dir, OUTPUT); //Pin 5
pinMode(Mot1Step, OUTPUT); //Pin 4
}
//###########################
//###########################
void loop()
{
digitalWrite(Mot1Dir, LOW); //Vorgabe Drehrichtung des Motors
Startrampe();
Fahrt(); // Fahrt hin
Bremsen();
delay(2000);
digitalWrite(Mot1Dir, HIGH); //Vorgabe Drehrichtung des Motors
Startrampe();
Fahrt(); //Fahrt zurueck
Bremsen();
delay(2000);
}
//###########################
//###########################
void Startrampe()
{
//Echtzeit....................
int StepCount = 1; //Schrittzaehler
int Geschwindigkeit = 0;
int indexCoeffAnfahrt = 0;
//Echtzeit....................
indexCoeffAnfahrt = int(Rampenlaenge);
while (StepCount <= int(Rampenlaenge))
{
Geschwindigkeit = Highspeed + round(indexCoeffAnfahrt * RampenCoeff);
indexCoeffAnfahrt--; //Pausenzeit von lang --> kurz
//Uebergabe der Geschwindigkeit an den Motor (PIN 4)
digitalWrite(Mot1Step, HIGH); //PIN on
delayMicroseconds(PulseDelay); //hier 80 Microsekunden s.o.
digitalWrite(Mot1Step, LOW); //PIN off
delayMicroseconds(Geschwindigkeit);
StepCount++;
}//Ende: while-Schleife
} //Ende: void Fahrt()
void Fahrt()
{
//Echtzeit....................
int StepCount = 1; //Schrittzaehler
int Geschwindigkeit = 0;
//Echtzeit....................
while (StepCount <= int(Fahrtlaenge))
{
Geschwindigkeit = Highspeed;
//Uebergabe der Geschwindigkeit an den Motor (PIN 4)
digitalWrite(Mot1Step, HIGH); //PIN on
delayMicroseconds(PulseDelay); //hier 80 Microsekunden s.o.
digitalWrite(Mot1Step, LOW); //PIN off
delayMicroseconds(Geschwindigkeit);
StepCount++;
}//Ende: while-Schleife
} //Ende: void Fahrt(int Steps)
void Bremsen()
{
//Echtzeit....................
int StepCount = 1; //Schrittzaehler
int Geschwindigkeit = 0;
int indexCoeffBremse = 0;
//Echtzeit....................
indexCoeffBremse = 1;
while (StepCount <= int(Bremslaenge))
{
Geschwindigkeit = Highspeed + round(indexCoeffBremse * RampenCoeff);
indexCoeffBremse++; //Pausenzeit von kurz --> lang
//Uebergabe der Geschwindigkeit an den Motor (PIN 4)
digitalWrite(Mot1Step, HIGH); //PIN on
delayMicroseconds(PulseDelay); //hier 80 Microsekunden s.o.
digitalWrite(Mot1Step, LOW); //PIN off
delayMicroseconds(Geschwindigkeit);
StepCount++;
}//Ende: while-Schleife
} //Ende: void Fahrt(int Steps)
Da ich die Geschwindigkeit nicht hinbekommen habe mit den delays ( sollte man ja so oder so nicht verwenden)
Habe ich diverse Anleitung zur AccelStepper.h gefunden. Und es schien mir, als währe es genau das was ich suche.. Mit einem Standardcode habe ich dann die gewünschte Geschwindigkeit hinbekommen mit den Rampen. Jedoch muss ich da eine Fixe Position Anfahren (auch verständlich für die Rampenberechnung). Doch da ich eine Variable Endposition habe ist die leider nicht möglich. Ich habe noch ein Video gefunden mit einem Notschalter, jedoch wenn ich dies richtig verstanden habe Stop dieser den ganzen Code und kann nur auf PIN1,2 verwendet werden. Da Kahm mir die Überlegung, dass ich runSpeed() verwende und die Startrampe Manuel hochfahre, wie beim Code mit dem Delay.
Hier bin ich schon einige Zeit dran, der Code ist einfach, jedoch scheitere ich schon an der Fahrgeschwindigkeit. Da ich dies danach für die Rampe benötige habe ich auch die Fahrt mit einem Counter begrenzt. Wenn ich einfach z.B. setSpeed (-600) und runSpeed() in den Loop packe, läuft der Schlitten schön rund.. wenn ich dies jedoch in die While Schleife im Void packe, Läuft dieser nur ganz kurz an. Um zu schauen, ob der Counter funktioniert, habe ich das SerialPrintIN integriert um zu sehen ob er hochzählt.. dies macht er, jedoch läuft die Spindel dann nicht mehr rund und Ruckelt. Also stimmt dann die Geschwindigkeit nicht mehr. Ich vermute mal ich habe hier 3 verschiedene "while Durchlauf Geschwindigkeiten"
- nur setSpeed und runSpeed (Schlitten läuft rund)
- setSpeed und runSpeed mit counter (läuft nicht rund)
- setSpeed und runSpeed mit counter und Serial Print (stockt kurz) evt wegen der Baud 9600?
Anbei der Code:
#include <AccelStepper.h>
// Define stepper motor connections and motor interface type. Motor interface type must be set to 1 when using a driver:
#define dirPin 5
#define stepPin 4
#define motorInterfaceType 1
// Create a new instance of the AccelStepper class:
AccelStepper stepper = AccelStepper(motorInterfaceType, stepPin, dirPin);
float Fahrtlaenge = 100.0; //Rampenlaenge Steps
void setup() {
Serial.begin(9600); // Start serial comunication at baud=9600
// Set the maximum speed in steps per second:
stepper.setMaxSpeed(1000);
stepper.setAcceleration (100.0);
}
void loop() {
Fahrt();
delay (2000);
}
void Startrampe()
{
//Echtzeit....................
int StepCount = 1; //Schrittzaehler
int Geschwindigkeit = 0;
int indexStartrampe = 0;
//Echtzeit....................
indexStartrampe = 1;
while (StepCount <= 200)
{
Geschwindigkeit = 0 - round(indexStartrampe * 3);
indexStartrampe++; //Pausenzeit von kurz --> lang
// Set the speed in steps per second:
stepper.setSpeed(Geschwindigkeit);
// Step the motor with a constant speed as set by setSpeed():
stepper.runSpeed();
StepCount++;
Serial.println(Geschwindigkeit);
Serial.write(0xff);
Serial.write(0xff);
Serial.write(0xff);
}//Ende: while-Schleife
} //Ende: void Fahrt()
void Fahrt()
{
int StepCount = 1; //Schrittzaehler
while (StepCount <= int(Fahrtlaenge))
{
Serial.println(StepCount);
// Set the speed in steps per second:
stepper.setSpeed(-600);
// Step the motor with a constant speed as set by setSpeed():
stepper.runSpeed();
StepCount++;
}//Ende: while-Schleife
} //Ende: void Fahrt()
Da der Motor laut Datenblatt max 1200rpm hat also 20rps würde ich auch diese gerne fahren. Wenn ich richtig verstehe sollte ich bei 1,8° 200 Stepps für eine Umdreung haben. also sollte ich ein Maxspeed von 4000 fahren können . Ich habe irgend wo gelesen, das man nicht über 2000 sollte. Dies würde aber zur not auch gehen.
Ich habe hier schon alles versucht, auch mit Anleitungen usw. komme ich nicht weiter.. evt versuche ich hier was, was gar nicht geht.
Es währe toll, wenn mir hier jemand einen Tip geben könnte.
Vielen Dank im Voraus für eure mühe.
Gruss Patrick