Classic arcade with all the latest technological advancements, ready for the classics. Enjoy!
To make the experience fit your profile, pick a username and tell us what interests you.
We found and based on your interests.
sistema que tienes: rodamiento 608ZZ + NEMA17 con caja planetaria 5:1 + hub hecho a medida + TMC2209 (UART) + 2 finales de carrera. Incluye los cálculos exactos (grados / pasos / torque), el cableado esencial, comportamiento de software y checklist de puesta en marcha.
Masa de la pantalla: 0,53 kg.
Dimensiones aproximadas: 280 × 210 × 55 mm.
Asunción (peor caso): eje en el borde → distancia centro de masa al eje ≈ 0,14 m (media del lado largo).
Rodamiento elegido: 608ZZ (8 × 22 × 7 mm).
Motor comprado: NEMA17 + caja planetaria 5:1 (ver nota de ratio más abajo).
Driver: TMC2209 v1.3 en UART.
Microcontrolador: Arduino Pro Micro (USB-Serial para RetroBat).
Finales de carrera: 2 (HOME = 0°; VERT = 90°).
Queremos saber el par que debe sostener el eje si la pantalla está anclada por el borde.
Fuerza debida a la gravedad:
m = 0,53 kg
g = 9,81 m/s²
F = m × g = 0,53 × 9,81 =
0,53 × 9,81 → hago el producto paso a paso:
9,81 × 0,5 = 4,905
9,81 × 0,03 = 0,2943
suma = 4,905 + 0,2943 = 5,1993 N
F = 5,1993 N
Par = F × r = 5,1993 × 0,14 =
5,1993 × 0,1 = 0,51993
5,1993 × 0,04 = 0,207972
suma = 0,51993 + 0,207972 = 0,727902 N·m
→ Par gravitatorio ≈ 0,7279 N·m (≈ 0,73 N·m).
Regla de diseño: usa factor de seguridad ×2 → objetivo de diseño ≈ ≥ 1,5 N·m en salida del reductor.
Supongamos torque nominal sin reductor del NEMA17 ≈ 0,52 N·m (modelo típico 17HS19).
Si la ratio nominal real es 5.18:1 (algunos PG5 son 5.18):
Par salida ≈ 0,52 × 5,18 =
0,52 × 5 = 2,60
0,52 × 0,18 = 0,0936
suma = 2,60 + 0,0936 = 2,6936 N·m
Si la ratio fuera exactamente 5:1:
Par salida ≈ 0,52 × 5 = 2,6 N·m
→ Resultado: con la planetaria tienes ≈ 2,6–2,69 N·m en salida, claramente por encima del objetivo 1,5 N·m. Holgura amplia.
Conclusión: la caja planetaria es sobredimensionada para seguridad y para compensar pérdidas/perfil dinámico — perfecto.
Necesitas saber cuántos pulsos STEP para mover 0°→90°.
Variables base:
Motor: 200 pasos / rev (1,8°/paso).
Microstepping elegido: 1/16 (configurado por UART en TMC2209).
Gearbox ratio: puede ser 5:1 o 5.18:1 — usa el número que indique tu caja (marca).
Cálculo A — si ratio = 5.18:
Pasos motor por rev = 200
Microsteps por rev motor = 200 × 16 = 3200
Pasos por 1 rev salida = 3200 × 5,18 =
3200 × 5 = 16000
3200 × 0,18 = 576
suma = 16000 + 576 = 16576 pasos por 360° salida
Pasos por 90° = 16576 / 4 = 4144 pasos
Cálculo B — si ratio = 5.00:
200 × 16 = 3200
3200 × 5 = 16000 pasos por 360° salida
Pasos por 90° = 16000 / 4 = 4000 pasos
Conclusión práctica:
Si tu caja es 5.18:1 → usa STEPS_90 = 4144.
Si es 5:1 → usa STEPS_90 = 4000.
(Confirma la relación exacta serigrafiada en la caja para elegir el número correcto en firmware.)
Si quieres que el giro dure 1,5 s:
Para 4144 pasos → pasos/s = 4144 / 1,5 = ≈ 2762,67 pasos/s.
Para 4000 pasos → pasos/s = 4000 / 1,5 = ≈ 2666,67 pasos/s.
Con microstepping 1/16 y TMC2209 en StealthChop esto es razonable; empieza por 1.5–2 s y ajusta.
Recomendación: hacer rampa de aceleración (accel) en firmware para evitar pérdidas de pasos; usa AccelStepper (Arduino) o implementa rampas en tu loop.
Piezas principales
NEMA17 + caja planetaria 5:1 (ya comprado).
Rodamiento 608ZZ (ya comprado).
Hub/disco con asiento para 608 (impreso o comprado).
TMC2209 v1.3 (UART).
...DOFLinx solo funciona con mame por separado, sin cores de retroarch.
He instalado la última versión de mame:
https://www.insertmorecoins.es/mame-0-282-64-bits-no-nag-including-mess/
Y he descargado todo el romset de esa versión
https://pleasuredome.github.io/pleasuredome/mame/
El romset entero es enorme, no instaléis todo. Yo he partido de una selección que ya tenía.
Para sustituir las roms que tenía por las del romset he usado freefilesync.
https://freefilesync.org/download.php
A la izq ponemos la carpeta del romset y a la derecha donde tenemos las roms C:\Retrobat\roms\mame
Para el set, tenemos que personalizar la sincronización como aparece en la imagen
He descargado la versión non merged que agrupa todo lo necesario en un solo archivo zip. La pega es que debe ser de la misma versión que el mame instalado.
Pero para retrobat, creo que es mejor.
Para añadir los flyers he usado la última versión de Bezel Project para windows.
https://github.com/thebezelproject/BezelProject-Windows
Se instala fácilmente. Primero hay que elegir la carpeta de mame.
Para cargar las roms desde mame stand alone, he creado un .bat en la carpeta plugins:
@echo off
REM Lanza directamente MAME con la ROM que le pasa RetroBat
cd /d "C:\RetroBat\emulators\mame"
mame.exe %1
Luego tenemos que editar es_systems.cfg y sustituir el command de mame por uno nuevo que apunte al .bat creado
<command>"C:\RetroBat\plugins\launch_mame_direct.bat" %ROM%</command>DOFLinx es un programa de utilidad diseñado para funcionar con DOF (Direct Output Framework) R3 (a partir de la versión 6.20, esta es la versión R3++ de DOF) para proporcionar funcionalidad adicional a los emuladores de pinball que no la implementan directamente. Inicialmente, solo añadía retroalimentación háptica a los flippers de Pinball FX2 y se llamaba DOFFX2.
https://doflinx.github.io/docs/overview/02_What_is_DOFLinx.html
Instalación:
https://doflinx.github.io/docs/getting-started/04_Installation.html
https://github.com/DOFLinx/DOFLinx/releases
https://pinball-docs.clevelandsoftwaredesign.com/docs/DOFLinx/installing/
Por supuesto, necesitarás tener tus ROMs cargadas en la carpeta ROM y cualquier otro material relacionado con MAME que planees usar, es decir, trucos, marquesinas, etc. Todo lo demás, excepto la comunicación entre procesos, es estándar de MAME.
ADVERTENCIA! No es necesario instalar una versión "especial" para DOFLinx. Esa información es obsoleta.
Una vez instalado MAME, debes modificar el archivo MAME.INI para habilitar la comunicación TCP con MAME. La sección que debes modificar se encuentra en “OSD SOUTPUT OPTIONS”. Configura la salida en “network”. Esto es fundamental; sin esta configuración, nada funcionará.
# OSD OUTPUT OPTIONS # output network
Esto permite que DOFLinx y MAME se comuniquen mediante TCP/IP usando la dirección de bucle invertido predeterminada, de modo que el tráfico nunca sale de tu PC, sino que permanece en la pila TCP/IP estándar. La comunicación TCP/IP se introdujo en MAME hace ya bastante tiempo; yo simplemente he añadido más mensajes.
Dentro de la carpeta DOFlinx existe una de plugins para MAME que debemos copiar posteriormente en la carpeta de plugins en MAME. Luego aseguraremos que el plugins de DOFLinx está activado.
Carpeta en DOFLinx
Pegar en MAME
Luego aseguraremos que el plugins de DOFLinx está activado.
Tenemos que configurar DOFLINX.ini directamente o con el programa de configuración.
DOFLinx siempre se debe ejecutar desde el acceso directo que lleva en la propia carpeta. Este hace referencia al .ini. Si lo ejecutamos desde el .exe no funcionara correctamente.
Dentro de las carpetas MAME , FX, FX3 vienen las configuraciones de las acciones en cada juego.
Para que DOFLinx funcione correctamente lo debemos ejecutar desde el fronted que tengamos instalado con la ruta CMD. Ejemplo: "MAME 1942" dentro de la ruta mame
Para realizar las pruebas y comprobar las tiras leds. Es necesario configurar los controles en DOFLinx. Si no lo hacemos los efectos no funcionarán.
https://doflinx.github.io/docs/getting-started/06_PinballFX.html
En todo este tiempo, he estado peleando para configurar el sistema WEMOS, tiras LEDS, LEDWIZ, DOF. He llegado a comprar hasta 3 wemos. La mala suerte de haber recibido los 2 primeros con problemas. Me he vuelto loco, hasta recibir uno en buen estado.
Tengo la suerte de participar en un grupo de Telegram donde nos ayudamos y aprendemos en la creación de Pinballs virtuales. En el pasado cree uno micro.
Mis compañeros Gustavo A Lara y Shiryu55 recopilaron toda la información en un PDF.
Aprovecho para compartir el canal de Gustavo, que es un autentico genio y comparte sus habilidades con la comunidad a un nivel muy alto.
https://youtube.com/@gustavoalarah?si=Wat1kwb0E_XjDkvE
En esta guía vamos a tratar de explicar todos los pasos para poder instalar y configurar nuestras tiras LED RGB para ofrecer efectos en nuestros pinballs virtuales a traves del Framework de DirectOutput (DOF). Asumimos que la instalación de VisualPinball está realizada (a través de Popper o similares) y que disponemos de nuestra ruta de instalación en C:\vPinball
1 ¿Qué es DOF?
(extraído de mjrnet.org)
DOF es un software independiente que puedes instalar en tu sistema para controlar dispositivos de retroalimentación (feedback). En realidad, no es un programa completamente separado; es más bien un complemento que funciona junto con Visual Pinball y otros programas. DOF gestiona las comunicaciones entre el software de pinball y tus dispositivos controladores de salida. Cumple dos funciones principales.
Primero, DOF maneja las comunicaciones con varios tipos diferentes de controladores de salida: LedWiz, PacLed, placas de relés SainSmart, Pinscape y más. Antes de que existiera DOF, un programa que quisiera acceder a múltiples controladores de salida debía ser programado específicamente en el lenguaje de cada controlador. DOF ofrece una interfaz común que VP puede usar para acceder a cualquiera de estos dispositivos sin necesidad de conocer sus detalles.
Segundo, DOF traduce entre los elementos de juego simulados de VP y las conexiones físicas de los dispositivos de los controladores de salida. VP piensa en términos de los elementos de la mesa de pinball simulada: flipper izquierdo, bumper central, lanzador derecho, etc. Los controladores de salida, en cambio, no saben nada de pinball. Solo saben de dispositivos genéricos conectados a sus “puertos de salida” numerados: puerto 1, puerto 2, puerto 3, etc. Cada puerto de salida en un controlador es básicamente una conexión por cable a un dispositivo físico como un solenoide o una luz intermitente. Pero los controladores de salida no saben nada sobre qué está conectado; solo saben que hay algo cableado a cada puerto.
DOF actúa como un intérprete que traduce entre el modelo orientado al juego de VP y la lista de dispositivos físicos del controlador de salida. DOF logra esto utilizando un archivo de configuración que tú proporcionas, el cual le indica el “significado” de cada puerto de salida físico.
2 Instalación de DirectOutput
Como ya se ha comentado anteriormente, antes de instalar DOF, primero debemos instalar Visual Pinball y el programa B2S Backglass, si vamos a usar PinballX como el sistema de menú para seleccionar juegos, también hay que instalarlo primero.
Una vez que VP, B2S y PinballX estén instalados, ya estás listo para instalar DOF.
La url con los últimos paquetes es la siguiente. http://mjrnet.org/pinscape/dll-updates.html#GranderUnifider
y la versión actual es del 1 de Julio de 2025, la cual tenéis aquí directamente:
http://mjrnet.org/pinscape/downloads/DirectOutput-mjr-x86-release-20250701.msi
http://mjrnet.org/pinscape/downloads/DirectOutput-mjr-x64-release-20250701.msi
Veréis que hay un enlace para x64 y otro para x86. SON NECESARIOS LOS DOS, ya que podemos encontrar...
Instalar Ncat
Instala Nmap para usar ncat.
Ruta recomendada: C:\Program Files (x86)\Nmap\ncat.exe.
Comprobar que desde CMD puedes ejecutar:
"C:\Program Files (x86)\Nmap\ncat.exe" --version
Scripts de Windows
start.batGestiona cierre de procesos, lanzamiento de RetroBat y monitor, y envía SHUTDOWN al cerrar.
Contenido ya funcional que compartiste:
@echo off setlocal enabledelayedexpansion set "MONITOR_BAT=C:\RetroBat\plugins\MarqueeManager\marquee_monitor.bat" set "MONITOR_TITLE=RetroBat_MarqueeMonitor" set "NCAT_EXE=C:\Program Files (x86)\Nmap\ncat.exe" set "RPI_IPS=192.168.1.138 192.168.1.145" set "RPI_PORT=12345" cd /d "%~dp0" :: --- Cerrar procesos previos --- for %%P in ( ESEvents.exe ESEventsScrapTopper.exe ESRetroAchievements.exe VPListenerWS.exe MAMEListenerWS.exe SUPERMODELListenerWS.exe retroarch.exe mpv.exe dmd.exe emulationstation.exe ) do ( tasklist | find /I "%%P" > NUL && taskkill /IM %%P /F ) :: --- Limpiar tmp del MarqueeManager --- rd /s /q ".\.tmp" 2>NUL :: --- Iniciar monitor --- start "%MONITOR_TITLE%" cmd /k ""%MONITOR_BAT%"" :: --- Iniciar ESEvents --- start "" ESEvents.exe timeout /t 1 /nobreak >NUL :: --- Iniciar RetroBat --- start "" ..\..\retrobat.exe timeout /t 2 /nobreak >NUL :: --- Esperar a que RetroBat termine --- :wait_rb tasklist | find /I "retrobat.exe" >NUL if not errorlevel 1 ( timeout /t 2 >NUL goto wait_rb ) tasklist | find /I "emulationstation.exe" >NUL if not errorlevel 1 ( timeout /t 2 >NUL goto wait_rb ) :: --- Cerrar monitor --- taskkill /FI "WINDOWTITLE eq %MONITOR_TITLE%" /F :: --- Enviar SHUTDOWN a RPis --- for %%I in (%RPI_IPS%) do ( echo [%time%] Enviando SHUTDOWN a %%I:%RPI_PORT%... echo SHUTDOWN | "%NCAT_EXE%" %%I %RPI_PORT% -w 1 ) endlocal
marquee_monitor.batRecibe eventos de RetroBat (sistema y ROM) y los envía a las RPis.
Contenido funcional que compartiste: no hay cambios, se mantiene tal cual.
Script mostrar_rom_ipc.sh
Ubicación: /usr/local/bin/mostrar_rom_ipc.sh
Permisos:
sudo chmod +x /usr/local/bin/mostrar_rom_ipc.sh
Contenido funcional que compartiste: mantener tal cual.
Servicio systemd
Crear archivo: /etc/systemd/system/marquee-mpv.service
[Unit] Description=Marquee MPV IPC Listener After=network.target [Service] Type=simple User=arcade ExecStart=/usr/local/bin/mostrar_rom_ipc.sh Restart=always RestartSec=2 StandardOutput=syslog StandardError=syslog SyslogIdentifier=marquee-mpv [Install] WantedBy=multi-user.target
Ajusta User=arcade si tu usuario es diferente.
Habilitar y arrancar el servicio
sudo systemctl daemon-reload sudo systemctl enable marquee-mpv.service sudo systemctl start marquee-mpv.service
Comprobar estado:
sudo systemctl status marquee-mpv.service
Esto asegura que siempre se levante al iniciar la RPi y esté escuchando los mensajes de Windows.
Desde Windows, prueba el envío manual:
echo SHUTDOWN | "C:\Program Files (x86)\Nmap\ncat.exe" 192.168.1.138 12345 -w 1
La RPi debería apagarse.
Lanzar start.bat en Windows:
RetroBat se inicia.
Monitor registra los eventos de sistema/ROM y los envía a las RPis.
Al cerrar RetroBat, el monitor envía SHUTDOWN automáticamente.
Revisar logs:
Windows: C:\temp\marquee_debug.log
RPi: /home/arcade/mostrar_rom_debug.log
Acceder a la partición de arranque (/boot/firmware/).
Crear (o editar si ya existe) el archivo stretch:
sudo nano /boot/firmware/stretch
Contenido posible del archivo:
Para estirar a pantalla completa:
STRETCH=yes
Para mantener la proporción original:
STRETCH=no
⚠️ Es importante que el archivo solo tenga esa línea, sin comillas ni espacios delante.
mostrar_rom_ipc.shEl script /usr/local/bin/mostrar_rom_ipc.sh fue modificado para leer este archivo al inicio:
STRETCH_CFG="/boot/firmware/stretch" KEEPASPECT="true" if [[ -f "$STRETCH_CFG" ]]; then if grep -q '^STRETCH=yes' "$STRETCH_CFG"; then KEEPASPECT="false" fi fi
Si detecta STRETCH=yes → usa keepaspect=false en mpv.
En cualquier otro caso → usa keepaspect=true.
Esto se aplica en la función mpv_load, justo antes de cargar el vídeo/imagen.
Después de editar el archivo stretch:
Guardar cambios.
Reiniciar la Raspberry Pi para que el servicio vuelva a lanzar el script con la configuración actualizada:
sudo reboot
Para comprobar qué modo está activo:
Reproducir cualquier ROM, imagen o logo.
Revisar el log de depuración:
tail -n 20 /home/arcade/mostrar_rom_debug.log
Si se quiere más claridad, se puede añadir al script un log explícito como:
[CFG] keepaspect=false (stretch enabled)
Pantalla completa (estirado):
/boot/firmware/stretch → STRETCH=yes
Mantener proporción original:
/boot/firmware/stretch → STRETCH=no
Cambio de modo:
Editar archivo y reiniciar RPi.
En la partición /boot/firmware (visible desde Windows), crear un archivo llamado wifi_config con este formato:
SSID=NombreDeLaRed PSK=ContraseñaDeLaRed
⚠️ Importante:
Usar solo UTF-8 sin BOM (notepad++ o VS Code permiten guardarlo así).
No dejar espacios extra al final de las líneas.
Evitar saltos de línea de Windows (\r\n), usar saltos UNIX (\n).
Ejemplo válido:
SSID=WIFI PSK=12345678
/usr/local/bin/apply_boot_wifi.shInstalar el script que leerá wifi_config y configurará la conexión Wi-Fi:
sudo nano /usr/local/bin/apply_boot_wifi.sh
Contenido:
#!/bin/bash set -euo pipefail LOG=/var/log/apply_boot_wifi.log echo "=== apply_boot_wifi run at $(date) ===" >> "$LOG" CFG="/boot/firmware/wifi_config" if [ ! -f "$CFG" ]; then echo "[ERROR] $CFG no existe" >> "$LOG" exit 1 fi SSID=$(grep -m1 '^SSID=' "$CFG" | cut -d= -f2- | sed 's/^ *//;s/ *$//') PSK=$(grep -m1 '^PSK=' "$CFG" | cut -d= -f2- | sed 's/^ *//;s/ *$//') echo "[INFO] SSID='$SSID'" >> "$LOG" echo "[INFO] Intentando conectar..." >> "$LOG" # Crear/actualizar conexión en NetworkManager if nmcli device wifi list | grep -q -F "$SSID"; then if nmcli connection show "$SSID" >/dev/null 2>&1; then nmcli connection modify "$SSID" wifi-sec.key-mgmt wpa-psk wifi-sec.psk "$PSK" else nmcli connection add type wifi ifname wlan0 con-name "$SSID" ssid "$SSID" nmcli connection modify "$SSID" wifi-sec.key-mgmt wpa-psk wifi-sec.psk "$PSK" fi nmcli connection up "$SSID" >> "$LOG" 2>&1 || echo "[ERROR] Falló la conexión" >> "$LOG" else echo "[ERROR] SSID '$SSID' no encontrado en escaneo" >> "$LOG" fi
Dar permisos de ejecución:
sudo chmod +x /usr/local/bin/apply_boot_wifi.sh
Crear el archivo de servicio:
sudo nano /etc/systemd/system/apply-boot-wifi.service
Contenido:
[Unit] Description=Apply WiFi config from /boot/firmware/wifi_config After=network-pre.target Wants=network-pre.target [Service] Type=oneshot ExecStart=/usr/local/bin/apply_boot_wifi.sh RemainAfterExit=yes [Install] WantedBy=multi-user.target
Activar y arrancar:
sudo systemctl daemon-reload sudo systemctl enable apply-boot-wifi.service sudo systemctl start apply-boot-wifi.service
Revisar el log:
cat /var/log/apply_boot_wifi.log
Debe aparecer algo como:
=== apply_boot_wifi run at Mon 15 Sep 20:49:05 CEST 2025 === [INFO] SSID='WIFI' [INFO] Intentando conectar... [INFO] Conectado a 'WIFI'
Ver estado de red:
nmcli device status ip -4 addr show wlan0
Probar ping a Internet:
ping -c3 8.8.8.8
Desde Windows, editar /boot/firmware/wifi_config con el nuevo SSID/PSK.
Guardar y expulsar la tarjeta SD.
Reiniciar la Raspberry Pi.
La Pi se conectará automáticamente a la nueva red.
✅ Con esto tienes una Raspberry Pi portátil donde el Wi-Fi se configura sin tocar Linux, solo editando un archivo en la partición accesible desde Windows.
Create an account to leave a comment. Already have an account? Log In.
Become a member to follow this project and never miss any updates
By using our website and services, you expressly agree to the placement of our performance, functionality, and advertising cookies. Learn More
Ander
Jasper Sikken