Muy buenas a todos, soy nuevo en el foro. Tengo un problema de programación que no logro resolver y estaría necesitando ayuda; la idea es intercomunicar un PIC16F887 con un Arduino MEGA usando el transceptor NRF24L01, básicamente la idea principal es tener varios esclavos con los pics, y que el arduino mega sea el maestro, pero de momento lo único que estoy buscando es lograr una comunicación de la forma que sea (Que el PIC envíe datos, o que el arduino envíe datos, o que los dos sean transmisores y receptores). De igual forma debajo compartiré el progreso de mi programación. En un futuro subiré colaboraciones de proyectos hechos, ya había trabajado con transceptores, específicamente el XBEE, para hacer un robot con el 16F887, pero quiero probar el NRF, es mucho más barato y tiene un rango de alcance muy elevado.
Esta es la programación del PIC16F887
Y esta la programación del arduino MEGA
Esta es la programación del PIC16F887
C:
#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.
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.
ret2=RF_SEND(); // Enviar datos.
}
}
Y esta la programación del arduino MEGA
C++:
#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 elegida en 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 en el pic (0x40)
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);
}