Pages Menu
TwitterFacebook



BANNER1_ALT

Posted by on Abr 25, 2014 in Comunicación | 20 comments

módulos de comunicación NRF24L01

módulos de comunicación NRF24L01

NRF_0

módulos de comunicación rf ( NRF24L01)

DESCRIPCIÓN

 Este tutorial consiste en el uso de los módulos de comunicación RF (radio frecuencia) NRF24L01+ (2 pzas). Estos módulos serán conectados cada uno a un Arduino Uno para mandar un string de un máximo 10 caracteres incluyendo /r y /n, mediante el monitor serial de su respectivo COM. El modo del monitor serial está configurado como retorno de .

MATERIALES

–       Módulo de comunicación inalámbrica NRF24L01 (2 pzas)

–       2  Arduino Uno

–       2 Cables USB serial

CONEXIÓN

NRF_2

 

 NRF_1

 

 

 

INTRODUCCIÓN

MÓDULO DE COMUNICACIÓN INALÁMBRICA NRF24L01

DESCRIPCIÓN

 

El nRF24L01 es un circuito altamente integrado, de ultra bajo consumo (ULP), transceptor de RF de 2Mbps para la banda ISM de 2,4 GHz (Industrial, Scientific and Medical). Con corrientes inferiores a 14 mA, administración avanzada de energía, y una gama de alimentación de 1,9 a 3,6 V, el nRF24L01 ofrece una solución que permite una duración verdadera de meses a años de duración de la batería cuando se ejecuta con pilas de botón o AA / AAA.

El nRF24L01 integra un transceptor RF de 2,4 GHz que soporta una interfaz SPI de alta velocidad para el controlador de la aplicación. No se requieren filtros externos, resonadores, o diodos VCO.

Caracteristicas del modulo NRF24L01+

·         2,4 GHz GFSK RF transceptor IC

·         Operación en la banda ISM de 2,4 GHz sin licencia en todo el mundo

·         1 Mbps y 2 Mbps de velocidad de datos en el aire

·         Enhanced ShockBurst ™ protocolo hardware acelerador

·         Bajo consumo de energía – meses o años de vida de la batería

·         Compatible con todas las Series nRF24L Nordic en 1 y el modo 2 Mbps

·         Compatible con nRF24E Nordic y nRF240 Series en el modo de 1Mbps

PROGRAMA EN C PARA AMBOS ARDUINOS UNO

// Emisor/Receptor Wireless nRF24L01+

#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>

char cadena[10]; //Cadena de caracteres para enviar
String inputstring = ""; //Cadena recibida desde el PC
boolean input_stringcomplete = false; //Cadena recibida completamente desde el PC

void setup()
{

 Mirf.spi = &MirfHardwareSpi; //Inicializa controlador de SPI
 Mirf.init(); //Inicializa PINES del SPI
 Mirf.payload = 1; //Define el payload, cantidad de bytes que enviara el NRF
 Mirf.channel = 90; //Seleccion de canal
 Mirf.config();
 Mirf.configRegister(RF_SETUP,0x06); // 1MHz

 Mirf.setTADDR((byte *)"TX_01"); // Seleccion de Direccion
 Serial.begin(57600); //Inicializa Serial a 57600 baudios
 Serial.println("Iniciando ...");

}

// ENVIO DE CADENA
void transmit(const char *string)
{
 byte c;
 for( int i=0 ; cadena[i]!=0x00 ; i++ ){
 c = cadena[i];
 Mirf.send(&c);
 while( Mirf.isSending() ) ;
 }

}
// ENVIO DE CR/LF
void transmitlf(void)
{
 byte c;
 c = '\r';
 Mirf.send(&c);
 while( Mirf.isSending() ) ;

 c = '\n';
 Mirf.send(&c);
 while( Mirf.isSending() ) ;
}

//Recepcion de caracteres desde serial
void serialEvent() {
 char inchar = (char)Serial.read();
 // Concatena caracter ingresado
 inputstring += inchar;
 // Fin de la cadena, recibido <CR>
 if(inchar == '\r') {input_stringcomplete = true;}
} 

void loop()
{
// Condicion para enviar datos
 if (input_stringcomplete) {
 inputstring.toCharArray(cadena, 10); //Conversion de String a arreglo de caracteres
 transmit(cadena); //Transmite cadena ingresada
 transmitlf(); //Transmite CR/LF 

 Serial.println("YO: ");
 Serial.println(inputstring);
 input_stringcomplete = false;
 inputstring = "";
 }

 byte c;
 int ascii;
//Condicion de Recepcion de datos
 if( Mirf.dataReady() )
 {
 Mirf.getData(&c); //Funcion de libreria MIRF que recibe Byte
 ascii=c; //
 char caracter= (char)ascii; //Casting de char para convertir de int a char
 Serial.print(caracter);
 }

}

DETALLES DE PROGRAMA

Incluye SPI.h la cual controla todo lo relacionado con este protocolo.

Incluye Mirf.h la cual declara las funciones que controlaran al módulo.

Incluye nRF24L01.h contiene las definiciones de comandos en Hexadecimal.

Incluye MirfHardwareSpiDriver.h, esta librería funciona para comunicarse con el NRF24L01 mediante SPI.


#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>

El siguiente segmento de  código es para inicializar el módulo NRF24L01, al lado derecho de cada línea de código hay un comentario explicando lo que hace.

void setup()
{
  Mirf.spi = &MirfHardwareSpi; //Inicializa controlador de SPI
  Mirf.init(); // Llamda a función que inicializa PINES del SPI
  Mirf.payload = 1; //Define el payload, cantidad de bytes que enviara el NRF
  Mirf.channel = 90; // Función que hace la selección del canal por el cual se transmite
  Mirf.config(); //Inicializa los registros en el módulo y enciende el módulo en modo recovery
  Mirf.configRegister(RF_SETUP,0x06); // Asigna reloj a un solo byte al registro RF_SETUP
  Mirf.setTADDR((byte *)"TX_01");  // Selección de Dirección
  Serial.begin(57600);   //Inicializa Serial a 57600 baudios
  Serial.println("Iniciando ...");

Esta function transmit() se dedica a enviar lo ingresado desde consola de character en character, cabe mencionar que se debe enviar en formato byte (uint8_t)


void transmit(const char *string)
{
   byte c;
      for( int i=0 ; cadena[i]!=0x00 ; i++ ){
        c = cadena[i];
        Mirf.send(&c);
        while( Mirf.isSending() ) ;
      }

}

 

La función transmitlf() agrega el fin de la cadena (\n) y el carácter de escape para retornar el carro (‘\r’)

void transmitlf(void)
{
  byte c;
  c = '\r';
  Mirf.send(&c);
  while( Mirf.isSending() ) ;
  c = '\n';
  Mirf.send(&c);
  while( Mirf.isSending() ) ;
}

Función dedicada a la recepción de caracteres desde serial

void serialEvent() {
  char inchar = (char)Serial.read();  // Concatena caracter ingresado
  inputstring += inchar;  // Fin de la cadena, recibido <CR>
  if(inchar == '\r') {input_stringcomplete = true;}
}

Monitor_NRF (2)

Figura. Como se observa en la figura superior se están enviando las cadenas de caracteres entre COM52 y COM53

SONY DSC

Figura. Ejemplo de chat.

SONY DSC

Figura. Conexion de Modulos NRF24l01.

Este tutorial es propiedad de HeTPro. Queda expresamente prohibida la reproducción total o parcial por cualquier medio o soporte de los contenidos de esta publicación sin la autorización expresa del editor, cualquier duda, sugerencia o permiso para redistribuir el material favor de mandar un correo a contacto@hetpro.com.mx

Si la redistribución de este material es para fines educativos, difusión tecnológica o cualquier otro fin sin lucro, HeTPro está de acuerdo en que el material sea distribuido sin la necesidad de requerir el permiso del autor.

Para descargar la librería MIRF ingresa a: http://playground.arduino.cc/InterfacingWithHardware/Nrf24L01

Para más ejemplos y tutoriales:

http://arduino-info.wikispaces.com/Nrf24L01-2.4GHz-HowTo

20 Comments

  1. Quiero controlar un brazo robot, inalambricamente ademas de mandar los datos de algún sensor también, pero con un PIC de Microchip, ¿Podrían subir un ejemplo básico? Preferentemente con el PIC18F4550? se los agradeceria muchisimo

    • Mario, puedes mandar un correo a ruben.estrada@hetpro.com.mx me parece que el tiene un código con este módulo para un dsPIC (que en teoría debe de ser muy similar a un PIC18). Igual vemos si podemos subir un tutorial de ese que te platico.

    • Hola que tal, estaremos trabajando en ejemplos con PIC, pero quizas este año aun no, saludos.

  2. Hola buenas me interesa comprar 2 de estos dispositivos para un robot por el cual un arduino uno se utilizaría de control y en uno mega se recibirían las lecturas de los botones pulsados para que el robot realice las activaciones correspondientes agradecería que me dijeran como puedo hacer esto y si estas tarjetas me funcionarían de ante mano muchas gracias

    • Hola que tal Emanuel, claro que te funcionan, de echo creo que el tutorial esta muy similar a lo que necesitas hacer, pero igual si tienes las dudas mas especificas nos comentas :).

  3. Me gustaría saber si existe alguna biblioteca o función para poder mandar por COM audio, y poder reproducirlo en la otra computadora. Gracias.

  4. Pues en si mi punto es como mandar una entrada como comando de activación a otro arduino y activar la salida

  5. Estoy tratando de implementar el mismo ejemplo pero con el arduino mega 2560, le agradezco si me puede colaborar en la conexion con el transceptor NRF24L01 ya que es diferente las conexiones eso creo , ya que he intentado pero no se envia los datos… estoy utilizando el mismo codigo como base….Gracias,, espero su ayuda

  6. Hola, muy bueno tu ejemplo de comunicación, solo que al echarlo a andar, corre en horizontal y no se detiene, que puede ser?? gracias

    Nota: Ya le puse retorno de carro automatico

    • A mi me pasa lo mismo, ya comunicaba correctamente pero lo volvi a intentar y solo aparece el letrero de iniciando y despues el cursor avanza hasta el infinito a la derecha. Alguna idea de que pueda ser?

  7. Hola,
    al tratar de compilar me marca error en la línea 15:
    Mirf.spi = &MirfHardwareSpi; //Inicializa controlador de SPI

    El error que me marca es este:
    undefined reference to `MirfHardwareSpi’

    ¿alguna idea o tip de a qué se deba o cómo resolverlo?

    Gracias de antemano, saludos.

      • Sí, todas las librerías que mandan llamar las tengo… incluso traté descargándolas de nuevo y ponerlo todo en una sola área y nada.

  8. Hola,hice un programa en visual lo tengo conectado al serial si se lo quiero mandar a otro arduino para que me ejecute lo que quiero que tengo que hacer? disculpa mi ignorancia soy nuevo en el tema. gracias

    • Alberto, dale una revisada detallada a este tutorial, seguro te sirve, ya si tienes alguna duda concreta me avisas.

  9. hola! necesito una ayuda. tengo tres sensores en distintos lugares y necesito que la información medida por los sensores llegue a una estación principal. La idea es utilizar este tipo de transceptores y pic18 o pic16 mis dudas son:
    *como haría para que lo medido por el sensor lo reciba el transceptor y luego este lo envíe al pic.

    muchas gracias!!!!!

    • Raul, que tal, la pregunta me parece valida pero esta muy abierta, te recomiendo primero ralizar una comunicación sencilla entre el PIC y el NRF para ir de ahí avanzando poco a poco.

  10. Hola, he estado trabajando con la librería Mirf, pero no encuentro algún lugar donde me mencionen todas sus funciones y como programar mi módulo. Necesito saber como le ajusto la potencia a mi transmisor… Gracias

    • Hola, contamos con un enlace al final del foro de Arduino podria servir de ayuda

Post a Reply

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *