PROYECTO VIDEOCONSOLA CON MANDO

MIEMBROS DEL EQUIPO

  • Álvaro García Sierra
  • Javier Balenzategui García
  • Javier Vico Gallego
  • Jorge Molina Tirado

INTRODUCCIÓN

En este proyecto se ha decidido realizar un sistema embebido. Puesto que la mayoria de miembros del equipo pertenecían al doble grado en Diseño y Desarrollo de Videojuegos + Ingeniería de Computadores, se decidio por enfocarlo a la creación de una consola con mando implementada con arduino. 

El proyecto esta compuesto principalmente por 4 partes: la consola, que contiene una raspberry overclockeada, un proyector, unos altavoces y un mando con baterías y bluetooth.

Bocetos iniciales del proyecto

MATERIAL EMPLEADO

MaterialCantidad
Arduino Pro MICRO1
Botones8
Joysticks2
Módulo Bluetooth HC-061
Baterias 186502
Fuente de alimentacion USB tipo C1
Cable Micro HSDMI1
Leds3
Controlador1

COMPONENTES

Mando de la consola

Para esta parte se ha necesitado un mando de tamaño no excesivamente grande, para poder adaptarlo al manejo ergonómico que se pretendía para el usuario. 

Esto implicó la necesidad de un controlador arduino lo suficientemente pequeño como para que pudiera funcionar dentro del mando sin añadir más volumen del necesario. Este mando dispone de baterías externas para evitar que se tenga que conectar constantemente a la alimentación, por lo que se utilizó un módulo bluetooth. También se requirió de varios botones/pulsadores, dos joysticks y  cables internos.

Para la construcción del mando se empleó un Arduino PRO MICRO, con un total de 8 botones y 2 joysticks. El proceso de construccion e implementación del mando constó de 2 partes: mando original del proyecto y un intento fallido de mando avanzado (+ bluetooth, + caragdor de pilas).

  • Mando original

Utilizando la librería “Joystic.h” el arduino será visto como un GamePad. Mediante INPUT_PULLUP se recibe la señal de los botones sin necesidad de alimentación adicional:

#include <Joystick.h>
#define ENABLE_PULLUPS
Joystick_ joystick;

Definimos las entradas de los botones e inicializamos el joystick:

void setup() {
pinMode(2,INPUT_PULLUP);
pinMode(3,INPUT_PULLUP);
joystick.begin();

Para usar el joystick, se leen pines analógicos del eje X y el Y del Joystick y mediante Joystick.h las entradas se codifican para el  uso del gamepad (si los Joystick no funcionan correctamente se deben mapear las entradas). Ejemplo de joystick:

void loop() {
joystickDerX = analogRead(A0);
joystick setRxAxis(joystickDerX);
joystickDerY = analogRead(A1);
joystick setRyAxis(joystickDerY);
}

Para los botones, también en el bucle loop, leemos las entradas digitales en bucle (empezando por 2 debido a la posición de los pines del arduino micro) y cuando se recibe un input la señal es codificada para el uso de un gamepad, presionando el botón. De no ser así el botón no estará activado.

for(int i = 2; i<=botones; i++) {
  if(digitalRead(i) == LOW) {
     joystick.pressButton(i-2);
  }
  else {
     joystick.releaseButton(i-2);
  }
  delay(10);
} 
Esquema

Finalmente, para la construcción se decidión colocar los botones y los joysticks en una carcasa hecha a mano de forma que se emula el aspecto de un mando de videojuegos.

  • Mando avanzado (+ bluetooth, +cargador de pilas)

Para las futuras mejoras del mando se recomienda el uso de un módulo RN42 o cambiar el firmware de otro módulo bluetooth mediante un FTDI BREAKOUT PORT. También se debe conectar una batería auxiliar, se recomienda el uso de 2 pilas 18650 en serie (2×3.7V = 7.2V) junto con un módulo cargador de pilas para alimentar el arduino y todos sus componentes incluyendo un módulo bluetooth HC-06.

Esquema aproximado en protoplaca. DERECHA: módulo bluetooth HC-06. IZQUIERDA: modulo cargador de pilas 18650

Para el montaje de esta segunda versión fallida del proyecto se cosntruyó una carcasa de mando mediante una impresora 3D que emula a la perfección un mando de consola de videojuegos actual.

Consola/Raspberry Pi 4

Para la consola se usó una Raspberry Pi 4 con 4GB de RAM, un adaptador WI-FI y un módulo Bluetooth. Se decidió por este modelo debido a su gran eficiencia y comodidad. 

Para mejorar el rendimiento general del sistema, y en los videojuegos que se icorporarán posteriormente en la consola, se realizó un Overclock a la Raspberry, al procesador ARM y a la GPU específicamente.

Se tuvo la idea de usar el emulador “RETROPIE” para poder jugar a los videojuegos con las ROMs de diversas consolas clásicas (en este caso la ATARI 7800 y SEGA MASTERSYSTEM). Para conseguirlo, se ha sobrepuesto el emulador sobre del sistema operativo de Raspbian utilizando una versión multiplataforma del emulador “RETROARCH”.

Se decidió descargar una versión especial de chromium que permite reproducir contenido multimedia como los servicios proprocionados HBO, NETFLIX o PRIME VIDEO, de tal forma que se pueda utilizar la consola como una fuente general de contenido y entretenimiento sin centrarse unicamente en los videojuegos.

Antes de explicar montaje de la consola primero se explicará los pasos realizado para la configuración de la raspberry. 

  • CONFIGURACIÓN DE REFRIGERACIÓN: 

Se ha agregado un ventilador a la  vez que diferentes disipadores para poder refrigerar la Raspberry y evitar que se pueda sobrecalentar. El ventilador va conectado a los pines de 5V para poder obtener la máxima velocidad posible.

  •  OVERCLOCK DEL PROCESADOR Y LA GPU: 

La versión base de Raspberry PI adquirida trae una frecuencia de reloj de procesador de 1.5GHz, y en la GPU de 500MHz. Para poder overclockear ambas frecuencias hemos utilizado el siguiente código en el terminal:

sudo nano /boot/config.txt

De esta forma se accede a la configuración de la raspberry. Acto seguido se añaden las siguientes líneas de código:

over_voltage=4
arm_freq=1750
gpu_freq=750

De esta forma se aumenta el voltaje y establecemos el procesador en 1.75GHz y la GPU en 750MHz.

  • INSTALACIÓN DE CHROMIUM MEDIA EDITION: 

Para que la consola ofrezca más servicios de entretenimiento además del gaming, hemos optado por descargar esta versión de Chromium que nos permite reproducir cualquier tipo de contenido multimedia: YouTube, Netflix, HBO, ect.

sudo su
cd /usr/lib/chromium-browser
wget http://blog.vpetkov.net/wp-content/uploads/2019/09/libwidevinecdm.so
unzip libwidevinecdm.so_.zip && chmod 755 libwidevinecdm.so
wget http://blog.vpetkov.net/wp-content/uploads/2020/03/chromeos-browser.desktop.zip
unzip chromeos-browser.desktop.zip && mv chromeos-browser.desktop /usr/share/applications
  • INSTALACIÓN DE RETROPIE: 

Para instalar RETROPIE se ha usado el enlace oficial del hilo de RETROPIE en GitHub. Esto permitirá ejecutarlo de forma manual una vez se inicie la consola. En este caso se deliberó instalar diversas ROMs de varias consolas como ATARI 7800 y SEGA MASTER SYSTEM.

sudo apt update
sudo apt upgrade
cd Downloads
git clone --depth=1https://github.com/RetroPie/RetroPie-Setup
cd RetroPie-Setup
chmod +x retropie_setup.sh
sudo ./retropie_setup.sh

Para poder utilizar RETROPIE mediante un USB donde se guardan las diferentes ROMs, se descargó e instaló el packcage opcional de USBROMSERVICE. El USB también fue formateado a FAT32 para poder utilizarlo. Adicionalmente, se tuvo que activar la SHELL SSH y desactivar el driver gráfico experimental GL para el correcto funcionamiento del emulador.

A continuacion se explica el proceso de montaje de la consola

Cómo envoltorio principal se ha usado una caja de madera prefabricada y se ha perforado para mantener una correcta ventilación, para la salida de audio, para acceder a los puertos USB y para extarer los cables entre los que se encuentran el HDMI y alimentación. Los altavoces fueron desmontados. Se han reutilizado las dos pantallas, el controlador de audio (junto a los botones de encendido y el potenciómetro de volumen) y el transformador de corriente (y se ha atornillado todo a la caja).

ROJO: controlador de audio y volumen. AMARILLO: transformador de corriente altavoces. NARANJA: altavoces. VERDE: controlador de leds. AZUL: rapsberry

Por último, y por estética, se ha reutilizado una tira con 3 LEDs para iluminar la caja en su interior, además de un pequeño teclado Bluetooth para navegar por el emulador y el sistema operativo que actúa como tapa de la caja (sellado con tornillos, silicona y velcro).

Proyector

En cuanto al display de la consola, se reutilizó un proyector disponible previamente, de la marca Ogima. A pesar de que ya disponía un sistema de audio integrado, se utilizado otro para mejorar la calidad.

Altavoces

Para el audio se decidió aprovechar unos altavoces antiguos, los cuales fueron desmontados, y se reutilizó el controlador como transformador de corriente. Los altavoces se conectan a la Raspberry mediante un cable Minijack y además se puede regular el volumen.

CÓDIGO COMPLETO

#include <Joystick.h>
#define ENABLE_PULLUPS

Joystick_ joystick;
int joystickDerX = 0;
int joystickDerY = 0;
int joystickIzqX = 0;
int joystickIzqY = 0;
//const bool testAutoSendMode = false;

int botones = 10; 
void setup() 
{
  pinMode(2, INPUT_PULLUP);
  pinMode(3, INPUT_PULLUP);
  pinMode(4, INPUT_PULLUP);
  pinMode(5, INPUT_PULLUP);
  pinMode(6, INPUT_PULLUP);
  pinMode(7, INPUT_PULLUP);
  pinMode(8, INPUT_PULLUP);
  pinMode(9, INPUT_PULLUP);
  pinMode(10, INPUT_PULLUP);
  pinMode(16, INPUT_PULLUP);
  pinMode(15, INPUT_PULLUP);
  pinMode(14, INPUT_PULLUP);

  joystick.begin();
}

void loop() 
{
  joystickDerX = analogRead(A0); //el valor del eje derecho del joystick lo recogeremos por el pin analogico 2
  //joystickDerX = map(joystickDerX,0,1023,255,0); //mapeamos la variable
  joystick.setRxAxis(joystickDerX);

  joystickDerY = analogRead(A1); //el valor del eje derecho del joystick lo recogeremos por el pin analogico 2
  //joystickDerY = map(joystickDerY,1023,0,255,0); //mapeamos la variable
  joystick.setRyAxis(joystickDerY);

  joystickIzqX = analogRead(A2); //el valor del eje derecho del joystick lo recogeremos por el pin analogico 2
  // joystickIzqX = map(joystickIzqX,0,1023,255,0); //mapeamos la variable
  joystick.setXAxis(joystickIzqX);

  joystickIzqY = analogRead(A3); //el valor del eje derecho del joystick lo recogeremos por el pin analogico 2
  //joystickIzqY = map(joystickIzqY,0,1023,255,0); //mapeamos la variable
  joystick.setYAxis(joystickIzqY);

  //Leemos una entrada digital 
  for(int i = 2; i<=botones; i++)
  {
    if(digitalRead(i) == LOW) joystick.pressButton(i-2);
    else joystick.releaseButton(i-2);
    delay(10);
  }
  
  for(int i = 14; i<=16; i++)
  {
    if(digitalRead(i)==LOW) joystick.pressButton(i-4);
    else joystick.releaseButton(i-4);
    delay(10);
  } 
}

VIDEO DEMOSTRACIÓN

También te podría gustar...

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *