ACCELSTEPPER Funktion runSpeed

Hallo,
Ich habe mit Accelstepper einmal den Beispielcode Blocking aufgesetzt.
Dabei habe ich zusätzlich einen Regler mit analogRead in den Code im loop eingesetzt.

Problem ist, der Regler reagiert nicht.

Kann es sein, das der loop wenn er läuft wegen dem Befehl stepper.runTNP stillsteht bis zur Endposition des Steppers?
Dadurch wird die Laufgeschwindigkeit nicht Nachregelbar?

Grüsse erstmal und wenn du Rückfragen sind melde ich mich natürlich.

Dann zeig doch mal wie du das mit dem Regler gemacht hast.
Ohne deinen Sketch und dein Schaltbild wissen wir doch nicht, wo du den Fehler gemacht hast.

Sketch bitte in Code-Tags posten, Schaltfläche </> oben links im Editorfenster verwenden.
Dein Schaltbild kann auch eine Bleistiftzeichnung sein.

void setup(){

stepper.setMaxSpeed(4000);
stepper.setAccelerationSpeed(4000);
}

void loop (){
sens5= analogRead (A5);
fake5=map (sens5, 0, 1023, 0, 6898);
stepper.runSpeed  (fake5);

stepper.runToNewPosition(1000000); 
}

So hab ich das probiert.....der Regler an Analog 5 reagiert nicht......Weder in Null noch in Vollstellung

Hi

Wenn man sich die Methode der Lib anschaut (oder dem Namen traut) - wird dieser Aufruf den Stepper auf 1000000 verfahren - Das blockiert halt.
Wenn Du die Ziel-Position einstellst (.moveto(xyz) absolut oder .move(xyz) relativ) und die Steos per .run() ausführen lässt, blockiert Das nicht.
Die .run() Methode muß so oft wie nur möglich aufgerufen werden - delay() oder so Kram sind pures Gift!

MfG

Ich habs mit kurzen Strecken probiert .....Auch rückwärts wie es im Beispiel ist....Das Ding läuft durch aber lässt sich nicht zwischendurch regeln....

Meine Anforderung fürs Resultat ist... erreiche Position (voreingestellt über Poti sens2) ca 25000 und reagiere dabei auf Regler sens5 . Denn dieser Regler steht beim Start auf Null und soll dann erst nachträglich 0-maxSpeed regeln.

Hi

Null (als Speed) wird wohl nicht gehen.
Hast Du mit .run() probiert, oder mit Deinem .runtoposition()?
Etwas genauer dürfen Deine Äußerungen schon werden - bringt uns Beiden nicht viel, wenn für jedes Hallo drei Posts brauchen.

MfG

Nur mit runToNewPosition.....Mit run () habe ich nicht getestet...Kann ich erst morgen in der Werkstatt.

Ist mir leider nicht klar welche Infos nützlich sind und welche nicht um mir weiterzuhelfen ...

Hi

Zu .runtoposition() hatten wir gesagt, daß Das wohl blockierend ist - da kannst Du stundenlang am Poti rumkurbeln - solange der Stepper die 1 Millionen Steps noch nicht hinter sich hat, ist DAS dem Arduino sch*** egal.
Auch hast Du die .run() nicht aufgerufen - klar: Du nutzt ja noch runtoposition() - und dann schreibst Du als Antwort, OHNE auch nur einen Hauch geändert zu haben, daß Es nicht klappt.

Sehr befriedigend, wenn angebotene Hilfe dermaßen ignoriert wird und man zusätzlich noch hören darf, daß das Problem weiter besteht.

MfG

Wie Dir schon gesagt wurde, kann das mit runToNewPosition nicht funktionieren. Dieser Aufruf ist blockierend, d.h. bis der Stepper sein Ziel erreicht hat, läuft der Sketch nicht weiter.

Die Kombination der Methoden ist auch ziemlich sinnfrei. 'stepper.runSpeed()' führt normalerweise bereits zu einer konstanten (nicht blockierenden) Rotation des Steppers. Einen Paramter akzeptiert diese Methode jedoch nicht. Das Tempo müsste über einen eigenen Aufruf gesetzt werden, den Du aber gar nicht nutzt.

Was für einen Arduino setzt Du überhaupt ein? mit den Standard-AVR's lassen sich deine eingestellten Geschwindigkeiten ncht erreichen. Da sind lt. Beschreibung in der Lib bereits Raten > 1000Steps/sec unzuverlässig.

Und stelle bitte nur einen kompletten Sketch ein. Mit so einem nicht übersetzbaren Fragment kann man nichts anfangen. Was setzt Du überhaupt für eine Lib ein? Bei der AccelStepper, die ich kenne, gibt es keine Methode 'setAccelerationSpeed'.

So macht das jedenfalls keinen Sinn

Waermerohr:
So hab ich das probiert.....der Regler an Analog 5 reagiert nicht......Weder in Null noch in Vollstellung

Dann lass dir doch mal im seriellen Monitor die Werte anzeigen.
Auch weil du kein Schaltbild postest, wissen wir nicht, ob dein Poti richtig angeschlossen ist.

Vielen Dank für die Anregungen, die ich in den Posts gefunden habe.
Nach delay (schlafen, essen, Kinderbesuch und dann Referenzen von AccelStepper lesen und Code neu schreiben )
reagieren auch die Regelpotis.
Zufrieden bin ich mit dem Sketch noch nicht, muss den loop noch aufräumen.
Meine Grundfrage wurde von euch ja bereits in den ersten Antworten erledigt und so wurde mir der Weg gezeigt, den ich einschlagen muss.
Hier jetzt meine erste lauffähige Version ohne Steuertaster

// 20.07.2019  auf  COM18
// Version 1.1 step   7on



#include <AccelStepper.h>
#include <EEPROM.h>
#include <LiquidCrystal.h>
LiquidCrystal mylcd(8, 9, 4, 5, 6, 7);
#define LCDdimmer 10 
#define Brightness 200
#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4 
#define btnNONE   5 
#define DIR     2               // Endstufe: DIR grün
#define STEP  3                 // Endstufe: Puls rot
#define ENABLE 12
//#define frei 11


AccelStepper stepper (1, 3, 2);    // Driver 1, Step 3, Dir2)


int sens2;
int sens3;
int sens5;
double fake2;
double fake3;
double fake4;
double fake5;
int pitch;
int Laengeneinstellung;   
int SpeedPedalSensor=A5;         // Sensor Eingang A5 für Speed-Pedal-Regler
int Schalter=4;                  // Sensor Eingang A4 für Schalter
int SpeedPedalSchalter=3;        // Sensor Eingang A3 für Speed-Pedal-Schalter
int LaengenRegler=2;             // Sensor Eingang A2 für Längen-Regler
char go ;
char ascii[10];                 //--------LCD-Anzeigeformat
int lcd_key     = 0;            //--------LCD-Buttons
int adc_key_in  = 0;
int read_LCD_buttons(){              
  adc_key_in = analogRead(0);       
  if (adc_key_in > 1000) return btnNONE; 
  if (adc_key_in < 50)   return btnRIGHT;  
  if (adc_key_in < 250)  return btnUP; 
  if (adc_key_in < 450)  return btnDOWN; 
  if (adc_key_in < 650)  return btnLEFT; 
  if (adc_key_in < 850)  return btnSELECT;  
  return btnNONE;

}
void setup()
{  
  Serial.begin(9600);
  Serial.println("Diameter");
  Serial.println();
  pinMode(DIR, OUTPUT);
  digitalWrite(DIR,HIGH);
  pinMode(ENABLE, OUTPUT);
  digitalWrite(ENABLE,HIGH);

  pinMode(LCDdimmer, INPUT);
  digitalWrite(LCDdimmer, LOW);
  mylcd.begin(16, 2);
  mylcd.setCursor(0, 0);
  mylcd.print("AccelStepper"); 
  mylcd.setCursor(0,1);
  mylcd.print("  V1.1");
  delay(1500);
  mylcd.clear();
  mylcd.setCursor(5, 0);
  mylcd.print("Soll ");
  mylcd.setCursor(14, 0);
  mylcd.print("cm ");  
  mylcd.setCursor(5, 1);
  mylcd.print("Rest ");
  mylcd.setCursor(14, 1);
  mylcd.print("cm ");
  delay(2000);


  stepper.setMaxSpeed(1);
  stepper.setAcceleration(3000.0);
}

void loop()
{   
  digitalWrite(ENABLE,LOW);
  //---------------------loop---analogRead(A2)------LängeneinstellPoti------
  sens2 = analogRead(LaengenRegler);                // 0-1023 -> 0-300
  fake2 = map(sens2, 0, 1023, 265, 0);          
  mylcd.setCursor(10, 0);
  mylcd.print (dtostrf(fake2,3,0,ascii));
  //---------------------loop---analogRead(A3)------SpeedPedalSchalter------
  //sens3 = analogRead(SpeedPedalSchalter);           // 0-1023 -> 0-1   
  //---------------------loop---analogRead(A4)------Schalter----------------
  //sens4 = analogRead(Schalter);                    // 0-1023 -> 0-1
  //---------------------loop---analogRead(A5)------SpeedPedalRegler-------- 
  sens5 = analogRead(SpeedPedalSensor);               // 0-1023 -> 0-2500
  fake5 = map(sens5, 0, 1023, 3, 2600);
  mylcd.setCursor(0,1); 
  mylcd.print (dtostrf(fake5/10,3,0,ascii));
  stepper.setMaxSpeed(fake5*2);                         //Geschwindigkeit setzen
  stepper.setAcceleration(3000.0);
  stepper.moveTo(46.9*fake2);                         //Position setzen  (sens2)
  //---------------------------------------ENABLE----------------------------------- 

  if (fake5<4){
    go=0;
  }  
  else {
    go=1;
  } 

  if (go==0){
    digitalWrite(ENABLE,HIGH);
    mylcd.setCursor(0,0); 
    mylcd.print("OFF");
  }
  else {
    digitalWrite(ENABLE,LOW);
    mylcd.setCursor(0,0); 
    mylcd.print("RUN"); 
    stepper.run();

  }
}

Hi

Display-Ausgaben NUR, wenn sich was an der Anzeige geändert hat - die Dinger sind um Größenordnungen langsamer als der Arduino!
Die Methode .run() wurfst Du in einem ELSE-Zweig auf, Der hinter Display-Ausgaben steht.
Alleine durch die häufigen Display-Ausgaben kann Das nicht sonderlich schnell werden.

.run() gehört in loop() ganz an den Anfang - Das wird JEDES MAL abgefrühstückt.
Wenn Du nicht willst, daß der Motor dreht: Soll=Ist - schon steht die Gurke mit Rampen ect.pp.

Jede Berechnung mit einem Float braucht viel zeit - Deine ganzen fake-Variablen sind double - brauchst Du Die So?
Oder brauchst Du die Komma-Zahlen eher nur für Dich für die Anzeige?
Dann->int, int32, int64 oder unsigned - Das ist deutlich schneller als Float.

Schön, daß Es bei Dir weiter geht und Du Erfolge erzielst!

MfG

Du hast auch noch nicht gesagt, welchen Arduino Du überhaupt einsetzt.
Auf den Standard-Arduinos mit AVR-Prozessoren gibt es kein double. Da ist das dasselbe wie float. Und wie schon angemerkt, ist die Frage ob Du das überhaupt brauchst.
Du willst immer noch sehr hohe Stepraten erreichen. Da braucht's auf jeden Fall einen sehr schnellen loop(). Und mit einem AVR dürfte das wohl gar nicht gehen.