Controllo velocita servo - millis ()!!!

Salve

Mi sono arenato su queste quattro righe di codice che probabilmente non sono corrette .
Sto utilizzando Arduino Uno un normale servo da modellismo ed un interruttore a levetta azionato dal servo stesso.
Volevo realizzare qualcosa del genere :
http://youtu.be/-PqcCjFaf3I?list=FLCUiUrT6wrGC2w3gp6LpNlQ

Lo sketch sembra funzionare se imposto vel = 80 rallento di molto il movimento del servo ma se voglio muoverlo veloce impostando vel =0 è sempre rallentato.
Con valori di vel = < di 40 la velocità del servo non aumenta.
Il servo per il reso si muove correttamente tra i due limiti impostati
Non riesco a venirne fuori .

Grazie

Carlo

#include <Servo.h> 
Servo Dito;// definisco oggetto servo
int Interut = 4;//Interuttore per muovere il servo 
int Ineteruttore = 0;//Interuttore per muovere il servo 
int pos_serv =0;// variabile dove scrivo la posizione del servo
int conta = 0 ;//Variabile per incremento posizione servo
int verif  = 0;//debug 
int diff = 0;//debug
int vel= 80;// variabile per modificare la velovita del servo
unsigned long startTime = 0;//Variabile di riferimento per lo scorrere del tempo velocita Servo
unsigned long startTime1 = 0;//Variabile di riferimento per lo scorrere del tempo velocita Servo
//---------------------------------------------------------
void setup()
{
  Dito.attach(9); //Definisco il pin del controllo servo
  pinMode (Interut , INPUT);
  Serial.begin (9600);// Inizializo la seriale
}
//---------------------------------------------------------
void loop(){
Serial.print ( "Verif  ");//Controllo posizione ServoSulla variabile diff 
Serial.println (verif);//Controllo posizione Servo
Serial.print ( "Conta  ");//Controllo posizione Servo
Serial.println (conta);//Controllo posizione Servo
Serial.print ( "Diff--------  ");//Controllo posizione Servo
Serial.println (diff);//Controllo posizione Servo


diff = millis() - startTime ;//debug
Ineteruttore = digitalRead(Interut);// Leggo la posizione del interuttore
if (Ineteruttore == HIGH ) {
if   ((conta >= Dito.read() || conta<=150) && (millis() - startTime) > vel ){//variando il parametro 10 vorrei modificare la 
verif = 0;//debug
conta = conta +1;
Dito.write (conta);
startTime = millis();
if ( conta > 150) {  conta =150;  }//Limito la corsa del servo
 }
}
else{
if((conta <= Dito.read()|| conta>=50)  &&  (millis() - startTime1) > vel){
verif = 1;//debug
startTime1 = millis();
conta -=1;
Dito.write (conta);//
if ( conta < 50) {  conta =50;   }//Limito la corsa del servo
  }
 }
}

Per gestire i servo la libreria di Arduino usa un Timer specifico. Se il Timer è lo stesso usato dalla funzione millis allora potresti avere problemi.
Cambia pin PWM e riprova.

Non ricordo al momento l'associazione pin/timers.

Ok
grazie per l’intervento ,ho provato con il pin 8 ma il comportamento è il medesimo.

Carlo

Forse perchè il codice nella loop() necessita di almeno 40 millisecondi per essere eseguito. Quindi vel < 40 è inutile visto che il codice a fare tutte quelle if , leggere da Dito.read() e calcoli (la millis e differenze tra millis e startTime comunque impiegano del tempo) necessitano di un minimo di tempo.

Potresti (forse) provare a far "saltare" alcuni pezzi di codice se vel=0, ad esempio se vel=0 è inutile fare quei test "if((conta <= Dito.read()|| conta>=50) && (millis() - startTime1) > vel){"

Ho cercato di snellire ,
ora il comportamento nella prima parte del codice con vel=0 è sempre la stessa il servo si muove lentamente anche se non dovrebbe.
mentre il rientro è veloce.
qualche consiglio!

Carlo

#include <Servo.h> 
Servo Dito;// definisco oggetto servo
int Interut = 4;//Interuttore per muovere il servo 
int Ineteruttore = 0;//Interuttore per muovere il servo 
int pos_serv =0;// variabile dove scrivo la posizione del servo
int conta = 0 ;//Variabile per incremento posizione servo
int verif  = 0;//debug 
int diff = 0;//debug
int vel= 0;// variabile per modificare la velovita del servo
unsigned long startTime = 0;//Variabile di riferimento per lo scorrere del tempo velocita Servo
unsigned long startTime1 = 0;//Variabile di riferimento per lo scorrere del tempo velocita Servo
//---------------------------------------------------------
void setup()
{
  Dito.attach(9); //Definisco il pin del controllo servo
  pinMode (Interut , INPUT);
  Serial.begin (9600);// Inizializo la seriale
}
//---------------------------------------------------------
void loop(){
Serial.print ( "Verif  ");//Controllo posizione ServoSulla variabile diff 
Serial.println (verif);//Controllo posizione Servo
Serial.print ( "Conta  ");//Controllo posizione Servo
Serial.println (conta);//Controllo posizione Servo
Serial.print ( "Diff--------  ");//Controllo posizione Servo
Serial.println (diff);//Controllo posizione Servo
if (vel = 0){Dito.write (150);}

diff = millis() - startTime ;//debug
Ineteruttore = digitalRead(Interut);// Leggo la posizione del interuttore
if (Ineteruttore == HIGH ) {
if   ( (millis() - startTime) > vel ){//variando il parametro 10 vorrei modificare la 
verif = 0;//debug
conta = conta +1;
Dito.write (conta);
startTime = millis();
if ( conta > 150) {  conta =150;  }//Limito la corsa del servo
 }
}
else{
  conta = 50;
Dito.write (conta);
verif = 1;//debug
 }
}