visualizzare angolazione servo motore

Salve a tutti, ho utilizzato un servo motore per il movimento di un braccio costruito in legno, collegando tutti i cavi il problema che ho riscontrato è che il motore non gira correttamente con gli angoli che gli ho dato ovvero sembra quasi che all’inizio parta da 0 e faccia 220 gradi (quando io gli ho impostato 200 gradi) e tornando in dietro vada da 200 a 0 (come gli ho impostato), questo comporta che per ogni ciclo di loop il motore gira troppo facendo salire troppo il braccio fino ad arrivare quasi a spaccare il filo. Per capire se è un problema del cavo troppo tirato, del troppo peso sul motore o del programma volevo visualizzare il valore della variabile pos che controlla l’angolazione del motore. Questo è come ho cercato di farlo:

#include <Servo.h> // include la Libreria Servo.h
 
Servo myservo;  // crea l’oggetto di tipo Servo, myservo sarà l’oggetto su cui opererai 
               
 
int pos = 0;    // inizializza una variabile di tipo intero pos il cui valore sarà la posizione da impartire al servo
 
void setup() 
{ 
  myservo.attach(8);  // lega l’oggetto myservo al pin a cui abbiamo collegato il nostro servo, in questo caso il pin 8
  Serial.begin(9600); //attiva la comunicazione seriale-USB
} 


 
void loop() 
{ 
  for(pos = 0; pos <200; pos += 1)  // imposta un ciclo con valori che vanno da 0 a 180, sarano i gradi di spostamento del nostro servo 
  {                                  
    myservo.write(pos);              // con il metodo write() passi all’oggetto myservo la posizione che deve raggiungere, 
                                     // il servo si sposterà gradualmente dalla sua posizione 0° alla posizione 180° 
    delay(15);                       // imposta un ritardo di 15 millesimi di secondo per ogni ciclo del for. 
                                     // Più sarà alto il ritardo più il servo sarà lento. 
  } 
  for(pos = 200; pos=0; pos-=1)     // In questo caso imposta un ciclo con valori che vanno da 180 a 0
  {
    Serial.print(pos);                                
    myservo.write(pos); 
                
    delay(15); 
                           
  } 
}

Il problema è che quando vado a visualizzare il monitor seriale, per visualizzare “pos” il monitor rimane bianco. Sapete aiutarmi sia sul fatto del motore che non segue bene l’angolazione che gli ho impostato sia per il monitor seriale?
Grazie mille a tutti cordiali saluti Luca Martinelli.

for (pos = 200; pos >= 0; pos -=1)

Che servo hai, da potergli far fare 200° ?

Questo non vorrei dire un'eresia ma non potrebbe ruotare di 360°? scusatemi per l'ignoranza. Cordiali saluti Luca Martinelli.

Perche’ se è un 360 Gradi si gestisce in maniera diversa

un servo.write ( < (minore di) 90 lo fà ruotare in un verso
un servo.write ( > (maggiore di ) 90 lo fà ruotare nell’altro verso

Per prima cosa la voglio ringraziare per l'enorme mano che mi sta dando con tutti i miei problemi, e come seconda cosa, per farlo ruotare di 360 quindi come devo fare? Come le scrivo sempre mi scusi per le mie domande che per lei sicuramente avranno una risposta ovvia. Cordiali saluti, Luca Martinelli.

Brunello:
Perche’ se è un 360 Gradi si gestisce in maniera diversa

un servo.write ( < (minore di) 90 lo fà ruotare in un verso
un servo.write ( > (maggiore di ) 90 lo fà ruotare nell’altro verso

Normalmente 360° indicano che il servo é modificato a girare di continuo senza una posizione correspondente al segnale di pilotaggio; si usano per far girare le ruote in robottini piccoli.

Ma.
http://www.servodatabase.com/servo/towerpro/mg995
In questo caso il servo sembra di essere uno che fa veramente una rotazione di 360° e non é a rotazione continua. Percui quello detto da Brunello é errato ed si usa nella stessa maniera di uno da 180° che fa il doppio dell angolo. Percui 0° corrispondono a 0° e 180° di pilotaggio corrispondono a 360°.

Ciao Uwe

Ammetto la mia ignoranza su detti tipi di Servo, a questo punto sorge una domanda: Come si pilota questo tipo di Servo ?

Mi rispondo da solo... writeMicroseconds()

uwefed: In questo caso il servo sembra di essere uno che fa veramente una rotazione di 360° e non é a rotazione continua.

Il Towerpro MG995 è un servo cineseria che più schifezza non può essere, ha grossissimi problemi per mantenere la posizione e di zero, gli ingranaggi si polverizzano facilmente sotto carico, è un servo che si trova sia nella classica versione 180° che nella versione 360° intesa come rotazione continua. Tutti i servo RC fanno 180°, solo alcuni modelli digitali, abbastanza costosi, arrivano fino a 240° previa modifica della corsa tramite apposito programmatore, il limite è sempre dato da fermi meccanici. In tutti i casi il limite massimo è imposto dal potenziometro collegato all'asse d'uscita, più di 270° non può fare. Esistono servi speciali ad uso nautico, detti verricelli, che possono fare più giri mantenendo il classico controllo posizione, però oltre ad essere costosi sono molto meno precisi di un normale servo, questo perché il potenziometro non è collegato direttamente sull'asse d'uscita, è collegato tramite un riduttore di giri. Poi esistono i servo specifici per robotica, controllati tramite bus seriale, che consentono sia il controllo classico fino a 300° che la rotazione continua con un controllo decente della velocità, però parliamo di oggetti che costano oltre 50 E per i modelli più semplici, p.e. i Dynamxel AX12.

che nella versione 360° intesa come rotazione continua

Bene, allora avevo ragione io. Grazie @Astro

Brunello: Mi rispondo da solo... writeMicroseconds()

La writeMicroseconds() fa la stessa identica cosa della myservo.write(), però lo fa con una risoluzione migliore, con la myservo.write() puoi inserire un parametro compreso tra 0 e 180, la posizione centrale è 90, che corrisponde ad un impulso compreso tra 500 e 2500 us, però la risoluzione è di 11 us, ovvero il servo si muove a scatti di 1°, Con la writeMicroseconds() cambi l'impulso di us in us, il che consente di spostare il servo di 0.1° per volta, ammesso che il servo sia in grado di farlo e se non hai un servo digitale di fascia alta, roba da non meno di 80E, non ci riesce, con i Towerpro non cambia nulla nell'usare la write o la writeMicroseconds().

Grazie a tutti delle delucidazioni siete stati chiarissimi, c’è solamente una cosa che non riesco a capire, come posso fare per far muovere il mio braccio? il mio problema è che 180° non mi bastano per far alzare totalmente il braccio e non riesco a trovare una soluzione. Il problema è che con lo stesso motore volevo anche riuscire a far aprire e chiudere una mano fatta con la stampante 3D i collegamenti tornano il problema è che anche in questo caso 180° non mi bastano per chiudere completamente la mano. queste sono le foto della mano e del braccio:

Vi prego aiutatemi perché sembra un incubo senza fine.
Grazie mille a tutti per il vostro aiuto, cordiali saluti Luca Martinelli.

Hai solo una soluzione possibile, a meno che non vuoi spendere qualche centinaio di Euro per dei servo AX12, usare squadrette più grandi per aumentare la distanza percorsa. Purtroppo il sistema dei tiranti è abbastanza arcaico, si usava su i primi bracci robot realizzato con motori stepper, tutti sistemati nella base, in questo caso non c'erano problemi di corsa in quanto i cavi venivano avvolti su piccole pulegge comandate dai motori. Tutti i bracci robot attuali usano servo montati direttamente sulle articolazioni, in questo caso 180° sono pure troppi, oppure i servo della spalla e del gomito, in totale 3, montati sulla base con comando del gomito tramite rinvii e parallelogramma per mantenere il polso allineato, poi sul polso si installa un attuatore quale una pinza o una ventosa, a seconda della designazione d'uso. Visto che hai una stampante 3D su Thingiverse trovi diversi progetti per bracci robot, p.e. questo che è sicuramente uno dei migliori tra quelli presenti.

Esempio di braccio robot commerciale (~350 E, struttura in lega di alluminio tagliato laser) realizzato con i servo nella base e rinvii con parallelogramma.

|500x375