DCCpp puente RF433


La radiofrecuencia de 433MHz es una banda de frecuencia utilizada comúnmente en dispositivos inalámbricos, como controles remotos, sistemas de seguridad, sistemas de monitoreo, domótica y, por supuesto, Arduino.

90

En el mundo Arduino los más conocidos son el módulos emisor FS1000A y módulo el receptor XY-MK-5V son muy populares dado su bajo coste y fácil implementación.

Estos módulos trabajan a una frecuencia de 433MHz que pertenece a una banda libre así que no hay problemas para usarlo y no tener problemas con la ley.

Para este montaje usaremos un módulo XY-MK-5V en la central DCCpp LMD que alimentaremos con los 5V de la placa.



Para poder tener activos los retromodulos tenemos que configurar el archivo Dccpp.h. Para ello editaremos el archivo en sus primeras lineas.

Así que primero tenemos que comentar los sensores y después quitar el comentario para uso del sistema S88 para no tener conflictos con la gestión de los sensores.

También tenemos que quitar los comentarios a USE_RF433 y USE_SERIALAUX:

// #define USE_SENSOR	// Activa sensores. No compatible con retromodulos S88.
// #define USE_S88      // Activa compatibilidad con retromodulos S88.
#define USE_RF433		// Activa recepción de comunicación RF433. (necesita USE_SERIALAUX)

#define USE_SERIALAUX   // Serial3.

Para conectar el módulo RF433 XY-MK-5V necesitamos otro dispositivo con un Arduino NANO o UNO. Este Arduino se comunica con la central por el canal serial Serial3.

Conexión puente Arduino NANO RF433 con DCCppLMD

Gestión de datos:

Una vez tenemos las conexiones entre el receptor RF433 XY-MK-5V y el Arduino NANO y antes de conectarlo al puerto D15 de la placa Arduino MEGA, cargamos el programa que tenemos a continuación:


#include <VirtualWire.h>


const int receive_pin = A4;
char b;

#define MAX_COMMAND_LENGTH 30
char commandString[MAX_COMMAND_LENGTH + 1];

void setup()
{
    Serial.begin(115200);	// Debugging only
    Serial.println("Receptor: setup");

    // Se inicializa el RF
    vw_setup(2000);	 // velocidad: Bits per segundo
    vw_set_ptt_inverted(true);  // Requerido para RD3100
    vw_set_rx_pin(2);    //Pin 2 como entrada del RF
    vw_rx_start();       // Se inicia como receptor
}
 

// Recibe datos RF433
void  Recibe433() {
  uint8_t buf[VW_MAX_MESSAGE_LEN];
  uint8_t buflen = VW_MAX_MESSAGE_LEN;

  if (vw_get_message(buf, &buflen)) // Non-blocking
  {
    int i;

    for (i = 0; i < buflen; i++)
    {
      // Serial.print((char)buf[i]);
      b = (char)buf[i];


      if (b == '<') {                   // start of new command
        commandString[0] = 0;
      } else if (b == '>') {              // end of new command

          Serial.print("<"); // 
          Serial.print(commandString); // 
          Serial.println(">"); // 

      }    else if (strlen(commandString) <  MAX_COMMAND_LENGTH)  // if commandString still has space, append character just read from serial line
        sprintf(commandString, "%s%c", commandString, b); // otherwise, character is ignored (but continue to look for '<' or '>')
    }
  }
}

void loop()
{
  Recibe433();
}

¿Que hace el programa?

Con este sketch recibimos los datos de la transmisión por RF en el pin A4 con la ayudad de la librería VirtualWire.h.

El dato se almacena como una cadena de caracteres de tipo char que luego enviamos mediante comunicación serial con el pin 1 Tx.

La trama es la misma que genera la central qx para un estado bajo del sensor y Qx para un estado alto.

Central DCCppLMD ¿Qué hace USE_RF433?


Al activar la definición "#define USE_RF433" Activamos las siguientes lineas del archivo TextCommand.cpp.

 #ifdef USE_RF433
	case 'q':
		// Serial.println("sensor bajo");
		datasen = "<q" + String(com[1]) + ">";
		datasen.toCharArray(char_s, datasen.length()+1);
		CommManager::printf(char_s);	 
		return true;
	
	case 'Q':
		// Serial.println("sensor Alto");
		datasen = "<Q" + String(com[1]) + ">";
		datasen.toCharArray(char_s, datasen.length()+1);
		CommManager::printf(char_s);	 			
		return true;
#endif

Esto redirige los datos desde el Serial3 a todos los demás puertos seriales. Este código va situado antes de los comandos para los sensores reales que utiliza la central. Con esto conseguinos que todos los programas que estén conectados a cualquiera de los puertos seriales recibirá la información sobre los sensores conectados a esta red.

El problema que me surgió al implementar y por lo que esta de la central es por el uso de la librería VirtualWire que utilizan el mismo timer, y si usas uno, no puedes usar otro.

Pasa algo parecido con la librería servos.h que no son compatibles por el uso del timer. La librería RadioHead RH_ASK.h tiene el mismo problema, así que no quedo otro remedio que tener que hacer un microcontrolador exclusivo para esta función.

La parte buena de este sistema es que no se limita a la comunicación con los sensores. Todos los comandos DCC que enviemos al puente DCC-RF433 llegarán a la central. Con esto podemos operar la central desde cualquier otro dispositivo como un mando. Eso si, no tendremos las respuestas de la central.





Página siguiente

Página anterior

Volver al índice

Descargar Librería DCCpp_LMD 2.0.4 (Modificación Oled, S88, Sonido, wifi, Bluetooth, Serial3, teclado y encoder)

Seguiré actualizando!!!