Pages: [1]   Go Down
Author Topic: Proyecto usando NRF24L01  (Read 3554 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 25
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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:
#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
« Last Edit: September 20, 2013, 06:03:27 am by ebludt » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 25
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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:
#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 smiley-wink

Salu2s
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 1
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 25
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

 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 smiley-grin
Logged

Pages: [1]   Go Up
Jump to: