Hallo,
Ich bin jetzt mal unverschämt und frage nach umfangreicher Hilfe.
Bei meinem Projekt hänge ich gerade mal wieder... Es geht um die Integration einer Smoothstep-Funktion (Arduino Playground - Smoothstep
Mein Code sieht so aus (auszug):
void runStepperPos(){ // gotoPosition
if (ct - lastSTEP > stepperSpeed){
// drive left
if (stepperPosition > stepperPositionP1 && stepperDirection == 0){
digitalWrite(step_pin,HIGH); // make a step
delayMicroseconds(800); // wait for some time
stepperPosition-=1;
digitalWrite(step_pin,LOW); // end of the step
}
// drive right
if (stepperPosition < stepperPositionP2 && stepperDirection == 1){
digitalWrite(step_pin,HIGH); // make a step
delayMicroseconds(800); // wait for some time
stepperPosition+=1;
digitalWrite(step_pin,LOW); // end of the step
}
lastSTEP = ct;
}
}
Ich habe also folgende Variablen:
stepperPosition = aktuelle Position des Motors in Schritten
stepperPositionP1 = Startposition des Motors in Schritten
stepperPositionP2 = Endposition des Motors in Schritten
stepperSpeed = Geschwindigkeit (Zeit zwischen den Schritten in mirosekunden)
ct = currentTime, aktuelle Zeit in microsekunden
lastSTEP = Zeit des letzen Schrittes in mikrosekunden
stepperDirection = Richtung des Motors
Dann gibt es noch das "damping", einen Wert zwischen 0 und 100, der den Smoothstep steuern soll.
0 = keine Glättung
100 = Glättung für 50% der Schritte beim Beschleunigen und dann die anderen 50% beim abbremsen
Wer hat Zeit, mich auf die richtige Fährte zu schicken?
Ich habe mir kürzlich die EasyDriver4 Library für den Pololu Stepper Driver umgeschrieben. Diese Pololu Library erweitere ich zur Zeit um eine SmoothStep Funktion. Wenn ich die fertig habe, kommt sie auch in die EasyDriver4 Lib. Beide Libs kann man dann von meiner Website downloaden.
Es wird aber noch etwas dauern, da ich die nächsten Tage unterwegs bin. Rechne also frühestens nächstes Wochenende mit einem brauchbaren Ergebnis.
stepperPosition ist die aktuelle Position meines Schrittmotors
stepperPositionP1 ist der Startpunkt (in schritten)
stepperPositionP2 ist der Endpunkt der Fahrt (in Schritten)
in dem smoothDelay möchte ich einfach eine Delay(ergebnis) einbauen, und die funktion nach jedem Schritt aufrufen...
#define SMOOTHSTEP(x) ((x) * (x) * (3 - 2 * (x))) //SMOOTHSTEP expression.
float A = 100.0; //Input Min Value
float B = 10000.0; //Input Max Value
int StepsToGo = 100; //Input number of steps for transition
int j = 1; //Just an Iterator.
int i = 0; //Just another Iterator.
float N; //Input number of steps for transition
float X; //final smoothstepped value
float v; //smoothstep expression variable
int Z; // Juast an Iterator
int stepperPosition = 100;
int stepperPositionP1 = 100;
int stepperPositionP2 = 1100;
void setup() {
Serial.begin(9600); //establish serial connection for debugging
}
void loop()
{
if (stepperPosition < stepperPositionP2){
smoothDelay(stepperPosition,stepperPositionP1,stepperPositionP2);
delay(100);
stepperPosition++;
}
}
int smoothDelay(int _stepperPosition,int _stepperPositionP1,int _stepperPositionP2){
j = _stepperPositionP1 - _stepperPosition;
int N1 = _stepperPositionP2 - _stepperPositionP1;
N = float(N1);
v = j / N; // Iteration divided by the number of steps.
v = SMOOTHSTEP(v); // Run the smoothstep expression on v.
X = (B * v) + (A * (1 - v)); // Run the linear interpolation expression using the current
Z = int(X);
Serial.println(Z); // prints the soothstepped value
j++; // Increments j by 1.
}
Soweit mein code, aber da hab ich irgendwo einen groben Denkfehler drin...