[Aporte] Arduino + nRF24L01

Hola a todos,

Les compoarto el uso del modulo e radiofrecuencia nRF24L01+.

nRF.jpg


¿Qué es el nRF24l01+?

El nRF24L01+ es un chip transceptor de 2.4Ghz con la lógica de banda base incluyendo un acelerador de protocolo por hardware Enhanced ShockBurst™ con una interfaz SPI de alta velocidad para el controlador de la aplicación.
El módulo Transceptor de baja potencia y corto alcance (200 metros más o menos)

MultiCeiver

MultiCeiver es una característica usada en modo RX que contiene un conjunto de
Seis pipes paralelos de datos con un única dirección.
Un pipe de datos es un canal lógico en el canal RF físico, cada pipe de datos tiene su propia dirección física decodificado en el nRF24L01+.

nRF24L01 configurado como PRX (receptor primario) puede recibir datos direccionados de seis diferentes datos de pipes en una sola frecuencia. Cada pipe de datos tiene su única dirección y puede ser configurado por comportamiento individual.


nRF2.jpg


nRF3.jpg


INTERFAZ

El interfaz SPI te da el control a todas las características del nRF24L01+, consiste en los siguientes señales digitales.
•IRQ(Esta señal es activada en bajo y controlable por tres interrupciones de mascara)
•CE(Esta señal es activada en alto y usado para activar el chip en modo RX o TX)
•CSN
•SCK
•MOSI
•MISO

Conexión al arduino

nRF4.jpg


nRF5.jpg


nRF6.jpg


nRF7.jpg


Codigos:

Rx:

Código:
#include <SPI.h>

#define CE_pin 8
#define CSN_pin 7
#define IRQ_pin 2
#define MOSI_pin 11
#define MISO_pin 12
#define SCK_pin 13

#define  W  1
#define  R  0

///////////////
//Comandos
//////////////

#define CONFIG    B00000000 //CONFIG
#define EN_AA     B00000001 //EN_AA
#define EN_RXADDR B00000010 //EN_RXADDR
#define SETUP_AW  B00000011 //SETUP_AW
#define STATUS    B00000111
#define RX_PW_P0  B00010001
#define RX_PW_P1  B00010010

#define R_RX_PAYLOAD  B01100001
#define W_TX_PAYLOAD  B10100000
#define FLUSH_TX  B11100001
#define FLUSH_RX  B11100010
#define RX_ADDR_R0  B00001010
#define TX_ADDR  B00010000


byte RXADRESS[5]={0xE7,0xE7,0xE7,0xE7,0xE7};
byte TXADRESS[5]={0xE7,0xE7,0xE7,0xE7,0xE7};


//The global variables used by everyone
byte data_in[5], data2, data3;
byte buffer[5];
byte nn;
int _count=0;

void setup(){
  Serial.begin(115200);//start Serial
  Serial.println("Conectando...");
  delay(100);
  nRF24L01_init();

}

void loop(){

  while(1){

    if(nRF24L01_Interrupt()==1){
      nRF24L01_Send_Commands_RWregisters(STATUS,0,R);
      Serial.print("Datos en el Pipe = ");
      Serial.print(((data_in[1]&0x0E)>>1));
      Serial.println();
      nRF24L01_Send_Commands_RXTXPAYLOAD(R_RX_PAYLOAD,buffer,5,R);
      nRF24L01_Send_Commands_RWregisters(STATUS,0B01000000,W);
      for(nn=0;nn<5;nn++){
      
        Serial.print(buffer[nn],HEX);
        Serial.print(' ');
      }
      
      for(nn=0;nn<5;nn++){
      
        buffer[nn]=0;
      
      }
      Serial.println(" ");
            
    }
    delay(10);
  }
  
}


void nRF24L01_init(void){

  /*
  Inicializa Pines
  */
  pinMode(CE_pin, OUTPUT);//chip enable set as output
  pinMode(CSN_pin, OUTPUT);//chip select pin as output
  pinMode(MOSI_pin, OUTPUT);//SPI data out
  pinMode(MISO_pin, INPUT); //SPI data in
  pinMode(SCK_pin, OUTPUT);//SPI clock out
  pinMode(IRQ_pin,INPUT);
  Serial.println("Inicializacion de Pines");
  
  SPI.setBitOrder(MSBFIRST);//SPI Most Significant Bit First
  SPI.setDataMode(SPI_MODE0);// Mode 0 Rising edge of data, keep clock low
  SPI.setClockDivider(SPI_CLOCK_DIV2);//Run the data in at 16MHz/2 - 8MHz
  digitalWrite(CE_pin, HIGH);//RX mode
  digitalWrite(CSN_pin, HIGH);//SPI idle
  SPI.begin();//start up the SPI library
  
  Serial.println("nRF Listo!");
  
  
  nRF24L01_Send_Commands_RWregisters(RX_PW_P0,B00000101,W);
  nRF24L01_Send_Commands_RWregisters(RX_PW_P1,B00000101,W);
  nRF24L01_Send_Commands_RWregisters(CONFIG,B00110011,W);
}


void nRF24L01_Send_Commands_RWregisters(byte cmd,byte value,byte rw){

  digitalWrite(CSN_pin, LOW);
  data_in[0] = SPI.transfer((cmd|(rw<<5)));
  data_in[1] = SPI.transfer(value);
  digitalWrite(CSN_pin, HIGH);

}

void nRF24L01_Send_Commands_RXTXPAYLOAD(byte cmd,byte *value,int n,int rw){

  int i_;
  
  if(rw==W){
    Serial.print("Write data = ");
    nRF24L01_Send_Commands_flushRXTX(FLUSH_TX);
  }
  
  digitalWrite(CSN_pin, LOW);
  data_in[0] = SPI.transfer(cmd);
  for(i_=0;i_<n;i_++){
    if(rw==W){
      
      data_in[0] = SPI.transfer(*value);
      Serial.print(*value);
    }else{
      *value = SPI.transfer(0);
    }
    value++;
  }
  digitalWrite(CSN_pin, HIGH);
  
  if(rw==W){
    Serial.println(" ");
    digitalWrite(CE_pin, LOW);//pull CE pin LOW
    delay(0.1);
    digitalWrite(CE_pin, HIGH);//pull CE pin LOW
  }else{
  
    nRF24L01_Send_Commands_flushRXTX(FLUSH_RX);
  
  }
}


void nRF24L01_Send_Commands_flushRXTX(byte cmd){
  
  digitalWrite(CSN_pin, LOW);
  data_in[0] = SPI.transfer(cmd);
  digitalWrite(CSN_pin, HIGH);
  
}

void nRF24L01_Send_Address(byte cmd,byte *adr,byte rw){

  int _i=0;
  
  digitalWrite(CSN_pin, LOW);
  data_in[0] = SPI.transfer((cmd|(rw<<5)));
  for(_i=0;_i<5;_i++){
    data_in[1] = SPI.transfer(*adr);
    adr++;
  }
  digitalWrite(CSN_pin, HIGH);

}

int nRF24L01_Interrupt(){

  int rep=0;
  
  if(digitalRead(IRQ_pin)==0){  
    rep=1;
  }

  return rep;
}

Tx:
Código:
#include <SPI.h>

#define CE_pin 8
#define CSN_pin 7
#define IRQ_pin 2
#define MOSI_pin 11
#define MISO_pin 12
#define SCK_pin 13

#define  W  1
#define  R  0

///////////////
//Comandos
//////////////

#define CONFIG    B00000000 //CONFIG
#define EN_AA     B00000001 //EN_AA
#define EN_RXADDR B00000010 //EN_RXADDR
#define SETUP_AW  B00000011 //SETUP_AW
#define STATUS    B00000111
#define RX_PW_P0  B00010001
#define RX_PW_P1  B00010010

#define R_RX_PAYLOAD  B01100001
#define W_TX_PAYLOAD  B10100000
#define FLUSH_TX  B11100001
#define FLUSH_RX  B11100010
#define RX_ADDR_R0  B00001010
#define TX_ADDR  B00010000


byte RXADRESS[5]={0xE7,0xE7,0xE7,0xE7,0xE7};
byte TXADRESS[5]={0xE7,0xE7,0xE7,0xE7,0xE7};

//The global variables used by everyone
byte data_in[5], data2, data3;
byte buffer[5];
byte nn;

void setup(){
  Serial.begin(115200);//start Serial
  Serial.println("Conectando...");
  delay(100);
  nRF24L01_init();

}

void loop(){

  while(1){
    buffer[0]=TXADRESS[0];
    buffer[1]=TXADRESS[1];
    buffer[2]=TXADRESS[2];
    buffer[3]=TXADRESS[3];
    buffer[4]=TXADRESS[4];
    nRF24L01_Send_Commands_RXTXPAYLOAD(W_TX_PAYLOAD,buffer,5,W);
    nRF24L01_Send_Commands_RWregisters(STATUS,0,R);
    nRF24L01_Send_Commands_RWregisters(STATUS,(data_in[1]|0x10),W);
    delay(1000);
  }
  
}


void nRF24L01_init(void){

  /*
  Inicializa Pines
  */
  pinMode(CE_pin, OUTPUT);//chip enable set as output
  pinMode(CSN_pin, OUTPUT);//chip select pin as output
  pinMode(MOSI_pin, OUTPUT);//SPI data out
  pinMode(MISO_pin, INPUT); //SPI data in
  pinMode(SCK_pin, OUTPUT);//SPI clock out
  pinMode(IRQ_pin,INPUT);
  Serial.println("Inicializacion de Pines");
  
  SPI.setBitOrder(MSBFIRST);//SPI Most Significant Bit First
  SPI.setDataMode(SPI_MODE0);// Mode 0 Rising edge of data, keep clock low
  SPI.setClockDivider(SPI_CLOCK_DIV2);//Run the data in at 16MHz/2 - 8MHz
  digitalWrite(CE_pin, HIGH);//RX mode
  digitalWrite(CSN_pin, HIGH);//SPI idle
  SPI.begin();//start up the SPI library
  
  Serial.println("nRF Listo!");
  
  
  nRF24L01_Send_Commands_RWregisters(RX_PW_P0,B00000101,W);
  nRF24L01_Send_Address(RX_ADDR_R0,RXADRESS,W);
  nRF24L01_Send_Address(TX_ADDR,TXADRESS,W);
  nRF24L01_Send_Commands_RWregisters(CONFIG,B00110010,W);
}


void nRF24L01_Send_Commands_RWregisters(byte cmd,byte value,byte rw){

  digitalWrite(CSN_pin, LOW);
  data_in[0] = SPI.transfer((cmd|(rw<<5)));
  data_in[1] = SPI.transfer(value);
  digitalWrite(CSN_pin, HIGH);

}

void nRF24L01_Send_Commands_RXTXPAYLOAD(byte cmd,byte *value,int n,int rw){

  int i_;
  
  if(rw==W){
    Serial.print("Write data = ");
    nRF24L01_Send_Commands_flushRXTX(FLUSH_TX);
  }
  
  digitalWrite(CSN_pin, LOW);
  data_in[0] = SPI.transfer(cmd);
  for(i_=0;i_<n;i_++){
    if(rw==W){
      data_in[0] = SPI.transfer(*value);
      Serial.print(*value);
    }else{
      *value = SPI.transfer(0);
    }
    value++;
  }
  digitalWrite(CSN_pin, HIGH);
  
  if(rw==W){
    Serial.println(" ");
    digitalWrite(CE_pin, LOW);//pull CE pin LOW
    delay(0.1);
    digitalWrite(CE_pin, HIGH);//pull CE pin LOW
  }else{
  
    nRF24L01_Send_Commands_flushRXTX(FLUSH_RX);
  
  }
}


void nRF24L01_Send_Commands_flushRXTX(byte cmd){
  
  digitalWrite(CSN_pin, LOW);
  data_in[0] = SPI.transfer(cmd);
  digitalWrite(CSN_pin, HIGH);
  
}

void nRF24L01_Send_Address(byte cmd,byte *adr,byte rw){

  int _i=0;
  
  digitalWrite(CSN_pin, LOW);
  data_in[0] = SPI.transfer((cmd|(rw<<5)));
  for(_i=0;_i<5;_i++){
    data_in[1] = SPI.transfer(*adr);
    adr++;
  }
  digitalWrite(CSN_pin, HIGH);

}

int nRF24L01_Interrupt(){

  int rep=0;
  
  if(digitalRead(IRQ_pin)==0){
    rep=1;
  }

  return rep;
}

Video


Saludos!
 
Hola. Voy tratar de exponer mi problema a ver si alguno se ha peleado con ello antes y puede echarme un cable.

Hace poco compré 2 módulos para mis Arduinos de NRF24L01+ como los descritos en el tema, pero no logro hacerlos funcionar correctamente.
He probado tanto la libería RF24 como Mirf.

La alimentación de estos módulos la tengo a parte a 3 V, con un condensador de 10uF para filtrar ruido que pueda haber, ya que he leído que era muy recomendable.
Utilizo un UNO y un NANO.

Pues bien, cuando cargo el programa de ejmplo GettingStarted de la librería RF24 con uno de los módulos solo obtengo 0 en todos los registros, y con el otro solo lo siguiente:


Código:
RF24/examples/GettingStarted/

ROLE: Pong back

*** PRESS 'T' to begin transmitting to the other node

STATUS = 0x0e RX_DR=0 TX_DS=0 MAX_RT=0 RX_P_NO=7 TX_FULL=0
RX_ADDR_P0-1 = 0x0808080808 0x0808080808
RX_ADDR_P2-5 = 0x08 0x08 0x08 0x08
TX_ADDR = 0x0808080808
RX_PW_P0-6 = 0x10 0x08 0x08 0x08 0x08 0x08
EN_AA = 0x08
EN_RXADDR = 0x08
RF_CH = 0x08
RF_SETUP = 0x08
CONFIG = 0x08
DYNPD/FEATURE = 0x08 0x08
Data Rate = 2MBPS
Model = nRF24L01
CRC Length = 8 bits
PA Power = PA_MIN
*** CHANGING TO TRANSMIT ROLE -- PRESS 'R' TO SWITCH BACK
Now sending 2950...failed.
Failed, response timed out.
Now sending 4653...failed.
Failed, response timed out.
Now sending 6354...failed.
Failed, response timed out.
Now sending 8055...failed.
Failed, response timed out.


Tampoco he logrado hacer funcionar ningún otro código.
Las conexiones de los pines del Arduino puedo asegurar tras revisarlas 10 mil millones de veces que son correctas.

¿Alguna idea de qué puede estar fallando?

¿Me los han vendidos rotos?
¿Se han quemado?
¿O solo soy muy muy torpe y estoy pasando algo fundamental por alto?

Muchas gracias por adelantado y mis disculpas por haber habierto un tema solo para eso :(
 
Hola amigo! Yo tenía el mismo problema. Sólo le solde el los pines de alimentación un capacitor de 220 microfaradios. Debe ser electrolítico a 5v. Y con eso santo remedio. Espero te sirva saludos!
 
Atrás
Arriba