Antefatto, ieri è passato a trovarmi un amico assieme al suo Arduino UNO e 12 servo Futaba di fascia alta, parliamo di servo digitali che costano più di 100 E l'uno, che deve usare per realizzare un braccio robotico, fin qui niente di strano, però quando mi ha fatto vedere il problema che lo bloccava mi è venuto subito il dubbio che la colpa era della libreria servo.
Premesso che i servo sono alimentati tramite un pacco batteria LiPo 2s da 5000 mAh, ha realizzato un apposito pcb che provvede alla distribuzione dell'alimentazione e preleva i segnali di controllo dalla UNO, in particolare pin da 2 a 7 per i primi sei servo e pin da 14 a 19 (A0-A5) per gli altri sei servo, pertanto ho escluso da subito problemi dovuti all'alimentazione o ai contatti.
Il problema è che quando i 12 servo vengono pilotati con impulsi, tutti uguali durante il test, minori di 1850 us funziona tutto perfettamente, non appena si supera questa soglia i servo si bloccano e tornano a funzionare non appena si torna sotto la soglia.
Mi ci è voluto un pochino per capire la natura del problema, sotto trovate uno screen shot dell'analizzatore di stati logici che evidenzia la causa del problema, però non appena fatta una misura strumentale dei segnali applicati ai servo la cosa è diventata chiara.
In pratica la libreria servo funziona in questo modo, andando in ordine di creazione delle varie xxxx.attach() emette gli impulsi di controllo in sequenza partendo dal primo servo dichiarato per finire con l'ultimo, fin qui nulla di strano però fino a che i servo sono pochi e/o gli impulsi di controllo non sono di valori elevati, range classico 500-2500 us per 0-180°, il frame rate (tempo di ripetizione dei vari impulsi) è circa 20 ms (50 Hz) come deve essere, non appena si usano molti servo con tempi lunghi questo modo di funzionamento porta a frame rate minori di 20 ms, nel caso specifico con 12 servo a 2500 us (180°) si arriva a oltre 30 ms (< 33 Hz).
Avere un frame rate lento causa due tipi di problemi, il primo è la perdita di reattività del servo e minore fludità di movimento, la seconda è che a seconda del modello di servo si può incorrere nel blocco del funzionamento dello stesso, come nel caso in oggetto visto che i servo digitali Futaba non accettano frame rate minori di 45 Hz, come valore massimo accettano 75 Hz.
Sebbene questo problema viene fuori solo in condizioni particolari è comunque un grave difetto della libreria servo, non è ammissibile che il frame rate varia a seconda del numero di servo usati e la durata degli impulsi.
Purtroppo questo problema non è risolvibile correggendo qualche riga di codice della libreria, va riscritta completamente modificando la logica di funzionamento.
Screen capture dell'analizzatori di stati logici con 12 servo e impulsi a 2500 us, le tracce sono solo 9 perché questi sono i canali collegati, gli impulsi servo collegati vanno da 1 a 8 e il 12, 9-10-11 sono mancanti ma si vede comunque che si trovano in mezzo tra 8 e 12,
