You are on page 1of 11

16/10/2011

BIBLIOMAN

CONEXIN INALMBRICA ENTRE DOS MICROCONTROLADORES

www.aquihayapuntes.com

Conexin inalmbrica entre dos Microcontroladores


Introduccin
En esta ocasin vamos a ver que establecer una comunicacin inalmbrica entre dos (o ms) Microcontroladores no es una tarea ni mucho menos difcil. El hardware que vamos a utilizar en esta Demo se compone de los siguientes elementos: dos transceptores basados en el integrado nRF24L01 de la empresa Nordic Semiconductor, dos Microcontroladores PIC de la familia PIC16FXXX y una fuente de alimentacin con salidas de 5 y 3,3V.

Caractersticas transceptores nRF24L01

Rango de radiofrecuencia en la cual trabaja (2.4 2.5 GHz), antena integrada en la placa. Comunicacin SPI. (Max. Velocidad 8Mhz). 128 canales de transmisin seleccionables por el bus SPI. Implementacin capas OSI por hardware. Tensin de alimentacin (1.9 a 3.6 V). Mxima velocidad de transferencia en radiofrecuencia 2Mbps. Pines de entrada con tolerancia a 5V (Niveles TTL).

Descripcin de la demo
El ejemplo consiste en transmitir va radio el estado del puerto D de un PIC (16F877) que hace las funciones de PIC transmisor, dicho puerto ser configurado como entrada y en sus pines conectaremos unos micro-interruptores para poder variar manualmente el valor de la entrada, el estado del puerto ser ledo cada segundo y su valor ser enviado al mdulo transceptor conectado a l y configurado como transmisor a travs del puerto SPI, los datos sern recibidos por otro transceptor el cual los enviar al PIC receptor (otro PIC 16F877) que mostrar su valor en el puerto D configurado esta vez

Biblioman

www.AquiHayApuntes.com

Pgina 2

Conexin inalmbrica entre dos Microcontroladores


como salida y conectado a un Array de leds para que se pueda ver visualmente su valor. Esquema conexin transceptores:

Biblioman

www.AquiHayApuntes.com

Pgina 3

Conexin inalmbrica entre dos Microcontroladores

Cdigo fuente: El ejemplo utiliza la librera lib_rf2gh4_10.h desarrollada por la empresa Bizintek Innova, S.L. y utilizada en su proyecto del robot mOway es fcil de utilizar, est bien documentada y adems es Open Source por lo que se puede distribuir y/o modificar bajo los trminos de la licencia GNU.

Biblioman

www.AquiHayApuntes.com

Pgina 4

Conexin inalmbrica entre dos Microcontroladores


Transmisor:

//////////////////////////////////////////////////////////////// // Ejemplo Mdulos transceptores NRF24L01 basado en la // // librera lib_rf2gh4_10.h // // Modulo transmisor // // Autor: Biblioman // // Web: www.aquihayapuntes.com // //////////////////////////////////////////////////////////////// #include <16F877.h> #device ICD=TRUE #FUSES NOWDT #FUSES XT #FUSES PUT #FUSES NOPROTECT #FUSES NODEBUG #FUSES NOBROWNOUT #FUSES NOLVP #FUSES NOCPD #FUSES NOWRT #use delay(clock=4000000) #include "lib_rf2gh4_10.h" //Mapeado de registros #BYTE PORTD=0X08 //Variables auxiliares para el programa principal int8 ret; //Programa principal void main() { //Configurar mdulos SPI del PIC RF_CONFIG_SPI(); //Configurar mdulo RF (canal y direccin) RF_CONFIG(0x40,0x01); //Activacin mdulo RF RF_ON(); //------------------------------------------------------------------------------

Biblioman

www.AquiHayApuntes.com

Pgina 5

Conexin inalmbrica entre dos Microcontroladores


while(true){ Delay_ms(1000); //-------------------------[Rutina de envi de datos]--------------------------//Preparacin de la direccin del receptor y de los datos RF_DIR=0x08; RF_DATA[0]=PORTD; //Envi de los datos ret=RF_SEND(); //sentencias de chequeo if(ret==0){ //Envi realizado y ACK recibido } else if(ret==1){ //Envi realizado y ACK no recibido } else{ //Envi no realizado } //-----------------------------------------------------------------------------} }

Biblioman

www.AquiHayApuntes.com

Pgina 6

Conexin inalmbrica entre dos Microcontroladores


Receptor:

//////////////////////////////////////////////////////////////// // Ejemplo Mdulos transceptores NRF24L01 basado en la // // librera lib_rf2gh4_10.h // // Modulo Receptor // // Autor: Biblioman // //Web: www.aquihayapuntes.com // //////////////////////////////////////////////////////////////// #include <16F877.h> #device ICD=TRUE #FUSES NOWDT #FUSES XT #FUSES PUT #FUSES NOPROTECT #FUSES NODEBUG #FUSES NOBROWNOUT #FUSES NOLVP #FUSES NOCPD #FUSES NOWRT #use delay(clock=4000000) #include "lib_rf2gh4_10.h" //Mapeo de registros #BYTE PORTD=0x08 //Variables auxiliares para el programa principal int8 ret; //--------------[Rutina de recepcin con interrupcin]-------------------------//Interrupcin del mdulo RF #int_ext void int_externo() { //Recepcion de los datos ret = RF_RECEIVE(); if (ret == 0) //recepcin nica { //tratar datos PORTD=RF_DATA[0];

Biblioman

www.AquiHayApuntes.com

Pgina 7

Conexin inalmbrica entre dos Microcontroladores


} } //Programa principal void main() { //Configuracin Puerto D set_tris_d (0x00); PORTD=0; //-----------[Rutina de configuracin y activacin con interrupcin]-----------//Habilitar interrupciones RF_INT_EN(); //Configurar mdulos SPI del PIC RF_CONFIG_SPI(); //Configurar mdulo RF (canal y direccin) RF_CONFIG(0x40,0x08); //Activar el mdulo RF RF_ON(); //-----------------------------------------------------------------------------//Bucle infinito. Espera hasta que se produce la interrupcin while(true); } Comentario: Con respecto al circuito hay que tener muy en cuenta que aunque los pines de entrada de los transceptores son tolerantes a 5V su alimentacin es de 3.3 V. Con respecto al software, lo que hace cada funcin est bastante bien explicado en la documentacin que se adjunta con la librera. La comunicacin entre el PIC y los mdulos transceptores se hace a travs del protocolo SPI por lo que el PIC que elijamos debe disponer de un puerto SPI dentro de sus recursos Hardware, hay un hilo en el foro con un ejemplo que trata sobre la comunicacin SPI entre varios microcontroladores, podis acceder a l desde aqu.

Biblioman

www.AquiHayApuntes.com

Pgina 8

Conexin inalmbrica entre dos Microcontroladores


Con respecto a la comunicacin de radiofrecuencia los transceptores disponen de 128 canales trabajando en el margen de frecuencia de 2.4 a 2.5GHz. Para participar en una misma comunicacin los dispositivos deben de tener asignado el mismo canal y la direccin de cada dispositivo debe de ser nica dentro del mismo. En el ejemplo se utiliza el canal 40, al transmisor se le asigna la direccin 0x01 y al receptor la 0x08. Cada vez que queramos enviar un dato hay que asignarle a la variable RF_DIR la direccin del dispositivo al que queremos enviarle los datos, los datos a enviar o recibir se guardan en el array RF_DATA[8] de 8 bytes, en el ejemplo solo se utilizar un byte para guardar el estado del puerto D por lo que solo utilizaremos el primer elemento del Array (RF_DATA[0]). El nRF24L01 dispone de un pin de interrupcin activo a nivel bajo que podemos utilizar para comprobar la recepcin de datos, para ello utilizaremos en el PIC la interrupcin externa por RB0 previamente hay que incluir en la funcin principal del receptor la llamada a la funcin RF_INT_EN() que se encarga de configurar los registros de interrupcin. Una vez recibido un dato (1 byte) o una trama formada por varios Bytes (max. 8) la funcin RF_RECEIVE() se encargar de guardar los datos en el array RF_DATA luego solo nos queda tratar esos datos, en el caso del ejemplo le asignamos el valor de esa variable al puerto D configurado previamente como salida y que tiene conectado en sus pines un array de leds para ver visualmente su valor. Otra cosa muy til y que se me olvidaba comentar es que la funcin de envo de datos RF_SEND() admite ACK para el control de los datos enviados, con ello podemos saber si no nos funcionan los mdulos si el problema lo tenemos en el transmisor o en el receptor. La funcin RF_SEND() devuelve tres valores distintos en funcin de cmo se ha realizado el envo: Un 0 si el envo se ha realizado correctamente y se ha recibido el ACK. Un 1 si los datos se han enviado pero no se ha recibido el ACK. Un 2 si se ha producido algn error y no se ha podido realizar el envo.

De igual forma la funcin RF_RECEIVE() tambin devuelve tres valores: Un 0 si solo se ha recibido un byte y no hay ms datos en la pila de recepcin. Un 1 si se ha recibido una trama de datos. En este caso se debe de crear un bucle que llame a la funcin RF_RECEIVE() mientras queden datos en la pila de recepcin. Un 2 si los datos no se han recibido correctamente.

En el caso de nuestro ejemplo si se reciben datos sern solo de un byte por tanto solo se chequea la primera opcin. La librera tambin permite la recepcin de datos sin el uso de interrupciones la explicacin de cmo hacerlo viene incluida tambin en la documentacin de la librera, as como las precauciones que hay que tener para evitar interferencias entre canales.

Biblioman

www.AquiHayApuntes.com

Pgina 9

Conexin inalmbrica entre dos Microcontroladores


Para preguntar dudas, hacer comentarios, o sugerir mejoras. Lo podis hacer en el hilo del foro Comunicacin va radio entre dos PICs Aqu tenis un vdeo de la Demo funcionando.

http://www.youtube.com/watch?v=WwU7jFgxn6I

Descargas
Podis descargar la librera lib_rf2gh4_10.h + Manual librera + ejemplos + versin del artculo en .pdf desde aqu. Fuentes de informacin http://www.moway-robot.com/index.php http://blog.diyembedded.com/ http://www.ccsinfo.com/

Marcas registradas Las marcas citadas en este artculo as como algunas de las imgenes procedentes de capturas de pantallas pertenecen a sus respectivos propietarios, su utilizacin en este artculo es con fines educativos y sin nimo de lucro.

Biblioman

www.AquiHayApuntes.com

Pgina 10

Conexin inalmbrica entre dos Microcontroladores


Copyrigh 2011 AquiHayApuntes.com Autor de este artculo: Biblioman Versin: 1.01 Pgina Web: http:\\www.aquihayapuntes.com Email: email.Biblioman@gmail.com Puedes copiar y distribuir libremente este artculo haciendo referencia al contenido de este prrafo.

Biblioman

www.AquiHayApuntes.com

Pgina 11

You might also like