Automatización y motorización de desvíos con Arduino

Iniciado por Fision, 24 de Marzo de 2019, 18:15:12 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Fision

Os presento una nueva forma de poder motorizar los desvíos de manera sencilla sin necesitar construir una caseta de guardagujas contigua a cada desvío donde esconder la electrónica.

El mecanismo no tiene mucha complicación, se trata de un motor "enterrado" en un módulo MILS con una rueda de goma que desliza la aguja desde abajo. Para evitar que el motor la rueda siga girando cuando el desvío ya ha cambiado de posición es necesario utilizar una llanta mas pequeña que el diametro de la rueda que permita que el eje siga girando mientras que la rueda deje de rotar.
       



El desvío requiere alguna pequeña modificación para que pueda funcionar con el motor, es necesario recortar la base para que la rueda del motor pueda rozar con el mecanismo interior y desplazar la aguja. También es necesario limar las pestañas que tiene en el interior que bloquean la aguja en ambas posiciones (izqa/dcha). Una vez limadas estas pestañas la aguja debería desplazarse libremente sin necesidad de hacer fuerza para bloquearla en su posición.
Las pestañas no se ven en la foto pero una vez abierto se localizan fácilmente.

La parte mecánica está acabada pero necesitamos una manera de hacerlo funcionar. He optado por automatizarlo con un Arduino que permite controlarlo facilmente desde un panel de control, donde además, indica la posición en la que se encuentra el desvío.

La electrónica es sencilla y cualquiera con un conocimiento básico de programación con Arduino puede realizarlo.
Los componentes esenciales son una placa Arduino (en este caso un Arduino Nano) y un driver L298N al que conectar el motor del desvío, además, puede servir una fuente de alimentación ya que tiene una salida de 5v. Por otra parte necesitaremos dos LEDs con sus correspondientes resistencias con la que indicar la posición del desvío y un interruptor con el que controlar el desvío. Esto es toda la electrónica del desvío y sigue el siguiente esquema:

El programa tampoco tiene mucho misterio, en este caso simplemente cambia la posición del motor dependiendo del estado del interruptor aunque se podría programar para automatizarlo y hacerlo funcionar de manera autónoma en un circuito completamente automático (pero mis habilidades no dan pa' más :tomatazo:)
[spoiler]
Citarint estadoInterruptor = 0;  //Variable que indica el estado del interruptor
int ledIzquierda = 12;      //Pin led izquierda
int ledDerecha = 11;        //Pin led derecha
int interruptor = 5;        //Pin interruptor
int IN1=6;                  //Conexiones con el driver de los motores
int IN2=7;
int ENA=9;
int direccion;              //variable que indica la posición del desvío
void setup() {
  estadoInterruptor = digitalRead(interruptor);
  pinMode(ledDerecha, OUTPUT);
  pinMode(ledIzquierda, OUTPUT);
  pinMode(interruptor, INPUT);
  pinMode(IN1,OUTPUT);
  pinMode(IN2,OUTPUT);
    if(estadoInterruptor == LOW){
      analogWrite(ENA, 125);
      digitalWrite(IN1, HIGH);
      digitalWrite(IN2, LOW);
      delay(250);
      digitalWrite(IN1, LOW);
      digitalWrite(IN2, LOW);
      direccion=1;
      digitalWrite (ledIzquierda, HIGH);
    }
    if(estadoInterruptor == HIGH){
      analogWrite(ENA, 125);
      digitalWrite(IN1, LOW);
      digitalWrite(IN2, HIGH);
      delay(250);
      digitalWrite(IN1, LOW);
      digitalWrite(IN2, LOW);
      direccion=0;
      digitalWrite (ledDerecha, HIGH);
    }
}

void loop() {
  estadoInterruptor = digitalRead(interruptor);
    if(estadoInterruptor == LOW){         
      digitalWrite(ledIzquierda, HIGH);
      digitalWrite(ledDerecha, LOW);
        if(direccion==0){
          analogWrite(ENA, 125);
          digitalWrite(IN1, HIGH);
          digitalWrite(IN2, LOW);
          delay(250);
          digitalWrite(IN1, LOW);
          digitalWrite(IN2, LOW);
          direccion=1;
        }
    }
    if(estadoInterruptor == HIGH){
      digitalWrite(ledIzquierda, LOW);
      digitalWrite(ledDerecha, HIGH);
        if(direccion==1){
          analogWrite(ENA, 125);
          digitalWrite(IN1, LOW);
          digitalWrite(IN2, HIGH);
          delay(250);
          digitalWrite(IN1, LOW);
          digitalWrite(IN2, LOW);
          direccion=0;
        }
    }
}
[/spoiler]

La última parte es conectar el motor al panel de control. Para ello he decidido utilzar conectores Dupont entre cada módulo inspirado por las calles con farolas de JUJO, la única pega de utilizar este tipo de conectores entre los módulos es que es necesario cortar el cable del motor para poder soldar los conectores Dupont a los cables C1 y C2 del motor (los dos del medio). Otra posibilidad sería utilizar los cables de extension de Power Functions [set]8871[/set] y [set]8886[/set] aunque creo que los conectores son demasido grandes para colocar entre módulos MILS. Si optas por los conectores Dupont el resultado es este:

Por último os dejo un pequeño vídeo del funcionamiento del desvío.
[ytube]_p1iYaIRHtI[/ytube]

Espero que esta especie de tutorial os sirva y si tenéis cualquier duda estaré encantado de aclararosla.

P.D. Los dos botones verde y rojo del panel de control no tienen nada que ver con el desvío, tengo pensado añadir un semáforo en el futuro.

ostman

Muy buen trabajo... Muchas gracias por compartir tu estupendo tutorial...

alberto luna

"La violencia es el último recurso del incompetente" -Salvor Hardin, alcalde de Términus-

JUJO

Felicidades por este estupendo trabajo  :aplauso: :aplauso: :aplauso: :aplauso:

asnito

Dedón vas tacirupeca! A saca de mi talibuea!!!

Yago

espectacular!! grandisimo y muy elegante.. apenas se nota el espacio! Bravo Fision!  :aplauso: :aplauso: :aplauso: :aplauso:

marcus

Aquí entran en juego varias cosa:
1. Motorizar algo tan cotidiano como un desvío.
2. Hacerlo de manera que no se aprecie en absoluto.
3. Automatizarlo con Arduino.
4. Hacer un tutorial para dummies.

Así que nada más que añadir, señoría!

¡OLE, OLE y OLE! Enhorabuenísima por esto y por lo que -espero no equivocarme- vendrá.
Diseñado para una sencilla construcción y rápido juego



Jero

De todo el montaje automatizado me quedo con este detalle técnico.
Cita de: Fision en 24 de Marzo de 2019, 18:15:12 PM
... Para evitar que la rueda siga girando cuando el desvío ya ha cambiado de posición es necesario utilizar una llanta mas pequeña que el diametro de la rueda que permita que el eje siga girando mientras que la rueda deje de rotar.
Sin este detalle, intuyo que sería necesario controlar la posición de exacta del desvío para que el motor dejara de girar. Me parece realmente ingenioso  :aplauso: :aplauso:

murielskt

Ay Dios mío....! ¿Éste chaval dónde llegará? Eres un crack Fisión! Sigue así que vas por el mejor camino... hacia dónde quieras!!!  :aplauso: :aplauso: :aplauso:
Soy uno de los 10 tipos de personas que entienden bricknario

d(^_^)b