Hola a todos,
Les compoarto el uso del modulo e radiofrecuencia nRF24L01+.
¿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.
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
Codigos:
Rx:
Tx:
Video
Saludos!
Les compoarto el uso del modulo e radiofrecuencia nRF24L01+.

¿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.


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




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!