servo motori

salve,
quanti servo motori posso collegare e gestire contemporaneamente su un arduino mega 2560.

Naturalmente con alimentazione separata ed appropriata.
Ogni servo ha bisogno di un pin di tipo OUTPUT, in teoria ne potrei collegare forse 30 o 40 se no di più.
Ho notato che collegando sia un servo che due la velocità è sempre uguale.

Utilizzando la libreria servo quanti ne posso collegare ?
Quanti ne posso collegare senza perdere in velocità ?

Esiste una libreria per gestire servo collegandoli allo shift register 74HC595 oppure all'I/O expander PCF8574AP, supponendo che si possano utilizzare per comdandare un servo (n) ?

La libreria servo.h puó gestire sul Arduino MEGA 48 servo.

Non so risponderti quanti puoi gestire contemporaneamente. Dipende dallo Sketch che scrivi. Visto che i servo vengono pilotati con un segnale a 50Hz non é cosí critico.

Esiste la libreria che puó pilotare i 595 per avere un segnale PWM, ma é una cosa che occupa molto di piú il controller che la libreria.

Ciao Uwe

supponendo che la libreria servo funzioni anche sul ARDUINO DUE, secondo Voi le performance migliorano o no.

puoi spiegarti meglio su queste affermazioni. grazie sempre della cortese attenzione.

Non so risponderti quanti puoi gestire contemporaneamente. Dipende dallo Sketch che scrivi. Visto che i servo vengono pilotati con un segnale a 50Hz non é cosí critico.

Esiste la libreria che puó pilotare i 595 per avere un segnale PWM, ma é una cosa che occupa molto di piú il controller che la libreria.

il link alla libreria si può avere.

Ciao. Se è la libreria standard di Arduino per pilotare i servocomandi (Servo.h) la trovi già nell'IDE 1.0.5

Sketch-->Importa libreria-->Servo

Ma forse ti riferisce a una libreria diversa, in tal caso scusa per aver detto un'ovvietà.

La libreria servo utilizza i pin standard di arduino.

La libreria a cui mi riferisco e quella indicata da uwefed

che utilizza i pin dello shift register

http://www.elcojacobs.com/shiftpwm/

Visto che i servo vengono pilotati con un impulso di lunghezza tra 1 e 2 mS ogni 20mS (50Hz) hai poco escursione usando una PWM da 8 o 9 Bit. 1mS sono ca 25 (51) e 2mS sono ca 51 (102) come valore PWM. PErcui hai solo 25 o 51 posizioni disponibili per i servo.
Inoltre come vedi dal calcolatore presente sulla pagina della libreria se usi 6 Shiftregister (48 uscite) tramite SPI con frequenza clock di 16MHz (Arduino standart) e una frequenza PWM di 50Hz hai un carico della CPU del microcontroller di 57% perché per ogni step del PWM deve essere rispedite le informazioni sui Shiftregister.

La libreria servo.h lavorerá in modo simile ma non é necessario pilotare i Shiftregister ma direttamente le uscite.

Devi calcolarti anche le posizioni che i vari servo devono raggiungere. Vuol dire che, se tutti i servo devono muoversi, devi calcolarti ogni 1/50 di secondo 48 valori nuovi e settare i vari servo. Puoi anche dire che vuoi aggiornare meno frequentemente la posizione allora hai piú tempo per il calcolo.

Ciao Uwe

premessa: ho avuto modo di verificare, con i servo che dispongo al momento, che per ruotare di 90° necessitano di circa 300 ms. Mi spiego, cioè dalla posizione zero do il comando per spostarsi alla posizione 90°; a questo punto se setto nuovamente il comando posizione 0 dopo un intervallo inferiore a 300 ms non arriva a 90 ma ritorna prima.

moveServo(myservo6, 0);
delay(300); // se imposto un valore inferiore la posizione non viene raggiunta
moveServo(myservo6, 90);
delay(300);

Quindi se impartisco il comando per una rotazione completa da 0 a 180 il servo necessità di 600 ms; dopo aver impartito il comando il controllo ritorna all'arduino per poter eseguire altre istruzioni o è una chiama sincrona, cioè il comando all'arduino ritorna dopo che il servo ha completato la propria escursione ?

Nel link da te segnalato parla di shiftPWM; Quando parla di shift register si riferisce allo shift-register dell'arduino stesso o uno shift register esterno ?

Uno di questi è il TLC4950
Mentre gli altri due 74HC595 e il PCF8574AP non sono shiftPWM. EDIT: il 74HC595 è uno shiftPWM.

Quindi è più indicato un TLC4950 piuttosto che gli altri due, se voglio utilizzare uno shft register esterno ?

E' meglio utilizzare i pin PWM dell'arduino o utilizzare i pin PWM di uno sheift register esterno ?

scusate per le banalità, però ho necessità di capire.

praticamente devo comandare 64 servo contemporaneamente, i quali devono cambiare posizione velocemente e non allo stesso modo.

Ho messo su una infrastruttura di tre arduini (al momento, ma possono crescere in base alle esigenze di cui sopra) collegati mediante I2C. Uno fa da master e riceve i dati dal pc e gli altri due (o più) da slave per il comando dei servo, led RGB, sensori e cosi via (distribuzione carico lavoro).

A questo punto devo decidere se utilizzare uno shiftRegister esterno tipo TLC4950 (16 canali PWM a 12 bit), oppure i pin PWM di arduino.

Eventualmente optare per arduino due per avere maggiori performance e una scelta possibile ?

Nel link da te segnalato parla di shiftPWM; Quando parla di shift register si riferisce allo shift-register dell'arduino stesso o uno shift register esterno ?

Arduino non ha shiftregister. Sono intesi sempre esterni.

A questo punto devo decidere se utilizzare uno shiftRegister esterno tipo TLC4950 (16 canali PWM a 12 bit), oppure i pin PWM di arduino.

A 2 Arduino MEGA con la libreria servo.h
Ciao Uwe

Sto tentando di comandare dei servo con il TLC4950.

Lo schema d collegamento è uguale a quello dei LED RGB con una resistenza collegata al pin IREF di 2K
Mentre ad ogni servo ho collegato una resistenza di 3.3K

Quando alimento l'arduino che a sua volta alimenta il TLC, praticamente uno o più servi inizia a vibrare senza muoversi. Perchè ? è un problema di alimentazione ?

Inoltre i servo ruotano solo di 90°, bisogna fare qualche impostazione nella libreria ?

gcam:
premessa: ho avuto modo di verificare, con i servo che dispongo al momento, che per ruotare di 90° necessitano di circa 300 ms. Mi spiego, cioè dalla posizione zero do il comando per spostarsi alla posizione 90°; a questo punto se setto nuovamente il comando posizione 0 dopo un intervallo inferiore a 300 ms non arriva a 90 ma ritorna prima.

Non conosco questo tipo di servo, che modello sono?

i servo sono HITEC HS311

escursione massima di 90° anche se fornisco valori alla libreria del TLC compresi tra 0 e 175

http://www.ahmetozkurt.net/robotics2005/14/hitechs.htm

A me sembra il classico servo con 20mSec di Periodo e da 1 a 2mS di impulso