Verilog Práctico

Capitulo 13. Ascensor con Alhambra FPGA, v2.0

6 de marzo de 2022

En el siguiente tutorial veremos las mejoras que he añadido al proyecto del ascensor, tales como un sistema de arranque y parada suaves mediante optoswitches y  motor de dos velocidades controlado con PWM, un display de 7 segmentos para indicar el piso en que se encuentra el ascensor, una puerta automática accionada con un servo y un sensor de seguridad de puerta abierta, para verificar que la puerta se ha cerrado correctamente y que inhabilita el movimiento en caso contrario. 

La imagen siguiente muestra la distribución de los componentes. 

1.1 Optoswitches y Finales de Carrera


En el lado derecho están los tres microswitches final de carrera de las tres plantas que forman el ascensor.

En el lado izquierdo he montado los optoswitches para acelerar el ascensor al inicio del movimiento y decelerar antes de parar.

1.2 Puerta Automática


Para montar la puerta automática necesitamos un servo, unos separadores hexagonales, un eje y un par de poleas GT2.5

Sobre un soporte impreso en 3D incrustamos dos tuercas M3 y desde la parte de arriba atornillamos dos separadores hexagonales de métrica 3 y 45 mm de longitud. En la parte superior fijamos el servo.

Con un separador hexagonal M4  de  60 mm de longitud y un par de piezas impresas, montamos el soporte del eje de la puerta. 

Para el eje de la puerta necesitamos una guía lineal de 6 mm de diámetro, una polea GT2,5 y dos bisagras impresas en 3D. 

Pasamos el eje por los orificios de los soportes y montamos las bisagras con 4 tornillos M3.

A continuación montamos el servo y lo fijamos con un tornillo M4. 

Imprimimos una polea GT2,5 y en la parte de abajo atornillamos una leva. 

Montamos la polea en el servo y con una correa GT2,5 unimos ambas poleas.

En el diseño original iba montado un microswitch para implementar la seguridad de puerta abierta, pero el servo tiene poca fuerza y no se accionaba bien, así que lo he sustituido por un optoswitch.

También he cambiado la bisagra inferior por otra más larga y he pegado un trozo de plástico para  que accione el optoswitch cuando se cierra la puerta.

Conectamos el servo a la Alhambra FPGA y con un sencillo sketch probamos el funcionamiento de la puerta.

Pulsar el switch 1 y comprobar que la puerta abre y cierra correctamente.

La puerta en el banco de pruebas 

Para ver más detalles sobre el montaje del ascensor, consulta el proyecto original 

2. Esquema eléctrico


La siguiente imagen ilustra el esquema eléctrico de conexión. Lo puedes descargar en alta resolución al final de la página.

FC0, FC1 y FC2 son los microswitches final de carrera de las plantas baja, primera y segunda.

PB0, PB1 y PB2 son los pulsadores para llamar al ascensor.

ACDC0, ACDC1, ACDC2 y ACDC3 son los optoswitches para las señales de acelerar y decelerar.

Para ahorrar pines, he conectado el display de 7 segmentos a un decodificador BCD. Para mostrar los pisos 0, 1 y 2  sólo necesitamos dos hilos.

Tanto el driver L298 como la Alhambra se alimentan con una fuente de 12V. Con los 5V del regulador interno de la Alhambra, alimentamos los pulsadores, optoswitches, finales de carrera y el display de 7 segmentos. 

3. Código Verilog


El código principal es una FSM de Moore.

Cada vez que pulsamos un botón de llamada, el ascensor arranca con un PWM del 50% hasta que toca el optoswitch más cercano y pasa al 100%. Cuando llega al optoswitch inmediato anterior al Final de Carrera del piso destino, vuelve a pasar al 50% de PWM y al llegar al Final de Carrera el ascensor se detiene.

Para subir o bajar, lo que hacemos es actuar sobre el sentido de giro del motor. Esto lo controlamos con las salidas L298[1] y L298[0], que se corresponden con las entradas IN3 e IN4 del driver L298.

Por ejemplo,

Estando detenido en la planta baja, si pulso PB1 paso al estado S2 (subir con PWM 50%  para un arranque lento y hacemos las salidas ENB = PWM 50%, IN3 = 0, IN4 = 1.

Cuando se acciona ADCD0 el ascensor acelera a velocidad normal PWM = 100 %, IN3 e IN4 no cambian porque el ascensor sigue subiendo  y así permanece hasta que un poco antes de alcanzar la primera planta se acciona ACDC1 y el ascensor pasa a velocidad lenta PWM = 50% 

Cuando por fin se pisa el final de carrera FC1, el ascensor se para y hacemos todas las salidas cero (ENB = 0, IN3 = 0, IN4=0).

El código Verilog está diseñado de manera jerárquica, con un módulo principal y cinco submódulos independientes -pero conectados entre sí- que realizan funciones específicas. 

Módulo principal

El módulo principal es aquel donde se instancian los módulos secundarios. 

Código para el servo

Para accionar el servo de la puerta tenemos un generador de pulsos PWM que proporciona dos señales con un ancho de pulso tal que se corresponde con las posiciones puerta abierta y puerta cerrada. 

Estas señales se conectan a un multiplexor 2-1 y con la entrada de selección proporcionada por la FSM del servo, hacemos que al servo le llegue una señal u otra, según queramos abrir o cerrar la puerta. 

En principio la señal de selección para el multiplexor la proporcionaba la FSM del ascensor, pero el código daba un error al compilar, así que he duplicado la FSM para que proporcione la señal de selección para el multiplexor. Es un clon de la FSM del ascensor, sólo que según el estado hacemos sel_out = 1 ó sel_out = 0 para que el multiplexor habilite una señal u otra, abriendo y cerrando la puerta en cada caso. 

Máquina de estado finito del ascensor

La FSM del ascensor proporciona las salidas IN3 e IN4 para el driver L298, así como la señal ENABLE con pulsos PWM para controlar la velocidad del ascensor. 

Otras salidas son las del decodificador BCD para que el display de 7 segmentos muestre el piso actual. Esta parte del código está basada en el ejemplo que vimos en el Tema 4 de los Apuntes de Verilog. 

Un optoswitch colocado en la cabina sirve para comprobar que la puerta se ha cerrado correctamente antes de poner en marcha el motor. Esto lo implementamos con una puerta AND que corta el paso a la señal ENABLE del driver L298, si la puerta está abierta. 

Cuando se cierra la puerta, la señal ENABLE llega hasta el driver L298 y el motor se alimenta.

Máquina de estado finito del ascensor

El código del ascensor es una FSM de Moore implementada con el estilo de tres bloques always.

Un bloque always para el circuito secuencial que almacena el estado actual.

Un segundo bloque always para el circuito secuencial que genera el estado siguiente.

El último bloque always se corresponde con el circuito combinacional que genera las salidas en función del estado actual.

Esta parte del código incluye el generador de pulsos PWM para implementar la función del motor de dos velocidades para un arranque y parada suaves.

Por último está la FSM que controla el display. Como dije más arriba, está basada en el ejemplo de FSM que vimos en el Tema 4 de los Apuntes de Verilog.

Agrandes rasgos, esta máquina envía las señales que correspondan al decodificado BCD en función del final de carrera que se accione.

Para terminar puedes ver un ejemplo de funcionamiento en el siguiente vídeo.

Descargas

En el siguiente enlace puedes descargar los modelos 3D de las piezas empleadas en el montaje del ascensor, el esquema eléctrico y el código Verilog para la Alhambra FPGA.