Controllo servi poco preciso

Ciao a tutti! Mi sono appena iscritto al forum e ci tengo a iniziare salutando tutti!
Dunque, ora il motivo del post: ho acquistato arduino da un mesetto e mi trovo molto bene. Da una settimana a quets parte cerco di usare i servi e devo ammettere che ora ci riesco abbastanza bene. Ho un solo problema: i servi che uso sembra che non riconoscano bene di aver raggiunto la posizione richiesta.
Mi spiego meglio: loro si orientano correttamente ma è come se ricevessero sempre impulsi di controllo, la carcassa vibra ma l'albero è giustamente fermo.
Devo preoccuparmi per la loro salute o è una questione della libreria standard per controllarli?
Scusate se mi sono dilungato un pò troppo ::slight_smile:
Comuqnue grazie in anticipo! :slight_smile:

PS:Uso la libreria Servo standard di arduino

Ciao e sopratutto benvenuto!

il comportamento che descrivi potrebbe esser dovuto da diversi motivi, se incolli il codice che hai usato magari ti si può aiutare :slight_smile:

ad esempio se il movimento è determinato dalla lettura di un sensore... il sensore potrebbe riportarti delle micro variazioni e i servi reagiscono di conseguenza!

cmq per debuggare nel modo più facile e risolverti la cosa da solo usa un Serial.print("SERVO numero X in posizione: "); Serial.println(posizione); dopo ogni volta che dai il comando di muoverlo... così intanto sai se è il software che gli dice di fare il "mini-movimento" o li hai bruciati :stuck_out_tongue:

in linea generale i servi sono dei motori con un potenziometro che funge da encoder quindi il motore è soggetto a forti sollecitazioni. A meno che non sia il codice a fare gli scherzi il tuo servo si è bruciato. Questo è possibile soprattutto se è costato 2 lire.

Grazie per i consigli.
Il codice è il seguente

//Controllare deu servi mediante comandi su porta seriale
#include <Servo.h> 

Servo servo1;
Servo servo2;
int pos[2];
int d = 0;
int cActive = 0;
char cmd;

void sweep(){
  Serial.print("Sweep test in corso..");
  for(pos[0] = 0; pos[0] < 180; pos[0] += 1)  // goes from 0 degrees to 180 degrees 
  {                                  // in steps of 1 degree 
    servo1.write(pos[0]);              // tell servo to go to position in variable 'pos' 
    servo2.write(pos[0]);
    delay(d);                       // waits 15ms for the servo to reach the position 
  } 
  for(pos[0] = 180; pos[0]>=1; pos[0]-=1)     // goes from 180 degrees to 0 degrees 
  {                                
    servo1.write(pos[0]);              // tell servo to go to position in variable 'pos' 
    servo2.write(pos[0]);
    delay(d);                       // waits 15ms for the servo to reach the position 
  } 
  pos[0] = 0; 
 Serial.println("Terminato."); 
}

//Routine per gestire i comandi da seriale
void handleCmd(){
  cmd = Serial.read();
  switch(cmd){
    case 'a':
    case 'A':
      Serial.println("Servo1 Attivato");
      cActive = 0;
      break;
    case 'b':
    case 'B':
      Serial.println("Servo2 Attivato");
      cActive = 1;
      break;
    case 's':
      sweep();
      break;
    case 'd':
      Serial.println("Impostazione delay Attivata");
      cActive = 2;
      break;
    case '0'...'9':
      Serial.println("Nuovo valore impostato");
      if (cActive < 2){
        pos[cActive] = (int)(cmd-'0')*10;
      } else {
        d = (int)(cmd - '0');
      }
      break;
  }
  servo1.write(pos[0]);
  servo2.write(pos[1]);
  delay(d);
}

void setup() 
{ 
  Serial.begin(9600); 
  Serial.println("Serial Servo Ready."); 
  servo1.attach(9);
  servo2.attach(10);
  //resettiamo la posizione dei servi
  servo1.write(0);
  servo2.write(0);
  //delay(500);
  //sweep();
} 

void loop()
{
  if ( Serial.available() ) handleCmd();
  //servo1.write(pos[0]);
  //servo2.write(pos[1]);
  //delay(d);
}

Ho modificato la posizione del servoX.write che prima era nel loop e ora viene aggiornato solo se ce ne bisogno, e pare funzionare.
Ma se la posizione è 0 ho lo stesso problema.
Il problema sono vibrazione della meccanica interna la servo, dal punto di vista esterno non si nota nulla, se sento solo la carcassa che "trema". :o
Credo sia un problema di riferimento del servo rispetto alla durata degli impulsi. Avete consigli a riguardo?
Grazie :smiley: