Fermare un servo motore regolando la velocità

Per regolare la velocità di rotazione di un servo motore si può utilizzare la seguente sintassi:

 for(int pos = 0; pos < 180; pos += 1)
  {
    myservo.write(pos);
    delay(15);
  }

Però così facendo il ciclo viene eseguito continuamente, se una volta arrivato a 180° volessi fermare il servo come dovrei fare?

Ma un servo normale o un servo a rotazione continua ? :fearful:

È un servo normale, ma mi sono spiegato male. Di base il ciclo viene eseguito una sola volta, ovvero quando pos = 180 il programma esce dal ciclo. Se però il ciclo for è annidato in un if, ad esempio:

if (a = 1)
{ 
 for(int pos = 0; pos < 180; pos += 1)
  {
    myservo.write(pos);
    delay(15);
  }
}

C’è un modo per uscire dal ciclo for anche se la condizione sull’if rimane vera, cioè vorrei che quando la condizione sull’if è true, il ciclo venga eseguito una volta sola.

esiste la funzione break;

for(int i=0; i<180,i++){
if(i=70)
break;
}

in questo modo quando appena i avrà iterato la 70esima+1volta uscirai dal ciclo for.
Puoi usare il break anche nei while e switch statament.

Ok perfetto grazie :slight_smile:

Nelle condizioni dell’if si usa il doppio =

if (x == 0)

se invece usate un uguale solo, state facendo una operazione di assegnazione

con

if (x=0)

state assegnando ad x il valore 0

Attenzione. Il compilatore NON VI SEGNALA questo come un ERRORE.
Però non funziona come ci si aspetterebbe. E’ un classico errore che tutti prima o poi abbiamo commesso, specialmente chi ha iniziato con il GWBASIC :grin:

Detto questo…
Invece di mettere nel loop quel pezzo di codice, costruisciti una funzione e richiamala dal loop quando ti serve.
La puoi chiamare void giralento (int angolo1, int angolo2, int rallentamento) e quando ti serve la richiami passando i tre valori angolo di partenza, angolo finale e rallentamento.
Considera però che se la costruisci con il delay, tutto rimarrà bloccato durante la rotazione.
In alternativa, ti fai una void gira (int angolo) e la richiami con la tecnica dei millis() facendo variare l’angolo un poco alla volta; così potrai anche costruirti un movimento che parte lento, diventa veloce e poi rallenta prima della configurazione finale.

Ok grazie per i consigli