Librería NmraDCC


Esta biblioteca le permite conectarse a una señal de seguimiento NMRA DCC y recibir comandos DCC en un terminal serial. Posteriormente podemos usar esos datos como velocidad, direcciones o estados.

Más enfocada a decodificadores de funciones (FN0-FN28) como por ejemplo una rotonda o un accesorio que tenga varias funciones como una grúa puente.

¿Para qué sirve un decodificador NMRA?

  • Control individual de cada locomotora: Permite controlar la velocidad, dirección y otras funciones de cada locomotora de forma independiente, incluso si están en la misma vía.
  • Funciones avanzadas: Ofrece la posibilidad de programar diversas funciones como sonidos, luces, cambios de dirección automáticos, etc., lo que hace la experiencia de modelismo mucho más realista y divertida.
  • Compatibilidad: Al seguir el estándar DCC, los decodificadores NMRA son compatibles con una amplia gama de centrales digitales y accesorios, lo que te permite ampliar y personalizar tu maqueta.

¿Cómo funciona un decodificador NMRA?

El decodificador recibe señales digitales de una central de control DCC. Estas señales contienen información sobre la velocidad, dirección, luces y otras funciones que se desean aplicar a la locomotora.

El decodificador interpreta estas señales y las convierte en señales eléctricas que controlan el motor y otros componentes de la locomotora.


Características clave de un decodificador NMRA:

  • CVs (Variables de Configuración): Son parámetros que se pueden modificar para personalizar el comportamiento del decodificador y de la locomotora.
  • Manufacturer ID: Un número que identifica al fabricante del decodificador.
  • Dirección DCC: Un número único que asigna a cada locomotora una dirección específica en el sistema DCC.

Como usar la librería NmraDCC.h

Al iniciar el archivo del programa usaremos #include para la librería y declaramos los objetos NmraDCC y DCC_MSG.

#include <NmraDcc.h>

NmraDcc  Dcc ;
DCC_MSG  Packet ;

Lectura de señal DCC:

Lector de señal DCC

Ahora declaramos el pin donde se realiza la lectura del montaje con el integrado con 6N137 y que como sabemos es imprescindible en cualquier montaje par un decodificador DCC, ya sea de locomotoras, funciones o accesorios.

La librería NmraDcc utiliza por defecto el pin 2 de las placas Arduino UNO o NANO.


// Define the Arduino input Pin number for the DCC Signal 
#define DCC_PIN     2

Función principal en loop:

Con el método Dcc.process(); llamaremos a la función principal de la librería NmraDcc.h que se ejecutará constantemente.

void loop()
{
  // You MUST call the NmraDcc.process() method frequently from the Arduino loop() function for correct library operation
  Dcc.process();
}

notifyDccSpeed

La función notifyDccSpeed obtiene los para un dirección DCC especifica para locomotoras.

// This call-back function is called whenever we receive a DCC Speed packet for our address 
void notifyDccSpeed( uint16_t Addr, DCC_ADDR_TYPE AddrType, uint8_t Speed, DCC_DIRECTION Dir, DCC_SPEED_STEPS SpeedSteps )
{
  #ifdef DEBUG_SPEED
  Serial.print("notifyDccSpeed: Addr: ");
  Serial.print(Addr,DEC);
  Serial.print( (AddrType == DCC_ADDR_SHORT) ? "-S" : "-L" );
  Serial.print(" Speed: ");
  Serial.print(Speed,DEC);
  Serial.print(" Steps: ");
  Serial.print(SpeedSteps,DEC);
  Serial.print(" Dir: ");
  Serial.println( (Dir == DCC_DIR_FWD) ? "Forward" : "Reverse" );
  #endif

  newDirection = Dir;
  newSpeed = Speed;
  numSpeedSteps = SpeedSteps;
};

Esta función nos devuelve los siguientes parámetros:

  • Addr: Dirección DCC del decodificador de la locomotora.
  • Speed: Velocidad de la locomotora.
  • speedSteeps: velocidad por pasos.
  • Dir: Sentido de la marcha.

notifyDccFunc

Con notifyDccFunc obtenemos los paquetes relacionados con las funciones de locomotoras (FN0 - FN28).

// This call-back function is called whenever we receive a DCC Function packet for our address 
void notifyDccFunc(uint16_t Addr, DCC_ADDR_TYPE AddrType, FN_GROUP FuncGrp, uint8_t FuncState)
{
  #ifdef DEBUG_FUNCTIONS
  Serial.print("notifyDccFunc: Addr: ");
  Serial.print(Addr,DEC);
  Serial.print( (AddrType == DCC_ADDR_SHORT) ? 'S' : 'L' );
  Serial.print("  Function Group: ");
  Serial.print(FuncGrp,DEC);
  #endif

  if(FuncGrp == FN_0_4)
  {
    newLedState = (FuncState & FN_BIT_00) ? 1 : 0;
    #ifdef DEBUG_FUNCTIONS
    Serial.print(" FN 0: ");
    Serial.print(newLedState);
    #endif
  }
  #ifdef DEBUG_FUNCTIONS
  Serial.println();
  #endif
}

Esta función nos devuelve los devuelve los siguientes parámetros de las funciones de locomotoras (FN0-FN28):

  • Addr: Dirección DCC del decodificador de la locomotora.
  • FuncGrp: Grupo de la función.
  • FuncState: Estado de la función.
  • Dir: Sentido de la marcha.

Otas funciones para accesorios:

Las funciones que hemos visto hasta ahora hacen referencia a los datos que recibimos sobre una dirección DCC.

Las siguiente funciones van enfocadas a decodificadores de accesorios. Estos generalmente cuentan con tres parámetros: Dirección, Subdirección y estado


notifyDccAccTurnoutBoard

Direccionamiento de placa:

// This function is called whenever a normal DCC Turnout Packet is received and we're in Board Addressing Mode
void notifyDccAccTurnoutBoard( uint16_t BoardAddr, uint8_t OutputPair, uint8_t Direction, uint8_t OutputPower )
{
  Serial.print("notifyDccAccTurnoutBoard: ") ;
  Serial.print(BoardAddr,DEC) ;
  Serial.print(',');
  Serial.print(OutputPair,DEC) ;
  Serial.print(',');
  Serial.print(Direction,DEC) ;
  Serial.print(',');
  Serial.println(OutputPower, HEX) ;
}

notifyDccAccTurnoutOutput

Direccionamiento de salida.

// This function is called whenever a normal DCC Turnout Packet is received and we're in Output Addressing Mode
void notifyDccAccTurnoutOutput( uint16_t Addr, uint8_t Direction, uint8_t OutputPower )
{
  Serial.print("notifyDccAccTurnoutOutput: ") ;
  Serial.print(Addr,DEC) ;
  Serial.print(',');
  Serial.print(Direction,DEC) ;
  Serial.print(',');
  Serial.println(OutputPower, HEX) ;
}

notifyDccSigOutputState

paquete de aspecto de señal DCC

// This function is called whenever a DCC Signal Aspect Packet is received
void notifyDccSigOutputState( uint16_t Addr, uint8_t State)
{
  Serial.print("notifyDccSigOutputState: ") ;
  Serial.print(Addr,DEC) ;
  Serial.print(',');
  Serial.println(State, HEX) ;
}

Volver