Ecco un semplice programma di test per servo RC.
|
Da tenere presente che esistono numerosissime tipologie di
servo: qui vogliamo trattare la forma più semplice di questi
dispositivi di posizionamento, ovvero quelli che richiedono un segnale costituito da
un impulso di ampiezza variabile , ripetuto ciclicamente.
Solitamente sono chiamati servo analogici, per distinguerli da quelli
"digitali" al cui interno il controllo è affidato ad un
microcontroller.
In generale, l'azione che svolgono è quella di fare ruotare un
disco o una crociera a cui andranno collegati gli elementi meccanici
da movimentare.
|
La corsa è normalmente di 180°, ovvero 90° a destra o a sinistra
rispetto ad una posizione centrale, ma esistono modelli in grado di sviluppare
angoli maggiori o minori.
|
L'ampiezza dell' impulso di comando determina la posizione assunta
dall' attuatore del servo.
Tipicamente sono comuni questi tempi:
- con un impulso da 1ms, è ruotato al minimo
- con un impulso da 2ms è ruotato al massimo
- con un impulso
da 1.5ms è posizionato al centro.
Gli impulsi si ripetono ogni 20ms circa.
La corsa può essere di 180°, ovvero 90° a destra o a sinistra rispetto
ad una posizione centrale, ma esistono modelli in grado di sviluppare angoli
maggiori o minori.
|
E' opportuno chiarire che, nonostante ci sia possibilità di
fraintendimento, il segnale di controllo dei servo che stiamo trattando NON è assolutamente un segnale
PWM come molti continuano a sostenere,
anche in "tutorials" sul WEB.
Per chiarire, un segnale PWM è costituito da una ripetizione in un tempo fisso di
un impulso di durata variabile. Il rapporto tra i due tempi determina i duty
cycle:
l'informazione trasmessa dal PWM sta proprio nel rapporto tra il
tempo dell' impulso e quello di ripetizione.
Nel comando del servo, il "duty cycle" del segnale non ha
alcuna valenza, anche se, da un punto di vista puramente numerico, si può
calcolare; questo sarebbe possibile solo supponendo fisso il tempo di ripetizione dell' impulso.
Ma il ripetersi ciclico dell'impulso non contribuisce all'
informazione di posizione, che è data solamente dalla durata dell'impulso
stesso. Il ciclo di ripetizione è un refresh che può essere necessario
alla logica di controllo del servo; basta considerare che questo tempo di
ripetizione può essere di durata variabile senza che questo
influisca sulla informazione di posizione, che , quindi, non è determinata
dal rapporto tra il tempo di ripetizione e quello dell'impulso.
Questo rende chiaro che il segnale di controllo del servo è qualcosa
di diverso da un vero PWM.
In pratica, il segnale di comando deve essere ripetuto per mantenere la
posizione con sicurezza: anche se buona parte dei servo sono in grado di
restare nella posizione assunta in mancanza di alimentazione o segnale di
controllo, ne esistono anche in grado di riportarsi in una posizione neutra se
manca il controllo o necessitare del continuo rinfresco della posizione per
esplicare la massima coppia.
Solitamente l'impulso, come accennato, deve avere una durata minima e l'informazione della posizione da assumere è fornita
dalla durata successiva dell' impulso.
Il tutto ha a che fare con la struttura interna del servo, che consiste, nella
forma più semplice, in un motore in corrente continua azionato da uno
specifico controller (M51660L,
NE544 e simili) attraverso ingranaggi, e che
compara la posizione con un potenziometro collegato all'attuatore.
I tempi che abbiamo indicato sono quelli "standard", ma va
osservato che diversi modelli di diversi costruttori possono presentare molte
variabili. La durata minima dell' impulso può variare tra 0.75 e 1.1ms, la
posizione centrale tra 1.3 e 1.6ms e quella finale tra 1.9 e 2.2ms. La lettura
del foglio dati del componente permetterà di individuare le caratteristiche.
Anche il tempo di ripetizione, che è tipicamente 20ms, può variare tra 10 e
50ms ed è possibile che il servo risponda a frequenze molto maggiori, anche
se in modo probabilmente non perfetto.
L' alimentazione è solitamente prevista per un funzionamento con batterie per cui le
tensioni di lavoro sono attorno ai 4-9V e molti modelli funzionano
correttamente con il tipico 5V,
mentre sono disponibili modelli con altre gamme di funzionamento.
Questo parametro, con la velocità di rotazione, la coppia fornibile, le
dimensioni meccaniche, il peso, ecc., sono gli elementi determinanti nella scelta del servo per
una applicazione.
Una visita ai siti dei produttori (Hitec,
Futaba,
Graupner,
Airtronics,
Japan
Radio e molti altri)
consente di avere ampie informazioni su quanto disponibile sul mercato.
Mettiamo il servo al lavoro.
Vogliamo realizzare un semplice dispositivo per verificare il funzionamento
di un servo analogico.
Il progetto è spartano, ma funzionale: prevede la presenza di due pulsanti, uno per attivare una
rotazione a destra, uno per quella in senso opposto. Se premuti
contemporaneamente inviano un segnale per posizionare l'attuatore al centro.
Abbiamo detto che occorre in uscita un impulso variabile tra 1 e 2ms,
ripetuto ciclicamente ogni 20ms circa. Questo è possibile da ottenere da
qualsiasi micro controller: non è un segnale PWM e quindi non occorre il
modulo CCP/PWM.
Inoltre, i tempi in gioco sono di gran lunga maggiori del ciclo di istruzione
di una MPU con un clock comune di 4MHz (tcyc=1us) e la cosa è risolvibile
senza l'impiego di interrupt.
Possiamo tranquillamente scegliere un piccolissimo Baseline a sei pin della
famiglia 10F2xx. Sono PIC minimali che dispongono essenzialmente del Timer0
che ci servirà per generare la cadenza. Per le
basse frequenze in gioco un algoritmo basato sulla durata delle istruzioni è
adeguato.
Questo è lo schema elettrico.
GP0 e GP1 sono collegati ai due pulsanti Up e Down, mentre GP2 è l'uscita
del segnale di controllo del servo.
Non occorre alcun buffer, dato che l' ingresso del servo richiede un segnale a
livello logico e lo alimentiamo alla stessa Vdd del microcontroller.
GP3 non è utilizzato.
Allo scopo di minimizzare i componenti, utilizziamo i weak pull-up abilitabili
su GP0, 1, 3, evitando così la necessità di resistenze esterne sui pulsanti.
Il clock è interno, a 4MHz, che determina un ciclo istruzione di 1us.
E' comodo
utilizzare la LPCuB
per sviluppare il programma:
Il jumper volante "marrone" collega il pulsante PB4 al GP0,
mentre quello "viola" collega il PB2 al GP1.
Il servo sarà collegato esternamente. Solitamente i costruttori utilizzano
un connettore a tre pin passo 2.54 con la stessa disposizione dei contatti, in
modo da garantire una intercambiabilità tra i vari modelli.
Il connettore non è polarizzato, ma i cavi hanno guaine di diverso colore, il
che semplifica le cose:
V+ |
rosso |
|
V- |
nero o marrone |
segnale |
arancio o bianco o giallo o blu |
In ogni caso la consultazione del foglio dati del componente chiarisce
eventuali dubbi.
Con questi collegamenti alimentiamo il servo alla stessa tensione del
microcontroller; in genere, non ci sono problemi, dato che la maggior parte
dei servo sono da 6v nominali e quindi a 5V lavorano sufficientemente bene.
Anche per modelli previsti per una alimentazione di 7-8V il funzionamento è
assicurato (sia pure con prestazioni inferiori, ma ciò non interessa questa
applicazione il cui scopo è verificare il funzionamento del servo).
AVVERTENZA: dato che i pulsanti sono collegati a PB1:0 che
sono anche PGC e PGD della programmazione, occorre assicurarsi che
essi non siano premuti durante questa operazione che, altrimenti,
sarebbe impossibile.
|
Il programma
Il sorgente è estremamente semplice ed utilizza il minimo delle risorse
disponibili in un PIC.
Come detto, non è richiesto modulo CCP/PWM, nè interrupt.
Il conteggio principale del tempo è basato sul Timer0, che genera una cadenza fissa a
circa 20ms. Questo tempo non è critico, ma, dato che lo utilizziamo anche per
verificare i pulsanti, non va abbreviato; semmai potrà essere aumentato.
Inizialmente viene generato un impulso da 1.5ms, che dovrà posizionare l'attuatore
del servo a metà corsa.
Il tempo di durata dell' impulso è generato con una routine waste time di
buona precisione, che produce un ritardo di 10us (per il clock a 4MHz) in
funzione del valore passato in WREG.
Viene verificato lo stato di Timer0 e ad ogni overflow il contatore viene
ricaricato.
A seguito dell' evento, viene generato un impulso fisso di 750us a cui si
aggiunge un tempo, in passi da 10us ciascuno, determinati dalla pressione dei
pulsanti.
La durata massima dell' impulso è prevista in 2.25ms.
Quindi, con i pulsanti, si potrà far variare la lunghezza dell' impulso tra
0.75 e 2.25ms. Questo dovrebbe coprire le esigenze della maggior parte dei
servo.
La pressione contemporanea dei pulsanti fa si che l'ampiezza dell'impulso sia
pari a 1.5ms, il che porterà il servo a centro corsa.
I pulsanti sono verificati ogni 240ms per evitare problemi di debounce;
questo fa si che se un pulsante viene mantenuto premuto, ogni 240ms si avrà
una variazione della larghezza dell'impulso pari a 10us e l'attuatore del
servo si muoverà con continuità.
Dato che ci sono 100 step da 10us tra 1 e 2ms, occorre un tempo di 24 secondi
per effettuare la rotazione completa. Se si desidera una maggiore velocità di
esecuzione basterà ridurre questo tempo, portandolo ad esempio a 80 o 100ms (il tempo si
basa sul conteggio dei cicli di Timer0 e quindi è un multiplo di questo).
Il sorgente è compilabile per PIC10F200/202/204/206/220/222: una selezione
automatica consente di adeguare l'inizializzazione del chip a seconda del
modello (204/206 hanno un comparatore integrato, mentre 220/22 hanno il modulo
ADC, che vanno esclusi per utilizzare le pure funzioni di I/O digitale dei
pin).
Il programma utilizza il set base di istruzioni ed è quindi portabile
su qualsiasi altro PIC semplicemente adeguando la parte iniziale.
Funzionamento.
Una volta programmato il microcontroller e collegato il servo, all'arrivo
dell' alimentazione, sarà prodotto un impulso da 1.5ms. L'attuatore si dovrà
portare a centro corsa.
Premendo il tasto down la durata dell' impulso scenderà a passi di 10us
una volta ogni 240ms verso il limite minimo di 0.75ms. L'attuatore ruoterà
verso sinistra.
Premendo il tasto up, la durata dell' impulso salirà a passi di 10us una
volta ogni 240ms verso il limite massimo di 2.25ms. L'attuatore ruoterà verso
destra.
Premendo contemporaneamente i tasti, si otterrà un impulso da 1.5ms che
riporterà al cento l'attuatore.
Dato che l'escursione supera il tratto 1-2ms nominali, sarà possibile
verificare anche se il servo sotto test agisce in questo range o richiede
tempi maggiori o minori.
Qui
un breve filmato della traccia oscilloscopica del segnale di comando
del servo. SI nota la variazione a passi di 10us ciascuno tra il minimo e il
massimo dovuta alla pressione continua sui pulsanti e l'effetto di
posizionamento al centro dovuto alla pressione dei due pulsanti
contemporaneamente.
Non è stato previsto un circuito stampato, ma, vista l'estrema semplicità
del circuito, la sua realizzazione non è certo un problema. Si potrà usare
anche un cablaggio su una millefori, dato che non ci sono elementi critici.
Qui potete scaricare il programma Assembly come sorgente e come eseguibile
compilato per 10F204/206.
|