desktop

Comunicación por Radiofrecuencia entre PICs y nRF24L01

Saludos.
Cuando yo realicé la prueba de éstos módulos, me funcionó a la primera.
No tuve complicaciones de ningún tipo con el software, con el hardware si tuve, pero lo resolví.

Recuerdo que la primera prueba fue usando Proteus para analizar la comunicación SPI con el debugger.
Noté que existían varias advertencias cuando se hacía el cambio de modo Master/Slave.
Así que en modo de depuración me dediqué a corregir la librería "lib_rf2gh4_10.h"

Esa fue una prueba y corrección en simulador, me quedaba la duda de que funcionaran físicamente.
Pero llegó el detalle con el hardware. Los módulos no son aptos para usarse en protoboard. :cry:
Entonces realicé unos pequeños adaptadores en PCB, y hasta con máscara antisoldante. :)

Posteriormente hice el diseñó para el cual tenía pensado usar los módulos.
(Un sistema de control de iluminación con LEDs para una discoteca.)
Tras armar las tarjetas, todo funcionó correctamente al primer encendido.
El sistema funcionó tal cual se requería y se había programado, sin ninguna falla. (Hasta el momento)

Ahora les comparto un proyecto, pero para encender y apagar un simple LED.
Incluye los esquemas y diseños para los PCB, así como también el footprint que usé como adaptador.
(Este footprint les servirá si desean hacer pruebas en protoboard.)

El sistema está funcionando físicamente y no deben tener problemas si realizan todo como está en los esquemas.
Usé dos PIC16F690, ya que con esos realicé mi prototipo.
(Tienen módulo SSP, oscilador interno y la cantidad de pines que yo necesitaba.)

Nota:
Recuerden que si se desea usar otro PIC, éste debe tener módulo SSP, y no olvidar configurar los pines a usar en la librería.

Espero les sea de utilidad.
 

Adjuntos

  • 16F690 NRF24L01.rar
    1.7 MB · Visitas: 296
  • Adaptador NRF24L01.jpg
    Adaptador NRF24L01.jpg
    44.2 KB · Visitas: 139
Ahora lo voy a ver, pero otra consulta, vos diste un detalle, vos tenes los modulos para proteus para simularlo? porque la verdad ya nose. Lindo seria saber si mis modulos funcionan hay manera de saberlo eso?. Y como dije voy a observar eso que esta en el rar , y tal cual queria eso solo sencillo encender o apagar un led mediante un boton o lo que sea pero nunca lo logre comunicar. espero entenderlo. :cry: vos sabes mucho y la verdad nose mucho de esto con spi.

perdon ahi vi que pusiste tambien las librerias para proteus :)
 
Las librerías adjuntas del NRF24L01, no sirven para simulación.
Son para realizar el diagrama esquemático que posteriormente se usará para crear el circuito impreso.

La única forma de saber si los módulos funcionan, es realizando una prueba en físico.
El proyecto que subí funciona perfectamente y debe funcionar con cualquier PIC que tenga módulo SSP.
Nada más se necesita configurar los pines conforme al PIC que se quiera usar.
 
Te comento, yo tengo los dos pic16F819 que programe uno como TX y el otro RX con sus respectivos modulos NRF24L01, (que la verdad nose si funcionan porque hice de todo) la realidad que no pasa nada solo me enciende el led como que envia el dato segun tu programa, lo que hice fue modificar unos puntos para poder utilizarlos con mis pic.

Por favor podrias verlos porque la realidad no me funciona esta todo armado en un protoboard y prolijo nada de nada solo el led en mi pic transmisor como que envia el dato. Ahi te adjunto los archivos. Maestro ayudame por favor.

Todo fisico lo pruebo nada de simulado todo lo que te explico
 

Adjuntos

  • trx819.zip
    892.8 KB · Visitas: 62
hola dcsalg, te recomiendo que no te sales las configuraciones iniciales del microcontrolador son muy importantes,

preguntas:

- Estas alimentando todo con una fuente de pc ? o baterías ? créeme que es muy importante también

- Estas alimentando todo a 3.3v? incluyendo los pics?

recomendaciones (aparte de las de arriba):

- no omitas las configuraciones iniciales del micro créeme que tuve problemas por eso

- para empezar trata de hacer lo mas simple posible tu código, cuando te funcione si retocalo todo lo que quieras, lo digo porque haces varios llamados a la funcion RF_RECEIVE() en tu receptor, te recomiendo que empezando trabajes solamente con la que esta en la interrupción, lo mismo para el emisor

-haciendo pruebas creo que también tuve problemas cuando asignaba valores enteros al array RF_DATA[0], prueba asignando valores hexadecimales primero
 
Esta tarde voy a intentar de nuevo. A ver que sucede. La alimentación de la pc , tendría que utilizar una fuente no?, lo de RF_RECEIVE voy a colocarlo en una interrupción, lo había sacado en su momento de ahí porqué tenía miedo que no funcionara la interrupcion. Como esta adentro de un bucle, me aseguraba sólo que lo iba a leer seguro. Pero voy a probar y te cuento esta tarde y te envío lo que hice

en lo siguiente deje el codigo asi, sigue sin funcionar. Los pic si estan Barbaros funcionan. no entiendo,. La alimentacion lo hago con un TTL que estoy ulizando en la PC que lo conectas a usb y entrega 5v y 3.3V. No creo que tenga problema eso, con eso mismo alimente dos pic que se comunicaban no por este medio sino por cable y funcionaban. Pero me supero esto ya nose que hacer?

el programa del transmisor es el mismo que esta en el archivo que subi anteriormente el RAR

Código:
#include <16f819.h>
//#fuses   nofcmen
#use     delay(internal = 4MHz)

#include "lib_rf2gh4_10.h"

#define  led   PIN_A1

// Servicio de interrupción externa por RB0
#int_ext
void sdi_rb0()
{
   int8 ret;

   ret = RF_RECEIVE();           // "ret" contendrá el valor que le llegue del emisor
   
   if ( (ret == 0) || (ret == 1) ) // Tanto si hay recepción simple o múltiple, leer datos.
   {
      do
      {
         ret = RF_RECEIVE();     // "ret" nos dirá si hay recepción simple, múltiple o no hay datos para leer.
         
            switch (RF_DATA[0])  // Seleccionar los datos que hay en RF_DATA[0]
            {
               case 1:
                  output_high(led);
                  break;
               case 0:
                  output_low(led);
            }
      }
      while ( (ret == 0) || (ret == 1) ); // Mientras haya datos para leer, seguir leyendo.
   }  
}

void main (void)
{  int8 ret;
   output_low(led);              // Inicialmente el LED estará apagado.
   
   
   
   RF_INT_EN();                  // Habilitar interrupción por RB0.
   RF_CONFIG_SPI();              // Configurar módulos SPI del PIC.
   RF_CONFIG(0x40,0x08);         // Configurar módulo RF (canal y dirección).
   RF_ON();                      // Activar el módulo RF.
   
   while (true)
   {
      sleep();
      delay_cycles(127);
     
       
   }
}
 
Última edición:
compa te comento de nuevo no te saltes las configuraciones para tu micro me refiero a esta parte :
Código:
    port_b_pullups(FALSE);         // Todo digital... etc.
    setup_adc_ports(NO_ANALOGS);
    setup_adc(ADC_CLOCK_DIV_2);
    setup_spi(SPI_SS_DISABLED);
    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
    setup_timer_1(T1_DISABLED);
    setup_timer_2(T2_DISABLED,0,1);
    setup_comparator(NC_NC_NC_NC);
    setup_vref(FALSE);

Asi como tampoco las directivas del preprocesador. mi pregunta es si estas alimentando todo a 3.3 v tanto los pics como los NRF? y te recomiendo que la alimentación sea con una fuente de PC o con baterías y un regulador como el Ld33v puesto que estos módulos son muy susceptibles al ruido, y pueda que los micros funcionen pero los NRF ni a palos
 
Todas esas configuraciones son innecesarias, ya que son las que establece por defecto el compilador.
Lo puedes comprobar mirando los valores de los registros en Watch Window.
Te comento, yo tengo los dos PIC16F819 que programé uno como TX y el otro RX, con sus respectivos módulos NRF24L01 (que la verdad no sé si funcionan porque hice de todo)
En la realidad no pasa nada, sólo me enciende el led como que envía el dato según tu programa.
Lo que hice fue modificar unos puntos para poder utilizarlos con mis pic.

Por favor, podrías verlos, porque en la realidad no me funciona.
Está todo armado en un protoboard, prolijo y nada de nada, sólo el led en mi pic transmisor como que envía el dato.
Te adjunto los programas y esquemas modificados para usar el PIC16F819 en ambos.
Si montas los circuitos tal y como están los esquemas, deben funcionar físicamente.

Suerte.
 

Adjuntos

  • 16F819 NRF24L01.rar
    98.7 KB · Visitas: 137
Última edición:
D@rkbytes, lo probe como digiste ya desconfio que esten quemados es increible porque los compre hace poco esos modulos, y la verdad mo logro hacerlos funcionar. probe repito lo que me pasaste y nada. se me quedan encendidos los dos leds del transmisor por lo tanto no esta enviando nada. . por eso digo si ya con lo que me enviaste no funciono estaran quemados los modulos. Lastima porque nose si tienen un testeo para asegurarme eso. o si lo tienen?
 
Posiblemente si se dañaron durante las varias pruebas que haz realizado.
Yo no uso arduino, pero también los puedes probar con una cosa de esas.
Desafortunadamente no tengo los PIC16F819, pero los puedo conseguir fácilmente y probar con ellos.
Sin embargo, son similares en funciones al PIC16F690 con los que yo hice mi proyecto.

Recuerda que, tanto el PIC como el módulo, deben estar alimentados con 3.3V.
 
Pueden pasar dos cosas:

  1. No se establecerá la comunicación entre el microcontrolador y el NRF24L01
  2. Se puede dañar el NRF24L01 por exceso de voltaje en sus entradas.
Por eso es importante poner atención a los esquemas. :cool:
 
Compraré otros y bueno, probaré. Así que en un tiempo escribiré por aquí de nuevo a ver que me pasó.
 
Última edición por un moderador:
Amigo los pines de señal del NRF24l01 son tolerantes a 5v OJO! solo los pines de señal pero su alimentación no debe ser mayor a 3.3v, puedes alimentar los pics a 5v y los NRF24l01 a 3.3v pero para evitar problemas con los niveles TTL, debes colocar una resistencia de 1k entre +5v y el pin MISO(7) del NRF o bien debes alimentar todo a 3.3v
 
entonces se quemaron o algo paso o vinieron fallados porque no me responde nada , por eso voy a comprar otros dos estoy esperando a que me lleguen los modulos aun. estan mas baratos afuera
 
Buenas tardes luvhines,

He hecho de todo para hacer funcionar estos módulos con el pic 16f887 y 16f877a, de hecho, tengo un led de prueba para observar si encienden y creo que ni eso hacen (aunque si tiene voltaje en los pines del modulo).

No se que puedo estar haciendo mal, hasta copie y pegue tu código y no reaccionan. Me pregunto si las modificaciones que le hiciste a la librería podrían ser mi problema también?, creo que sería de ayuda si me pudieras facilitar tu librería con las modificaciones, si no es molestia.

A continuación mi código:

Código:
#include <16f877.h>
#fuses HS,NOWDT,XT,NOPROTECT,NODEBUG,NOBROWNOUT,NOLVP,NOCPD,NOWRT                        
#use delay(clock=4000000)
#include "lib_rf2gh4_10.h"
#byte porta=5
#byte porte=9
#define porte,0 PIN_E0

int8 ret1;
int8 ret2;
int8 i;
int8 ON;

#int_ext         
void int_externo() 
{ 
   ret1=RF_RECEIVE;
   porta=RF_DATA[0];
   
}
void main()
{  
   port_b_pullups(FALSE);        
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);

   set_tris_a(0b000000);     
   porta=0;
   set_tris_e(0b000);
   setup_spi(SPI_SS_DISABLED);
   RF_INT_EN();
   RF_CONFIG_SPI();
   RF_CONFIG(0x40,0x01);
   RF_ON();
   ON=RF_ON;
   delay_ms(1000);
   
   if (ON==1)
  {  output_high(PIN_E0);
      while(1)
    { Delay_ms(5000);
      RF_DIR=0x08;
      for (i=0;i<8;i++)
      {
         RF_DATA[i]=1;
      }
      ret2=RF_SEND();
    }
  }
   
}
 
Dentro del tema se encuentra toda la información que requieres y también la librería modificada.
Noté que existían varias advertencias cuando se hacía el cambio de modo Master/Slave.
Así que en modo de depuración me dediqué a corregir la librería "lib_rf2gh4_10.h"
En el único programa que expones, tienes varias cosas mal.
Dices usar dos tipos de PIC, uno de ellos, el 16F877A, pero declaras: #include <16f877.h>

#byte porta=5
#byte porte=9
#define porte,0 PIN_E0

La tercer declaración no es correcta para definir un pin.
En dado caso, tendría que ser así: #bit RE0 = porte.0
O así: #define RE0 PIN_E0

Tienes un uso incorrecto para llamar a una función:
ret1=RF_RECEIVE;
Agregar los paréntesis: ret1=RF_RECEIVE();

Tienes configuraciones innecesarias para el microcontrolador:
Código:
   port_b_pullups(FALSE);        
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
Todas esas configuraciones son innecesarias, ya que son las que establece por defecto el compilador.
Lo puedes comprobar mirando los valores de los registros en Watch Window.
Mira la información y los programas adjuntos del post #26
 
Gracias, d@rkbytes, haré las que recomiendas.Estoy un poco nueva en esto :confused:



Cuando intento igualar el retorno 3 (ret3), con el comando de encendido del modulo no me lo permite y me dice "A numeric expression must appear here", quisiera saber por qué pasa esto si en la interrupción estoy haciendo lo mismo con el comando RF_RECEIVE()

Código:
#include <16f877.h>
#fuses HS,NOWDT,XT,NOPROTECT,NODEBUG,NOBROWNOUT,NOLVP,NOCPD,NOWRT                        
#use delay(clock=4000000)
#include "lib_rf2gh4_10.h"
#byte porta=5
#byte porte=9
#bit RE0 = porte.0

int8 ret1;
int8 ret2;
int8 i;
int8 ret3;

#int_ext         
void int_externo() 
{ 
   ret1=RF_RECEIVE();
   porta=RF_DATA[0];
   
}
void main()
{  
   set_tris_a(0b000000);     // Todo el puerto D como salida.
   set_tris_e(0b000);
   setup_spi(SPI_SS_DISABLED);
   RF_INT_EN();
   RF_CONFIG_SPI();
   RF_CONFIG(0x40,0x01);
   RF_ON();
   ret3=RF_ON();
   delay_ms(1000);
   
   if (ret3==1)
  {  output_high(PIN_E0);
      while(1)
    { Delay_ms(5000);
      RF_DIR=0x08;
      for (i=0;i<8;i++)
      {
         RF_DATA[i]=0x01;
      }
      ret2=RF_SEND();
    }
  }
   
}
 
Última edición:
Cuando intento igualar el retorno 3 (ret3), con el comando de encendido del modulo no me lo permite y me dice "A numeric expression must appear here", quisiera saber por qué pasa esto si en la interrupción estoy haciendo lo mismo con el comando RF_RECEIVE()
Porque RF_ON no retorna nada, es una subrutina.
Tan sólo puedes llamarla:
RF_ON();

void RF_ON()
{
}
Y RF_RECEIVE() si es una función que puede retornar un valor.
int RF_RECEIVE()
{
}

Nota que las rutinas que pueden devolver valores, tienen al inicio el tipo que deben retornar.
Int o Int8 en PIC C de CCS = 8 Bits. (1 Byte)
Void = Sin retorno. (O retorno Nulo)

Cuando las rutinas no contienen nada entre los paréntesis, también se entiende como Void.
En éste caso; rutina sin retorno y sin parámetros.
void mi_rutina (void)
{
}

Rutina con retorno y con parámetros:
int16 mi_funcion (int8 param1, int8 param2)
{
int16 x = param1 + param2;
return (x);
}
 
Última edición:
buenas tardes luvhines, e visto todos los comentarios que se han dicho es te foro con respecto al modulo nfr NRF24L01 y su funcionamiento es muy bueno, pero tengo una pregunta es posible enviar una cadena de texto "String" o un "hola mundo ", que el maestro envíe el hola mundo y que el esclavo lo reciba y cuando lo reciba enviarlo por serial para verlo en pc.
muchas gracias podría aclarar me esa duda.
 
Atrás
Arriba