Autor Tema: Enlace radiofrecuencia PIC16F887 - Arduino MEGA con NRF24L01  (Leído 398 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado ShizenMatsac

  • PIC10
  • *
  • Mensajes: 5
Enlace radiofrecuencia PIC16F887 - Arduino MEGA con NRF24L01
« en: 26 de Julio de 2020, 19:55:11 »
Muy buenas a todos, estoy contento de poder formar parte de esta importante y útil página que tanta ayuda personalmente me ha dado.
Resulta que tengo un inconveniente tratando de enlazar un PIC16F887 con un arduino MEGA utilizando el transceptor NRF24L01, he buscado en muchos lugares, incluso en foros en inglés, y no he encontrado que alguien lo haya hecho alguna vez, o al menos lo haya compartido.
Bueno dejando ya la introducción, les comparto la programación que utilicé para tratar de llevar a cabo mi objetivo:
Esta es la programación del PIC.
Código: [Seleccionar]
#include<16F887.h>
#fuses NOWDT, XT, PUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay (clock=4000000)
#include <lib_rf2gh4_10.h>
#byte porta=0x05
#byte portb=0x06
#int_ext

void int_ext_isr(void)              // Si te da error esta línea, sustituir por: void int_ext_isr(void).
{                            // Se encargaría de la recepción de datos.
   int8 ret1;
   
   ret1 = RF_RECEIVE();
   if ( (ret1 == 0) || (ret1 == 1) )
   {
      do
      { 
         ret1 = RF_RECEIVE();
      }while ( (ret1 == 0) || (ret1 == 1) );
   } 
}

void main()

   int8 ret2;
   RF_INT_EN();              // Habilitar interrupción RB0/INT.
   RF_CONFIG_SPI();          // Configurar módulo SPI del PIC.
   RF_CONFIG(0x40,0x01);     // Configurar módulo RF canal y dirección de recepción. Para recibir datos tiene la dirección 0x01. (El canal también se pondrá en el arduino.
   RF_ON();                  // Activar el módulo RF.
   
   delay_ms(5);              // Le damos un mínimo de 2.5 milisegundos para que se ponga en marcha.
   
   set_tris_a(0b111111);     // Todo el puerto A como entradas.
   
   while(true)               // Bucle infinito.
   { 
      RF_DATA[0]=porta;     // Cargamos el dato en RF_DATA[0].
      RF_DIR=0x08;           // Dirección del receptor. (En teoría esta es la que cargaremos en el arduino), podrá verse en el siguiente programa
      ret2=RF_SEND();       // Enviar datos.
   }
}

Y aquí la programación del arduino MEGA

Código: [Seleccionar]
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
 
//Declaremos los pines CE y el CSN para NRF24L01
#define CE_PIN 7
#define CSN_PIN 8
 
byte direccion[6] = {8};  // Dirección que envió el PIC (0x08)
RF24 radio(CE_PIN, CSN_PIN);  // Creael objeto radio (NRF24L01)
char datos[10];   // Buffer para los datos recibidos
 
void setup(){
  radio.begin();   //inicializamos el NRF24L01
//--------------------------------------------------------------------------------------- 
    // Posibles ajustes de ptencia.
    // RF24_PA_MIN = -18dBm, RF24_PA_LOW = -12dBm, RF24_PA_HIGH = -6dBm, RF24_PA_MAX = 0dBm
//--------------------------------------------------------------------------------------- 
  radio.setPALevel(RF24_PA_MAX); // Potencia máxima (irrelevante en modo escucha)
  Serial.begin(9600);
  radio.setChannel(64); // Canal escogido también en el PIC
  radio.openReadingPipe(1, direccion);  // Modo escucha siempre llamar antes que radio.startListening()
  radio.startListening();   // Modo escucha activo
}
 
void loop() {
  if ( radio.available())   // Datos disponibles?
 {   
     radio.read(datos,sizeof(unsigned long));  // Leer los datos
     Serial.println(datos);     // Mostrar los datos en el puerto serial
}
 delay(1000);
}

No logro realizar el enlace, pensé que podría funcionar de esa manera pero no. ¿Tienen alguna idea de como puedo solucionar mi problema? ¿Qué estoy haciendo mal?. Desde ya un abrazo grande a todos, muchas gracias por la colaboración, en el futuro subiré proyectos interesantes que ya he realizado con el PIC16F887.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 7939
Re:Enlace radiofrecuencia PIC16F887 - Arduino MEGA con NRF24L01
« Respuesta #1 en: 26 de Julio de 2020, 21:04:44 »
Y esas librerias son tuyas? Vienen con el compilador? Estan probadas, son correctas? Se usa asi? Veo que son distintas librerias encima.

Desconectado Sispic

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1521
    • winpic800
Re:Enlace radiofrecuencia PIC16F887 - Arduino MEGA con NRF24L01
« Respuesta #2 en: 27 de Julio de 2020, 03:12:55 »
hola ShizenMatsac .

No es mi intencion desanimarte , pero solo te cuento mi experiencia con estos módulos.
Yo también busque estas fuentes por la red y son bastante correctas, hay que hacer cambios para adaptar a las necesidades.
Al cavo de muchas horas peleando pude comunicar los módulos aunque con muy poca fiabilidad y escaso alcance .
máxima potencia 0 dbm = 1mw  solo 40 metros despejado.
los tengo en un cajón por no tirarlos.
Yo no te los aconsejo.

Voy a probar estos , los tengo pero falta time .

https://es.aliexpress.com/item/32975490778.html?src=google&src=google&albch=shopping&acnt=631-313-3945&isdl=y&slnk=&plac=&mtctp=&albbt=Gploogle_7_shopping&aff_atform=google&aff_short_key=UneMJZVf&&albagn=888888&albcp=9866812732&albag=99951347003&trgt=899371718148&crea=es32975490778&netw=u&device=c&albpg=899371718148&albpd=es32975490778&gclid=EAIaIQobChMIxOjGwd3s6gIVUvlRCh0nmADrEAQYAiABEgLEAPD_BwE&gclsrc=aw.ds

Los venden en dos potencias 20dbm=10mw y 30dbm=1w
También en frecuencias de 433mhz, 915mhz etc.

Se envían y reciben los datos USART rs232  : 1200 to 115200 bps(Default: 9600)  configurable.

https://www.hackster.io/akarsh98/esp32-with-e32-433t-lora-module-tutorial-lora-arduino-380902
Aunque el ejemplo es para Arduino no sera muy difícil con pic .

tiene buena pinta .

Suerte


Desconectado ShizenMatsac

  • PIC10
  • *
  • Mensajes: 5
Re:Enlace radiofrecuencia PIC16F887 - Arduino MEGA con NRF24L01
« Respuesta #3 en: 27 de Julio de 2020, 11:26:22 »
hola ShizenMatsac .

No es mi intencion desanimarte , pero solo te cuento mi experiencia con estos módulos.
Yo también busque estas fuentes por la red y son bastante correctas, hay que hacer cambios para adaptar a las necesidades.
Al cavo de muchas horas peleando pude comunicar los módulos aunque con muy poca fiabilidad y escaso alcance .
máxima potencia 0 dbm = 1mw  solo 40 metros despejado.
los tengo en un cajón por no tirarlos.
Yo no te los aconsejo.

Voy a probar estos , los tengo pero falta time .

https://es.aliexpress.com/item/32975490778.html?src=google&src=google&albch=shopping&acnt=631-313-3945&isdl=y&slnk=&plac=&mtctp=&albbt=Gploogle_7_shopping&aff_atform=google&aff_short_key=UneMJZVf&&albagn=888888&albcp=9866812732&albag=99951347003&trgt=899371718148&crea=es32975490778&netw=u&device=c&albpg=899371718148&albpd=es32975490778&gclid=EAIaIQobChMIxOjGwd3s6gIVUvlRCh0nmADrEAQYAiABEgLEAPD_BwE&gclsrc=aw.ds

Los venden en dos potencias 20dbm=10mw y 30dbm=1w
También en frecuencias de 433mhz, 915mhz etc.

Se envían y reciben los datos USART rs232  : 1200 to 115200 bps(Default: 9600)  configurable.

https://www.hackster.io/akarsh98/esp32-with-e32-433t-lora-module-tutorial-lora-arduino-380902
Aunque el ejemplo es para Arduino no sera muy difícil con pic .

tiene buena pinta .

Suerte



Buenas Sispic! Y no lograste probar la versión que presume lograr un enlace de 1km? la que tiene antena?, muchas gracias por el dato! Un abrazo.

Desconectado ShizenMatsac

  • PIC10
  • *
  • Mensajes: 5
Re:Enlace radiofrecuencia PIC16F887 - Arduino MEGA con NRF24L01
« Respuesta #4 en: 27 de Julio de 2020, 11:29:32 »
Y esas librerias son tuyas? Vienen con el compilador? Estan probadas, son correctas? Se usa asi? Veo que son distintas librerias encima.
Buenas KILLERJC, pues no son mías, si están probadas pero la idea es adaptarlas para poder lograr mi objetivo. Ojalá pudiera encontrar librerías similares para esa funcionalidad, he buscado bastante y no lo logro, el camino más fácil es tratar de adaptar librerías que ya están ya que sería muy complicado hacer una nueva librería para eso, considerando también que no soy tan bueno programando.


Desconectado ShizenMatsac

  • PIC10
  • *
  • Mensajes: 5
Re:Enlace radiofrecuencia PIC16F887 - Arduino MEGA con NRF24L01
« Respuesta #6 en: 31 de Julio de 2020, 19:24:36 »
Muy buenas! Logré encontrar una solución y voy a compartirla. Encontré una librería genérica para el arduino y para el PIC. Lo que hace el ejemplo es mandar un valor del 0 al 255 desde el PIC hacia el Arduino. El trabajo que encontré se lo debo a "Luis Castellanos", realmente no sé si se encuentra en el foro, pero vale mucho la pena mencionar.
Programa para el ARDUINO MEGA
Código: [Seleccionar]

#define IRQ_pin                         6
#define CE_pin                          7
#define SS_pin                          8
#define MOSI_pin                        51
#define MISO_pin                        50
#define SCK_pin                         52

#define R_REGISTER_cmd                0x00
#define W_REGISTER_cmd                0x20
#define R_RX_PL_WID_cmd               0x60
#define R_RX_PAYLOAD_cmd              0x61
#define W_TX_PAYLOAD_cmd              0xA0 
#define W_ACK_PAYLOAD_cmd             0xA8
#define W_TX_PAYLOAD_NO_ACK_cmd       0xB0
#define FLUSH_TX_cmd                  0xE1
#define FLUSH_RX_cmd                  0xE2
#define REUSE_TX_PL_cmd               0xE3
#define NOP_cmd                       0xFF

#define CONFIG_reg          0x00
#define EN_AA_reg                     0x01
#define EN_RXADDR_reg                 0x02
#define SETUP_AW_reg       0x03
#define SETUP_RETR_reg                0x04                             
#define RF_CH_reg       0x05                 
#define RF_SETUP_reg                  0x06
#define STATUS_reg                    0x07
#define OBSERVE_TX_reg                0x08
#define RPD_reg                       0x09
#define RX_ADDR_P0_reg                0x0A
#define RX_ADDR_P1_reg                0x0B
#define RX_ADDR_P2_reg                0x0C
#define RX_ADDR_P3_reg                0x0D
#define RX_ADDR_P4_reg                0x0E
#define RX_ADDR_P5_reg                0x0F
#define TX_ADDR_reg                   0x10
#define RX_PW_P0_reg                  0x11
#define RX_PW_P1_reg                  0x12
#define RX_PW_P2_reg                  0x13               
#define RX_PW_P3_reg                  0x14
#define RX_PW_P4_reg                  0x15
#define RX_PW_P5_reg                  0x16
#define FIFO_STATUS_reg               0x17
#define DYNPD_reg                     0x1C
#define FEATURE_reg                   0x1D


unsigned char x, uchartemperatura, uchartemperatura1 = 0;
int t, h;


unsigned char nRF24L01_read()
{
  unsigned char s = 0;
  unsigned char msg = 0;
 
  for(s = 0; s < 8; s++)
  {
      msg <<= 1;
      digitalWrite(SCK_pin, HIGH);
      if(digitalRead(MISO_pin) != 0)
      {
        msg |= 1;
      }
      digitalWrite(SCK_pin, LOW);
  }
 
  return msg;
}


void nRF24L01_write(unsigned char d)
{
  unsigned char s = 0;
 
  for(s = 0; s < 8; s++)
  {
    if((d & 0x80) != 0)
    {
      digitalWrite(MOSI_pin, HIGH);
    }
    else
    {
      digitalWrite(MOSI_pin, LOW);
    }
    d <<= 1;
    digitalWrite(SCK_pin, HIGH);
    digitalWrite(SCK_pin, LOW);
  }
}


void register_write(unsigned char reg, unsigned char value)
{
  digitalWrite(SS_pin, LOW);
  nRF24L01_write((reg | W_REGISTER_cmd));
  nRF24L01_write(value);
  digitalWrite(SS_pin, HIGH);
}


void write_command(unsigned char cmd)
{
  digitalWrite(SS_pin, LOW);
  nRF24L01_write(cmd);
  digitalWrite(SS_pin, HIGH);
}


unsigned char register_read(unsigned char reg)
{
  unsigned char value = 0;
 
  digitalWrite(SS_pin, LOW);
  nRF24L01_write((reg | R_REGISTER_cmd));
  value = nRF24L01_read();
  digitalWrite(SS_pin, HIGH);
 
  return value;
}


void set_TX_RX_address(unsigned char *addr, unsigned char bytes, unsigned char reg)
{
  unsigned char n = 0;
 
  digitalWrite(SS_pin, LOW);
  nRF24L01_write((reg | W_REGISTER_cmd));
  for(n = 0; n < bytes; n++)
  {
    nRF24L01_write(addr[n]);
  }
  digitalWrite(SS_pin, HIGH);
}


void flush_TX_RX()
{
  register_write(STATUS_reg, 0x70);
  write_command(FLUSH_TX_cmd);
  write_command(FLUSH_RX_cmd);
}


void send_data(unsigned char bytes, unsigned char *value)
{
  unsigned char s = 0;
 
  flush_TX_RX();
  register_write(CONFIG_reg, 0x3A);
 
  digitalWrite(SS_pin, LOW);
  nRF24L01_write(W_TX_PAYLOAD_cmd);
  for(s = 0; s < bytes; s++)
  {
    nRF24L01_write(value[s]);
  }
  digitalWrite(SS_pin, HIGH);

  digitalWrite(CE_pin, HIGH);
  delayMicroseconds(60);
  digitalWrite(CE_pin, LOW);
 
  register_write(CONFIG_reg, 0x38);
}

void receive_data(unsigned char bytes, unsigned char *value)
{
  unsigned char s = 0;
 
  digitalWrite(SS_pin, LOW);
  nRF24L01_write(R_RX_PAYLOAD_cmd);
  for (s = 0; s < bytes; s++)
  {
    value[s] = nRF24L01_read();
  }
  digitalWrite(SS_pin, HIGH);
}


void nrF24L01_TXinit()
{
  unsigned char address[5] = {0x99, 0x99, 0x99, 0x99, 0x99};
 
  digitalWrite(CE_pin, LOW);
 
  register_write(SETUP_RETR_reg, 0x00);
  register_write(SETUP_AW_reg, 0x03);
  register_write(RF_SETUP_reg, 0x0E);
  register_write(RF_CH_reg, 0x09); 
  register_write(EN_AA_reg, 0x00);
  register_write(CONFIG_reg, 0x38);
  set_TX_RX_address(address, 5, TX_ADDR_reg);
  set_TX_RX_address(address, 5, RX_ADDR_P0_reg);
  flush_TX_RX();
 
  digitalWrite(CE_pin, HIGH);
}

void nrF24L01_RXinit()
{
  unsigned char address[5] = {0x99, 0x99, 0x99, 0x99, 0x99};
 
  digitalWrite(CE_pin, LOW);
 
  register_write(CONFIG_reg, 0x38);
  register_write(SETUP_RETR_reg, 0x00);
  register_write(SETUP_AW_reg, 0x03);
  register_write(RF_SETUP_reg, 0x0E);
  register_write(RF_CH_reg, 0x09); 
  register_write(EN_AA_reg, 0x00);
  register_write(RX_PW_P0_reg, 0x01);
  register_write(CONFIG_reg, 0x3B);
  set_TX_RX_address(address, 5, TX_ADDR_reg);
  set_TX_RX_address(address, 5, RX_ADDR_P0_reg);
  flush_TX_RX();
 
  digitalWrite(CE_pin, HIGH);
}

unsigned char get_Status_Reg()
{
  return register_read(STATUS_reg);
}



void setup()
{
  unsigned char val = 0;
 
  pinMode(IRQ_pin, INPUT_PULLUP);
  pinMode(MISO_pin, INPUT);
  pinMode(CE_pin, OUTPUT);
  pinMode(SS_pin, OUTPUT);
  pinMode(SCK_pin, OUTPUT);
  pinMode(MOSI_pin, OUTPUT);

  digitalWrite(CE_pin, LOW);
  digitalWrite(SS_pin, LOW);
  digitalWrite(SCK_pin, LOW);
  digitalWrite(MOSI_pin, LOW);
 
  Serial.begin(9600);
  Serial.flush();
 
  nrF24L01_RXinit();
 
  delay(900);
 
  val = register_read(SETUP_RETR_reg);
  Serial.print("SETUP_RETR: 0x");
  Serial.println(val, HEX);
 
  val = register_read(SETUP_AW_reg);
  Serial.print("SETUP_AW: 0x");
  Serial.println(val, HEX);
 
  val = register_read(RF_SETUP_reg);
  Serial.print("RF_SETUP: 0x");
  Serial.println(val, HEX);
 
  val = register_read(RF_CH_reg);
  Serial.print("RF_CH: 0x");
  Serial.println(val, HEX);
 
  val = register_read(EN_AA_reg);
  Serial.print("EN_AA: 0x");
  Serial.println(val, HEX);
 
  val = register_read(CONFIG_reg);
  Serial.print("CONFIG: 0x");
  Serial.println(val, HEX);
}


void loop()
{
  if(get_Status_Reg() == 0x40)
  {
    receive_data(1, &x);
    Serial.println(x);
   
    if (x == 5){ //Evaluando el valor de X
      flush_TX_RX();
      nrF24L01_TXinit(); //Cuando el tranceptor pasa de TX a RX colocar el dedo en el cristal del tranceptor para atterizar bien la tierra y que el modulo envie mensaje
      delay(3000);
      x = 0;
      while(1){
          send_data(1, &x);
          x++;
          Serial.println(x);
        }   
      }
   
   
   
  }
 
   
}

Programa para PIC16F887

Código: [Seleccionar]
sbit RF_IRQ_TRIS at TRISB0_bit;
sbit RF_CS_TRIS at TRISC1_bit;
sbit RF_CE_TRIS at TRISC2_bit;
sbit SCK_TRIS at TRISC3_bit;
sbit SDI_TRIS at TRISC4_bit;
sbit SDO_TRIS at TRISC5_bit;

sbit IRQ_pin at RB0_bit;
sbit SS_pin at RC1_bit;
sbit CE_pin at RC2_bit;
sbit SCK_pin at RC3_bit;
sbit MOSI_pin at RC5_bit; //SDO Escritura Salida
sbit MISO_pin at RC4_bit; //SDI Lectura Entrada

sbit Led at RC1_bit;

#define R_REGISTER_cmd                0x00
#define W_REGISTER_cmd                0x20
#define R_RX_PL_WID_cmd               0x60
#define R_RX_PAYLOAD_cmd              0x61
#define W_TX_PAYLOAD_cmd              0xA0
#define W_ACK_PAYLOAD_cmd             0xA8
#define W_TX_PAYLOAD_NO_ACK_cmd       0xB0
#define FLUSH_TX_cmd                  0xE1
#define FLUSH_RX_cmd                  0xE2
#define REUSE_TX_PL_cmd                      0xE3
#define NOP_cmd                       0xFF

#define CONFIG_reg                         0x00
#define EN_AA_reg                     0x01
#define EN_RXADDR_reg                 0x02
#define SETUP_AW_reg                      0x03
#define SETUP_RETR_reg                0x04
#define RF_CH_reg                      0x05
#define RF_SETUP_reg                  0x06
#define STATUS_reg                    0x07
#define OBSERVE_TX_reg                0x08
#define RPD_reg                       0x09
#define RX_ADDR_P0_reg                0x0A
#define RX_ADDR_P1_reg                0x0B
#define RX_ADDR_P2_reg                0x0C
#define RX_ADDR_P3_reg                0x0D
#define RX_ADDR_P4_reg                0x0E
#define RX_ADDR_P5_reg                0x0F
#define TX_ADDR_reg                   0x10
#define RX_PW_P0_reg                  0x11
#define RX_PW_P1_reg                  0x12
#define RX_PW_P2_reg                  0x13
#define RX_PW_P3_reg                  0x14
#define RX_PW_P4_reg                  0x15
#define RX_PW_P5_reg                  0x16
#define FIFO_STATUS_reg               0x17
#define DYNPD_reg                     0x1C
#define FEATURE_reg                   0x1D


unsigned char x = 0;


unsigned char nRF24L01_read()
{
  unsigned char s = 0;
  unsigned char msg = 0;

  for(s = 0; s < 8; s++)
  {
      msg <<= 1;
      SCK_pin = 1;
      delay_us(8);
      if(MISO_pin != 0)
      {
        msg |= 1;
      }
      SCK_pin = 0;
      delay_us(8);
  }

  return msg;
}


void nRF24L01_write(unsigned char d)
{
  unsigned char s = 0;

  for(s = 0; s < 8; s++)
  {
    if((d & 0x80) != 0)
    {
      MOSI_pin = 1;
    }
    else
    {
      MOSI_pin = 0;
    }
    d <<= 1;
    SCK_pin = 1;
    delay_us(8);
    SCK_pin = 0;
    delay_us(8);
  }
}


void register_write(unsigned char reg, unsigned char value)
{
  SS_pin = 0;
  nRF24L01_write((reg | W_REGISTER_cmd));
  nRF24L01_write(value);
  SS_pin = 1;
  delay_us(8);
}


void write_command(unsigned char cmd)
{
  SS_pin = 0;
  nRF24L01_write(cmd);
  SS_pin = 1;
  delay_us(8);
}


unsigned char register_read(unsigned char reg)
{
  unsigned char value = 0;

  SS_pin = 0;
  nRF24L01_write((reg | R_REGISTER_cmd));
  value = nRF24L01_read();
  SS_pin = 1;
  delay_us(8);

  return value;
}


void set_TX_RX_address(unsigned char *addr, unsigned char bytes, unsigned char reg)
{
  unsigned char n = 0;

  SS_pin = 0;
  nRF24L01_write((reg | W_REGISTER_cmd));
  for(n = 0; n < bytes; n++)
  {
    nRF24L01_write(addr[n]);
  }
  SS_pin = 1;
  delay_us(8);
}


void flush_TX_RX()
{
  register_write(STATUS_reg, 0x70);
  write_command(FLUSH_TX_cmd);
  write_command(FLUSH_RX_cmd);
}


void send_data(unsigned char bytes, unsigned char *value)
{
  unsigned char s = 0;

  flush_TX_RX();
  register_write(CONFIG_reg, 0x3A);

  SS_pin = 0;
  nRF24L01_write(W_TX_PAYLOAD_cmd);
  for(s = 0; s < bytes; s++)
  {
    nRF24L01_write(value[s]);
  }
  SS_pin = 1;
  delay_us(8);

  CE_pin = 1;
  delay_us(60);
  CE_pin = 0;

  register_write(CONFIG_reg, 0x38); //En modo RX se quita
}

void receive_data(unsigned char bytes, unsigned char *value)
{
  unsigned char s = 0;

  SS_pin = 0;
  nRF24L01_write(R_RX_PAYLOAD_cmd);
  for (s = 0; s < bytes; s++)
  {
    value[s] = nRF24L01_read();
  }
  SS_pin = 1;
  delay_us(8);
}


void nrF24L01_init_TX()
{
  unsigned char address[5] = {0x99, 0x99, 0x99, 0x99, 0x99};

  CE_pin = 0;

  register_write(SETUP_RETR_reg, 0x00);
  register_write(SETUP_AW_reg, 0x03);
  register_write(RF_SETUP_reg, 0x0E);
  register_write(RF_CH_reg, 0x09);
  register_write(EN_AA_reg, 0x00);
  register_write(CONFIG_reg, 0x38);
  set_TX_RX_address(address, 5, TX_ADDR_reg);
  set_TX_RX_address(address, 5, RX_ADDR_P0_reg);
  flush_TX_RX();

  CE_pin = 1;
}

void nrF24L01_init_RX()
{
  unsigned char address[5] = {0x99, 0x99, 0x99, 0x99, 0x99};

  CE_pin = 0;

  register_write(CONFIG_reg, 0x38);
  register_write(SETUP_RETR_reg, 0x00);
  register_write(SETUP_AW_reg, 0x03);
  register_write(RF_SETUP_reg, 0x0E);
  register_write(RF_CH_reg, 0x09);
  register_write(EN_AA_reg, 0x00);
  register_write(RX_PW_P0_reg, 0x01);
  register_write(CONFIG_reg, 0x3B);
  set_TX_RX_address(address, 5, TX_ADDR_reg);
  set_TX_RX_address(address, 5, RX_ADDR_P0_reg);
  flush_TX_RX();

  CE_pin = 1;
}

unsigned char get_Status_Reg()
{
  return register_read(STATUS_reg);
}


  unsigned char val = 0;

void main(){

delay_ms(1000);
//Enntradas con 1 y salidas 0
 TRISA     =  0x00;
 TRISB     =  0x00;
 TRISC     =  0x00;
 ADCON1 = 0x0F;
 PORTB = 0X00;
 PORTC = 0x00;

 RF_IRQ_TRIS = 1;
 RF_CS_TRIS = 0;
 RF_CE_TRIS = 0;
 SCK_TRIS = 0;
 SDI_TRIS = 1;  //MISO
 SDO_TRIS = 0;  //MOSI

 CE_pin = 0;
 SS_pin = 0;
 SCK_pin = 0;
 MOSI_pin = 0;

 delay_ms(1000);

 nrF24L01_init_TX();

 delay_ms(900);


 while(1){
  send_data(1, &x);
  porta = x;
  x++;
  delay_ms(1000);
  Led = 1;
  if (x == 6){
   flush_TX_RX();
   nrF24L01_init_RX();
   delay_ms(900);
   porta = 0;
   x = 0;
   while(1){
    if(get_Status_Reg() == 0x40)
    {
      receive_data(1, &x);
      porta = x;
    }
   }
  }
 }
}

En los dos, los parámetros de los pines a usarse pueden configurarse, y básicamente podremos lograr comunicar CUALQUIER PIC con arduino modificando ciertos parámetros en el comienzo del código.

Desconectado Sispic

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1521
    • winpic800
Re:Enlace radiofrecuencia PIC16F887 - Arduino MEGA con NRF24L01
« Respuesta #7 en: 01 de Agosto de 2020, 03:30:15 »
enhorabuena  ShizenMatsac .

usas los modulos  NRF24L01 -18dBm  ó  NRF24L01 + PA + LNA Módulo con SMA  0dbm ??
que tal te fue el alcance ?





Desconectado ShizenMatsac

  • PIC10
  • *
  • Mensajes: 5
Re:Enlace radiofrecuencia PIC16F887 - Arduino MEGA con NRF24L01
« Respuesta #8 en: 01 de Agosto de 2020, 13:39:25 »
enhorabuena  ShizenMatsac .

usas los modulos  NRF24L01 -18dBm  ó  NRF24L01 + PA + LNA Módulo con SMA  0dbm ??
que tal te fue el alcance ?





Bueno uso el módulo de -18dBm al parecer, el que no tiene la antena. No probé el alcance porque las pruebas las hice en protoboard (No me suele gustar trabajar en la protoboard), de todas formas, la protoboard me genera ruído, además, quizás necesite ver la forma de estabilizar lo mejor que pueda los cristales del PIC. Tuve que toquetear ciertas cosas y de repente se hacía el enlace por unos segundos, y luego se iba, pero como dije, ha de ser cuestión de ruído y deberán ser factores que tendré que tener en cuenta al diseñar el PCB.
He leído en muchas partes que el módulo con la antena es muy bueno, el de 1km. Comentaré mi experiencia cuando lo pruebe.


 

anything