Verilog Práctico

Capítulo 17. Crane Game Machine

Publicado el 10 de diciembre de 2022.

Actualizado el 22 de enero de 2023. Añadida una tira de ledes RGB.


En el siguiente tutorial veremos cómo hacer una máquina arcade del juego de la grúa. Este proyecto ya ha sido publicado en otras ocasiones, así que para hacerlo de manera diferente lo he rediseñado por completo, introduciendo un poco de sobreingeniería. Los cambios introducidos son:


· Montaremos la mecánica por fuera de la estructura, para ganar en superficie útil.

· Sustituiremos los motores DC por motores paso a paso en todos los ejes.

· Colocaremos finales de carrera en los ejes X e Y.

· Veremos cómo hacer la interfaz de pulsadores y microswitches con la Alhambra FPGA de dos maneras diferentes.

· Garra rediseñada e impresa en 3D y accionada con servo Futaba S3003.

· Y por supuesto, todo controlado con la Alhambra FPGA y programado en Verilog.

1. Montaje mecánico


No me voy a extender mucho en esta parte, ya que al final de la página he dejado los planos de la urna y la mecánica, en formato SketchUp. 


Básicamente, montaremos toda la parte mecánica sobre los listones que forman la estructura principal, así aprovechamos mejor el espacio interior.

En la parte trasera se monta el motor del eje Y. Es un motor con doble eje, para mover el carro de ambos lados.

En la siguiente imagen podemos ver el motor Z con la polea para subir y bajar la garra y los finales de carrera izquierdo y frontal. 

Detalle del motor X, y el final de carrera derecho. 

Vista frontal general.

Detalle del frontal de la máquina. Joystick y cajita para recoger el premio. 

Vista general superior. En el lado izquierdo de la imagen puede verse la posición de los finales de carrera delantero y trasero. 

2. Garra


La garra la he sacado de thingiverse. El cuerpo principal está basado en este diseño pero con los dedos de este otro modelo ya que los de la garra original me parecían demasiado grandes para el tamaño de la urna. 

Imprimimos las partes y montamos la garra empleando tornillería de métrica 3. Otras piezas son: un eje lineal de 8 mm de diámetro y unos 15 cm de longitud, tornillería M3 y una arandela de retención. 


Con una sierra de metal, hacemos dos hendiduras en la parte inferior del vástago, donde colocaremos la arandela de retención. En la parte superior hacemos un taladro de 3 mm de diámetro.

Se introduce el vástago por la parte de abajo y en la parte superior se monta el tapón de cierre con un tornillo M3. 

Detalle de la arandela de retención. 

Para accionar la garra, usaremos una polea y un cable que tira del vástago. La polea está disponible en thingiverse. 

Montamos en el tapón un tornillo M3 con contratuerca. Hacemos un lazo con un cable o hilo y lo atamos a la polea del servo. 

Una vez terminada la garra, hay que montarla en la máquina y hacer pruebas. Ajustar la longitud de la cuerda, la posición de la arandela de retención y el ángulo de actuación del servo para obtener el mejor resultado a la hora de coger los objetos. 

3. Esquema


La siguiente imagen muestra el esquema eléctrico del circuito. Al final de la página lo puedes descargar en alta resolución.

Con una fuente de 12V y 2A alimentamos los drivers A4988 de los motores y la Alhambra FPGA en el pin VIN. Con los 5V que genera la Alhambra alimentamos el servo, los finales de carrera y el CI 74HC244 que hace de interface entre los microswitches y las entradas de la Alhambra FPGA.

Los movimientos se controlan con un joystick y 4 pulsadores. El joystick mueve el carro en los ejes X e Y. Con los dos pulsadores de la izquierda subimos y bajamos la garra y los otros dos pulsadores son para abrir y cerrar la misma. 

La interface entre la consola de mandos y las entradas de la Alhambra se hace mediante optoswitches. 

Para tal efecto he diseñado la siguiente  tarjeta. En el lado izquierdo conectamos el joystick y los pulsadores y en el lado derecho las entradas hacia la Alhambra. 

Otra mejora respecto de la máquina anterior es el montaje de finales de carrera para detener el movimiento cuando se alcanzan los topes de recorrido, evitando así dañar los motores accidentalmente.


Los microswitches se alimentan con los +5V de la Alhambra y se conectan mediante un 74HC244. Montamos también unas resistencias pull-down de 10K y unos condensadores de 100nF para eliminar los rebotes. Los ledes son opcionales, se pueden omitir para simplificar el cableado, pero son muy útiles a la hora de hacer troubleshooting.

Los motores paso a paso se controlan con un driver A4988 conectado a la Alhambra FPGA. Para controlar un motor paso a paso necesitamos generar tres señales, ENABLE, STEP y DIR que se conectan directamente a las salidas DD0 - DD5.


Los drivers X e Y se conectan de igual manera, pero el driver Z tiene el pin ENABLE conectado a GND para retener el eje y que aguante el peso de la garra cuando no está en uso.

Por último, el servo se alimenta con +5V de la Alhambra y la señal de control se conecta en GP3. 

4. Código Verilog


Declaramos las entradas y salidas, los registros para los contadores y otras variables auxiliares.

Circuito que genera los pulsos para los drivers A4988, ejes X e Y. 

Contadores 1 y 2 para los generadores de pulsos X e Y. 

El hecho de tener pulsos de distinta frecuencia se debe a que las poleas del eje X son de menor diámetro que las del eje Y; para que el eje X se mueva a la misma velocidad que el eje Y, es necesario aumentar la frecuencia de los pulsos. Más info aquí. 

Código para el servo que acciona la garra. Básicamente es un generador de dos señales PWM de igual frecuencia pero distinto ancho, para mover el servo a dos posiciones que se corresponden con abrir o cerrar la garra. Los Flip-Flip son para mantener la posición. Más info sobre control de servos con Verilog en el Capítulo 5 de esta serie. 

Para el control de los ejes X e Y he desarrollado la siguiente tabla de la verdad. Las entradas son los pulsadores forward fw_sw  y backward bk_sw y los finales de carrera situados en los límites de recorrido máximo y mínimo fw_fc y bk_fc


Las salidas son las señales enable y dir para gobernar el driver A4988.

Para convertir la tabla de la verdad en ecuaciones combinacionales me he ayudado del software logisim. Más info en el Capítulo 11. 

El código para el eje Z lo he implementado mediante asignaciones contínuas. 

Si recordáis el esquema del driver Z, la señal enable está conectada a GND para que el driver esté siempre habilitado y retenga el eje del motor.


Para hacer que el motor sólo gire cuando se acciona un pulsador (up, down) utilizamos una puerta XOR y generamos la señal ena_z. Esta señal aplicada en la entrada de una puerta AND hace que los pulsos hacia el driver A4988 del eje Z sólo pasen cuando se acciona uno de los pulsadores de subir o bajar. 

Puedes descargar el código al final de la página.

5. Ledes RGB

Puedes montar tu máquina con lo que hemos visto hasta ahora, o bien añadir una tira de ledes RGB y hacer una grúa más molona.

Esta parte no afecta al esquema general, que se mantiene sin cambios. Conecta el driver RGB en los pines GP5, 6 y 7. Si utilizas ledes a 12V puedes alimentarlos con la misma fuente que el resto de la máquina.

A la hora de programar la Alhambra FPGA utilizamos el mismo código, sólo hay que añadir la parte que genera las señales PWM para los ledes rojo, verde y azul. Este código lo he bajado del GitHub de la usuaria Sara Sparks y lo he modificado ligeramente para adaptarlo a la Alhambra FPGA.

Como la cosa se complicaba un poco, he decidido separar el código en tres módulos que son:  el servo, el driver para los motores y el código para los ledes RGB y luego instanciar los módulos en un  módulo principal.

Esta forma de modelar hardware en una FPGA se llama diseño jerárquico y se utiliza para descomponer el código en partes más pequeñas y fáciles de modelar.

En el módulo principal declaramos todas las entradas y salidas de nuestro circuito...

...y luego conectamos los puertos de entrada y salida mediante mapeo explícito:

Recuerda poner todos los archivos juntos en la misma carpeta.

Aquí abajo tienes disponible para descargar, las dos versiones de código; con y sin ledes RGB.

Espero que os haya gustado.

¡Hasta pronto!

6. Enlaces


Capítulo 10. Pulse Width Modulation (servos)


Capitulo 11. Finite State Machines


Capítulo 15. Motores Paso a Paso


Rainbow fading RGB LED in Verilog, many thanks to Sara Sparks 



7. Descargas


Descarga los planos de la máquina, el esquema eléctrico y el código verilog en el siguiente enlace.