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:

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) ;
}