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.
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
}
}