-->
Controllo servocomando con pulsanti
 

Introduzione:

I servomotori o servocomandi sono dei dispositivi che permettono uno spostamento angolare del loro asse in un range di circa 180°. Lo spostamento avviene inviando un impulso PWM sull’ingresso di controllo, con periodo alto che può assumere un valore compreso tra 800us e 2200us (questo valore può variare a seconda dei modelli dei servo).

Inviando un impulso con durata di 1,5ms il servo si porta al centro dell'intervallo di rotazione; aumentando la durata dell’impulso fino a 2ms il servo compie uno spostamento di 45° verso destra, invece se scendiamo fino a 1ms il servo si sposta di 45° verso sinistra.

L’immagine descrive meglio il funzionamento:

Tra un impulso e un altro, deve trascorrere un tempo di almeno 10ms e non più di 40ms, altrimenti nel primo caso la logica interna del servo potrebbe non accorgersi del cambio di stato del segnale e nel secondo caso la forza di torsione tende ad annullarsi. Per un uso ottimale è consigliato utilizzare un tempo di 20ms tra un impulso e l’altro.

Descrizione:

Per la gestione si utilizza il micro 16F84 (intercambiabile con qualsiasi altro micro), il quale provvede a fornire il treno di impulsi ai due servocomandi, con possibilità di regolare la loro posizione agendo su quattro pulsanti.

Lo schema è molto semplice da realizzare, bastano quattro pulsanti, qualche resistenza, condensatori, quarzo e il micro. Gli ingressi della PORTA sono utilizzati per i pulsanti, con relativa resistenza di pull down; i servo invece sono pilotati dalla PORTB, più precisamente da RB0 e RB1; il quarzo utilizzato è da 4Mhz.

Software:

Le istruzioni di cui si compone il programma "da dare in pasto al pic" è il seguente:

int k, x, j;

 

#define servo1 portb.f0

#define servo2 portb.f1

#define tastoUp1 porta.f0

#define tastoDown1 porta.f1

#define tastoUp2 porta.f2

#define tastoDown2 porta.f3

 

void main(void){

k = 50;

j = 50;

 

trisa = 0xFF;

trisb = 0x00;

 

while(1){

 

//pilota servo 1

servo1 = 1;

delay_us(700);

  for(x=0;x<=k;x++){

  }

servo1 = 0;

 

//pilota servo 2

servo2 = 1;

delay_us(700);

  for(x=0;x<=j;x++){

  }

servo2 = 0;

 

//incrementa servo 1

if (tastoUp1)

    j++;

//decrementa servo 1

if (tastoDown1)

    j--;

   

//incrementa servo 2

if (tastoUp2)

    k++;

//decrementa servo 2

if (tastoDown2)

    k--;

   

if (k>100)

    k=100;

 

if (k<0)

    k=0;

 

if (j>100)

    j=100;

 

if (j<0)

    j=0;

   

   

delay_ms(15);

 

}}

Per prima cosa definiamo le variabili k, x e j come interi “int”; poi con la funzione #define attribuiamo gli ingressi e/o uscite delle porte a nomi che permettono di rendere più semplice la scrittura/lettura del listato.

Nel main, assegniamo alle variabili k e j il valore 50, poi definiamo PORTA come ingresso “TRISA = 0XFF” e PORTB come uscita “TRISB = 0x00”. Il programma vero e proprio è racchiuso nel ciclo while, infatti qui avviene la gestione dei motori e dei pulsanti.

Le prime due istruzioni:

 

//pilota servo 1

servo1 = 1;

delay_us(700);

  for(x=0;x<=k;x++){

  }

servo1 = 0;

 

//pilota servo 2

servo2 = 1;

delay_us(700);

  for(x=0;x<=j;x++){

  }

servo2 = 0;

 

Permettono di pilotare i servo connessi alle porte RB0 e RB1; l’istruzione “servo1”, nel #define è attribuita alla porta RB0 “come gia detto questo sistema ci permette di scrivere e leggere il listato in modo più semplice, perché attribuiamo variabili e/ingressi a parole che identificano meglio la funzione”.

L’istruzione “delay_us(700)” messa a disposizione dalle librerie di mikroc, attende un periodo di 700us, successivamente il ciclo for, aggiunge un ulteriore ritardo definito dalla variabile k; infine con l’istruzione “servo1 = 0” disabilitiamo l’uscita RB0.

Incrementando o decrementando il valore delle variabili k e j per cui è possibile aumentare o diminuire il tempo in cui l’uscita si trova a livello logico alto; esse vengono incrementate o decrementate agendo su i pulsanti collegati sulla PORTA del micro, il blocco di codice che si occupa di ciò è:

 

//incrementa servo 1

if (tastoUp1)

    j++;

//decrementa servo 1

if (tastoDown1)

    j--;

   

//incrementa servo 2

if (tastoUp2)

    k++;

//decrementa servo 2

if (tastoDown2)

    k--;

 

Nel caso in cui si verificano uno degli eventi contenuti nelle parentesi, si esegue l’istruzione che segue, ovvero se si pigia il tasto posto su RA1, si esegue l’istruzione j++, che permette di incrementare la variabile j.

L’ultimo blocco di istruzioni:

 

if (k>100)

    k=100;

 

if (k<0)

    k=0;

 

if (j>100)

    j=100;

 

if (j<0)

    j=0;

   

   

delay_ms(15);

 

Permette di "contenere" i valori delle variabili all’interno di un range stabilito (nel nostro caso 0-100), perché come detto nell’introduzione, il segnale per il servo può assumere un valore compreso tra 800 e 2200us.

Infine l’istruzione delay, inserisce una pausa di 15ms prima di generare un nuovo impulso per i servo.

 

Conclusioni:

Una possibile applicazione di tale circuito potrebbe essere un “test per servocomandi”, per verificare il loro corretto funzionamento; è possibile anche aumentare le uscite per gestire più servo contemporaneamente.

File Hex da caricare all'interno del micro.

By Vasile Egidio

Redatto da Vasile Egidio il giorno 17 aprile 2011 - Photos and videos by Samsung Galaxy S

 

Commenti: 4

 

- Nunzio:

 

salve,
sono interessato al suo controllo per servo ma siccome non sono molto esperto con i pic mi chiedevo se mi poteva spiegare come convertire il programma in HEX o almeno in che linguaggio lo ha scritto.
Grazie.
Nunzio

  - Egidio

 

Salve sig. Nunzio,
grazie per aver visitato la mia pagina.
il codice è stato scritto in C utilizzando il compilatore mikroc versione 8.2, scaricabile in versione di prova dal sito:

http://www.mikroe.com/eng/products/view/7/mikroc-pro-for-pic/

per convertire il programma in Hex, basta copiare il codice all'interno del compilatore e procedere con la compilazione utilizzando il pulsante con il simbolo di un ingranaggio (build).
saluti
Egidio

- Nunzio:

 

Gentile Egidio Vasile,
inanzitutto la ringrazio per aver preso in considerazione la mia domanda.
Se non è di troppo disturbo vorrei chiederle alcune informazioni diciamo tecniche a riguardo.
Ho provato a fare lo schema ma ho un problema, praticamente programmando il pic e inserendolo on board il servo motore appena lo alimento inizia a fare dei scatti senza premere nessun pulsante a intervalli di circa mezzo secondo, se tento a premere i pulsanti non accade nulla.
Non è che saprebbe dirmi dove sbaglio ?
Le ripeto che sono inesperto con i pic ma in elettronica diciamo che qualche schemino lo so fare.
La ringrazio anticipatamente per uan futura risposta e la saluto.
Nunzio.

  - Egidio

 

il problema descritto potrebbe dipendere dal pic che tende a resettarsi, i servo che utilizza assorbono molta corrente?
può provare a separare le due alimentazioni, ovvero l'alimentazione del micro dall'alimentazione dei servo.
mi faccia sapere se risolve in questo modo.

saluti
Egidio


 

 

 


Scrivi un commento:

Il contenuto di questa pagina richiede una nuova versione di Adobe Flash Player.

Scarica Adobe Flash Player

 

Vasile Egidio © 2010-2011 - Tutti i diritti riservati - Vietata la riproduzione, anche parziale del sito 
VASILE ELETTRONICA - CONTROLLO SERVOCOMANDO CON PULSANTI