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 :
Comuqnue grazie in anticipo!
il comportamento che descrivi potrebbe esser dovuto da diversi motivi, se incolli il codice che hai usato magari ti si può aiutare
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
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.
//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