Close

Mostrar imagen en Raspberry Pi al seleccionar juegos en CoinOPS

A project log for THE ULTIMATE MINI ARCADE

Classic arcade with all the latest technological advancements, ready for the classics. Enjoy!

srrubioSrRubio 07/30/2025 at 12:180 Comments

Índice

  1. Instalación sistema operativo en Raspberry Pi

  2. Instalación de dependencias en Raspberry Pi

  3. Estructura de archivos y directorios

  4. Scripts usados en Raspberry Pi

    • mostrar_rom_wrapper.sh

    • recibir_rom.sh

  5. Servicio systemd para automatizar el script

  6. Configuración en Windows para enviar el nombre de la ROM

    • Script launch_rom_with_image.bat

    • Configuración en CoinOPS para usar el script

  7. Funcionamiento y flujo de trabajo

  8. Notas finales

1. Instalación sistema operativo en Raspberry Pi



sudo apt update && sudo apt upgrade -y


2. Instalación de dependencias en Raspberry Pi

Instalar herramientas necesarias:



sudo apt install fbi socat nmap -y


3. Estructura de archivos y directorios



/home/arcade/
├── caratulas/
│   ├── logo.jpg        # Imagen logo por defecto
│   ├── aliens.jpg      # Imagen de ejemplo para la ROM aliens
│   └── otras_roms.jpg  # Más imágenes para otras ROMs
├── mostrar_rom_debug.log  # Log de depuración
/usr/local/bin/
├── recibir_rom.sh         # Script para recibir nombre ROM y mostrar imagen
├── mostrar_rom_wrapper.sh # Script que muestra imagen según ROM recibida
/etc/systemd/system/
└── recibir_rom.service    # Servicio systemd para ejecutar recibir_rom.sh


4. Scripts usados en Raspberry Pi

mostrar_rom_wrapper.sh



#!/bin/bash

ROM="$1"
ROM=${ROM//\"/}  # <--- Elimina comillas del nombre recibido
DEBUG_LOG="/home/arcade/mostrar_rom_debug.log"
TTY="/dev/tty1"
CARATULAS="/home/arcade/caratulas"
IMG="$CARATULAS/${ROM}.jpg"
LOGO="$CARATULAS/logo.jpg"
FBI_PID_FILE="/tmp/fbi_logo.pid"

# Detener el logo mostrado con fbi
if [[ -f "$FBI_PID_FILE" ]]; then    FBI_PID=$(cat "$FBI_PID_FILE")    sudo kill "$FBI_PID" 2>/dev/null    rm -f "$FBI_PID_FILE"
fi

# Mostrar imagen de la ROM o el logo si no existe
if [[ -f "$IMG" ]]; then    echo "$(date) Recibido: $ROM → $IMG" >> "$DEBUG_LOG"    sudo fbi -T 1 -noverbose -a "$IMG" > /dev/null 2>&1 &
else    echo "$(date) Imagen no encontrada: $IMG. Mostrando logo." >> "$DEBUG_LOG"    if [[ -f "$LOGO" ]]; then        sudo fbi -T 1 -noverbose -a "$LOGO" > /dev/null 2>&1 &    fi
fi


recibir_rom.sh


#!/bin/bash

PORT=12345
LOGO="/home/arcade/caratulas/logo.jpg"
TTY="/dev/tty1"
FBI_PID_FILE="/tmp/fbi_logo.pid"

# Esperar a que termine el arranque completo (evita que el logo desaparezca)
sleep 5

# Mostrar el logo al inicio con fbi
if [[ -f "$LOGO" ]]; then    sudo fbi -T 1 -noverbose -a "$LOGO" > /dev/null 2>&1 &    echo $! > "$FBI_PID_FILE"
fi

# Escuchar por nuevas ROMs
socat TCP-LISTEN:$PORT,reuseaddr,fork SYSTEM:'/usr/local/bin/mostrar_rom_wrapper.sh $(cat)'


5. Servicio systemd para automatizar el script

Archivo /etc/systemd/system/recibir_rom.service:



[Unit]
Description=Servicio para recibir nombre de ROMs y mostrar su imagen
After=network.target

[Service]
ExecStart=/usr/local/bin/recibir_rom.sh
Restart=always
User=root

[Install]
WantedBy=multi-user.target


Para habilitar y arrancar el servicio:



sudo systemctl daemon-reload
sudo systemctl enable recibir_rom.service
sudo systemctl start recibir_rom.service


6. Configuración en Windows para enviar el nombre de la ROM

launch_rom_with_image.bat


@echo off
set ROM_NAME=%1

:: Log local
echo Enviado: %ROM_NAME% >> c:\temp\rom_debug.log

:: Enviar el nombre de la ROM a la Raspberry Pi
echo %ROM_NAME% | "C:\Program Files (x86)\Nmap\ncat.exe" 192.168.1.138 12345

:: Lanzar el emulador directamente y esperar a que termine
"E:\Deluxe 4x3\emulators\mame\mame64nocfg.exe" %1 -rompath "E:\Deluxe 4x3\emulators\mame\roms"

:: Una vez cerrado el emulador, mostrar logo
echo logo | "C:\Program Files (x86)\Nmap\ncat.exe" 192.168.1.138 12345
echo Enviado: logo (tras salir del juego) >> c:\temp\rom_debug.log


Configuración en CoinOPS (RetroFE)

En el archivo de configuración .conf del emulador (ejemplo mame.conf):



executable = E:\Deluxe 4x3\scripts\launch_rom_with_image.bat
arguments = "%ITEM_NAME%"
LEDBlinkyEmulator = mame


7. Funcionamiento y flujo de trabajo

  1. Al iniciar la Raspberry Pi, se muestra el logo.jpg durante el arranque y espera conexiones en el puerto 12345.

  2. Desde Windows, cuando se selecciona un juego en CoinOPS, se ejecuta launch_rom_with_image.bat enviando el nombre del juego (ROM) a la RPi vía ncat.

  3. El script en la RPi recibe el nombre de la ROM, para mostrar la imagen correspondiente (aliens.jpg, 19xx.jpg, etc.) o el logo.jpg si no existe la imagen de la ROM.

  4. Se lanza el emulador con la ROM seleccionada.

  5. Al cerrar el emulador, se envía el comando para mostrar de nuevo el logo en la RPi.

8. Notas finales

Discussions