Iluminación vecindario H0 con Arduino


Luces vecindario decodificador DCC

Muy buenas a todos y todas!

Las luces en una maqueta son algo imprescindible si queremos recrear un maqueta mucho más realista.

Gracias a los decodificadores podemos programar animaciones con leds, en este caso, para una parte de la maqueta.

También podemos añadir al accesorio que creemos en la lista de animaciones de dccppAnimations.infotronikblog.com.

Igual que con el efecto soldador, el resultado en nuestra maqueta será genial!!

Una de las características del programa para hacer los diferentes efectos de luces en casas es que se puede poner en la maqueta sin necesidad de conectarlo a la linea DCC.



Características del decodificador

El programa tiene 3 modos con los diferentes efectos que podemos seleccionar.

La variable mode es la encargada de seleccionar este modo:

// Definimos los modos del decodificador
#define MODE_ALL_ON   1
#define MODE_ALEATORY 2
#define MODE_SECUENCY 3

int mode = MODE_ALEATORY;

  • MODE_ALL_ON o Modo On/Off:
    Enciende o apaga todas las luces.
  • MODE_ALEATORY o Modo Aleatorio:
    Las luces se encenderán de manera totalmente aleatoria.
  • MODE_ALEATORY o Modo Secuencia:
    Las luces se enciendes o apagan según se define en la variable secuencia[]


Si queremos iniciar el decodificador desde el momento que inicia el microcontrolador tenemos que cambiar la variable acc[ACC_CHANGE_HOUSE_MODE].output a “true” dentro de la función ConfigureFunctionsAndServos():

////////////////
// Dirección 9; Cambia el modo encendido casas ; Dirección 3 Subdirección 0
// 
acc[ACC_CHANGE_HOUSE_MODE].direccion = EF_BARRIADA;
acc[ACC_CHANGE_HOUSE_MODE].output = true;


Para la parte de programación vamos a usar la librería DCC_Decoder de Mynabay.


Direcciones DCC :

Para este decodificador usaremos solo dos direcciones, una dirección para las luces de las casas y una segunda dirección para encender la iluminación de las farolas de la calle.


Pines de salidas de Arduino:

Decoder DCC para barriada con Arduino


Podemos usar todas las salidas disponibles, para esta calle usaremos 8 salidas del microcontrolador, 2 salidas por cada una de las 4 casas.

Y una salida para las farolas que iluminarán la parte exterior de diorama. La salida de las farolas actúa sobre un transistor BC548 que aguanta una corriente 100mA, suficientes para un puñado de LEDs.

  • Pin 2 -> Interrupción del decoder
  • Pin 3 -> Salidas farolas

  • Pin 4 -> Salida casa1A
  • Pin 5 -> Salida casa1B

  • Pin 6 -> Salida casa2A
  • Pin 7 -> Salida casa2B

  • Pin 8 -> Salida casa3A
  • Pin 9 -> Salida casa3B

  • Pin 10 -> Salida casa4A
  • Pin 11 -> Salida casa4B
  • Pin 12 -> Salida casa4C

Si necesitas mas pines, también se pueden usar los pines analógicos como pines de salida.

Definición de direcciones:

Primero definimos el accesorio en la función ConfigureFunctionsAndServos():

#define MAX_ACC 2   // Número máximo de accesorios

void ConfigureFunctionsAndServos() 
{
  // Dirección 2; Luces calles; Dirección 1 Subdirección 1
  acc[0].direccion = 2;
  acc[0].outputPin0 = PIN_FAROLAS;
  acc[0].output = false;
  
  // Dirección 3; Luce encendido casas; Dirección 1 Subdirección 2
  acc[1].direccion = 3;
  acc[1].output = false;
}


Función Aleatoria:

Esta función le da un autentico realismo a todo el conjunto de casas. Todas las luces funcionan de manera independiente, encendiéndose y apagándose de manera independiente.

En mi opinión personal es la mejor de las tres opciones.

int oldPin = 0;

void Modo_Aleatorio() 
{
  const unsigned long intervalo = 5000; // Intervalo de 5 segundos
  //const unsigned long intervalo = 1000; // Intervalo de 1 segundos
  // Verifica si ha pasado el tiempo suficiente
  if (millis() - timerModoAleatorio >= intervalo) 
  
  {
    timerModoAleatorio = millis(); // Actualiza el tiempo anterior

    int pinAleatorio = random(4, 13); // Genera un número aleatorio entre 4 y 12
    while (pinAleatorio == oldPin)
    {
      pinAleatorio = random(4, 13); // Genera un número aleatorio entre 4 y 12
    } 

    oldPin = pinAleatorio;
    
    bool estado = random(2); // Genera 0 (apagado) o 1 (encendido)


Función secuencia predeterminada

Con esta opción las luces se encenderán en una secuencia dada por el usuario.

La variable encargada de esta función es la variable int secuencia[]

Una vez terminada el último valor de la secuencia volverá al inicio de la misma.

int secuencia[] = {4, 6, 8, 10, 12, 10, 8, 6};


Descargar Decodificador barriada o edificio

Los archivos para descargar el decodificador están en GitHub

Decodificador de funciones DCC barrio

Recuerda que tienes más decodificadores de accesorios en este mismo blog:

Decodificador de funciones DCC efecto soldador