MAME e Outputs - Guida Pratica

Qui trovi aiuto nella risoluzione dei problemi hardware del tuo cabinato
Rispondi
Avatar utente
Barito
Arcade Maniac
Arcade Maniac
Messaggi: 3045
Iscritto il: 08/12/2015, 19:18
Reputation: 740

MAME e Outputs - Guida Pratica

Messaggio da Barito » 18/09/2018, 10:22

INTRODUZIONE
Con questa guida cercherò di fare un po’ di chiarezza su cosa siano e soprattutto su come possano essere gestiti gli outputs in MAME.
Nei cab dedicati, onestamente, sono pochi i casi in cui gli outputs sono veramente necessari (mi viene in mente il knocker di Q*bert e poco altro…); completamente diverso il caso dei cabinati di guida: luci ed effetti al volante (rumble se non addirittura Force Feedback in alcuni casi) sono parte integrante dell’ esperienza di gioco, si pensi al tasto start lampeggiante che SEGA ha introdotto in tutti i suoi cab da outrun in poi, i lampeggianti in chase HQ, etc etc.
Ad oggi non esistono prodotti commerciali economici per far fronte al “problema”: per le luci esistono periferiche tipo LedWiz e SmartASD, mentre per il rumble… praticamente niente (forse la smartASD è configurabile per il rumble, ma costa 20 volte tanto).
MAME supporta gli output da parecchio tempo, tipo dalla versione 0.110; questi output, propri delle schede emulate, non possono essere utilizzati direttamente per il semplice fatto che MAME non li indirizza su alcuna periferica del PC. La cosa non deve sorprendere più di tanto dal momento che sarebbe codice che esula dallo scopo del MAME stesso. A questo fine ci viene in aiuto un software a mio avviso geniale, scritto da Howard Casto, utente molto attivo sul forum BYOAC. Questo software si prende la briga di “leggere” i mistici messaggi di output di MAME e di “tradurli” in formati digeribili da hardware esterni. Questi formati sono vari ed eventuali, ma a noi interessa la sola comunicazione seriale. Perché? Beh, guarda un po’, le nostre amate schede a microcontrollore Arduino sono in grado, se opportunamente programmate, di leggere questo tipo di segnale e renderlo un segnale logico sfruttabile per controllare altro hardware!
Ok, ma qual è lo schema complessivo necessario per trasformare questi segnali di output intimamente nascosti in MAME nell’accensione di un LED oppure nel movimento di un motore? Ecco lo schema a blocchi…
schema a blocchi.png
In sostanza: MAMEhooker traduce i messaggi di output di MAME rendendoli digeribili da Arduino (o altro hardware); Arduino a sua volta aziona dei driver di potenza (dispositivi cioè in grado di generare correnti anche significative) che accendono LED cicciotti, mettono in movimento motori, etc etc, tutto secondo le volontà di MAME (o, in altre parole, della scheda gioco emulata… mica cazzi!).
Ciò che questa guida copre è sia la filiera MAME -> MAMEhooker -> Arduino, sia una introduzione all'uso di driverboard per pilotare motori DC, LED grandi e piccoli. I pin di arduino infatti possono erogare solo poche decine di mA di corrente, di conseguenza è impensabile controllare direttamente hardware poco più grande di un mini LED
Ad ogni modo: andiamo a vedere come si configurano mamehooker e arduino per avere dei segnali logici “utili” a costo praticamente zero (che ci tengo ;) )!!

MAME E ARDUINO SETUP
Innanzitutto scegliamo la “giusta” versione di MAME: in alcune versioni di MAME gli output sono buggati e non utilizzabili; meglio dunque evitare le versioni da 0.170 a 0.175 incluse e le versioni prima della 0.110. Nel caso il file mame.ini della versione che stai utilizzando avesse la voce “output” sotto “OSD OUTPUT OPTIONS”, questa va settata a “windows”, cioè:

Codice: Seleziona tutto

#
# OSD OTPUT OPTIONS
#
output 		windows
Ora sporchiamoci un po’ le mani! Assicuriamoci di riuscire a far girare il giochillo che ci interessa in MAME. Per convenienza futura, meglio mettere la cartella “mame” in un percorso semplice, tipo C:\MAME.
Colleghiamo la scheda microcontrollore e vediamo se win installa i driver. In caso di uso di un clone con chip CH340 sicuramente non lo installerà. Allego qui i driver del fornitore ufficiale del chip di comunicazione seriale che non si sa mai ;)
CH341SER.ZIP
Apriamo l’IDE di arduino. Scegliamo sotto il menù “strumenti” il tipo di scheda (nel mio caso una nano ATMega168) e la porta di comunicazione (nel mio caso COM4, ma potrebbe essere un’altra).
Carichiamo lo sketch sulla nostra schedina arduino. Il firmware/sketch legge i messaggi in arrivo sulla porta seriale, li interpreta e porta a stato logico alto o basso i corrispondenti pin.

Codice: Seleziona tutto

/*
Arduino - Mamehooker outputs read setup sketch

This sketch lets Arduino read outputs signals from 
Howard Casto's Mamehooker.
Pins from #2 to #13 are set to outputs and can be used
to send hardware outputs signals.
Here is an example of mamehooker .ini code 
(message sent to Arduino serial port COM4):

[General] 
MameStart=cmo 4 baud=9600_parity=N_data=8_stop=1 
MameStop=cmc 4 
StateChange= 
OnRotate= 
OnPause= 
[KeyStates] 
RefreshTime= 
[Output] 
lamp0=
lamp1=cmw 4 3., cmw 4 %s%, cmw 4 x
lamp2=cmw 4 4., cmw 4 %s%, cmw 4 x
lamp3=cmw 4 5., cmw 4 %s%, cmw 4 x
lamp4=cmw 4 6., cmw 4 %s%, cmw 4 x
lamp5=cmw 4 7., cmw 4 %s%, cmw 4 x
lamp6=cmw 4 8., cmw 4 %s%, cmw 4 x
lamp7=cmw 4 9., cmw 4 %s%, cmw 4 x
lamp8=cmw 4 10., cmw 4 %s%, cmw 4 x
lamp9=cmw 4 11., cmw 4 %s%, cmw 4 x
lamp10=cmw 4 12., cmw 4 %s%, cmw 4 x
lamp11=cmw 4 13., cmw 4 %s%, cmw 4 x

Code adapted from fruit-emu.com (majoris and eric)

by Barito, 2018
*/

int pin;
int value;

void setup() {
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);

Serial.begin(9600);
}

void loop(){ 
while (Serial.available()>0){
  pin = Serial.parseInt();
  value = Serial.parseInt();
  if (Serial.read() == 'x'){
    digitalWrite(pin, value);
    Serial.println();
  }
}
}
Nello sketch sono impostati come outputs tutti i pin dal numero 2 al 13. Volendo si potrebbero aggiungere i pin “analogici” (o meglio, capaci di ricevere input analogici) per un totale di 20 outputs, più che sufficienti per qualsiasi giochillo arcade! In sostanza una LEDwiz da 3 euro [bash.gif]
Bene, l’hardware base necessario a testare le funzionalità di mamehooker è pronto.

MAMEHOOKER SETUP
Scompattiamo mamehooker (alla versione 5.1 nel momento in cui scrivo) e mettiamolo in C:\.
Entriamo nella cartella di mamehooker e lanciamo l’eseguibile “mamehook.exe”. Comparirà una iconcina in basso a destra della barra di win. La clicchiamo e si aprirà la debug window di mamehooker. Impostiamo in mamehooker il percorso in cui abbiamo messo mame nel menù a tendina “options”, voce “Set MAME path for Driver/Parent Detection”.
11.png
Va indicato il percorso completo, escluso il nome dell’eseguibile. Subito dopo ci verrà chiesto di indicare il nome dell’eseguibile (es. mame.exe).
Bene! Mamehooker è agganciato a MAME!
Ora lanciamo il gioco di cui vogliamo mappare gli outputs. Io ho scelto outrunners perché (a) ha un sacco di outputs, (b) è fra i miei giochi preferiti di sempre. Se mamehooker è collegato correttamente comincerà, via via che si avanza nelle schermate, a riconoscere gli outputs del gioco. Sentirai un “bing” ad ogni riconoscimento.
Questa la schermata di log che ho ottenuto io dopo il lancio e dopo essere arrivato al “via” della corsa.
12.png
Adesso andiamo nella cartella di mamehooker, apriamo la cartella “ini”, “MAME, e apriamo il file ini del gioco che stiamo configurando (nel mio caso orunners.ini). Qui dobbiamo impostare le azioni che mamehooker dovrà eseguire quando MAME gli manderà un segnale di output. Il file “orunners.ini” diventa una cosa di questo tipo:

Codice: Seleziona tutto

[General]
MameStart=cmo 4 baud=9600_parity=N_data=8_stop=1 
MameStop=cmc 4
StateChange=
OnRotate=
OnPause=
[KeyStates]
RefreshTime=
[Output]
MA_Check_Point_lamp=cmw 4 2., cmw 4 %s%, cmw 4 x
MA_Race_Leader_lamp=cmw 4 3., cmw 4 %s%, cmw 4 x
MA_Steering_Wheel_motor=
MA_DJ_Music_lamp=
MA_<<_>>_lamp=
MB_Check_Point_lamp=
MB_Race_Leader_lamp=
MB_Steering_Wheel_motor=
MB_DJ_Music_lamp=
MB_<<_>>_lamp=
Dove:
la prima linea dopo “MameStart=” stabilisce la connessione seriale e le sue caratteristiche
“cmw” è il comando di scrittura su porta seriale di mamehoker
“4” è la porta seriale di trasmissione (COM4)
“2.” e 3.” sono i pin di arduino che controllano le due lampade in parola (il punto è un delimitante che serve ad arduino per capire che si tratta del pin da utilizzare)
“%s%” indica lo stato attuale della lampada (accesa o spenta, dato fornito da MAME, o meglio dalla scheda che emula)
“x” dice ad arduino che il segnale è terminato.
Io qui ho settato solo le lampade di check point perché vengono usate anche durante l’attract mode e possiamo verificare subito se funziona, senza nemmeno inserire crediti.
Nota: arrivare a questo file passando dal menu a tendina “Script Editor” e scegliendo “Edit INI For Current Rom”, come suggerirebbe la guida ufficiale di Howard, a me con win 7 restituiva un errore di runtime. Se non ricordo male con XP questo problema non c’era. Se riesci ad utilizzare lo script editor è meglio perché ti mostra tutti i comandi supportati da mamehooker e le opzioni disponibili.
Ora chiudiamo mamehooker e riavviamolo. Lanciamo il giochillo che abbiamo configurato et voilà, i nostri outputs sono pronti per essere utilizzati!!

VIDEO!
Nel video di seguito lancio outrunners da riga di comando e subito due LED collegati (brutalmente) ai pin “2” e “3” di una arduino nano iniziano a lampeggiare controllati dal giochillo… poco fico!? :D



Passiamo alle driver board e periferiche.

ATTENZIONE – giocare con l’elettricità può essere molto pericoloso! Molti dei componenti di seguito descritti possono diventare molto caldi in esercizio. L’uso di alimentatori non adeguati può provocare incendi e danni a persone e cose. Non mi riterrò responsabile di danni a persone o cose che le informazioni di seguito riportate o un uso errato di esse possano provocare.

Le soluzioni qui proposte non sono necessariamente lo stato dell’arte quindi consiglio, in ogni caso, di fare una ricerca in rete prima di acquistare componenti o adottare una delle soluzioni qui suggerite.

ESEMPIO 1 – LED A BASSA POTENZA E CLASSICA LAMPADINA A INCANDESCENZA 5V DA CAB (TESTATO)
Partiamo subito con un esempio semplice, ma di potenziale largo impiego: driver board per controllare piccoli LED (max 1W, 250-300mA) o lampadine DC a incandescenza (5V, 250mA) dei nostri cab.
uln2003a.png
L’integrato ULN2003 ha le seguenti caratteristiche:

Tensione di controllo: 5V DC
Tensione di alimentazione: 5-12V DC
Corrente massima erogabile: 500 mA sul singolo canale (MAX!), 1A totali.


In alternativa si può utilizzare l'ULN2803 che si differenzia soltanto per il fatto di avere una entrata/uscita in più.

Come per tutte le soluzioni che vedremo, c'è bisogno di un alimentatore esterno capace di fornire la corrente necessaria ad alimentare le lampadine. L'alimentatore di switching del cab qui va benissimo.

Questo integrato può servire a noi per azionare fino a 7 LED di potenza ridotta (massimo 1,5W, 300mA) o lampadine DC (5V, 250mA). In caso si preveda che più di due lampade/LED possano lavorare contemporaneamente, bisogna assicurarsi di non superare la corrente massima di 1 A totale; dunque si possono accendere fino a 4 LED contemporaneamente con corrente cadauno massima 250 mA, oppure fino a sette con corrente cadauno 150 mA. Tieni presente comunque che le luci dei cab difficilmente si accendono contemporaneamente.
Se alimentiamo a 5V, nel caso delle lampadine ad incandescenza la connessione fra uscita dell'integrato e lampadina è diretta dato che si alimentano a 5V e assorbono una corrente minore della metà del valore massimo supportabile dall'UNL2003 (che ricordiamo è 500mA MAX sul singolo canale); il collegamento è semplicissimo:
uln2003wiring.png
In caso di utilizzo di un LED bisognerà indurre un calo di tensione che porti i 5V di alimentazione alla tensione di lavoro del LED (solitamente 3 V per un LED bianco, meno in caso di colore), dunque sarà necessaria una resistenza “R” funzione della corrente di lavoro del LED. Assumento che il LED assorba 300 mA (dunque un LED da 1W circa, neanche piccolissimo), la resistenza sarà di almeno
R=V/I = (5-3)V/0.3A=6.6 ohm
Che approssimiamo al valore commerciale superiore più prossimo che è 6.8 ohm.
Quando acquisti un LED, le caratteristiche sono sempre riportate; da quelle puoi ricavare il valore della resistenza. >>QUI<< un pratico calcolatore online.

ESEMPIO 2 – LED AD ALTA POTENZA (3W) (NON TESTATO)
Escludendo a priori che nel tuo cab sia già presente un LED ad alta potenza e ipotizzando tu voglia sostituire qualche grossa lampadina ad incandescenza (per esempio le flash lamps del cab chase HQ, quelle poste sotto il marquee) mi semplifico la vita in questo caso suggerendo un modulo (sempre economico, tranquillo… tipo 1 neuro) con LED da 3W più driver board integrata semplicissimo da usare e installare che funge direttamente a 5V DC (sempre naturalmente forniti da alimentatore esterno).
3WLED.jpg
Questo modulo ha le seguenti caratteristiche:

Tensione di controllo: 5V DC
Tensione di alimentazione: 5V DC
Corrente massima erogabile: adeguata al LED (driver integrato)
Nota: al contrario degli altri moduli/elementi descritti in questa guida, questi Led non li ho mai provati, ma rimedierò.


Il collegamento è molto semplice: al pin “G” va la massa di un alimentatore esterno (cortocircuitata a quella di arduino), al pin “+” vanno i 5V, sempre prelevati dall’alimentatore esterno, al pin “S” va collegato il pin di arduino che piloterà l’accensione e spegnimento del LED.

ESEMPIO 3 – MOTORE DI RUMBLE (TESTATO)
Qualche anno fa, quando mi trovai di fronte al problema “come cazzo faccio a pilotare la bestia di motore di rumble del cab con l’uscita della porta parallela” dopo una serie di ricerche mi imbattei in quella che è, a mio avviso, la soluzione più pulita e pratica al problema. Tutto sommato è pure economica (5 neuro circa).
Questa soluzione è l’uso di relay a stato solido tipo l’ SSR25DD o SSR40DD.
SSR-40_DD.jpg
Le caratteristiche di questo signore sono:

Tensione di controllo: 3-32V DC
Tensione di alimentazione: 5-60V DC
Corrente massima erogabile: 40 A (SSR40DD) o 25 A (SSR25DD)
Nota: la versione con sigla finale “DA” controlla una tensione ALTERNATA e non continua in uscita.


Il relay a stato solido ha lo svantaggio di essere ingombrante (vabbè: dentro il cab spazio cenn'è); ha però l’ulteriore vantaggio di garantire un isolamento galvanico fra ingresso (lato Arduino dunque) e uscita (lato motore) grazie alla presenza, al suo interno, di uno switch ottico.
Questi SSR hanno il dissipatore sul fondo: meglio non metterli direttamente a contatto con il legno. Esistono in commercio anche alette di raffreddamento dedicate che consiglio di utilizzare.

Il collegamento è il seguente:
SSR40DD wiring.png
Il cilindretto nero posto alla base del motore DC è un diodo di ritorno e fa si che quando il motore si sta arrestando, la corrente indotta (la quale viaggia "al contrario") non bruci il relay.
Nota che massa di arduino e massa del relay NON vanno cortocircuitate proprio perché ingresso e uscita sono volutamente isolate fra loro.
Attenzione: nel caso si volesse alimentare il motore a 12V, l'alimentatore del cabinato potrebbe non essere sufficiente ad erogare la corrente necessaria. Se il motore è molto grosso, neppure la corrente erogabile dalla linea 5V dello switching nel cab potrebbe bastare. Valuta dunque PRIMA di fare i test quale sia un alimentatore adatto.
Non hai i permessi necessari per visualizzare i file allegati in questo messaggio.


Dal ciglio della strada osservo sbraitando i lavori in corso nel mondo arcade...


Avatar utente
saturnshadow
Arcade Maniac
Arcade Maniac
Messaggi: 3387
Iscritto il: 04/05/2016, 16:00
Medaglie: 35
Reputation: 742
Località: Bologna
Nazione: Italy
:
Medaglia d'oro Medaglia d'argento Medaglia di bronzo Medaglia di legno

Re: MAME e Outputs - Guida Pratica

Messaggio da saturnshadow » 18/09/2018, 11:21

come si direbbe a Belluno Marina "uagliò si nu puòzz' e' sciénz'" [clap2.gif]
appena farai lo step con i controlli, sarà la volta buona che romperò gli indugi e mi metterò a progettare una postazione guida ad hoc creando l'interfaccia adeguata con Arduino (e a studiarmi un bel po' il sistema)
la scimmia sale sempre di più (e batte i pugni sul petto) [bash.gif]


Avatar utente
b4nd1t0
Arcade Maniac
Arcade Maniac
Messaggi: 3938
Iscritto il: 06/06/2016, 17:34
Medaglie: 10
Reputation: 851
Località: Roma
Nazione: Italia
:
Medaglia d'oro Medaglia d'argento Medaglia di bronzo Medaglia di legno
Contatta:

Re: MAME e Outputs - Guida Pratica

Messaggio da b4nd1t0 » 18/09/2018, 11:38

[w00t-anim.gif]
Come creare un log con mame:
- Da command line, digitare: mame -v romname >romname.txt
(dove romname è il nome della rom che volete avviare, mame può essere anche groovymame etc.)
- Allegare il contenuto di romname.txt al post


b4nd1t0's repo here


Avatar utente
Barito
Arcade Maniac
Arcade Maniac
Messaggi: 3045
Iscritto il: 08/12/2015, 19:18
Reputation: 740

Re: MAME e Outputs - Guida Pratica

Messaggio da Barito » 18/09/2018, 11:39

Attualmente sia l'uso di arduino per i controlli (cioè il volante, pedali, etc) sia per il blocco frequenze è possibile e documentato su questa board nelle varie guide; quello che manca (e che con un po' di pazienza butterò giù) è qualche indicazione sulle driver boards (fatte da sé oppure comprate: in cina te le vendono per noccioline). Il più è scegliere quella "ciusta" [book6.gif]
EDIT: inseriti anche alcuni esempi concreti di driver board e periferiche Immagine
Dal ciglio della strada osservo sbraitando i lavori in corso nel mondo arcade...


Avatar utente
saturnshadow
Arcade Maniac
Arcade Maniac
Messaggi: 3387
Iscritto il: 04/05/2016, 16:00
Medaglie: 35
Reputation: 742
Località: Bologna
Nazione: Italy
:
Medaglia d'oro Medaglia d'argento Medaglia di bronzo Medaglia di legno

Re: MAME e Outputs - Guida Pratica

Messaggio da saturnshadow » 18/09/2018, 11:44

Barito ha scritto:
18/09/2018, 11:39
quello che manca (e che con un po' di pazienza butterò giù) è qualche indicazione sulle driver boards (fatte da sé oppure comprate: in cina te le vendono per noccioline). Il più è scegliere quella "ciusta" [book6.gif]
problemuccio da nulla! [joint.gif] che di acquisti a capocchia avendone fatti troppi in passato, vorrei partire con "solide basi" [on_eek.gif]


Avatar utente
Gibranx
Extreme Arcader
Extreme Arcader
Messaggi: 1678
Iscritto il: 26/02/2018, 12:06
Medaglie: 5
Reputation: 446
Località: Benevento
:
Medaglia d'oro Medaglia d'argento Medaglia di legno
Contatta:

Re: MAME e Outputs - Guida Pratica

Messaggio da Gibranx » 18/09/2018, 12:03

Cioè sta cosa mi dà una carica di energia pazzesca....roba da estendere la plancia al cabinato intero!




...cerco di stare calmo...
http://nircada.weebly.com/


"Piegando un foglio di carta a metà per 103 volte, raggiungeremmo uno spessore di quasi 100 miliardi di anni luce, oltre il diametro dell’Universo conosciuto".


Avatar utente
b4nd1t0
Arcade Maniac
Arcade Maniac
Messaggi: 3938
Iscritto il: 06/06/2016, 17:34
Medaglie: 10
Reputation: 851
Località: Roma
Nazione: Italia
:
Medaglia d'oro Medaglia d'argento Medaglia di bronzo Medaglia di legno
Contatta:

Re: MAME e Outputs - Guida Pratica

Messaggio da b4nd1t0 » 18/09/2018, 14:29

vabbè famme accende un paio di lampeggianti e suonare qualche sirena al superamento di un record e sto apposto, te giuro
Come creare un log con mame:
- Da command line, digitare: mame -v romname >romname.txt
(dove romname è il nome della rom che volete avviare, mame può essere anche groovymame etc.)
- Allegare il contenuto di romname.txt al post


b4nd1t0's repo here


Avatar utente
saturnshadow
Arcade Maniac
Arcade Maniac
Messaggi: 3387
Iscritto il: 04/05/2016, 16:00
Medaglie: 35
Reputation: 742
Località: Bologna
Nazione: Italy
:
Medaglia d'oro Medaglia d'argento Medaglia di bronzo Medaglia di legno

Re: MAME e Outputs - Guida Pratica

Messaggio da saturnshadow » 18/09/2018, 14:34

b4nd1t0 ha scritto:
18/09/2018, 14:29
vabbè famme accende un paio di lampeggianti e suonare qualche sirena al superamento di un record e sto apposto, te giuro
2 o più lampeggianti sul cab con una sirena configurati e sincronizzati con il file .ini degli hi-score
appena se ne supera uno partono giochi di luce e suoni tipo jackpot (poi si potrebbe prevedere anche un lancio di coriandoli e stelle filanti ma mi sa che poi le mogli si incazzano per il bordello da pulire), ma ci starebbe un casino [joint.gif]


ok, basta
torno a drogarmi come fa la gente normale [on_eek.gif]


Avatar utente
Barito
Arcade Maniac
Arcade Maniac
Messaggi: 3045
Iscritto il: 08/12/2015, 19:18
Reputation: 740

Re: MAME e Outputs - Guida Pratica

Messaggio da Barito » 18/09/2018, 15:08

Ho aggiunto alcuni esempi concreti di driver board per alcune possibili periferiche di interesse (LED e motori sostanzialmente).
C'è ampio margine di miglioramento, ma già con queste info si possono controllare il 90% di tipologie di output arcade [builder.gif]
Dal ciglio della strada osservo sbraitando i lavori in corso nel mondo arcade...


Rispondi