Controlador Automatizado de Barrera Ferroviaria: Circuito Arduino y Código Fuente
Circuito Controlador Automático de Barrera Ferroviaria de Alta Velocidad Usando Arduino y Sensores Ultrasónicos
En este tutorial, aprenderemos cómo diseñar un sistema simple y eficiente de controlador automático de barrera ferroviaria de alta velocidad. Este es un enfoque relativamente simple para este proyecto pero puede tomarlo como bloque básico y en futuras modificaciones también podemos rastrear la velocidad del tren al pasar y mucho más. Pero antes de saltar al tutorial, necesitamos una idea sobre qué es automatización y qué exactamente se puede esperar de ella.
Automatización básicamente significa idear un método para reducir o eliminar esfuerzos/intervención humana. En este tutorial explicaremos cómo automatizar una barrera ferroviaria con Arduino usando motor servo junto con software Proteus.
La complejidad de la automatización puede variar desde un control básico "encendido/apagado" hasta algoritmos multivariable altamente complejos. Los sistemas de control para automatización pueden ser de lazo abierto o cerrado, significando que pueden trabajar con un solo parámetro de entrada o en respuesta a la salida retroalimentada como entrada en sistemas de lazo cerrado. La automatización en la industria ferroviaria es una necesidad importante al avanzar a la era avanzada y para reducir el riesgo de accidentes por errores humanos, es muy importante dejar que estas tareas sean manejadas por estas máquinas inteligentes.
- Artículo Relacionado: Circuito Detector de Velocidad de Auto – Funcionamiento y Código Fuente
Como en el caso de toda tecnología, la automatización también tiene pros y contras:
Ventajas
- Aumento de productividad
- Calidad predecible (Mejora de Calidad)
- Mayor robustez
- Gran consistencia de salida
- Reducción de gastos de mano de obra humana
- Altamente preciso
- Reduce esfuerzos humanos en trabajos monótonos
Desventajas
- Susceptible a amenazas de seguridad
- Costo de desarrollo podría exceder predicciones
- Alto costo de implementación
- Causa de desempleo en muchos sectores
Las ventajas mencionadas superan ampliamente las desventajas y por eso el mundo entero está entrando en la era de la automatización.
En este tutorial intentamos automatizar una barrera ferroviaria para abrir y cerrar cuando el circuito detecta un tren en la vía e iniciar un zumbador o alarma representando que la velocidad del tren es mayor que un umbral particular. Para lograr esto, usaremos dos componentes electrónicos muy usados: Arduino y motor servo.
El sensor que usaremos es el sensor ultrasónico, pero no es obligatorio usar este sensor; también podemos hacer una versión diferente usando módulo sensor IR y depende de nuestra elección, qué queremos usar y qué está disponible.
- Artículo Relacionado: Sistema Inteligente de Automatización del Hogar – Circuito y Código Fuente
Componentes Requeridos para Controlador de Barrera Ferroviaria
- Arduino UNO
- Zumbador (Buzzer)
- Sensor Ultrasónico (HC-SR04)
- Motor Servo
Software Requerido:
- Arduino IDE
- Proteus
Diagrama de Circuito del Controlador de Barrera Ferroviaria

Descripción de Componentes
Arduino UNO
Arduino es básicamente una placa de desarrollo de código abierto que utiliza principalmente el microcontrolador Microchip ATmega328P y es fabricada por Arduino.cc. La placa viene con un conjunto de pines de entrada/salida compuestos por digitales y analógicos que pueden interconectarse a placas de expansión y circuitos externos.
La placa viene con 14 pines digitales junto con 6 pines analógicos que se utilizan o hacen programables con la ayuda de un IDE (Entorno de Desarrollo Integrado) que viene con ella: Arduino IDE. El programa se graba vía cable USB tipo B. Métodos de alimentación: por cable USB o conectando 9V CC. Rango de voltaje aceptable: 7 a 20 voltios. Por diseño y funcionamiento, no es muy diferente de sus otros familiares: Arduino Nano y Arduino Leonardo.
STK500 sigue siendo el protocolo original para Uno comunicarse. La diferencia mayor de sus predecesores es que no usa el chip FTDI USB-a-serial. Por el contrario, usa ATmega 16U2 (Atmega8U2 hasta versión R2) programado como conversor USB-a-serial.
- Artículo Relacionado: Fuente de Alimentación Variable Usando Arduino UNO – Circuito y Código

Sensor Ultrasónico (HC-SR04)
El sensor ultrasónico es el sensor básico que usamos para determinar la distancia de un objeto. De otra forma, se usa para medir qué tan lejos está un objeto de un punto de referencia. Tiene básicamente 4 pines;
- Pin Trig (Disparador)
- Pin Echo (Eco)
- Pin GND
- Pin VCC (+5V)
¿Cómo funciona el ultrasónico? El transmisor (trig) envía una señal de sonido de alta frecuencia que es reflejada por el objeto y luego la señal reflejada es recibida en el receptor (echo). Como la velocidad del sonido en aire es conocida, podemos calcular la distancia. Este sensor es extremadamente popular entre los aficionados a Arduino que lo usan en sus proyectos diariamente y para disparar este sensor requerimos un pulso alto de 10 microsegundos o más.
Características del sensor ultrasónico:-
- Alimentación: +5V CC
- Corriente en Reposo: <2mA
- Corriente de Trabajo: 15mA
- Ángulo Efectivo: <15°
- Distancia de Medición: 2cm – 400 cm/1″ – 13ft
- Resolución: 0.3 cm
- Ángulo de Medición: 30 grados
- Ancho de Pulso de Disparo: 10uS
- Dimensiones: 45mm x 20mm x 15mm
Artículo Relacionado: Sistema Automático de Riego de Plantas – Circuito, Código y Reporte de Proyecto

Motor Servo
Estos son un tipo especial de motores empleados para movimiento muy específico en un ángulo particular. Es un actuador rotativo o lineal que permite control preciso en ciertas posiciones angulares o lineales. El motor servo no es una entidad única sino una combinación de un motor adecuado junto con un sensor que da retroalimentación de la posición actual del motor.
Para usar este motor servo se requieren varios módulos avanzados ya que no es similar en facilidad de uso al motor DC. Estos motores se usan básicamente en robótica e industrias de manufactura a gran escala.
Estos motores tienen poca similitud con los motores paso a paso que representan control de lazo abierto. Los motores paso a paso tienen pasos integrados en los que giran pero con la falta de un sistema de retroalimentación, su uso se limita a una aplicación específica para la que fueron diseñados y fabricados.
Esta falta de retroalimentación es lo que distingue al motor servo de los motores paso a paso y les da ventaja al ser dinámicos y personalizables según la tarea con pequeña alteración en la programación. Un módulo controlador dedicado generalmente viene con el motor servo del fabricante.
Mecanismo– Es básicamente un servomecanismo de lazo cerrado que utiliza el sistema de retroalimentación para actualizar el movimiento y la posición final del rotor. La entrada al control del motor puede ser analógica o digital.
- Artículo Relacionado: Medición de Distancia Usando Arduino y Sensor Ultrasónico
Un codificador de algún tipo está emparejado al motor para dar retroalimentación de posición y velocidad al control que genera una señal de error hasta que la salida deseada no se alcanza. Y para reducir esta señal de error, el motor puede moverse en cualquiera dirección para finalmente reducir la señal de error a cero. Cuando se alcanza esta condición, se logra la salida deseada. Los servomotores mejorados y sofisticados tienen un codificador óptico rotativo en el eje de salida para medir su velocidad.

Zumbador (Buzzer)
El zumbador puede ser de naturaleza mecánica, electrónica, electromecánica y piezoeléctrica. Generalmente usamos el electrónico en hornos, concursos y electrodomésticos. Estos zumbadores tienen un circuito interno. El sonido se produce por el movimiento de un disco. El disco es ferromagnético. Es un dispositivo impulsado por corriente que tiene una fuente de voltaje como entrada.

Funcionamiento del Controlador Automático de Barrera Ferroviaria
En este circuito hemos usado sensores ultrasónicos y motores servo para replicar el funcionamiento de un cruce ferroviario. Ambos sensores se disparan con la ayuda de pines de disparador conectados a la placa Arduino y se calcula la distancia. El funcionamiento posterior del circuito depende completamente de la distancia medida.
Si la vía está despejada, los motores servo no harán nada, pero si un tren llega a cualquiera de los lados de la vía, la distancia medida por uno de los sensores variará de la distancia anterior. Así nos informaremos sobre la llegada del tren y en ningún tiempo, Arduino pondrá sus pines digitales 7 y 8 en ALTO.
Estos pines están conectados con los dos motores servo y entonces el servo cubrirá una distancia angular de 90° y por tanto la barrera se cerrará para bloquear el paso a vehículos. Cuando el tren se aleje del otro sensor, este notificará a Arduino sobre la salida del tren y los motores servo volverán a su posición anterior para abrir la barrera.
Considerando la seguridad de las personas, hemos agregado una característica más a este circuito: alertar en caso de tren de alta velocidad. Esto se logra calculando el tiempo entre las transiciones de dos sensores en un ciclo. Si el tiempo es menor que un valor determinado, el zumbador hará un sonido para alertar a las personas cerca del cruce.
- Artículo Relacionado: Sistema Inteligente de Riego – Diagrama de Circuito y Código
Código Fuente del Proyecto y Explicación
En este sketch, hemos definido cinco variables de tipo entero y cuatro de tipo long. Las variables tr1, tr2, eh1 y eh2 se usan para enviar pulso y recibir valor de tiempo en microsegundos mientras que val1, val2, dis1 y dis2 almacenan valores de tiempo en microsegundos y distancia en cm. Baud rate establecido a 9600 bits/seg responsable de la comunicación entre la placa y el monitor serial.
const int tr1 = 13, eh1 = 12, tr2 = 3, eh2 = 2;; int bz = 11; unsigned long val1, dis1, val2, dis2; #include Servo myservo1; Servo myservo2; int pos=-1;
Las funciones incluidas en void setup () se ejecutarán solo una vez durante la ejecución y su tarea es definir baud rate y modo del pin como entrada o salida.
void setup() { // put your setup code here, to run once: pinMode(tr1, OUTPUT); pinMode(tr2, OUTPUT); pinMode(bz, OUTPUT); pinMode(eh1, INPUT); pinMode(eh2, INPUT); myservo1.attach(8); myservo2.attach(7); Serial.begin(9600); }
Según el funcionamiento requerido, medimos continuamente la distancia disparando el sensor ultrasónico y la distancia calculada se establece como parámetro de la sentencia condicional. Si la condición es verdadera, la variable "pos" incrementa su valor para accionar los motores servo y cuando la condición es falsa, la variable "pos" decrementa su valor para devolver los motores servo a su posición anterior.
Hay una sentencia condicional más que verifica si dos sensores detectan el objeto rápidamente, entonces pondrá el pin 11 en alto para alimentar el zumbador y alertar a las personas. Todos estos procesos están englobados en void loop () y se repiten hasta que el Arduino se reinicie o se corte el suministro.
void loop() { // put your main code here, to run repeatedly: digitalWrite(tr1, LOW); delayMicroseconds(2); digitalWrite(tr1, HIGH); delayMicroseconds(10); digitalWrite(tr1, LOW); val1 = pulseIn(eh1, HIGH); dis1 = (val1 * 0.0343) / 2; digitalWrite(tr2, LOW); delayMicroseconds(2); digitalWrite(tr2, HIGH); delayMicroseconds(10); digitalWrite(tr2, LOW); val2 = pulseIn(eh2, HIGH); dis2 = (val2 * 0.0343) / 2; Serial.println("distance is "); Serial.println(dis1); Serial.println(dis2); if(dis1 < 100 || dis2 < 100) { if(pos==-1){ for (pos = 0; pos <= 90; pos += 1) { myservo1.write(pos); myservo2.write(pos); delay(15);} } delay(1000); digitalWrite(tr1, LOW); delayMicroseconds(2); digitalWrite(tr1, HIGH); delayMicroseconds(10); digitalWrite(tr1, LOW); val1 = pulseIn(eh1, HIGH); dis1 = (val1 * 0.0343) / 2; digitalWrite(tr2, LOW); delayMicroseconds(2); digitalWrite(tr2, HIGH); delayMicroseconds(10); digitalWrite(tr2, LOW); val2 = pulseIn(eh2, HIGH); dis2 = (val2 * 0.0343) / 2; if(dis1 < 100 || dis2 < 100) {digitalWrite(bz, HIGH); Serial.println("distance2 is "); Serial.println(dis1); Serial.println(dis2);} } else if(dis1 >= 100 && dis2 >= 100) { if(pos==91){ for (pos = 90; pos >= 0; pos -= 1) { myservo1.write(pos); myservo2.write(pos); delay(15); } } digitalWrite(bz, LOW); delay(200); } }
Interfaz de Archivo Hex con Proteus para Simulación: En su Arduino IDE haga clic en Archivo>Preferencias y luego en "Mostrar salida detallada" marque ambas opciones compilación y carga. Y, al compilar el código, en la ventana de abajo seleccione y copie la ubicación del archivo hex y en Proteus haga doble clic en Arduino y pegue la ubicación del archivo en la opción Archivo de Programa y haga clic en OK. Ahora su circuito estará listo para simulación en Proteus.
Proyectos Relacionados:
- Timbre Automático con Detección de Objeto por Arduino
- Lámpara Nocturna Automática Usando Arduino
- Programación PWM Arduino y sus Funciones en Arduino
- Arduino Serial: Comunicación Serial por Arduino
- Ideas de Proyectos Finales de Electrónica
- Ideas de Proyectos de Ingeniería Electrónica para Estudiantes
- Ideas de Mini Proyectos Electrónicos Simples y Básicos para Principiantes
Tecnología Industrial
- Control Automático de Tren DIY con Arduino: Simple, Fiable y Personalizable
- SERENA: Sistema de Alarma Personalizado Arduino Mega 2560 con Pantalla TFT LCD Táctil
- Centro de Control de Potencia Arduino: N-FET, P-FET, Relé y RTC
- Sistema automático de riego para plantas con Arduino
- Latch SR con Puerta NOR: Construcción y Comprensión de Memoria Digital
- Modos de falla comunes en sistemas eléctricos probados
- Compuertas TTL NOR y OR: análisis de circuito y conversión
- Circuitos avanzados de control de motor: retención, parada y técnicas de retardo
- Monitorización en la nube: Sistema de control remoto para gestión de activos en tiempo real
- M-TECH: Sistema Avanzado de Control CNC para Routers Apollo
- Sistema Automático de Apertura de Puertas con Sensor PIR: Circuito, Funcionamiento y Aplicaciones