0

Sensores y decoders DCC

Siempre había visto y leído sobre los sensores en la maqueta para detectar el paso de trenes y ahora me he puesto a ello. Anteriormente comente sobre como conectar los sensores directamente a la central DCC++.

Lo primero fue elegir el tipo de sensor para esta función. Después de varias pruebas mi elección es el que se utiliza con el S88.. y esto lo hablo un poco de oidas, porque realmente nunca he tenido un S88 pero si buscas en Google, es el esquema que sale, aunque con algunas modificaciones.

Estas modificaciones son las que me hicieron decantarme por este sistema aunque realmente funcionaría con cualquier tipo de sensor de los que ya hable anteriormente con sus respectivas modificaciones en el código

En el esquema original se utilizaban 4 diodos y esto a sido sustituido por un puente de diodos puenteando la salida ( +, -)… aunque suene redundante :). En el esquema se puede ver mejor de lo que hablo. También cambie la resistencia de 47K por una de 10K y no he notado nada raro. la que si que hay que mantener a un nivel bajo es la de 22 Ohm. Como no tenia a mano puse de 220 Ohm y no iba bien. Así que me toco buscar una lo más baja posible y encontré una de 33 Ohm, a partir de ahí todo genial. Este es el esquema:

Este esquema lo podemos conectar a cualquier pin de Arduino que queramos desde el pin 3 hasta el pin A5. Con esto podríamos conectar hasta 15 detectores en un mismo Arduino (2 más con arduino NANO).

Leyendo los sensores con Arduino.

Primero tenemos que definir el pin como entrada en el setup() y leer el estado en el loop(). Para que no este constantemente leyendo los pines he puesto un temporizador que hace que se lea cada 250ms, de esta manera no saturamos el microcontrolador ni el envío de datos a la central.

Un pequeño ejemplo:


// Timer Sensores
unsigned long previousMillisSensores = 0;
const long intervalSensores = 250; // Intervalo de lectura  
int bloques[2] {0, 0};

void setup() {
  Serial.begin(115200);
  pinMode(4, INPUT_PULLUP); // pin 4 como entrada
  pinMode(5, INPUT_PULLUP); // pin 5 como entrada
}

void loop() {
   if (currentMillisSensores - previousMillisSensores >= intervalSensores) {

    previousMillisSensores = currentMillisSensores;

    bloques[0] = digitalRead(4); // Lee el pin 4 y lo almacena en el array
    bloques[1] = digitalRead(5); // Lee el pin 5 y lo almacena en el array
  }

// Después de leer el estado de los sensores los imprime en pantalla

   Serial.print(F("bloque 1 estado: "));
   Serial.print(bloques[0]);
   Serial.print(F(" bloque 2 estado: "));
   Serial.println(bloques[1]);
}

A partir de aquí ya tenemos una lectura de los sensores. En este caso funcionan con lógica inversa, es decir, cuando la vía esta libre, nos dará un 1 y un 0 cuando circule uno de los trenes.

Enviando señal a la central

Para comunicarme con la central la apuesta es por el protocolo I2c. Con este Bus realmente podríamos tener tanto Tx como Rx pero sería bastante lío a la hora de comunicarse unos con otros. Mi propuesta es usar la central como «Primario» siempre en escucha y los demás como «Replicas» y únicamente transmitiendo.

El protocolo i2C en Arduino permite mandar texto con su comando Wire.print(«Texto»); Con esto no hará falta que mandemos tramas complicadas con direcciones y demás. Simplemente mandamos el comando que corresponda a esa sección, seguro que en este ejemplo se ve más claro:

void Sendtadai2c(int idsensor, boolean estado) {

  Wire.beginTransmission(1); // transmite a la central con dirección 1
  
if (estado) Wire.print("<Q"); // Manda la primera parte del comando en estado alto
  else Wire.print("<q"); // Manda la primera parte del comando en estado bajo
  Wire.print(idsensor); // Número ID del sensor
  Wire.print(">"); // Cierra el comando DCC++
  byte error = Wire.endTransmission(); // Fin de transmisión
  Serial.print (F("error = "));
  Serial.println (error);
}

Ahora solo falta implementarlo en la librería DCCpp y que cuando reciba el comando por el puerto i2C este sea replicado tanto por el Serial como por el BT… pero eso es otra historia que vendrá después de más y más pruebas…

A día de hoy funciona todo correctamente pero en vez de la central uso una pantalla tft que me muestra el estado del bucle en un rudimentario esquema de vías, pero funcionar, funciona!!!

Saludos a todos y gracias por visitar la Web!!!

(Visitado 70 veces, 1 visitas hoy)

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *