stepper con potenziometro: le velocità non cambiano..

Ciao ragazzi…
spero possiate aiutarmi perchè non so più dove sbattere la testa…
Sto pilotando un motore passo passo con Arduino Leonardo cambiando le velocità attraverso un potenziometro.
Ho diviso in 9 intervalli. Devo pilotare il motore in quarter step (ma il problema che espongo non si risolve neppure provando con half o full step).
Quello che succede è che dal 5° intervallo in poi la velocità non aumenta più. posso solo diminuire. la cosa strana è che i led che indicano l’entrata in un certo intervallo di velocità si illuminano regolarmente.

Sapete dirmi se c’è qualcosa che può dargli noia nel codice? Magari lo manda in saturazione… boh…
help!!
Grazie mille in anticipo!!

#include <AccelStepper.h>
// Definizione dei pin usati
#define pinStep 5
#define pinDirection 6
#define led0 0
#define led1 1
#define led2 2
#define led3 3
#define led4 4
#define led5 7
#define led6 8
#define led7 9
#define led8 10

AccelStepper stepper(1,pinStep,pinDirection); 
long VelMax;
int prec_intervallo=-1;

void setup()
{
  stepper.setMaxSpeed(3500);
  stepper.setSpeed(950); //imposto la velocità
  Serial.begin (9600);
  pinMode(led0, OUTPUT);
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  pinMode(led5, OUTPUT);
  pinMode(led6, OUTPUT);
  pinMode(led7, OUTPUT);
  pinMode(led8, OUTPUT);
}
void loop()
{
  int val = analogRead(A0);
  int intervallo= floor( val / 113.67);
  
  switch (intervallo){
    
    case 0:// vale da 0 a 113
    VelMax=650;//in step/sec
    digitalWrite(led0, HIGH);
    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW);
    digitalWrite(led3, LOW);
    digitalWrite(led4, LOW);
    digitalWrite(led5, LOW);
    digitalWrite(led6, LOW);
    digitalWrite(led7, LOW);
    digitalWrite(led8, LOW);
    break;
    
    case 1:// vale da 114 a 227
    VelMax=950;//in step/sec
    digitalWrite(led0, LOW);
    digitalWrite(led1, HIGH);
    digitalWrite(led2, LOW);
    digitalWrite(led3, LOW);
    digitalWrite(led4, LOW);
    digitalWrite(led5, LOW);
    digitalWrite(led6, LOW);
    digitalWrite(led7, LOW);
    digitalWrite(led8, LOW);
    break;    
    
    case 2://vale da 228 a 341
    VelMax=1270;//in step/sec
    digitalWrite(led0, LOW);
    digitalWrite(led1, LOW);
    digitalWrite(led2, HIGH);
    digitalWrite(led3, LOW);
    digitalWrite(led4, LOW);
    digitalWrite(led5, LOW);
    digitalWrite(led6, LOW);
    digitalWrite(led7, LOW);
    digitalWrite(led8, LOW);
    break;
    
    case 3://vale da 342 a 454
    VelMax=1595;//in step/sec
    digitalWrite(led0, LOW);
    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW);
    digitalWrite(led3, HIGH);
    digitalWrite(led4, LOW);
    digitalWrite(led5, LOW);
    digitalWrite(led6, LOW);
    digitalWrite(led7, LOW);
    digitalWrite(led8, LOW);
    break;
    
    case 4://vale da 455 a 568
    VelMax=1920;//in step/sec
    digitalWrite(led0, LOW);
    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW);
    digitalWrite(led3, LOW);
    digitalWrite(led4, HIGH);
    digitalWrite(led5, LOW);
    digitalWrite(led6, LOW);
    digitalWrite(led7, LOW);
    digitalWrite(led8, LOW);
    break;
    
    case 5://vale da 569 a 682
    VelMax=2240;//in step/sec
    digitalWrite(led0, LOW);
    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW);
    digitalWrite(led3, LOW);
    digitalWrite(led4, LOW);
    digitalWrite(led5, HIGH);
    digitalWrite(led6, LOW);
    digitalWrite(led7, LOW);
    digitalWrite(led8, LOW);
    break;

    case 6://vale da 683 a 795
    VelMax=2555;//in step/sec
    digitalWrite(led0, LOW);
    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW);
    digitalWrite(led3, LOW);
    digitalWrite(led4, LOW);
    digitalWrite(led5, LOW);
    digitalWrite(led6, HIGH);
    digitalWrite(led7, LOW);
    digitalWrite(led8, LOW);
    break;
    
    case 7://vale da 796 a 909
    VelMax=2870;//in step/sec
    digitalWrite(led0, LOW);
    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW);
    digitalWrite(led3, LOW);
    digitalWrite(led4, LOW);
    digitalWrite(led5, LOW);
    digitalWrite(led6, LOW);
    digitalWrite(led7, HIGH);
    digitalWrite(led8, LOW);
    break;
    
    case 8://vale da 910 a 1023
    VelMax=3205;//in step/sec
    digitalWrite(led0, LOW);
    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW);
    digitalWrite(led3, LOW);
    digitalWrite(led4, LOW);
    digitalWrite(led5, LOW);
    digitalWrite(led6, LOW);
    digitalWrite(led7, LOW);
    digitalWrite(led8, HIGH);
    break;
  }
  
    stepper.runSpeed();//provo a mettere run perchè runspeed non implementa accelerazioni
    stepper.setSpeed(VelMax);
    
  if (intervallo!=prec_intervallo)
  {
    Serial.print ("Valore potenziometro: ");
    Serial.println (val);
    Serial.print (" - Velocità motore in step/sec: ");
    Serial.println (VelMax);
    Serial.println (" ");
  }
  prec_intervallo=intervallo;
}

Ti invitiamo a presentarti qui: http://forum.arduino.cc/index.php?topic=113640.0 e a leggere il regolamento: http://forum.arduino.cc/index.php?topic=149082.0 - qui una serie di schede by xxxPighi per i collegamenti elettronici vari: http://forum.arduino.cc/index.php?topic=146152.0 - qui le pinout delle varie schede by xxxPighi: http://forum.arduino.cc/index.php?topic=151646.0 - qui una serie di link utili: http://forum.arduino.cc/index.php?topic=126861.0

E' vietato fare cross-posting (hai postato anche in sezione inglese) Inoltre il codice devi racchiuderlo negli appositi tag code. Vedi sezione 7 del regolamento, speiga bene come fare. Se non usi i tag code, parte del codice viene interpretato come attributo del testo e non visualizzato.

Buongiorno a tutti, scusatemi se non mi ero presentata… sinceramente non avevo letto il regolamento! :blush:
per quanto riguarda il fatto della sezione inglese, quando ho postato non sapevo che esistesse anche una sezione del forum italiano!! Altrimenti avrei scritto subito qui invece di scervellarmi a trovare la forma migliore in inglese… Comunque, l’argomento era del tutto diverso perchè ero ad un’altra fase del mio progetto…

per la descrizione del problema rimando al post precedente…
Spero vogliate darmi una mano… =(
Grazie…

#include <AccelStepper.h>
// Definizione dei pin usati
#define pinStep 5
#define pinDirection 6
#define led0 0
#define led1 1
#define led2 2
#define led3 3
#define led4 4
#define led5 7
#define led6 8
#define led7 9
#define led8 10

AccelStepper stepper(1,pinStep,pinDirection); 
long VelMax;
int prec_intervallo=-1;

void setup()
{
  stepper.setMaxSpeed(3500);
  stepper.setSpeed(950); //imposto la velocità
  Serial.begin (9600);
  pinMode(led0, OUTPUT);
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  pinMode(led5, OUTPUT);
  pinMode(led6, OUTPUT);
  pinMode(led7, OUTPUT);
  pinMode(led8, OUTPUT);
}
void loop()
{
  int val = analogRead(A0);
  int intervallo= floor( val / 113.67);
  
  switch (intervallo){
    
    case 0:// vale da 0 a 113
    VelMax=650;//in step/sec
    digitalWrite(led0, HIGH);
    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW);
    digitalWrite(led3, LOW);
    digitalWrite(led4, LOW);
    digitalWrite(led5, LOW);
    digitalWrite(led6, LOW);
    digitalWrite(led7, LOW);
    digitalWrite(led8, LOW);
    break;
    
    case 1:// vale da 114 a 227
    VelMax=950;//in step/sec
    digitalWrite(led0, LOW);
    digitalWrite(led1, HIGH);
    digitalWrite(led2, LOW);
    digitalWrite(led3, LOW);
    digitalWrite(led4, LOW);
    digitalWrite(led5, LOW);
    digitalWrite(led6, LOW);
    digitalWrite(led7, LOW);
    digitalWrite(led8, LOW);
    break;    
    
    case 2://vale da 228 a 341
    VelMax=1270;//in step/sec
    digitalWrite(led0, LOW);
    digitalWrite(led1, LOW);
    digitalWrite(led2, HIGH);
    digitalWrite(led3, LOW);
    digitalWrite(led4, LOW);
    digitalWrite(led5, LOW);
    digitalWrite(led6, LOW);
    digitalWrite(led7, LOW);
    digitalWrite(led8, LOW);
    break;
    
    case 3://vale da 342 a 454
    VelMax=1595;//in step/sec
    digitalWrite(led0, LOW);
    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW);
    digitalWrite(led3, HIGH);
    digitalWrite(led4, LOW);
    digitalWrite(led5, LOW);
    digitalWrite(led6, LOW);
    digitalWrite(led7, LOW);
    digitalWrite(led8, LOW);
    break;
    
    case 4://vale da 455 a 568
    VelMax=1920;//in step/sec
    digitalWrite(led0, LOW);
    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW);
    digitalWrite(led3, LOW);
    digitalWrite(led4, HIGH);
    digitalWrite(led5, LOW);
    digitalWrite(led6, LOW);
    digitalWrite(led7, LOW);
    digitalWrite(led8, LOW);
    break;
    
    case 5://vale da 569 a 682
    VelMax=2240;//in step/sec
    digitalWrite(led0, LOW);
    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW);
    digitalWrite(led3, LOW);
    digitalWrite(led4, LOW);
    digitalWrite(led5, HIGH);
    digitalWrite(led6, LOW);
    digitalWrite(led7, LOW);
    digitalWrite(led8, LOW);
    break;

    case 6://vale da 683 a 795
    VelMax=2555;//in step/sec
    digitalWrite(led0, LOW);
    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW);
    digitalWrite(led3, LOW);
    digitalWrite(led4, LOW);
    digitalWrite(led5, LOW);
    digitalWrite(led6, HIGH);
    digitalWrite(led7, LOW);
    digitalWrite(led8, LOW);
    break;
    
    case 7://vale da 796 a 909
    VelMax=2870;//in step/sec
    digitalWrite(led0, LOW);
    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW);
    digitalWrite(led3, LOW);
    digitalWrite(led4, LOW);
    digitalWrite(led5, LOW);
    digitalWrite(led6, LOW);
    digitalWrite(led7, HIGH);
    digitalWrite(led8, LOW);
    break;
    
    case 8://vale da 910 a 1023
    VelMax=3205;//in step/sec
    digitalWrite(led0, LOW);
    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW);
    digitalWrite(led3, LOW);
    digitalWrite(led4, LOW);
    digitalWrite(led5, LOW);
    digitalWrite(led6, LOW);
    digitalWrite(led7, LOW);
    digitalWrite(led8, HIGH);
    break;
  }
  
    stepper.runSpeed();//provo a mettere run perchè runspeed non implementa accelerazioni
    stepper.setSpeed(VelMax);
    
  if (intervallo!=prec_intervallo)
  {
    Serial.print ("Valore potenziometro: ");
    Serial.println (val);
    Serial.print (" - Velocità motore in step/sec: ");
    Serial.println (VelMax);
    Serial.println (" ");
  }
  prec_intervallo=intervallo;
}

che motore passo paso è ? bipolare o unipolare? , come lo piloti?

di più...

che caratteristiche ha questo motore? e come lo alimenti?

per aiutarti mi sa che almeno queste cose debbano essere note sennò è un problema fare delle ipotesi ;)

detto questo...forse il codice va un pò ottimizzato, ma qui lascio la parola ad altri :)

GIusto.. è un motore bipolare, pilotato in quarter step, alimentato con 12 V. gear ratio 1:64 step angle 00140625° in half step rpm da 0 a 20 (20 max in full step)

il motore comanda una pompa peristaltica..

bene... e tra il motore ed arduino.. che hai messo???

ricorda se hai schemi o datasheet (DS) schemi di collegamento ecc...ci fai felici....

p.s. bene le caratteristiche angolari ecc, ma ora quelle non son importani.. meglio sapere modello motore, alimentazione, corrente/fase insomma le caratteristiche elttrichepiu che meccaniche (importanti dopo o in fase di progetto del sistema)

ok! In allegato file utili… ovviamente ho collegato un potenziometro da 50K. Utilizzo Arduino Leonardo.

WPX1_selectguid.pdf (3.16 MB)

a4988_DMOS_microstepping_driver_with_translator.pdf (371 KB)

non è che sei gia alla velocità massima??? se leggo bene son 20 RPM....

poi hai visto bene i valori RS1/RS2 da quanto leggo il tuo motore funge a 1.92V se non limiti bene o altro lo distruggi (o quasi)

Una cosa che non ho specificato è che ogni velocità impostata nel codice è già stata testata con un codice molto più semplice che aziona il motore alla velocità impostata da computer.. cioè dandogli un'unica velocità costate, senza la possibilità di variazione. la velocità massima è 4260 step/sec.. io mi fermo a 3205.

se dici che con un programma piu semoplice funzionva deduco un errore sul codice (mi fido di quanto dici)

prova a mettere la funzione stepper.setSpeed(velmax);

direttamente dentro nei sincoli "case" (levandola li dovè ora)

se ancora nada prova a mettere anche .runSpeed(), dentro ogni singolo case.. e vediamo che succede

sicura del VelMax = long?

Mettendo le funzioni nei case non parte proprio..

hai letto la spiegazione delle varie funzioni???

dal momento che usi long per setmaxspeed, forse, no perche sembra voglia:

Sets the desired constant speed for use with runSpeed().

Parameters
[in] speed The desired constant speed in steps per second. Positive is clockwise. Speeds of more than 1000 steps per second are unreliable. Very slow speeds may be set (eg 0.00027777 for once per hour, approximately. Speed accuracy depends on the Arduino crystal. Jitter depends on how frequently you call the runSpeed() function.

da notare cosa dice per numeri maggiori di 1000 :wink:

http://www.airspayce.com/mikem/arduino/AccelStepper/classAccelStepper.html

prova a vedere se cioò ti aiuta