Indice |
Introduzione
E' necessario innanzitutto fare una breve introduzione sul servocomando o servo.
Sono dei dispositivi usati soprattutto nel modellismo.
Dal corpo del servo esce un perno zigrinato su cui si applica la cosidetta "squadretta" che altro non è che una piccola staffa
Il perno puo' ruotare di 90° (45°- 0°- 45°)anche se la maggior parte arriva a 180° (90°- 0°- 90°).
Descrizione del servo dal punto di vista elettronico
Da un servocomando escono tre fili. Due fili per l'alimentazione che generalmente sono di colore nero o marrone per il negativo e rosso per il positivo.
L'alimentazione è compresa tra 4.8 V e 6.0 V. Di solito è così, ma è meglio dare un'occhiata alle caratteristiche fornite dal costruttore.
Con questa premessa entriamo nel vivo dell'argomento.
Il segnale di comando è un'onda quadra che deve essere ripetutamente inviata in quanto, se questo non avviene, il perno del servo girerà in maniera libera, a seconda, naturalmente, dell'attrito che vi è negli ingranaggi, nonostante sia presente l'alimentazione.
Il periodo in linea di massima deve avere una durata di 20ms, mentre l'impulso positivo deve avere una durata compresa tra 0.5ms e 2.5ms per i servi che ruotano di 180°. Anche questa volta, sarà bene dare un'occhiata alle specifiche tecniche del costruttore.
Il servo che ho utilizzato (quello della foto) a 180° vibra e va sotto sforzo.
Quindi nel suo utilizzo non andrò oltre i 90° (45° - 0° -45°).
A seconda della durata dell'impulso, il perno del servo girerà di un certo numero di gradi.
Con il grafico sottostante cerco di chiarire i concetti sopra menzionati.
Se il segnale di comando sarà un'onda quadra positiva della durata di 1,5 ms, il perno del servo si posizionerà al centro. Se sarà di 1 ms o 2 ms, si posizionerà rispettivamente a destra o a sinistra, a seconda, naturalmente, di come guardiamo il servo.
Schema del circuito
Come potete notare, lo schema è molto semplice. Io ho utilizzato il Pic16f628.
Ho collegato alla porta B (RB1- RB2)due pulsanti normalmente aperti. Le due resistenze di pull-down poste tra i pulsanti e massa servono per fissare a livello basso i rispettivi piedini di I/O quando i pulsanti non sono premuti.
Utilizzerò il pulsante P1 per fare girare il servo a destra e P2 per farlo girare a sinistra (naturalmente dipende da come si guarda il servo).
RB0 invece è collegata al servo e fornisce il segnale di comando.
Per questo circuito, il quarzo utilizzato è di 4 MHz.
Flow chart del programma
Come potete notare, il flow chart è molto semplice e intuitivo. Quindi non ha bisogno di molti commenti.
Dallo schema a blocchi si nota comunque che il servo rimarrà nella posizione di destra o sinistra finchè si tiene premuto un pulsante, dopo di che si posizionerà al centro.
Questo per una mia precisa scelta, in quanto quest'esempio di programmazione fa parte di un proggetto più grande, che spero di pubblicare se sarà terminato con successo.
Dal flow chart si può notare che ci sono due interruzioni che prenderò in esame con lo schema sottostante.
Il software che scaturisce dal questo schema è di vitale importanza per il funzionamento del progetto.
Senza questa tecnica non funziona nulla o comunque funziona male (io ci ho provato).
Come ho potuto studiare dal libro del buon Paolino questa è una tecnica antirimbalzo software che serve per contrastare il fatto che il pulsante non assume in maniera istantanea la posizione chiusa, ma avviene con dei rimbalzi della parte meccanica del componente.
ANALISI DEL FILE SORGENTE
Il compilatore utilzzato è il MikroC PRO.
void destra (void)
{ RB0_bit=1; //pongo l'uscita RB0 a 1 delay_us(1000); //per un tempo di 1000us RB0_bit=0 ; //pongo l'uscita RB0 a 0 delay_us(19000) ; //per un tempo di 19000us }
void sinistra (void)
{ RB0_bit=1; delay_us(2000); RB0_bit=0 ; delay_us(18000) ; }
void centro(void)
{ RB0_bit=1; delay_us(1500); RB0_bit=0 ; delay_us(18500) ; }
Queste sono le tre funzioni che vengono richiamate quando si spinge il pulsante.
I file sorgenti sono molto semplici grazie all'uso della funzione delay_us() fornita dal compilatore MikroC.
Qualcuno mi potrebbe dire che avrebbe utilizzato delle macro menmoniche e delle variabili per una migliore leggibilità e per un più facile riutilizzo del codice per un prossimo futuro. Sono pienamente daccordo con quel qualcuno, ma in questa maniera vengono, secondo me, rafforzati i concetti spiegati prima.
{ ..... while (1) { centro(); while(( RB1_bit=0) ||( RB2_bit=0)) //resta in attesa di quale pulsante è premuto { if(RB1_bit=1){ //se viene premuto P1 chiama la funzione delay_ms(50); if(RB1_bit=1){ destra (); //destra() } } if(RB2_bit=1){ //se viene premuto P2 chiama la funzione delay_ms(50); if(RB2_bit=1){ sinistra(); //sinistra() } } } } }
Download
Da qui si può scaricare il file zippato con il sorgente del programma
Conclusione
Questo è il cuore del programma. Penso che sia abbastanza ben commentato e che non ci sia bisogno di ulteriori spiegazioni.
Siamo così arrivati alla fine e vorrei concludere dicendo che, visto la semplicità dell'articolo, è chiaro che non è diretto ai guru dei pic, ma a coloro che, come me, sono all'inizio e che vogliono spingersi oltre l'accensione del famoso led.