¿Como debugear el modulo NRF24L01 ?

Hola amigos!

Tengo un problema con el modulo tranceptor NRF24L01. Tenia dos arduino uno conectados con sendos modulos NRF24L01. Un Arduino (uno) transmitia un caracter via radio y el otro lo recivia y lo enviaba a la consola serial para mostrarlo en la PC. Era un simple prototipo de comunicacion. Utilizo la libreria MIRF para interfacear el software con el modulo.

De un dia a otro todo dejo de funcionar. En realidad uno de los modulos (el transmisor) se quedo sin bateria y dias despues cuando lo volvi a conectar ya no funcionaba. ¿Como debugear el problema? ¿Como saber si el problema es la transmision de radio o la recepcion?. ¿Como verificar la comunicacion via SPI entre Arduino y el tranceptor? Verifique el cableado y aparentmente esta correcto. Gacias!!!

El codigo se basa en el siguiente ejemplo

http://arduino-info.wikispaces.com/nRF24L01-Mirf-Examples

Codigo Transmisor

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

// converts a float into a char 
// and sends it via nRF24L01
void transmit( float v)
{
  byte c; 
  char buf[10];
  
  dtostrf(v,9,3,buf);

  for( int i=0 ; i<8 ; i++ )
  { 
    c = buf[i];
    Mirf.send(&c);
    while( Mirf.isSending() ) ;
  }
}

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

// send a CR/LF sequence via the nRF24L01
void transmitlf(void)
{
  byte c;
  
  c = '\r';
  Mirf.send(&c);
    while( Mirf.isSending() ) ;
  
  c = '\n';
  Mirf.send(&c);
    while( Mirf.isSending() ) ;
}

void setup()
{
  
  // init the transceiver
  Mirf.init();
  
  // we transmit only a single byte each time
  Mirf.payload = 1;
  
  // selecting a channel which is not too noisy
  Mirf.channel = 90;
  Mirf.config();
 
  // Set 1MHz data rate
  Mirf.configRegister(RF_SETUP,0x06);
  
  // Set address - this one must match the 
  // address the receiver is using!
  Mirf.setTADDR((byte *)"TX_01");
}

void loop() 
{
  
  // transmit a string
  transmit("hola");
  
    
  // transmit a CR/LF for the PC

  transmitlf();
 
  // ... just take your time
  delay(100);
}

Codigo Receptor

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

void setup()
{
  Serial.begin(9600);
  
  Mirf.init();
  
  // name the receiving channel - must match tranmitter setting!
  Mirf.setRADDR((byte *)"TX_01");
  
  // just a single byte is transmitted
  Mirf.payload = 1;

  // we use channel 90 as it is outside of WLAN bands 
  // or channels used by wireless surveillance cameras 
  Mirf.channel = 90;
  
  // now config the device.... 
  Mirf.config();  
  
  // Set 1MHz data rate - this increases the range slightly
  Mirf.configRegister(RF_SETUP,0x06);
}

void loop()
{

  byte c; 

  // is there any data pending? 
  if( Mirf.dataReady() )
  {
     // well, get it
     Mirf.getData(&c);

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

El conexionado de los pines es el siguiente

MISO → 12
MOSI → 11
SCK → 13

CE → 8
CSN → 7

Los 3.3 V los estoy tomando desde la placa Arduino, al igual que GND

1x1d0.png

Y donde pusiste el código, donde un esquema de como estan conectados?

Hola Surbye! Ahi agrege la informacion que me solicitaste. La verdad es que me desconcierta bastante el asunto porque estaba funcionando todo muy bien y de un dia para otro dejo de andar por completo.

Como veras en las imagen adjunta, tengo incorporado al esquema un sensor de temperatura 18b20 y uno de humedad DH11. Con esto ademas de caracteres llege a transmitir en un momento tambien los datos de los sensores.

Espero que me puedas ayudar a debugear el poblema, quiero saber donde se “rompe” la cadena de transmision y por que.

Arduino <-> SPI <-> Modulo <-> Radio Enlace <-> Modulo <-> SPI <-> Arduino <-> Rs 232 <-> PC

Arduino <-> Rs 232 <-> PC no existe. es Arduino <-> USB <-> PC

Si el ejemplo esta tomado de la página entonces la falla es de hardware.
Si estaba funcionando y ahora no, entonces se te aflojó alguna soldadura o conexión.
Revisa las conexiones con el tester sin alimentación a ver si todo te da continuidad entre arduino y nRF24l01

Verifique todo el conexionado y alimentacion entre cada arduino con su NRF24L01 y esta todo bien. La alimentacion la tomo del pin de 3.3v de Arduino con un capacitor de 10uf.

Al intercambiar los modulos NRF con las placas arduino (el modulo de la placa arduino receptora lo pase a la transmisora y viceversa) , note que el transmisor rompe el loop() de arduino al quedarse bloqueado en un ciclo sin fin dentro de los bolques while de las funciones transmit.

while( Mirf.isSending() ) ;

Mirf.isSending() nunca retorna false luego de realizar el Mirf.send().

Cabe aclarar que usarndo las placas en su combinacion original (sin permutar) el lazo pincipal loop() de arduino no se rompe, funcionando correctamente el retorno de Mirf.isSending(), aunque el receptor no acusa la presencia de datos en su buffer con Mirf.dataReady().

Seria de utilidad cualquier consejo antes de comprar placas NRF nuevas :)

Infinitas gracias

Yo no uso esa librería pero debería funcionar. Dejame que vea mis ejemplos y te propongo algo con la librería Maniac, luego te paso links.

Hola Surbyte!

Te agradecería si me podes mandar un codigo de ejemplo con otra libreria para probar. Estoy estudiando los registros del modulo NRF para ver si hay algun error en la libreria MIRF o es un tema del hardware. Me sigue resultando extraño de que todo el conjunto pase de funcionar a dejar de andar asi por que si, pero no es la primera vez que me topo con estas cosas de apariencia ilogica.

Gracias!

Mira yo primeramente encontré como tu la librería Mirf y dentro de la página que la mencionaba encontré la Maniac

Resultó ser mucho mejor. En esta página (la que te puse el link) hay un ejemplo donde se envian datos de un joystick ese fue mi primera prueba modificando los datos a enviar por los mios.

YD_nRF24L01_Transmit_JoyStick

/* YourDuinoStarter Example: nRF24L01 Transmit Joystick values
 - WHAT IT DOES: Reads Analog values on A0, A1 and transmits
   them over a nRF24L01 Radio Link to another transceiver.
 - SEE the comments after "//" on each line below
 - CONNECTIONS: nRF24L01 Modules See:
 http://arduino-info.wikispaces.com/Nrf24L01-2.4GHz-HowTo
   1 - GND
   2 - VCC 3.3V !!! NOT 5V
   3 - CE to Arduino pin 9
   4 - CSN to Arduino pin 10
   5 - SCK to Arduino pin 13
   6 - MOSI to Arduino pin 11
   7 - MISO to Arduino pin 12
   8 - UNUSED
   - 
   Analog Joystick or two 10K potentiometers:
   GND to Arduino GND
   VCC to Arduino +5V
   X Pot to Arduino A0
   Y Pot to Arduino A1
   
 - V1.00 11/26/13
   Based on examples at http://www.bajdi.com/
   Questions: terry@yourduino.com */

/*-----( Import needed libraries )-----*/
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
/*-----( Declare Constants and Pin Numbers )-----*/
#define CE_PIN   9
#define CSN_PIN 10
#define JOYSTICK_X A0
#define JOYSTICK_Y A1

// NOTE: the "LL" at the end of the constant is "LongLong" type
const uint64_t pipe = 0xE8E8F0F0E1LL; // Define the transmit pipe


/*-----( Declare objects )-----*/
RF24 radio(CE_PIN, CSN_PIN); // Create a Radio
/*-----( Declare Variables )-----*/
int joystick[2];  // 2 element array holding Joystick readings

void setup()   /****** SETUP: RUNS ONCE ******/
{
  Serial.begin(9600);
  radio.begin();
  radio.openWritingPipe(pipe);
}//--(end setup )---


void loop()   /****** LOOP: RUNS CONSTANTLY ******/
{
  joystick[0] = analogRead(JOYSTICK_X);
  joystick[1] = analogRead(JOYSTICK_Y);
  
  radio.write( joystick, sizeof(joystick) );

}//--(end main loop )---

/*-----( Declare User-written Functions )-----*/

//NONE
//*********( THE END )***********

YD_nRF24L01_Receive_JoyStick

/* YourDuinoStarter Example: nRF24L01 Receive Joystick values

 - WHAT IT DOES: Receives data from another transceiver with
   2 Analog values from a Joystick or 2 Potentiometers
   Displays received values on Serial Monitor
 - SEE the comments after "//" on each line below
 - CONNECTIONS: nRF24L01 Modules See:
 http://arduino-info.wikispaces.com/Nrf24L01-2.4GHz-HowTo
   1 - GND
   2 - VCC 3.3V !!! NOT 5V
   3 - CE to Arduino pin 9
   4 - CSN to Arduino pin 10
   5 - SCK to Arduino pin 13
   6 - MOSI to Arduino pin 11
   7 - MISO to Arduino pin 12
   8 - UNUSED
   
 - V1.00 11/26/13
   Based on examples at http://www.bajdi.com/
   Questions: terry@yourduino.com */

/*-----( Import needed libraries )-----*/
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
/*-----( Declare Constants and Pin Numbers )-----*/
#define CE_PIN   9
#define CSN_PIN 10

// NOTE: the "LL" at the end of the constant is "LongLong" type
const uint64_t pipe = 0xE8E8F0F0E1LL; // Define the transmit pipe


/*-----( Declare objects )-----*/
RF24 radio(CE_PIN, CSN_PIN); // Create a Radio
/*-----( Declare Variables )-----*/
int joystick[2];  // 2 element array holding Joystick readings

void setup()   /****** SETUP: RUNS ONCE ******/
{
  Serial.begin(9600);
  delay(1000);
  Serial.println("Nrf24L01 Receiver Starting");
  radio.begin();
  radio.openReadingPipe(1,pipe);
  radio.startListening();;
}//--(end setup )---


void loop()   /****** LOOP: RUNS CONSTANTLY ******/
{
  if ( radio.available() )
  {
    // Read the data payload until we've received everything
    bool done = false;
    while (!done)
    {
      // Fetch the data payload
      done = radio.read( joystick, sizeof(joystick) );
      Serial.print("X = ");
      Serial.print(joystick[0]);
      Serial.print(" Y = ");      
      Serial.println(joystick[1]);
    }
  }
  else
  {    
      Serial.println("No radio available");
  }

}//--(end main loop )---

/*-----( Declare User-written Functions )-----*/

//NONE
//*********( THE END )***********

Aclaro y va para ti y para Go_zalo que tiene problemas similares.
Esto funciona bien con librería Maniac. No usar Tmrh20 con este ejemplo (hay que hacer leves correcciones).