Servomotore

Costruisci il tuo controller per servomotori


Non mi assumo nessuna responsabilita' per danneggiamenti, perdita di dati o danni personali come risultato diretto o indiretto dell'uso delle informazioni contenute in queste pagine. Questo materiale e' fornito cosi' com'e' senza nessuna garanzia implicita o esplicita.


Home
Hardware
Software

Servomotore
Tester
Servo stick
Registri
Collaudo
Trackball
Tavoletta
Download

Servomotore

Parlando di servomotori mi riferiro' in particolare a quelli usati nel modellismo, tipicamente per il controllo dell'acceleratore o degli alettoni o dello sterzo; mi riferiro' esclusivamente a servi analogici, il caso dei servi digitali e' del tutto simile, cambia solo la frequenza degli impulsi che e' piu' alta nei servi digitali. Un servo ha solitamente una forma piu' o meno rettangolare, ha un albero che esce da un lato solitamente dotato di attacco millerighe e un cavetto a tre fili. Due dei tre fili servono chiaramente per alimentare il servo, il terzo filo porta il segnale di comando al servo. Un servo non ruota, un servo si posiziona ed e' in grado di mantenere in modo autonomo la posizione indicata dal segnale di controllo.

In funzione del modello l'albero del servo ha piu' o meno liberta' di movimento, difficilmente supera comunque i 270 gradi di rotazione prima di incontrare un fermo meccanico; nel movimento dell'albero si identifica una posizione iniziale, albero ruotato tutto da una parte, ed una posizione finale, albero ruotato tutto nel senso opposto.

Il segnale di controllo indica al servo quale debba essere la posizione dell'albero. Come si vede nella figura sotto il segnale di controllo ha un andamento impulsivo: e' costituito da un breve impulso largo solitamente da 1ms a 2ms seguoto da una pausa di 20ms. La larghezza dell'impulso determina la posizione del servo: 1ms corrisponde alla posizione iniziale, 2ms corrisponde alla posizione finale; tutte le posizioni intermedie sono possibli. In funzione del modello questi valori possono variare leggermente, alcuni garantiscono che la variazione da 1ms a 2ms copra 90 gradi di rotazione anche per servi che offrono una maggiore liberta'. La morale della favola e' che servi diversi possono accettare range di controllo differenti, non resta che sperimentare.

servo motor
Servomotore e segnali

Servo tester

Questo e' lo schema elettrico di un semplice driver per servomotori, il tutto e' basato su un 555 e il controllo della posizione avviene tramite il potenziometro sulla sinistra. E' molto semplice da realizzare e funziona molto bene, tra le altre cose offre un modo molto veloce per verificare il range di pilotaggio e di movimento dei servi.

tester schematic
Semplice servo tester

Servo stick

Ora passiamo al servo controller computerizzato: dopo diverse prove ed esperimenti sono approdato a servo stick, il nome dipende dalla sua forma che imita la famosa gomma del ponte.
L'idea che sta' alla base del servo controller e' molto semplice: un piccolo microprocessore genera 12 impulsi di controllo per 12 differenti servi e contemporaneamente riceve ordini attraverso una linea seriale.
Come protocollo seriale ho scelto il ModBus, protocollo al quale sono molto affezionato per ragioni storiche.

servo stick pcb
Servo stick, descrizione connettori

controller schematic
Servo stick, schema elettrico

Registri di controllo

Visto che si parla di ModBus sara' necessaria una tabella che descriva i registri mostrati da questo controller, ovviamente il dispositivo e' slave e il suo indirizzo e' fisso a 0x02. Qualcuno potrebbe notare che gli indirizzi dei registri non seguono esattamente lo standard ModBus, infatti mi sono permesso di utilizzare direttamente gli indirizzi di memoria del microprocessore, per me e' molto piu' chiaro cosi'.

Address Reg high
byte
Reg low
byte
r/w Descrizione
0x0060 Ctrl r/w Control register, non utilizzato.
0x0062 Dest 1 Dest 0 r/w Destinazione del servo.
0x0064 Dest 3 Dest 2 r/w  
0x0066 Dest 5 Dest 4 r/w  
0x0068 Dest 7 Dest 6 r/w  
0x006a Dest 9 Dest 8 r/w  
0x006c Dest 11 Dest 10 r/w  
0x006e Spd 1 Spd 0 r/w Velocita' di movimento.
0x0070 Spd 3 Spd 2 r/w  
0x0072 Spd 5 Spd 4 r/w  
0x0074 Spd 7 Spd 6 r/w  
0x0076 Spd 9 Spd 8 r/w  
0x0078 Spd 11 Spd 10 r/w  
0x007a Pos 1 Pos 0 r Posizione attuale del servo.
0x007c Pos 3 Pos 2 r  
0x007e Pos 5 Pos 4 r  
0x0080 Pos 7 Pos 6 r  
0x0082 Pos 9 Pos 8 r  
0x0084 Pos 11 Pos 10 r  
0x0086 Offset r/w Offset iniziale.
0x0088 Scale r/w Correzione della scala.

Il registro di controllo non e' utilizzato nella versione 0.06, volendo puo' essere utilizzato come registro spare per verificare il dialogo con la scheda.
I registri destinazione sono i registri piu' importanti: determinano la posizione finale che il servo deve raggiungere. La posizione di ogni servo viene indicata da un valore a 8 bit, pertanto ogni registro controlla contemporaneamente 2 servi; non e' possibile scrivere mezzo registro alla volta. Il valore 0x00 corrisponde all'impulso piu' stretto possibile, quindi sara' generato un impulso largo circa 1ms; il valore 0xff corrisponde all'impulso piu' largo, quindi circa 2ms. Un servo puo' quindi assumere 256 posizioni diverse; per quanto questa cosa possa sembrare approssimativa vi garantisco che il movimento di 1 solo punto non e' percettibile a occhio.

I registri velocta' determinano, come suggerisce il nome, la velocita' di movimento di ciascun servo, 0x01 corrisponde alla velocta' minima, 0xff corrisponde alla velocita' massima, praticamente limitata solo dall'effettiva velocita' di risposta del servo. La velocita' viene misurata in step massimi eseguibili per unita' di tempo: la velocita' di 0x01 impone al servo di muoversi di un solo punto (1/256esimo del movimento totale) per ogni unita' di tempo. Una unita' di tempo corrisponde ai 20ms di pausa che separano un impulso dal successivo.

I registri posizione contengono in ogni istante la posizione del servo, per quanto non sia vietato e' sconsigliato modificare direttamente il valore di questi registri per evitare comportamenti inaspettati dei servi.

Collaudo

Adesso che il servo controller e' pronto manca ovviamente la cosa piu' importante: chi comanda il servo controller?
Per supplire a questa grave mancanza ho creato un piccolo sequencer programmabile in grado di colmare la lacuna senza troppi effetti speciali: servoseq.

Servoseq e' un programma da riga di comando che legge la sequenza di operazioni da un file di testo e invia le coordinate da seguire al servo controller. Il set di comandi e' veramente ridotto all'osso, ma con questi semplici comandi e' possibile comporre scenari piu' complessi come: la camminata di un ragno a sei zampe o i movimenti di un braccio nello spazio circostante. L'uso di servoseq e' del tutto sperimentale in attesa di un software e di una interfaccia utente piu' complessa.

servo proving ground
Servo array per il collaudo

Trackball

Un giorno trovo nella mia cantina un vecchio trackball seriale, probabilmente dei tempi dei 286, e mi viene un'idea fulminante: perche' non pilotare i servi tramite trackball?!
Ovviamente in mancanza del trackball si puo' usare un mouse seriale, mal'uso del trackball mi sembra piu' accattivante, inoltre era abbandonato in fondo ad una cantina buia, non potevo lasciarlo li da solo.

Cosi' nasce la versione 0.07 di servo: solo due servi, uno legato alle X e l'altro legato alle Y del trackball.

Visto che servo stick non e' collegabile direttamente ad un mouse, ha bisogno di un vero transceiver RS232 dall'altra parte per poter funzionare, ho utilizzato IR sil: una scheda elettricamente identica ma che fisicamente si presta meglio ad essere collegata ad un transceiver RS232. Qui sotto il piano di montaggio del modulo IR sil.

trackball experiment
Pilotaggio dei servi tramite trackball

Qui sotto lo schema delle connessioni per poter utilizzare la scheda IR sil per piloare i servi tramite mouse o trackball.

trackball experiment
Schema delle connessioni

Tavoletta grafica

Purtroppo l'appetito vien mangiando e un bel giorno ho trovato un altro residuato bellico in fondo alla mia cantina: una tavoletta grafica Acecad D-9000; per quanto sia perfettamente funzionante non l'ho mai usata, cosi' mi sono detto: "Perche' non usarla per pilotare i servi!?!".

Dopo tutto una tavoletta grafica e' molto piu' precisa di un trackball o di un mouse e finalmente potrebbe approfittarne per uscire dalla buia cantina e farsi un giretto tra servomotori e azionamenti vari.

Acecad tablet
Tavoletta grafica

All'inizio sembrava semplice: sostituisco il trackball con la tavoletta, imposto l'emulazione di mouse et voila'... non funziona niente!

Reimposto, punzono, giro, brigo, meno, ma il risultato non cambia: i servi non si muovono o si muovono a casaccio!

Dopo lunga e attenta riflessione scopro che: il trackball lavora in modalita' Microsoft mouse, ma non so per quale motivo impostando la tavoletta in emulazione di Microsoft mouse questa rimane perfettamente muta. La tavoletta funziona invece perfettamente in emulazione di System mouse!

Ecco quindi una nuova versione di firmware per il servo controller, la 0.08, ora deve essere in grado anche di parlare il System mouse-ese se voglio giocare con la tavoletta grafica. Per fortuna i collegamenti rimangono gli stessi del trackball, l'unica differenza rispetto a prima e' nel firmware caricato sul modulo IR sil.

Download

servo-0.06.tar.gz Servo stick firmware.
servo-0.07.tar.gz Versione Microsoft mouse a due servi.
servo-0.08.tar.gz Versione Microsoft mouse o System mouse.
servoseq-0.02.tar.gz Servo sequencer software.

Questo sito e' stato realizzato interamente con vim.
Grazie a tutta la comunita' open source, alla free software foundation e chiunque scriva software libero.