Go Down

Topic: Come fare per muovere un servo di 10° in 10 secondi in modo continuo? (Read 1 time) previous topic - next topic

crystal13

ci ho gia pensato ma non si puo fare perche write accetta solo valori int...

:smiley-fat:

uwefed


ciao, scusate ma mi sono espresso male.

Il mio obiettivo è muovere un servo motore di 10° (es. da 0° a 10°) con un movimento che sia continuo e non scattoso. Per non scattoso intendo che il delay (che solo ora ho capito essere la pausa tra un movimento e l'altro del servo) dovrebbe essere diciamo...zero. Cioè, non voglio che il servo faccia una pausa tra uno scatto e l'altro (delay=1000 vuol dire che fa pausa di 1 secondo) ma proprio che il movimento sia continuo.

Spero di essermi spiegato.....

Grazie!!

La precisione del Servo non é cosí grande da poter fare dei passi infinitesimamente piccoli.
Se usi servo.writeMicroseconds(uS)  puoi dare valori da 1000 a 2000 percui 1000 passi; mentre con servo.write(angle) dai dei angoli da 0 a 180, percui 180 passi.
http://arduino.cc/en/Reference/ServoWriteMicroseconds

@mancio
Hai provato quel codice proposto?
Sai cosa succede se a un int sommi un numero decimale? rest lo stesso numero percui hai creato un bel ciclo infinito.

Ciao Uwe

mancio

si l'ho scritto stanotte dal tablet e mi sono accorto che serviva un float..  :smiley-mr-green: :smiley-mr-green:

astrobeed

Lo standard per i servo RC è che la loro posizione deve essere aggiornata ogni  20 ms (50Hz), questo vuol dire che è inutile cercare di aggiornarla molto più velocemente, p.e. 10 ms, ed è deleterio aggiornarla molto più lentamente, p.e. 1s, se si vuole ottenere un movimento fluido alla velocità desiderata.
Nel tuo caso devi creare un ciclo con un timing di 20ms che aggiorna la posizione del servo del corretto numero di step ogni volta utilizzando la myservo.writeMicroseconds() che consente una risoluzione maggiore rispetto alla myservo.write(), con la prima puoi impostare variazioni di 1us sul comando PPM, pari a circa 0.09° ciascuna (1 ms = 90°), con la seconda imposti movimenti di grado in grado, molto meno precisa e il servo si sposta tra le varie posizioni alla massima velocità.
Dato che anche la myservo.writeMicroseconds() accetta solo numeri interi compresi tra 500 (-90°) e 2500 (+90°) va da se che il suo incremento deve avvenire in accordo con tale range di valori e non è detto che puoi incrementare il valore ad ogni ciclo di 20 ms, sopratutto nel caso di movimenti molto lenti, quindi dovrai prevedere un contatore che ti permette di incrementare di una unità ogni tot cicli servo in accordo con l'escursione e il tempo desiderato.
Se tutto questo ti sembra complicato hai visto giusto, far muovere in modo fluido, e controllato, un servo non è una cosa semplice da fare come il farlo passare da una posizione all'altra con movimenti sempre alla massima velocità :)

vittorio68

Code: [Select]
for (int a=0; a>10;a+=0.000001)
{
Myservo.write(a);
Delay(10);
}


Scusatemi, nei primi post del thread avevo pensato che il codice riportato fosse solo esemplificativo e non avevo fatto notare la condizione a > 10 che pensavo fosse solo un svista notata da tutti.

Adesso mi pare di capire che il codice sia stato testato e forse è opportuno sottolineare che così come è scritto il ciclo non viene mai eseguito.


Go Up