Progetti - PIC

 

Tester per servo RC


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.


 

 

Copyright © afg. Tutti i diritti riservati.
Aggiornato il 29/09/15.