Comunicación inalámbrica entre PICs a 434MHz.

Introducción

Módulo LAIPAC TLP434A

Para algunos de los proyectos de control se hace necesaria la comunicación entre microcontroladores de forma inalámbrica. Esta es una tarea relativamente sencilla si se hace con las herramientas adecuadas, tales como un buen par de radios, un buen compilador de micros, y un mejor algoritmo para el tráfico de la información.
En este proyecto se puede aprender de forma sencilla como establecer una comunicación inalámbrica entre dos microcontroladores, enviando un cuarteto de bits, que posteriormente se puede ver en el micro receptor. La implementación del sistema esta desarrollado con un par de micros PIC16F628A, y dos módulos de radio.

Método

La clave fundamental de este proyecto esta en el medio de transmisión que se utilice. En el comercio se pueden conseguir una gran gama de radios de trasmisión y recepción, con diferentes características como: costo, alcance, formas de modulación, y complejidad en el manejo entre otras.
Para este proyecto trabajaremos con un par de radios muy sencillos de la compañía canadiense LAIPAC que produce diferentes soluciones en el campo de comunicaciones inalámbricas. Se trata de un par de radios de los cuales uno es transmisor y el otro es receptor.

Las referencias son TLP434A y RLP434A, que son el transmisor y el receptor respectivamente. Este juego de radios trabaja una señal portadora de 434MHz y modulan en ASK, de tal manera que pueden transmitir valores lógicos 1 y 0.

La modulación ASK es similar a la modulación AM de la radio comercial de la banda de AM. En la modulación ASK un 0 lógico se representa con la ausencia de la señal portadora y un 1 lógico con la presencia de esta.

Los módulos de radio que se utilizan en este proyecto tienen un alcance de 100 metros si tienen una adecuada instalación de las antenas. La modulación ASK al igual que la modulación AM es supremamente propensa a las interferencias y al ruido. Por esta razón es importante implementar dentro de la programación del PIC una rutina que permita detectar cuando un dato ha llegado con errores para que sea descartado, ya que los módulos de radio no incluyen ningún método de software ni hardware para la detección de estos errores.

Los módulos de radio tienen la capacidad de transmitir a una velocidad de 9600 bits por segundo y de recibir a una velocidad de 4800 bits por segundo pero estos son los casos extremos de los módulos. Para establecer una comunicación más confiable, trabajaremos a una velocidad de 2400 bits por segundo.

La instalación de estos módulos de radio es muy simple, se utiliza dos pines para alimentar el modulo, uno con Vcc y otro con GND, un pin para la antena y otro para la entrada o salida de datos de forma serial.

El modulo transmisor se puede alimentar con una tensión de entre 3V y 12V. La potencia de transmisión será mayor a mayor voltaje. El modulo receptor solo se puede alimentar con 5V.


Implementación

Para establecer la comunicación entre los dos PIC trabajamos con el modulo USART de cada uno de los micros. Esto implica que uno de ellos será el transmisor y el otro el receptor.Estos micros los llamaremos, de aqui en adelante, TX y RX. En el micro TX se evalúan constantemente cuatro pines, en los cuales están instalados sendos pulsadores que son los cuatro bits de información que deseamos transmitir. Esta información es empaquetada y transmitida serialmente por la USART.


Aspecto del módulo RLP434A.

Para evitar los errores en los datos de llegada, es necesario implementar algún método que garantice la veracidad de la información. Para esto existen formas complejas de control de errores pero para este proyecto implementaremos un método muy sencillo conocido como redundancia, el cual consiste en transmitir repetidamente el mismo dato y verificar si el dato que llega en el micro RX es igual, para determinar que el dato no tiene errores.
En el micro RX están instalados cuatro LEDs que permiten ver el dato que llega de manera inalámbrica.

Circuitos

A continuación están los esquemático del proyecto:

Circuito del emisor (TX).


Circuito del receptor (RX).

Software

Este es el código fuente en C de los micros TX y RX. El compilador utilizado es el CCS PICC de Hi-Tech, pero puede ser emigrado a cualquier otro compilador que trabaje en C:

Programa del MICRO TX

#include <pic.h>

void TxSerial( char d_ ) // Función para transmitir un dato de forma serial
{
         TXREG = d_;      
         while( !TRMT );
} 

void InicioSerial( void ) // Función d inicio de la USART
{
         TRISB1 = 1;
         TRISB2 = 0;
         TXSTA = 0x24;
         RCSTA = 0x90;
         BRGH = 1;      // Configuración de la USART a 2400 bits por segundo  
         SPBRG = 103;
}

void main( void ) // Funcion principal
{
        char DATO;
        INTCON = 0;    // Configuración de las interrupciones 
        TRISB = 0xFF; // Se configuran los pines de los leds como salidas
        RBPU = 0; // Se activan las resistencias PULL-UP 
        InicioSerial(); // Función d inicio de la USART
        while(1)
        {
	DATO = (~PORTB>>4)&15; // Se guarda en la variable DATO el valor de los 4  pulsadores
	TxSerial( 170 ); // Se transmite una bandera de inicio con la secuencia de bits: 10101010
	TxSerial( DATO ); // Se transmite el dato de manera redundante. 8 veces
	TxSerial( DATO );
	TxSerial( DATO );
	TxSerial( DATO );
	TxSerial( DATO );
	TxSerial( DATO );
	TxSerial( DATO );
	TxSerial( DATO );
        }
}

 __CONFIG( 0x3F09 );



Programa del MICRO RX
 
#include <pic.h>

// Declaración de variables de trabajo
char n=0;
char Trama[4]={1,2,3,4};
char DATO;

void InicioSerial( void )// Función para la configuración de la USART.
{
         TRISB1 = 1;
         TRISB2 = 0;
         TXSTA = 0x24;
         RCSTA = 0x90;
         BRGH = 1;
         SPBRG = 103;
}

void interrupt VET( void ) // Vector de interrupciones. 
{
     if( RCIF ) //Interrupción serial
     {
	DATO = RCREG; //Lectura del buffer de entrada serial 
	switch( DATO ) // Se evalúa el dato que llega
	{
case 170:  for( n=0; n<4; n++ )Trama[n]=n; n=0; break; // bandera de entrada.
                       // Se guardan los datos de entrada en el búfer de la trama. 
			default :  Trama[n++]=DATO; 
                       // Se evalua cuanda a llega el cuarto byte de la trama.
                           	if( n==4 ) 
			 {
                              // Se comparan los datos 1,2,3 del bufer de la trama 
			      if( Trama[1]==Trama[2] ) 

                                     if( Trama[2]==Trama[3] )//y verifica que sean iguales.  
                                         {
                                         // cuando el dato es correcto se muestra por
                                         // el puerto b en los LEDs
                                    	 PORTB = Trama[1]*16; 
				  for( n=0; n<8; n++ )Trama[n]=n;
                                         }
			      n=4; 
                                }				
         }	
         RCIF=0;
     }
}

void main( void ) // Funcion principal.
{
        INTCON = 0; // Se apagan todas las interrupciones.
        PEIE=1; // Se activan las interrupciones periféricas.
        RCIE=1; RCIF=0; // Se activan las interrupciones por recepción serial.
        GIE = 1; // Se activan las interrupciones de forma general.
        TRISB = 0x0F; // Se configuran los pines b como entrada y salida.
        PORTB = 0; // Se apagan los pines del puerto b
        InicioSerial(); // Se inicializa la USART.
        while(1); // bucle infinito para la espera de interrupciones.
}


__CONFIG( 0x3F09 );