Uso basico del modulo RFM69HCW 915MHz en esp32

Recientemente adquiri 4 Modulos "RFM69HCW 915MHz Transceptor Lora"

1691715637790.jpeg

La finalidad es experimentar y conocer si estos modulos los puedo explotar en mi propiedad para diferentes "Dataloggers" de mi jardin.

Primero que nada, me ha costado mucho tiempo poder lograr lo que en seguida compartire en los codigos ya que he pasado el mayor tiempo tratando de encontrar la Conexion adecuada entre dicho modulo y mis ESP32 que estoy ocupando por el tema de que estos modulos solo funcionan a 3.3 volts y aunque tengo arduinos UNO disponibles, como sabemos, estos funcionan a 5 volts en sus niveles logicos y para lograr los ejemplos que hay por la Internet se requiere de uno o varios Convertidor de Nivel Lógico bidireccionales de 5 a 3 volts los cuales no tengo.

Por otro lado, en la capa de software, encontrar una libreria adecuada tambien fue una buena faena ya que nunca pasaba de la configuracion y comprobacion de que el modulo fuera inicializado de manera correcta, es decir, las diferentes librerias se quedan en el limbo "esperando" a que el modulo respondiera, o me mandaba un error inmediato lo cual fue muy desmotivador, incluso pense que habia fastidiado el modulo por mala conexion, etc.

Finalmente con la libreria RFM69.h y la siguiente conexion entre el ESP32 y el Modulo RFM69 pude finalmente lograr un enlace muy sencillo.

1691717319511.png

1691717392366.png

Nota.- La conexion es excatamente la misma tanto para el transmisor como para el receptor.


Ahora dejo el codigo para el Receptor:

C++:
/*   Receptor usando RFM69

La forma mas burda de recibir un Buffer

*/
//Definimos los pines donde se conectan los LEDS
  #define LedRojo 26
  #define LedVerde 25
  #define LedBlanco 33

  unsigned long T_Evento=millis();
  float TxContador=0;//Variable que contiene el numero de envios
  char buffer[35];// creamos la variable Buffer que contendra el dato que se debe transmitir

//configuracion del modulo RFM69
#include <RFM69.h>
#include <SPI.h>
#define NETWORKID     200   //Identificador de RED igual en todos los radios
#define MYNODEID      1   //Nuestro ID
#define TONODEID      2   //ID del nodo al que enviamos datos
#define FREQUENCY     RF69_915MHZ //Europa es RF69_434MHZ
#define ENCRYPTKEY    "TOPSECRETPASSWRD" // Clave igual para cada radio
#define USEACK        true // Pedimos ACK de retorno para cada paquete
#define IS_RFM69HCW false // Si tu radio es RFM69HCW entonces va "true"
#define POWER_LEVEL 31 // Valor máximo de potencia
#define SPI_CS              5 //NSS o Cable Select al GPIO 5
#define IRQ_PIN             2 // DIO0 conectado a GPIO2
#define IRQ_NUM             2 //IRQ igual al pin

RFM69 radio = RFM69(SPI_CS, IRQ_PIN, IS_RFM69HCW, IRQ_NUM);

void setup() {

Serial.begin(115200);
pinMode(LedRojo,OUTPUT);
pinMode(LedVerde,OUTPUT);
pinMode(LedBlanco,OUTPUT);
digitalWrite(LedRojo,LOW);
digitalWrite(LedVerde,LOW);
digitalWrite(LedBlanco,LOW);

//Se inicializa el Modulo RFM69

if(radio.initialize(FREQUENCY, MYNODEID, NETWORKID))
     Serial.println("Se a Inicializado el Radio satisfactoriamente");
#ifdef IS_RFM69HW_HCW
  radio.setHighPower(); //configuramos el radio a su maxima potencia
#endif
  radio.encrypt(ENCRYPTKEY);
 
#ifdef ENABLE_ATC
  radio.enableAutoPower(ATC_RSSI);
#endif


}



void loop() {

if (radio.receiveDone()){ //Espera hasta recibir un dato
    String Mensaje = "";
    for (byte i = 0; i < radio.DATALEN; i++){
      // Se construye el mesaje recibido:
      Mensaje.concat((char)radio.DATA[i]);
    }
    //Envio de ACK cuando es solicitada
    if (radio.ACKRequested()){
      radio.sendACK();
    }
    Serial.println(Mensaje);
 }


//creamos un evento cada 1000 ms para hacer titilar un led
if ( millis() - T_Evento >= 1000 ) {
 
  digitalWrite(LedVerde,!digitalRead(LedVerde)); //invertimos el estado del Led para ver que hay actividad

   T_Evento = millis();// Actualizamos el valor de T_Evento
 }



}


Y aca el del transmisor:

C++:
/*   Receptor usando RFM69

La forma mas burda de recibir un Buffer

*/
//Definimos los pines donde se conectan los LEDS
  #define LedRojo 26
  #define LedVerde 25
  #define LedBlanco 33

  unsigned long T_Evento=millis();
  float TxContador=0;//Variable que contiene el numero de envios
  char buffer[35];// creamos la variable Buffer que contendra el dato que se debe transmitir

//configuracion del modulo RFM69
#include <RFM69.h>
#include <SPI.h>
#define NETWORKID     200   //Identificador de RED igual en todos los radios
#define MYNODEID      2   //Nuestro ID
#define TONODEID      1   //ID del nodo al que enviamos datos
#define FREQUENCY     RF69_915MHZ //Europa es RF69_434MHZ
#define ENCRYPTKEY    "TOPSECRETPASSWRD" // Clave igual para cada radio
#define USEACK        true // Pedimos ACK de retorno para cada paquete
#define IS_RFM69HCW false // Si tu radio es RFM69HCW entonces va "true"
#define POWER_LEVEL 31 // Valor máximo de potencia
#define SPI_CS              5 //NSS o Cable Select al GPIO 5
#define IRQ_PIN             2 // DIO0 conectado a GPIO2
#define IRQ_NUM             2 //IRQ igual al pin

RFM69 radio = RFM69(SPI_CS, IRQ_PIN, IS_RFM69HCW, IRQ_NUM);

void setup() {

Serial.begin(115200);
pinMode(LedRojo,OUTPUT);
pinMode(LedVerde,OUTPUT);
pinMode(LedBlanco,OUTPUT);
digitalWrite(LedRojo,LOW);
digitalWrite(LedVerde,LOW);
digitalWrite(LedBlanco,LOW);

//Se inicializa el Modulo RFM69

if(radio.initialize(FREQUENCY, MYNODEID, NETWORKID))
     Serial.println("Se a Inicializado el Radio satisfactoriamente");
#ifdef IS_RFM69HW_HCW
  radio.setHighPower(); //configuramos el radio a su maxima potencia
#endif
  radio.encrypt(ENCRYPTKEY);
 
#ifdef ENABLE_ATC
  radio.enableAutoPower(ATC_RSSI);
#endif


}



void loop() {

// hacemos una transmision cada 5000 ms
if ( millis() - T_Evento >= 5000 ) {
 
  digitalWrite(LedVerde,!digitalRead(LedVerde)); //invertimos el estado del Led para ver que hay actividad
    sprintf(buffer, "Numero de Transmisión=%.0f",TxContador); //creamos el Buffer que se enviara  
       radio.sendWithRetry(TONODEID, buffer, sizeof((buffer)));   //se envia el contenido del buffer
       Serial.println(buffer);// mandamos el contendio del buffer para monitorear desde el puerto serie
          TxContador++; //incrementamos la variable en uno

   T_Evento = millis();// Actualizamos el valor de T_Evento
 }

}

Ahora el motivo de abrir este tema, primero que nada esperando que el presente sirva a algunos que quieran experimentar con este modulo ya que en las busquedas no encontre nada al respecto, segundo saber si algunos han podido tener resultados optimos con estos modulos, me refiero a Covertura, confiabilidad, incluso sobre esta libreria o, si existen otras que conozcan.

A mi me ha "decepcionado" un poco, ya que la covertura en metros ha sido muy pobre; no he logrado mas de 10 metros. Muy probablemente por el tipo de antena que estoy utilizando que como ven en la foto es un simple alambre muy burdo y en estos dias intentare calcular y armar algo mas formal (inicialmente una Dipolo) a ver que tanto mejora la covertura. por hoy es todo, como siempre espero sus comentariosy experiencias.

Saludos a todos los amables compañeros.
 
¿el hardware si soporta ir a los 433? normalmente uno usaría la banda de 868 para no desplazar demasiado la frecuencia, al menos es como tengo los módulos de Anaren, para los 433 sí cambian los valores de algunos componentes.
 
¿el hardware si soporta ir a los 433? normalmente uno usaría la banda de 868 para no desplazar demasiado la frecuencia, al menos es como tengo los módulos de Anaren, para los 433 sí cambian los valores de algunos componentes.

En mi caso el modulo viene fijado a 915 MHZ como podras ver en el propio modulo, con una marcas de tinta.


1691722875111.png

Ya intente modificar a otra frecuencia, pero no veo ningun cambio, de echo era parte de mi problema inicial.

Saludos y gracias por tu comentario
 
En mi caso el modulo viene fijado a 915 MHZ como podras ver en el propio modulo, con una marcas de tinta.

Ya intente modificar a otra frecuencia, pero no veo ningun cambio, de echo era parte de mi problema inicial.

Saludos y gracias por tu comentario
Sí, lo esperaba, por eso preguntaba por el comentario del código, algunos condensadores e inductores del circuito para la antena cambia y es posible ponerlo a 868 a veces, pero pasarlo a 433 es demasiado, igual es responsabilidad de cada quien confirmar que pueda usar dicha frecuencia, sobre todo si lo piden de china y no localmente donde la entidad reguladora tiene que haberlo aprobado para venta primero.
 
Solo comentar que con antenas dipolo bien hechas y calculadas logre 300 mts con vista directa sin perdidas, mas ya no es fiable, asi que para los costos de un Microcontrolador mas el modulo RFM69HCW , sobrepasa por mucho el costo de un ESP32 utilizando la tecnologia ESP32 NOW y con menor esfuerzo.

Saludos y buen dia.
 
Solo comentar que con antenas dipolo bien hechas y calculadas logre 300 mts con vista directa sin perdidas, mas ya no es fiable, asi que para los costos de un Microcontrolador mas el modulo RFM69HCW , sobrepasa por mucho el costo de un ESP32 utilizando la tecnologia ESP32 NOW y con menor esfuerzo.

Saludos y buen dia.

Hola, podrías pasar que modelo de antena realizaste? Estoy experimentando con antenas para 915 MHz para los gateway para ver si puedo acercarme a las comerciales, para calcular hice un nodo medidor RSSI así puedo comparar una con otras.
La que realicé por ahora es colineal de 1/4 lambda, obtuve buenos resultados pero no logro acercarme a la comercial.
 
Última edición por un moderador:
Hola, podrías pasar que modelo de antena realizaste? Estoy experimentando con antenas para 915 MHz para los gateway para ver si puedo acercarme a las comerciales, para calcular hice un nodo medidor RSSI así puedo comparar una con otras.
La que realicé por ahora es colineal de 1/4 lambda, obtuve buenos resultados pero no logro acercarme a la comercial.
Pues no hice otra cosa que una dipolo simple con dos trozos de cobre directamente soldados al modulo RFM69HCW.

Saludos
 
Atrás
Arriba