¡Bienvenido visitante ! ¡Apúntate al foro ! ¡Es gratuito !
Aquí encontrarás respuesta a muchas de tus preguntas sobre modelismo ferroviario.
¡Puedes preguntar a tus anchas y aportar tus conocimientos!

ABC más detección

Electrónica aplicada al modelismo, gama CTMS, investigación y desarrollo.
Avatar de Usuario
Alfred
Forero
Mensajes: 897
Registrado: Jue Abr 24, 2008 9:41 pm
18
Ubicación: Sant Martí de Provençals

ABC más detección

Mensaje por Alfred »

Hola a todos.

Quiero hacer una detección y una parada ABC en un mismo tramo.
Se trata de una estación oculta con dos vías con topera.
Cuando un tren entra en la vía 1, el ABC lo para y el detector lo detecta. El detector está asociado con un relé que al quedar activo alimento un motor de un desvío se cambia de Via 1 a Via 2.
Cuando un tren entra en via 2, se para y el detector/relé vuelve a activar el motor del desvío para Via 1.

Primera pregunta:
En este circuito de deteción, ¿como se alimenta el relé? ¿Me podéis terminar el cuircuito?
Detector.png
Detector.png (9.63 KiB) Visto 1137 veces
l'Alfred
Avatar de Usuario
Alfred
Forero
Mensajes: 897
Registrado: Jue Abr 24, 2008 9:41 pm
18
Ubicación: Sant Martí de Provençals

Re: ABC más detección

Mensaje por Alfred »

¿Y como se combinaría con el ABC?
l'Alfred
Avatar de Usuario
fmco
Forero
Mensajes: 945
Registrado: Vie Ene 20, 2006 4:09 pm
20
Ubicación: Reus
Contactar:

Re: ABC más detección

Mensaje por fmco »

hola,

Recuerda: NO mezclar corriente digital con corriente analógica de control de automatismos.

1- Tienes que usar un opto
2- El puente de diodos lo puedes sustituir por el ABC BM1
3- El transistor del opto te activa el relé: Emisor a GND y colector a la bobina, el otro extremo de la bobina a +12V
4- La R1 no te haría falta.

Aún tienes que resolver dos problemas:
1- Como desactivas el relé si hay un tren en la Via1 que te esta activando el relé
2- Como desactivas el ABC en caso necesario para mover el tren

Para el 1 se me ocurre que uses un relé biestable, cada vía activa una de las bobinas. Problema: Necesitas que el detector de un impulso para que no se activen las dos bobinas cuando tengas dos trenes

Para el 2 si solo va a ir marcha atrás, no hay problema el ABC se programa para ir en un solo sentido. Si también puede ir hacia adelante quizás necesites de un interruptor que puentee el ABC BM1

saludos,

Paco
Avatar de Usuario
Alfred
Forero
Mensajes: 897
Registrado: Jue Abr 24, 2008 9:41 pm
18
Ubicación: Sant Martí de Provençals

Re: ABC más detección

Mensaje por Alfred »

fmco escribió: Lun Ene 23, 2023 8:11 am hola,

Recuerda: NO mezclar corriente digital con corriente analógica de control de automatismos.

1- Tienes que usar un opto
¿Qué Opto?

fmco escribió:2- El puente de diodos lo puedes sustituir por el ABC BM1
3- El transistor del opto te activa el relé: Emisor a GND y colector a la bobina, el otro extremo de la bobina a +12V
4- La R1 no te haría falta.

Aún tienes que resolver dos problemas:
1- Como desactivas el relé si hay un tren en la Via1 que te esta activando el relé
Voy a usar un motor MP1 de MTB. Usaré la salida conmutada para seleccionar desde que relé me llega la alimentación.

fmco escribió:Para el 2 si solo va a ir marcha atrás, no hay problema el ABC se programa para ir en un solo sentido. Si también puede ir hacia adelante quizás necesites de un interruptor que puentee el ABC BM1

saludos,

Paco
La via es de topera, por lo que el tren solo saldrá al invertir la marcha.
l'Alfred
Avatar de Usuario
fmco
Forero
Mensajes: 945
Registrado: Vie Ene 20, 2006 4:09 pm
20
Ubicación: Reus
Contactar:

Re: ABC más detección

Mensaje por fmco »

hola,

El opto casi que puede ser cualquiera, pero mejor el que tenga dos LED, como el PC814, aunque puedes usar uno normal de un solo LED como el PC817, lo único que puede pasar es que tengas que invertir las conexiones entre el opto y el BM1.

Si vas a usar un MP1 de MTB creo que no te hacen falta los reles para darle alimentación.

Te propongo el siguiente circuito:

Cuando llegue un tren a una topera el ABC lo frena y como circula corriente por él, el opto conduce y activa el transistor PNP que proporciona los 12V a uno de los contactos del MP1. Si es el que esta conectado hará mover el motor del MP1 cuando acabe el movimiento el contacto cambia y se para el motor.

Cuando llegue el otro tren, hará lo mismo pero en el otro sentido.

Creo que así funciona el MP1 pero sino es así habrá que cambiar el diseño. El transistor lo necesitas porque el MP1 consume 150mA según su web, mucho para el opto, y justito para el BC557 aunque siempre puedes usar otro transistor mas gordo. El condensador es para filtrar la señal de salida del opto ya que le llega DCC y puede no ser salida continua.

saludos,

Paco


PD: Cuando tengas ocupadas ambas toperas el MP1 ira cambiando de un lado a otro :roll:
Adjuntos
ABC_toperas.png
ABC_toperas.png (180.24 KiB) Visto 1121 veces
Avatar de Usuario
Alfred
Forero
Mensajes: 897
Registrado: Jue Abr 24, 2008 9:41 pm
18
Ubicación: Sant Martí de Provençals

Re: ABC más detección

Mensaje por Alfred »

Le he estado dando vueltas a este esquema y no termina de funcionar.
Estoy planteando diseñarlo por medio de un arduino.

Tenemos dos entradas E1 y E2.
Tenemos dos salidas S1 y S2.

Cuando la entrada E1 cambie de 0 a 1 (detección), activa la salida 1. Cuando deje de detectar, de 1 a 0, no hacer nada.
Igual con la entrada 2.

Supongo que se hace con un IF y un ELSE.

Le daré unas vueltas.
l'Alfred
Avatar de Usuario
raulm
Forero
Mensajes: 77
Registrado: Jue Sep 14, 2017 8:54 am
8
Ubicación: Navaluenga

Re: ABC más detección

Mensaje por raulm »

Buenos días chicos:

hace tiempo que no me meto en estos diseños, pero quizá el uso de un arduino sea "matar moscas a cañonazos".

Se me ocurre que se podría usar una reducción de boole o un mapa de Karnaugh para hacer la reducción de un circuito digital e implementarlo con puertas simples. No se si al final estoy complicando el asunto para un tema relativamente sencillo...

Pongo un par de referencias:




Saludos,
Raúl.
LZV100 + LH100 + LS150 + PpP RS8DC + PpP GenLI + PpP SEM3

Escala N: Lenz Silver mini+ y Gold mini, Zimo MX620, D&H DH10C/DH05C/DH18A/SD18A, Kuehn N025, ESU Lokpilot micro V2/V3/V4, ESU Loksound micro V3.5/V4, digitrax DN145K, TCS K0D8-E
Avatar de Usuario
Alfred
Forero
Mensajes: 897
Registrado: Jue Abr 24, 2008 9:41 pm
18
Ubicación: Sant Martí de Provençals

Re: ABC más detección

Mensaje por Alfred »

Al final me he liado con un arduino, pero.......

Aquí os dejo los archivos .ico y .json para el simulador a ver que os parece.
Adjuntos
gestio_est_terme_2vies.zip
(1.58 KiB) Descargado 41 veces
Última edición por Alfred el Dom Jul 30, 2023 9:49 pm, editado 1 vez en total.
l'Alfred
Avatar de Usuario
Alfred
Forero
Mensajes: 897
Registrado: Jue Abr 24, 2008 9:41 pm
18
Ubicación: Sant Martí de Provençals

Re: ABC más detección

Mensaje por Alfred »

Estoy usando unos motores MP1 de MTB que tienen un conmutador asociado que se podría usar para la comprobación del desvío de manera que el el .ico debería de incluir dos entradas más de comprovación de la posición de les agujas.
l'Alfred
Avatar de Usuario
Alfred
Forero
Mensajes: 897
Registrado: Jue Abr 24, 2008 9:41 pm
18
Ubicación: Sant Martí de Provençals

Re: ABC más detección

Mensaje por Alfred »

El diagrama sería este:
Adjuntos
photo_2023-03-13_11-42-18.jpg
photo_2023-03-13_11-42-18.jpg (88.6 KiB) Visto 1049 veces
l'Alfred
Avatar de Usuario
Alfred
Forero
Mensajes: 897
Registrado: Jue Abr 24, 2008 9:41 pm
18
Ubicación: Sant Martí de Provençals

Re: ABC más detección

Mensaje por Alfred »

Ep! Había un error en el fichero .json y por eso no funcionaba.

Ahora ja funciona el .ino perfectamente!!!!
l'Alfred
Avatar de Usuario
Alfred
Forero
Mensajes: 897
Registrado: Jue Abr 24, 2008 9:41 pm
18
Ubicación: Sant Martí de Provençals

Re: ABC más detección

Mensaje por Alfred »

El prototipo:
Adjuntos
IMG_20230731_182943.jpg
IMG_20230731_182943.jpg (4.76 MiB) Visto 1029 veces
l'Alfred
Avatar de Usuario
Alfred
Forero
Mensajes: 897
Registrado: Jue Abr 24, 2008 9:41 pm
18
Ubicación: Sant Martí de Provençals

Re: ABC más detección

Mensaje por Alfred »

¡¡¡¡Solo el 1 es 1!!!!!

Usando el conjunto de diodos del ABC para hacer una detección, la detección es pulsante:

Cuando estamos en una de las fases del ciclo la detección es correcta, pues caen unos 3 v y el opto actúa.
Detecció 1.png
Detecció 1.png (410.47 KiB) Visto 1009 veces
pero cuando estamos en la otra fase del ciclo, al pasar tan solo por un diodo, solamente caen 0,6 voltios y el opto no lo pilla!!!!
Detecció 2.png
Detecció 2.png (322.34 KiB) Visto 1009 veces
l'Alfred
Avatar de Usuario
fmco
Forero
Mensajes: 945
Registrado: Vie Ene 20, 2006 4:09 pm
20
Ubicación: Reus
Contactar:

Re: ABC más detección

Mensaje por fmco »

Usando el conjunto de diodos del ABC para hacer una detección, la detección es pulsante
Como toda la vida del señor con los detectores DCC!!! :lol:

Saludos,

Paco
Avatar de Usuario
fmco
Forero
Mensajes: 945
Registrado: Vie Ene 20, 2006 4:09 pm
20
Ubicación: Reus
Contactar:

Re: ABC más detección

Mensaje por fmco »

hola,

como veo que todavía no has dado con la solución a la detección con la señal DCC, te diré como trabajo yo y como hago con los detectores DCC.

Antes una pregunta que me tiene intrigado, porque usas 6 diodos en el ABC cuando todo el mundo usa 5? hay algún decoder tiquismiquis?

También recomiendo una lectura de la parte inicial del capitulo 13 del hilo sobre 'Lenguaje de Programación Arduino':
http://ctms1.com/forum/viewtopic.php?t= ... =30#p44084

Pues como recomiendo en ese capitulo, lo primero que hago es: 'Parar y Pensar', luego cuando tengo el concepto claro empiezo por comprobar con pequeños programas de prueba las diferentes partes que tienen que ver con las entradas y salidas o con los cálculos que se tienen que realizar.

Una vez que ya tengo esas pequeñas funciones funcionando correctamente, ya empiezo a montar el programa sabiendo que en principio no voy a encontrar errores en esas funciones y que los errores vendrán por la lógica que siga en el programa.

Finalmente, busco errores de funcionamiento a base de machacar el circuito con posibles situaciones que se pueden presentar.

No es un método infalible pero facilita mucho el trabajo y la satisfacción posterior.

Bueno, pasemos a tu caso particular:


Detección ocupación en DCC

Como bien has comprobado la señal DCC es pulsante y por lo tanto cuando circula corriente por el detector ABC ya que hay un tren en la vía se transmite así al opto y a su salida también tenemos una señal pulsante pero de 0 a 5V

Imagen


Esto nos plantea un problema en nuestro programa, ya que cuando no hay tren, no hay señal, en la entrada del opto tenemos 5V (HIGH) debidos a la resistencia de pull-up pero cuando hay tren no obtenemos GND (LOW) a la entrada sino una copia de la señal DCC cambiando rápidamente de 0 a 5V y viceversa por lo que con digitalRead() obtendremos unas veces LOW y otras HIGH según el momento en el que se haga la lectura.

Posibles soluciones:
  • Acondicionar la entrada añadiendo un condensador en la salida del opto.
  • Leer la entrada muchas veces y dar el valor mediante cálculo o retardo
La solución de poner el condensador, como en el circuito electrónico del inicio del hilo, es un poco a base de prueba y error pero con un electrolítico de 10uF probablemente sea suficiente.

Vamos con la solución software, para el test ponemos un par de LED en los pines 11 y 12 para ver la ocupación en el simulador, y ahora en lugar de ver la ocupación con digitalRead() la veremos consultando un par de variables. Tendremos que escribir una función que nos actualice estas variables según detecte en la entrada la señal DCC o no:

Código: Seleccionar todo

int sensorVia1 = 4;    //Pin d'entrada sensor Via 1
int sensorVia2 = 2;    //Pin d'entrada sensor Via 2


int ledOcupacioVia1 = 11;  // LEDs de informacio ocupacio vies
int ledOcupacioVia2 = 12;

bool ocupacioVia1 = false;
bool ocupacioVia2 = false;
diagram.json
► Mostrar Spoiler

La idea, si has visto como funcionan los sensores en Traincontroller, Rocrail, etc. te sonará, es cada vez que haya detección (he leído LOW) inicializo un retardo de 0,5s o similar. Mientras estoy contando el retardo, la variable me indica ocupado, si acabo el retardo es que ya no hay ocupación.

Evidentemente el retardo ha de ser mayor que el tiempo en que cambia la señal DCC, de ahí los 0,5s, y he de leer suficientes veces la entrada dentro del retardo para pillarla, por estadística, alguna vez en LOW. Para asegurar esto último podríamos usar interrupciones pero esto ya es para otro capitulo más avanzado.

Tendremos que definir unas variables para el contador de esperas y los tiempos para las esperas. Por ejemplo, cada 10ms usando millis() decrementariamos un contador que se incializará a un valor de 50 cuando leamos LOW lo que nos da 0,5s de retardo.

Código: Seleccionar todo

#define INTERVAL_ESPERA 10    // Interval espera (en ms)
#define TEMPS_SENSOR   50    // mantenir 500ms l'ocupacio (en 10ms)

byte esperaSensor1=0;
byte esperaSensor2=0;

unsigned long tempsEsperaSensors;
Nuestra función de lectura de sensores es bastante directa, cada vez que la llamemos leemos las entradas con la esperanza de pillarla alguna vez en LOW, además cada 10ms indicamos la ocupación o no de la vía en las variables ocupacioVia en función si hay tiempo de espera en los contadores esperaSensor (el tiempo de espera del contador se decrementa si no ha llegado a 0):

Código: Seleccionar todo

void llegueixSensorsVies() {
  if (digitalRead(sensorVia1) == LOW)                       // DCC a la entrada
      esperaSensor1 = TEMPS_SENSOR;                           // activa espera
      
  if (digitalRead(sensorVia2) == LOW)
    esperaSensor2 = TEMPS_SENSOR;
    
  if (millis() - tempsEsperaSensors > INTERVAL_ESPERA) {    // Cada 10ms
    tempsEsperaSensors = millis();
    
    if (esperaSensor1 > 0) {                                // espera activa
      ocupacioVia1 = true;
      esperaSensor1--;
    }
    else {                                                  // espera inactiva
      ocupacioVia1 = false;
    }
    
    if (esperaSensor2 > 0) {
      ocupacioVia2 = true;
      esperaSensor2--;
    }
    else {
      ocupacioVia2 = false;
    }
  }
}

El resto del programa de test no tiene complicación:

Código: Seleccionar todo

void setup() {
  pinMode(sensorVia1, INPUT);
  pinMode(sensorVia2, INPUT);
  pinMode(ledOcupacioVia1, OUTPUT);
  pinMode(ledOcupacioVia2, OUTPUT);
  tempsEsperaSensors = millis();
  delay(100);                  // retard pel simulador
}

void loop() {
  llegueixSensorsVies();

  digitalWrite(ledOcupacioVia1, ocupacioVia1);
  digitalWrite(ledOcupacioVia2, ocupacioVia2);

}

Puedes comprobar el resultado mirando los LED y clicando rápidamente en los interruptores para simular la señal DCC y cambiando el tiempo de TEMPS_SENSOR

sketch.ino
► Mostrar Spoiler
Una vez comprobado esto, ya puedes empezar a plantear el resto de la lógica.

saludos,

Paco
Responder
 
  • Contacto
  • Nombre de Usuario:
    Email:
    Asunto:
    Mensaje: