Go Down

Topic: Proyecto usando NRF24L01 (Read 7213 times) previous topic - next topic

Anthony19

Hola a todos.

Quiero hacer un proyecto de comunicación entre 4 dispositivos NRF24L01 2 de ellos conectados a ordenadores diferentes a través de arduino.

La idea es que cada uno de los dispositivos lleve un arduino mega con capacidad para adquirir diversos datos del exterior. Y dependiendo de los valores medidos el arduino mega se comunicara con uno de los arduinos conectados al pc.

http://img99.xooimage.com/files/d/f/a/arduino-proyecto-40d4b19.png

Se que existe la librería nRF24L01.h para facilitar las cosas, pero no he encontrado ningún manual en Español que me ayude a comprender mejor su funcionamiento.

En internet hay muchos casos de gente que no ha podido hacer funcional correctamente las antenas NRF24L01, he leido algún caso exitoso en ingles, pero son pocos y me cuesta entender el funcionamiento de los programas.

Si alguien sabe del tema, estaría muy agradecido ante cualquier ayuda que me pueda permitir empezar a trabajar en el proyecto con esperanzas de "éxito".

Relativo al hadware esta es la información de conexionado de la que dispongo:



Un saludo y gracias de antemano


ebludt

#1
Sep 20, 2013, 12:58 pm Last Edit: Sep 20, 2013, 01:03 pm by ebludt Reason: 1
El NRF24L01 es facil de usar.

Tienes que configurar un receptor y un emisor.

Yo uso la libreria MIRF que es mas facil, desde mi punto de vista claro.


Voy a fusilar un código de http://arduino-info.wikispaces.com/nRF24L01-Mirf-Examples

Este sería el receptor.
Code: [Select]
Code:
#include <Spi.h>
#include <mirf.h>

void setup()
{
 Serial.begin(57600);
 
 Mirf.init();
 
 // Nombre que le vas a dar a ESTE NRF24L01. Si el alguien quiere emitir a ESTE equipo tiene que referirse a este nombre
// seria el equivalente a la ip de un ordenador. 5 bytes maximo.

 Mirf.setRADDR((byte *)"TX_01");
 
 // Payload, en bytes, a transmitir. Si quiere mandar dos datos, dos por por ejemplo, usa 2. 3 para tres... hasta 32
 Mirf.payload = 1;

 // we use channel 90 as it is outside of WLAN bands
 // or channels used by wireless surveillance cameras
// esto lo dejo igual
 Mirf.channel = 90;
 
 // Esto inicia el mirf y borra la lista FIFO
 Mirf.config();  
 
 // Set 1MHz data rate - this increases the range slightly
// esto no lo puse pero mal no puede hacer
 Mirf.configRegister(RF_SETUP,0x06);
}

void loop()
{

 byte c;

 // comprobamos que no hay datos a recibir.
 if( Mirf.dataReady() )
 {
    // lo recibimos y lo almacenamos en C
    Mirf.getData(&c);

   // ... and write it out to the PC
    Serial.print(c);
 }
}



Ahora el emisor

Code: [Select]
#include <Spi.h>
#include <mirf.h>




void setup()
{
 
 // Iniciamos el modo de trasmision
 Mirf.init();
 
 // payload de un byte
 Mirf.payload = 1;
 
 // lo del canal
 Mirf.channel = 90;
// Nombre que le vas a dar a ESTE NRF24L01. En el momento de transmsitir al emisor tienes que señalarle este receptor.
// seria el equivalente a la ip de un ordenador. 5 bytes maximo.

 Mirf.setRADDR((byte *)"RX_99");
// a configurar y vavciar cola FIFO
 Mirf.config();

 // Set 1MHz data rate
 Mirf.configRegister(RF_SETUP,0x06);
 
 
}

void loop()
{
 
 v02 = analogRead(1); //leemos un potenciometro por ejemplo

 // nombre del NRF24l01 al que vamos a emitir. Del NRF24L01 DESTINO.

 Mirf.setTADDR((byte *)"TX_01");
 //ahora vamos a emitir
 Mirf.send(v02);
//esperamos a que termine de emitir
   while( Mirf.isSending() ) ;

//para enviar a otro NRf24L01 cuyo nombre fuese "TX_57"
Mirf.setTADDR((byte *)"TX_57");
 //ahora vamos a emitir
 Mirf.send(v02);
//esperamos a que termine de emitir
   while( Mirf.isSending() ) ;
 
 
 delay(100);
}



aqui la librería completa mirf.

http://playground.arduino.cc/InterfacingWithHardware/Nrf24L01

Anthony19

Gracias por la ayuda Ebludt.

Sin embargo e codigo de ejmplo esta mal y no compila.

Errores detectados:
#include <Spi.h> hay que cambiarlo por #include <SPI.h>
falta añadir la librería #include <nRF24L01.h>.


  Mirf.send((v02); error: invalid conversion from 'byte' to 'uint8_t*'
Solución: Mirf.send((byte *)&v02);


este sería el código emisor:
Code: [Select]
#include <SPI.h>
#include <mirf.h>
#include <nRF24L01.h>
byte v02;



void setup()
{
   
 
  // Iniciamos el modo de trasmision
  Mirf.init();
 
  // payload de un byte
  Mirf.payload = 1;
 
  // lo del canal
  Mirf.channel = 90;
// Nombre que le vas a dar a ESTE NRF24L01. En el momento de transmsitir al emisor tienes que señalarle este receptor.
// seria el equivalente a la ip de un ordenador. 5 bytes maximo.

  Mirf.setRADDR((byte *)"RX_99");
// a configurar y vavciar cola FIFO
  Mirf.config();

  // Set 1MHz data rate
  Mirf.configRegister(RF_SETUP,0x06);
 
 
}

void loop()
{

  v02 = (analogRead(A3)/4); //leemos un potenciometro por ejemplo

  // nombre del NRF24l01 al que vamos a emitir. Del NRF24L01 DESTINO.

  Mirf.setTADDR((byte *)"TX_01");
  //ahora vamos a emitir
  Mirf.send((byte *)&v02);
//esperamos a que termine de emitir
    while( Mirf.isSending() ) ;

   
 
  delay(100);
}


El receptor
Code: [Select]

#include <SPI.h>
#include <mirf.h>
#include <nRF24L01.h>


#include <Spi.h>
#include <mirf.h>

void setup()
{
  Serial.begin(57600);
 
  Mirf.init();
 
  // Nombre que le vas a dar a ESTE NRF24L01. Si el alguien quiere emitir a ESTE equipo tiene que referirse a este nombre
// seria el equivalente a la ip de un ordenador. 5 bytes maximo.

  Mirf.setRADDR((byte *)"TX_01");
 
  // Payload, en bytes, a transmitir. Si quiere mandar dos datos, dos por por ejemplo, usa 2. 3 para tres... hasta 32
  Mirf.payload = 1;

  // we use channel 90 as it is outside of WLAN bands
  // or channels used by wireless surveillance cameras
// esto lo dejo igual
  Mirf.channel = 90;
 
  // Esto inicia el mirf y borra la lista FIFO
  Mirf.config(); 
 
  // Set 1MHz data rate - this increases the range slightly
// esto no lo puse pero mal no puede hacer
  Mirf.configRegister(RF_SETUP,0x06);
}

void loop()
{

  byte c;

  // comprobamos que no hay datos a recibir.
  if( Mirf.dataReady() )
  {
     // lo recibimos y lo almacenamos en C
     Mirf.getData(&c);

    // ... and write it out to the PC
     Serial.print(c);
  }
}


No se lo que hay mal, pero no consigo establecer comunicación entre las antenas.

Si como dices, es fácil de usar, supongo que tendrás un código que hayas usado y funcione. Si no te importa, pásamelo, el agradecimiento sería máximo ;)

Salu2s

nan69nan69

Hola , hice varios proyectos con nRF24L01.h  pero en este caso solo para conectar un emisor que envía datos a un receptor .
Hace poco en Google+ encontré otra librería que la he probado y funciona por lo menos en los casos mas simples.
Es mas sencilla de usar que nRF24L01.h y tiene mas funcionalidades , entre ellas la de comunicarse con 6 dispositivos distintos (ésta no la probé ).
link : https://github.com/gcopeland/RF24

PD: lo intenté con Mirf y no funcionó.
Saludos

Anthony19

Hola a todos

Gracias por la ayuda Nan69nan69

Finalmente fui capaz de comunicar un arduino uno con uno mega con la librería Mirf.h
Aunque no es completamente funcional, este código permite establecer comunicación entre las antenas:
http://arubia45.blogspot.com.es/2013/01/emisorreceptor-wireless-nrf24l01-arduino.html

Con unos retoques y teniendo en cuenta que la información es transmitida y recibida en byte, es decir, si envías caracteres a los números hay que sumarles 48, pues si intentas escribir 1, 2, 3... no te saldrá nada al ser caracteres tipo comando.

Por otro lado en la recepción si recibes un 48 que seria como un '0'  lo escribe como numero 48, hay que pasarlo a variable char con un código simple.

byte a;
char b ;
b=a;

Un saludo y si tienen problemas con la librería Mirf.h aquí estoy para ayudarles :D

lazaro

Hola Anthony.

He estado checando tus comentarios.

Yo quiero hacer un proyecto con comunicación inalámbrica con el módulo Arduino Uno y el NRF24L01, que me recomiendas?

Si funciona con el Arduino Uno?
o sólo con el mega?

Agradezco tu comentario.

surbyte

Funciona con cualquier Arduino que tenga SPI o sea todos.

juanpintom

Yo he tenido muchos y diversos problemas con los NRF, en primer lugar por la alimentacion a 3.3v, en segundo lugar por interferencias y en ultima instancia pero no por ello menos importantes por el Software de control, el timing de envio y el payload...

Si te interesa es posible que el proyecto Souliss te podamos ayudar, porque basicamente quieres desarrollar algo que ya tenemos hecho :)  Si quieres mas info, tienes los links en mi firma :P

Salu2
Souliss - Distributed Home Automation and Internet of Things<br /><br />http://www.souliss.net/<br /><br />http://forum.arduino.cc/index.php?topic=223723.0

carama

#8
Apr 30, 2015, 07:27 pm Last Edit: Apr 30, 2015, 07:30 pm by carama
Yo actualmente tengo mandando datos de un sensor DHT un arduino UNO con nrf24l01+ a otro que esta a una distancia de unos 100 metros , este los recibe y lo subo a una web para poder consultarlos.

Web

La grafica de abajo ni caso , porque ahor amismo como estoy haciendo tantas pruebas se le va la olla.

Si necesitas saber algo , hazmelo saber, saludos.

stazlad

Yo actualmente tengo mandando datos de un sensor DHT un arduino UNO con nrf24l01+ a otro que esta a una distancia de unos 100 metros , este los recibe y lo subo a una web para poder consultarlos.

Web

La grafica de abajo ni caso , porque ahor amismo como estoy haciendo tantas pruebas se le va la olla.

Si necesitas saber algo , hazmelo saber, saludos.
Interesante ese proyecto, una duda para cada sensor  le tiene un arduino? Y como haces para  subir esos datos a una web? Arduino yun o la shield?

gepd

#10
May 23, 2015, 11:55 pm Last Edit: May 24, 2015, 07:18 am by gepd
También estoy trabajando en un proyecto con este famoso módulo, que muy poca documentación tiene. Lo que he podido descubrir es que la mayoría de los problemas son debido a que no se inicializa la misma configuración en ambos dispositivos (arduinos).

Es importante configurar el mismo canal, el tamaño del payload, los pipes, etc. Sólo así fue que conseguí hacer funcionar el ejemplo de la librería NRF24, ahora lo que más me está costando, es entender la librería. Quiero hacer una guía explicando cada parámetro para enviar o recibir datos, hasta ahora me falta entender todo el tema de los payloads.

stazlad

También estoy trabajando en un proyecto con este famoso módulo, que muy poca documentación tiene. Lo que he podido descubrir es que la mayoría de los problemas son debido a que no se inicializa la misma configuración en amos dispositivos (arduinos).

Es importante configurar el mismo canal, el tamaño del payload, los pipes, etc. Sólo así fue que conseguí hacer funcionar el ejemplo de la librería NRF24, ahora lo que más me está costando, es entender la librería. Quiero hacer una guía explicando cada parámetro para enviar o recibir datos, hasta ahora me falta entender todo el tema de los payloads.
si te agradeceria que la hicieras, yo de igual estoy investigando este modulo

gepd

#12
May 24, 2015, 02:50 am Last Edit: May 24, 2015, 07:18 am by gepd
He comenzado la guía del módulo aquí: http://forum.arduino.cc/index.php?topic=325087

cualquier ayuda es bien recibida, no soy un experto en el tema, solo llevo un par de días con el famoso módulo y comienzo a entenderlo poco a poco

lazaro

Funciona con cualquier Arduino que tenga SPI o sea todos.
Gracias.

lazaro

Saludos a la comunidad.

He estado involucrado un poco sobre las Arduino Uno y el NRF24L01+ y tengo entendido que ambos módulos pueden comunicarse de manera inalámbrica tanto para el envío de señal como de recepción de señal y he estado revisando este Link: https://github.com/gcopeland/RF24 que recomienda; sin embargo no podido identificar cuál de los archivos son para transmisión y cuál codificación debe ser para recepción por ello acudo a ustedes si alguien podrá apoyarme con una orientación. De antemano les agradezco.

Saludos.

Go Up