DCC & ARDUINO: EJEMPLO BÁSICO / BASIC EXAMPLE

publicado en: Internet | 0

BIENVENIDO:

La tecnología Arduino ha abierto una interesante puerta a la electrónica aplicada a la afición por el modelismo ferroviario.

En esta sección Vd. podrá encontrar algunos montajes para construir uno mismo. Los hay para maquetas analógicas (tradicionales), pero la mayoría han sido diseñados para maquetas digitales DCC con bus datos XpressNet (el sistema europeo de Lenz, Fleischmann y Roco).


 

WELCOME:

Arduino technology has open an interesting door to electronics applied to this hobby of model trains.

In this section you may find some nice devices you can do yourself at home. They can be used on analogic (traditional) layouts, but most of them have been designed for DCC XpressNet layouts (Lenz, Fleischmann, Roco european system).

ObeTren_DCC_deco_01

 


 

Vamos a empezar la sección DIGITAL con un sencillo decodificador DCC.

 

DECODIFICADOR DCC PARA 8 SEÑALES DE DOS ASPECTOS

Este código permite programar un Arduino Nano Pro para convertirlo en un decodificador de accesorios DCC que controle 8 señales de dos aspectos con conmutación progresiva (apagado / encendido lento).

Cópielo y péguelo libremente en la aplicación para programar Arduino (Arduino IDE).


 

Let’s begin this DIGITAL section with an easy DCC decoder.

 

DCC DECODER FOR 8 TWO ASPECTS SIGNALS

This code compiles for Arduino Nano Pro to make an accessory DCC decoder for 8 two aspects signals with slow commutation between them (dimming, slow switching).

Feel free to copy and paste it into your programming application (Arduino IDE).

 

/* 18 dimming LEDs with Arduino Nano DCC decoder
 By German Trinidad and Norber, Spain, December 2015
 Freely distributable for private, non commercial, use

 Attach led anodes (+) to 0 -> 18 pins but link DCC to pin 2
 Attach led catodes (-) to GND
 Don't forget to add serial resistors! */

#define DIREC1 160 // Direccion primer grupo accesorios: 129 son Multimaus 0005, 0006, 0007, 0008
#define DIREC2 161 // Direccion segundo grupo accesorios: 130 0009, 0010, 0011, 0012
#define DIREC3 162 // Sumar 127 a la direccion Rocrail:
#define DIREC4 163 // (33-1234) 127+33=160: 0129, 0130, 0131, 0132
//                    (34-1234) 127+34=161: 0133, 0134, 0135, 0136
//                    (35-1234) 127+35=162: 0137, 0138, 0139, 0140
//                    (36-1234) 127+36=163: 0141, 0142, 0143, 0144
//                    (37-1234) 127+37=164: 0145, 0146, 0147, 0148
//                    (38-1234) 127+38=165: 0149, 0150, 0151, 0152
#define DCC_INT 2
#define SI 0 // Para el preámbulo, la primera vez de la interrupción
#define NO 1
#define TICKS 215 // Prescaler 8 -> pulso de Timer cada 0.5 µs -> 200 ticks son 100 µs
#define FREQ 120 // Aprox 15x ms 
#define DELTA 3 // Ritmo de variacion del PWM 
#define APAGAR 20
#define PAUSAR 30
#define ENCENDER 40

volatile byte buf_dcc[6];
volatile byte pinPWM;
volatile boolean comandoRecibido = false;
volatile boolean variandoLed = false;
volatile int duty = FREQ - 1;
volatile byte estado = APAGAR;

void setup() {
 pinMode(DCC_INT, INPUT);
 for (int i = 3; i < 20; i++) {
 pinMode(i, OUTPUT);
 if (i & 0x01) digitalWrite(i, LOW); // Los leds verdes en pin impar empiezan apagados
 else digitalWrite(i, HIGH); // Los leds rojos en pin par empiezan encendidos
 }
 attachInterrupt(0, dcc_int, CHANGE); // pin2 = DCC externalInterrupt 0
 cli();
 TCCR0A = 0;
 TCCR0B = 0;
 TCCR0B |= (1 << CS01); // Set CS01 bit for 8 prescaler (0.5 µs) on Timer0 - DCC
 TCCR2A = 0;
 TCCR2B = 0;
 TCCR2B |= (1 << CS21); // Set CS21 bit for 8 prescaler (0.5 µs) on Timer2 - Dimming
 TIMSK2 = 0;
 TIMSK2 |= (1 << TOIE2); // Enable Timer2 Overflow interrupt
 sei();
}

void dcc_int() { // ISR(INT0_vect) External interrupt routine for signal on pin2
…
...


 

Recomendar este artículo:
  • Twitter
  • LinkedIn
  • Print
  • Facebook
  • Google Bookmarks
  • del.icio.us
Comentarios Cerrados.