Controllare un servocomando a distanza con i moduli RF della Aurel

Vediamo in questo articolo controllare un servocomando a distanza mediante una coppia di moduli Aurel e due picmicro programmati con MikroC. Il sistema è formato da un circuito trasmettitore e un circuito ricevitore. Per entrambi ho utilizzato un picmicro differente e precisamente il PIC16F628 per il trasmettitore e il PIC16F876 per il ricevitore (la scelta è casuale, sono quelli che aveva il mio negoziante). Per la parte RF ho utilizzato una coppia di moduli Aurel economici ma efficienti.

I moduli RF utilizzati lavorano sulla frequenza degli 868.3MHz e hanno un’antenna integrata. Ho utilizzato un TX-8L25IA (modulo trasmittente) e un RX-AM8SF (modulo ricevente). Per quanto riguarda il funzionamento dei servocomandi vi rimando a questo articolo.

Il servo viene controllato in remoto mediante due pulsanti posti sul trasmettitore. Il firmware non prevede lo spostamento “continuo” dei servi ma unicamente il posizionamento tutto a destra o tutto sinistra. Una volta rilasciato il pulsante sul trasmettitore, il servo ritorna al centro.

Schema Trasmettitore

Il modulo Aurel TX-8L25IA è un trasmettitore SAW con antenna dedicata che ha una potenza di irradiazione di 25mW. La frequenza di trasmissione è di 868.3MHz. Ho scelto questo modulo e non quelli di 430MHz perchè ho pensato che fosse un po più immune ai disturbi. Il picmicro funziona a 5V, mentre il modulo a 3V per questa ragione viene utilizzato un partitore resistivo, costituito da R1-R2 che abbassa a 3V il segnale di 5V proveniente dalla linea di trasmissione del PIC.

Per il calcolo delle resistenze ho usato la seguente formula:

Per quanto riguarda l’alimentazione del modulo Aurel avrei voluto utilizzare un MCP1702-3002, un regolatore nella versione a 3V, ma non avendolo trovato dal mio negoziante ho dovuto ripiegare sul famosissimo LM317:

Con la seguente formula ho calcolato la resistenza R2 per ottenere una tensione di 3V:

Non essendoci in commercio una resistenza da 300Ω ho optato per due da 150 collegate in serie. E’ importante dire anche che la tensione in ingresso deve essere almeno di 3V superiore a quella di uscita.

Il picmicro è collegato al modulo trasmittente tramite il pin RB2 che è abilitato alla trasmissione dei dati tramite periferica USART. I due led servono solo a indicare che si sta andando in trasmissione.

Schema Ricevitore

Lo schema del ricevitore è molto piu’ semplice in quanto tutti i componenti sono alimentati a 5V. Il picmicro è collegato al modulo tramite il pin RC7 che è abilitato alla ricezione dei dati tramite periferica USART.

Con il pin 11 del modulo Aurel si seleziona il livello di sensibilità:

  • Livello logico 0: -109dBm
  • Livello logico 1: -90dBm

Veloce panoramica sull’ utilizzo della periferica USART con MikroC

Per fare comunicare il circuito trasmettitore con il ricevitore ho utilizzato la periferica USART (Syncronous Asyncronous Receveir Transmitter). Si tratta di una periferica hardware in grado di trasmettere e ricevere informazioni ad una velocità espressa in bit per secondo (bps), meglio nota come Baudrate.

La periferica può essere configurata in tre modi differenti:

  • modalità asincrona
  • modalità sincrona master
  • modalità sincrona slave

Per il nostro progetto andremo a utilizzare la modalità asincrona. La periferica è in grado di trasmettere e ricevere dati attraverso due pin che per il PIC16f876 sono RC7/RX e RC6/TX mentre per il PIC16f628 sono RB2/TX e RB1/RX.

I dati gestiti da questa periferica sono formati da un bit di START, otto bit di dati e un bit di STOP. Lato software ho usato il compilatore MikroC PRO il quale ci mette a disposizione delle librerie che semplificano molto il lavoro.

Per il loro uso bisogna selezionarle attraverso lo strumento Library Manager. Una volta aperta la finestra bisogna mettere una una spunta su UART.

UART e non USART perchè queste funzioni integrate supportano unicamente la comunicazione asincrona.

Analizzeremo adesso unicamente le funzioni che ho utilizzato per il progetto:

void UART1_Init(unsigned long baud_rate);

Questa funzione inizializza la periferica UART con la velocità di trasmissione desiderata. ES: UART1_Init(1000); In questo caso la periferica è stata inizializzata con una velocità di 1000 bps.

char UART1_Tx_Idle();

Restituisce 1 se ci sono dati pronti per la scrittura, 0 se non ce ne sono. Questa funzione serve per verificare se il buffer di trasmissione è vuoto o no.

void UART1_Write(char_data);

Questa funzione trasmette un byte attraverso il modulo UART.

char UART1_Data_Ready();

Questa funzione serve per verificare se ci sono dati per la lettura. Restituisce 1 se i dati sono pronti per la lettura 0 se non ci sono dati.

char UART1_Read();

Restituisce il byte ricevuto.

Flow Charts

Ho organizzato il lavoro mediante diagrammi di flusso. Di seguito sono illustrati i flow charts del trasmettitore e del ricevitore:

Flow Chart Trasmettitore

Flow Chart Ricevitore

Il codice è molto semplice e, come dicevo, non prevede un movimento continuo del servo su tutta la scala ma unicamente tutto a destra o tutto a sinistra mediante 2 semplici funzioni, più una terza che posiziona il servo al centro:

void destra (void)
 {
 RB1_bit=1;
 delay_us(1000);
 RB1_bit=0 ;
 delay_us(19000);
 }
 
void sinistra (void)
 {
 RB1_bit=1;
 delay_us(2000);
 RB1_bit=0 ;
 delay_us(18000);
 }
void centro(void)
  {
 RB1_bit=1;
 delay_us(1500);
 RB1_bit=0 ;
 delay_us(18500);
 }

Come vedete per utilizzo i valori di 1mS per l’estremo destro e 2mS per l’estremo sinistro, che prevedono un posizionamento a 45° rispetto al centro. Molti servi, però, permettono un posizionamento fino a 90° (0.5mS e 2.5/2.4 mS). Nel codice del ricevitore, all’avvio ho fatto in modo che il servo inizialmente si posizioni al centro, questa è una mia scelta personale in quanto questo progetto fa parte di uno più grande. Tra la ricezione di un comando e il successivo ho impostato un ritardo di 30ms,  necessario in quanto il servo raggiunge la posizione desiderata in un determinato tempo. Se non ci fosse tale ritardo il servo oscillerebbe tra la posizione centrale e quella che si intende raggiungere (destra o sinistra) continuamente senza mai raggiungerla. Ricordo di fatti che per l’utilizzo che serve a me, il servo deve ritornare al centro dopo aver rilasciato i pulsanti.

Ho personalmente provato i circuiti montati entrambi su breadboard agli antipodi di casa mia (una casa di circa 100m²)tenendo conto dei vari divisori e che per antenna c’era un pezzo di cavo, il tutto ha funzionato egregiamente. Se ci si fa un circuito stampato rispettando le specifiche del costruttore Aurel le cose andranno anche meglio.

Downloads

Il file zip comprende gli schemi elettrici in formato FidocadJ e i sorgenti del trasmettitore e ricevitore per MikroC.

Controllare un servocomando via RF by Massimo Peino (312 download)



Questo articolo ti è stato utile? Ti ha permesso di risolvere un problema o di migliorare le tue applicazioni? Ci lavori? Ti ha permesso di scrivere la tua tesina? Ti ha semplicemente fatto spendere un po' del tuo tempo in maniera costruttiva? Allora clicca il banner qui sotto:


Settorezero.com è un blog personale di Giovanni Bernardo aperto dal 25 Ottobre 2007. Non è una testata giornalistica né un sito a carattere commerciale.
Settorezero.com, il logo Zroid™ e la tagline "Play embedded electronics™" sono copyright ©2007÷2019 Giovanni Bernardo.
La navigazione su settorezero.com e la fruizione dei contenuti ivi presenti sono soggette ai seguenti Termini di utilizzo - Informativa sulla privacy - Utilizzo dei Cookie.
Il tema di questo sito è basato sul tema Fusion per wordpress, realizzato originariamente da digitalnature e fa uso del plugin Wassup per il computo delle statistiche.
Per poter contattare il gestore del sito potete utilizzare la sezione contatti o inviare una email a gianni[at]settorezero[dot]com.
Per seguire gli aggiornamenti del blog Settorezero, oltre al feed RSS, puoi anche seguire la pagina Facebook o iscriverti al canale Telegram.
Su Twitter, invece, pubblico un po' di tutto e, quando mi va, uso anche Tumblr - Google+ - Blogspot - Youtube.