Bartop multiemulador 2 jugadors
Introducció
Configuració botons
Per configurar 2 jugadors i tots els emuladors, necessito 24 botons:
- joystick*2 = 8 botons
- 6 botons bàsics*2 = 12 botons. Més aviat serien 6 botons per a P1 i 4 botons per a P2.
- player 1 select
- player 2 select
- coin
- ESC
Total 24 botons. Amb els pins GPIO bàsics no en tinc prou. Tinc dues solucions.
1) utilitzar un I-PAC. És una solució zero-time delay. Es connecta el I-PAC per USB, i els emuladors el reconeixen com un game-pad. Per ex:
2) continuar utilitzar pikeyd, però expandint el número de pins amb un MCP23017. El dimoni pikeyd ja ho té previst. És un dimoni que en teoria introdueix un petit delay en l'escombrat, però en teoria no s'hauria de notar.
NOTA: un nou projecte similar al pikeyd que demostra que puc utilitzar fins a 24 botons amb la RPi B+. https://github.com/digitalLumberjack/mk_arcade_joystick_rpi
3) Mirant bé la configuració del pinout de la RPi B+, és possible utilitzar 24 pins GPIO. Si no utilitzem els pins GPIO2 i 3 del I2C, i utilitzant els pins GPIO14 i 15 de Tx-Rx, de fet tenim 24 pins. Però seria qüestió de fer la prova i anar un per un.
Per utilitzar els pins GPIO que fan referència a Tx i Rx:
By default the Pi uses the last 2 GPIOs as a serial output - when using it for other stuff you should turn off what the Pi/Linux is using it for. So edit the bits out of /boot/cmdline.txt and edit the line out of /etc/inittab that refers to /dev/ttyAMA0. Otherwise it's conceviable that the Pi will write something to the serial port which may affect what you're written...
En aquest enllaç es veu el pinout del model B+ amb tots els seus pins GPIO i els usos alternatius:
I en principi en aquest article i en el video es comenta que es poden utilitzar els 26 pins com a E/S:
Solució amb GPIO (Pikeyd)
Implemento 4 emuladors (mame4all, Neo-Geo, MegaDrive i GBA), però també valdria per a SNES. Els emuladors que soporten dos jugadors són mame4all i Neo-Geo. Megadrive i GBA són de 1 sol jugador.
Resumint, la configuració del CPO seria:
- botons de servei: ESC, COIN-Select (2 botons)
- P1 Start, X, Y, Z-D, A-Cat, B-Fav, C-Emu (7 botons)
- P2 Start, A, B, C, D (5 botons)
- 2 joysticks (8 botons)
Són 22 botons.
En principi volia utilitzar un IPAC2, per ex:
El problema està en què el I-PAC2 original de Ultimarc és car, i els compatibles com el de dalt dubto que funcioni el software de configuració (https://github.com/katie-snow/Ultimarc-linux). El problema està en què aquests I-PAC simulen que són un GamePad i no pas un teclat. I tots els emuladors poden funcionar, però el meu front-end s'hauria de reprogramar per tal de respondre a events de gamepas més que de teclat (que es podria fer).
Per sort, la RPi B+ suporta fins a 24 entrades (https://github.com/digitalLumberjack/mk_arcade_joystick_rpi, projecte similar a pikeyd), i per tant s'han de poder utilitzar tots els pins GPIO. Ara bé, recordo haver tingut problemes amb alguns pins GPIO (TX, RX). S'ha de veure com es soluciona. El millor eś agafar la RPi B+ i anar pin per pin per comprovar que efectivament tinc tots els pins GPIO disponibles. Per utilitzar els pins GPIO que fan referència a Tx i Rx, llegir el que s'explica més amunt.
He fet la prova, i efectivament disposo de 24 pinos GPIO disponibles. Els únics que no funcionen són els dos primers (GPIO2 i GPIO3), que es corresponen al protocol I2C i que precisament s'han de fer servir en cas de què vulgui expandir el número de pins de I/O. He desactivat els pins de comunicació sèrie (GPIO14 i GPIO15, TXD i RXD) editant el fitxer /boot/cmdline.txt i eliminar la referència a tty.
Evidentment, s'ha d'editar el fitxer /etc/pikeyd.conf (i reiniciar el servei).
CPO, configuració
nota: aquesta imatge ja està malament, canviar-la.
NOTA: aquesta disposició és perque encara no implemento SNES. Si s'implementa SNES amb dos jugadors, el segon jugador ha de tenir també 6 botons (X Y A B L R), i aleshores ja és totalment simètric.
NOTA: ara ja implemento SNES (canviar la imatge)
Resum dels botons que necessita cada emulador:
Front-End: CAT, FAV, EMU, SEL MAME (2 players): COIN, P1 Start, P2 Start, A, B, C, PAUSE Neo-Geo (2 players): COIN, P1 Start, P2 Start, A, B, C, D, PAUSE GBA (1 player): Start, Select, A, B, L, R, PAUSE MegaDrive (1 player): Start, X, Y, Z, A, B, C ShutDown: X+A
NOTA: en el minibartop no podia implementar el L, R de GBA NOTA: puc implementar el PAUSE en tots menys Megadrive, en el botó Y
Hem de buscar la compatibilitat amb la CPO de la mini-bartop de Metal Slug, que va ser la primera multi-emulador. Un petit canvi que s'ha fet: ara primer va CAT i després va FAV.
I el fitxer pikeyd.conf quedaria de la següent manera:
#joy.cfg #format: # [keycode from /usr/include/linux/input.h] [whitespace] [GPIO pin no] # Not limited to a single key. A GPIO press will emit all defined keys in order. #joystick1 KEY_LEFT 4 KEY_RIGHT 17 KEY_UP 27 KEY_DOWN 22 #joystick1 KEY_J 14 KEY_L 15 KEY_I 18 KEY_K 23 #esc, P1 start, coin/sel, P2 Start KEY_0 24 KEY_1 25 KEY_2 8 KEY_9 7 #jugador 1 KEY_3 10 KEY_4 9 KEY_5 11 KEY_6 5 KEY_7 6 KEY_8 13 #jugador 2 KEY_A 12 KEY_B 16 KEY_C 20 KEY_D 21 KEY_E 19 KEY_F 26
I el pinout de la RPi B+:
pinheader BCM GPIO *--* *--* *--* left-GPIO4 *--* GPIO14-J *--* GPIO15-L right-GPIO17 *--* GPIO18-I up-GPIO27 *--* down-GPIO22 *--* GPIO23-K *--* GPIO24-0 3-GPIO10 *--* 4-GPIO9 *--* GPIO25-1 5-GPIO11 *--* GPIO8-2 *--* GPIO7-9 *--* 6-GPIO5 *--* 7-GPIO6 *--* GPIO12-A 8-GPIO13 *--* E-GPIO19 *--* GPIO16-B F-GPIO26 *--* GPIO20-C *--* GPIO21-D
Aquests de dalt són els pins que faré servir. Recordem però els pins GPIO disponibles: (GPIO2 i GPIO3 no es fan servir perquè són I2C, i es farien servir precisament si encara necessités més entrades I/O):
pinheader BCM GPIO *--* *--* *--* GPIO4 *--* GPIO14 *--* GPIO15 GPIO17 *--* GPIO18 GPIO27 *--* GPIO22 *--* GPIO23 *--* GPIO24 GPIO10 *--* GPIO9 *--* GPIO25 GPIO11 *--* GPIO8 *--* GPIO7 *--* GPIO5 *--* GPIO6 *--* GPIO12 GPIO13 *--* GPIO19 *--* GPIO16 GPIO26 *--* GPIO20 *--* GPIO21
Resum layout per imprimir:
2 PLAYER 16 BOTONS ESC P1ST SEL-COIN P2ST 0 1 2 9 * * * * X Y Z-R-D X Y Z-R-D 6 7 8 d e f * * * * * * * * * * * * A B C-L A B C-L 3 4 5 a b c J1: left, right, up, down J2: i, k, j, l 3.3 *--* 5V *--* *--* GND le *--* J *--* L ri *--* I up *--* do *--* K *--* 0 3 *--* 4 *--* 1 5 *--* 2 *--* 9 *--* 6 *--* 7 *--* A 8 *--* E *--* B F *--* C *--* D
Configuració mame4all per a 2 jugadors
Recordar que per accedir a la configuració és TAB (des de qualsevol joc que estigui carregat), i es pot configurar el General del mame4ll, o el joc particular en el qual estic. Igual que el Neo-Geo, el truco està en assignar la mateixa tecla a COIN1 i COIN2 (la "2"). I si vull jugar amb 1P: "1"; i 2P: "9".
Hi ha vàries possibilitats a l'hora de jugar amb dos jugadors.
- Hi ha jocs com el Aero Fighter, 1941, 1943 que són cooperatius, i que funcionen amb els dos joysticks.
- Amidar, aurail, 1942,...: efectivament en clicar 2P és de dos jugadors, però els jugadors s'han d'anar alternant el Joystick 1 (no serveix de res el Joystick 2).
- atetris: hi ha jocs que per entrar en el joc no és 1P, sinó el botó de foc ("3"). En aquest cas, per entrar en el mode 2 jugadors no hem d'apretar el botó 2P, sinó el foc del jugador 2: botó A.
Configuració Neo-Geo per a 2 jugadors
p1control A=K51,B=K52,C=K53,D=K54,START=K49,COIN=K50,UP=K273,DOWN=K274,LEFT=K276,RIGHT=K275,MENU=K27 p2control A=K97,B=K98,C=K99,D=K100,START=K57,COIN=K50,UP=K105,DOWN=K107,LEFT=K106,RIGHT=K108,MENU=K27
El truco està en què el COIN per a P1 i P2 està assignat a la mateixa tecla, i d'aquesta manera quan apretem el botó de COIN ja apareix Press P1 or P2, per escollir si volem jugar amb un jugador o 2. És a dir, que només ens cal una tecla per a COIN.
- /usr/include/SDL/SDL_keysym.h
- fitxer de configuració: .gngeo/gngeorc
Jocs cooperatius
mame4all
Agafant el que diu la gent de:
Nearly every MAME game is a co-op game, my favourites being:
M'asseguro que tinc els següents:
gradius3 Gradius 3 captcomm Captain Commando xmen.zip X-men knights Knights of the Round - Fighting ffight Final Fight - Fighting simpsons The Simpsons - Fighting nbajam NBA Jam - Sports ikari Ikari Warriors - Shooter ddragon Double Dragon - Fighting bublbobl Bubble Booble - Undefined aliens Aliens - FP-Shooter joust Joust - Platform contra Contra - Platform spacduel Space Duel - Undefined nstocker Night Stocker - Shooter silkworm Silk Worm - Shooter hbarrel Heavy Barrel - Undefined dynduke Dynamite Duke - Undefined dino Cadillacs and Dinosaurs - Fighting altbeast Altered Beast - Fighting gaunt2 Gauntlet II - Maze gauntlet Gauntlet - Maze rampage Rampage - Platform wow Wizzard of Wor - Maze firetrk Fire Truck - Driving spacduel Space Duel - Shooter raiden Raiden - Shooter jackal Jackal - Shooter trog Trog - Maze blstroid Blasteroids - Shooter narc Narc - Shooter
Construcció
Fusta conglomerat/DM, U-Molding, vinils. Pixartprinting.com
En aquesta ocasió no pintaré el moble, sinó que cobriré tot el moble amb vinils. L'avantatge és que puc utiltizar fusta conglomerada, que és fàcil de trobar a diferència del contraxapat. I buscant el pressupost més baix.
- Els laterals, marquee i CPO han d'estar coberts amb dibuixos del tema en què baso la bartop. https://www.pixartprinting.es és una bona solució per Internet per tal de què et facin els vinils. La idea és cobrir tots els laterals, i amagar els cantos de l'adhesiu sota el U-molding.
Productos > Gran formato > Vinilos adhesivos > Vinilos adhesivos para superficies planas
- Base: 60
- Altura: 200
- Vinilo adhesivo monomérico mate
- sin recortar (en bobina)
- plastificado: ninguna
Preu: 5,06 e
La resta de fusta (excepte el darrera) s'utiltiza vinil (per exemple de color negre). Provaré http://www.vinilosametros.com, que estan a Gràcia. 1,23m2 de color negre són 6,28e. Per tant, la idea és utilitzar fusta, i cobrir-la tota amb vinils llisos o decorats, i U-molding. M'evito pintar, i tinc més superfície per al disseny. A més, en el vidre també li puc aplicar un marc de vinil negre, i així evito que es vegin els cantos de la pantalla.
vinilo adhesivo opalino para retroiluminación
https://www.pixartprinting.es era correcta, però aquest adhesiu no em val per la marquesina. Per fer la marquesina retroiluminada, la comanda correcta és:
- Vinilos para cristales: (per fer la marquesina)
- base: 51
- altura: 200 (amb aquesta combinació de dimensions optimitza el cost)
- vinilo adhesivo opalino para retroiluminación
- sin recortar (en bobina)
- plastificado: ninguna
preu: 11,08 e
Problemes amb la sortida HDMI
La màxima compatibilitat la trobo amb la següent configuració:
#hdmi_safe=1 #disable_overscan=1 # uncomment the following to adjust overscan. Use positive numbers if console # goes off screen, and negative if there is too much border overscan_left=16 #overscan_right=16 overscan_top=16 overscan_bottom=16 hdmi_force_hotplug=1 #hdmi_group=2 #hdmi_mode=39 #hdmi_drive=2 #config_hdmi_boost=4 # uncomment for composite PAL #sdtv_mode=2
Però el problema eś que no accepta la resolució de la pantalla. (La resolució de la pantalla pot ser un problema per al joanillo_arcade_frontend, on vull que hi càpiga el màxim de resolució dins la pantalla, però no pas per als emuladors que igualment treballen a pantalla completa).
El meu monitor de 19 és un Samsung 920NW 1440x900 75 Hz. Com es veu a https://www.raspberrypi.org/documentation/configuration/config-txt.md, el valor ha de ser hdmi_mode=48. Però si fico aquest valor, aleshores ja no hi ha sortida de video (o a vegades arrenca el video i a vegades no), encara que posi hdmi_safe=1.
Al final la configuració que funciona és:
#hdmi_safe=1 # uncomment to force a specific HDMI mode (this will force VGA) hdmi_group=2 #1440x900 75 Hz hdmi_mode=48 hdmi_drive=2 config_hdmi_boost=4
Però s'ha d'anar amb compte perquè realment hi ha combinacions que no funcionen. Si no funciona no passa res, doncs encara que no hi hagi video la màquina arrenca i em puc connectar per SSH si tinc ben configurada la wiki o tinc el cable de xarxa.
Solució: el cable HDMI a VGA ha de ser de qualitat
Els cables que vaig comprar, i que aparentment anaven bé però que m'han donat molts problemes són aquests:
Finalment he comprat aquest cable que sí ha funcionat.
Hi ha la possibilitat d'enxufari una entrada de 5V directa, la qual cosa té sentit, i funciona. Però el cas és que sense l'alimentació externa també funciona! Per tant, és un tema de la qualitat dels cables. I de fet ja es veu des del principi la diferència. Quan arrenca la màquina i el video, amb els cables problemàtics tenia alguna interferència (ratlles), atribuïble a que és un senyal analògic. Però és que amb el cable blanc no es veu cap interferència.