Torna alla Home page

 

Premessa: RacerMAME 0.106 NON supporta gli output. Questi sono stati introdotti in MAME dalla versione 0.110 e sono quindi supportati da versioni recenti di MAME. Questo è il motivo per cui ho deciso di implementare (in maniera non costante) versioni successive come RacerMAME 0.160. Quindi se vuoi effetti di vibrazione (rumble), effetti luminosi, etc è necessario utilizzare l'ultima versione di RacerMAME o, più in generale, versioni di MAME successive a 0.110.

In questa sede ti spiegherò brevemente come si possano ricreare alcuni di questi effetti in un cabinato di guida. Da non confondersi effetto di "rumble" (o vibrazione) e "force feedback": sono due bestie completamente diverse. Qui ti spiegherò come poter sfruttare un effetto di vibrazione tipo quello che avrai sicuramente provato in cabinati di guida come Outrun, Powerdrift, Outrunners, etc, quindi NON FORCE FEEDBACK (tipico invece in cab tipo Hard Drivin' o Daytona USA). In particolare spiegherò come ho ottenuto un effetto di rumble sul volante del mio cab e come sono riuscito ad ottenere effetti luminosi (es. tasto di start che lampeggia quando si inserisce un gettone in outrun, luci della polizia lampeggianti quando si raggiunge un ricercato in Chase HQ, etc).

Per prima cosa, tieni presente che MAME non è in grado di colloquiare direttamente con le periferiche del PC. Non è possibile, per esempio,mandare dei segnali alla porta parallela del PC, così come non è possibile innescare la vibrazione di un pad direttamente da MAME. A questo fine ci viene in aiuto un programma sviluppato da Howard Casto chiamato MameHooker. Molto sommariamente, Mamehooker "legge" i comandi di output di MAME e li "traduce" affinchè siano riconosciuti dalle periferiche del PC.

Una lista di periferiche con cui Mamehooker può "colloquiare" è presente sul sito del programmatore, quindi non mi dilungherò su questo punto. Io ho voluto utilizzare le uscite che vanno ai motorini di vibrazione del pad Xbox360 e la porta parallela del PC in quanto già presenti sul mio PC e quindi a costo zero.

Prima di proseguire, dobbiamo valutare bene quale periferica utilizzare per pilotare l'effetto che ci interessa. Come scritto, io volevo un effetto di vibrazione al volante e un effetto "luci", quindi volevo pilotare un bel motore a corrente continua attaccato al mio volante per la vibrazione e un paio di LED belli cicciotti per le luci. La scelta delle periferiche da usare ha tenuto conto del fatto che le porte parallele (LPT) in accensione del PC sono a stato logico "alto", cioè "buttano fuori" una tensione non nulla (segnale). Ne segue che, se scegli la porta LPT per pilotare le luci, in avvio avrai tutte le "luci accese" (poco male); se usi un pin della porta parallela per pilotare il motore di vibrazione, analogamente, questo riceverà un segnale di avvio in accensione, quindi vibrerà durante tutte le fasi di caricamento del bios e del sistema operativo... e continuerà a girare finchè non lo fermerai. Per pilotare il motore ad alta potenza di vibrazione consiglio dunque di utilizzare come segnali le alimentazioni dei motorini (a bassa potenza) di vibrazione del pad: questi hanno potenziale nullo ai loro capi quando il PC parte, quindi non ti daranno problemi. Inoltre questa scelta vi permette di poter avere l'effetto di vibrazione su qualsiasi gioco in grado di mandare un segnale al pad! Le luci, invece, puoi pilotarle tramite la porta parallela del PC senza problemi. Per "bloccare" le uscite dei pin della porta LPT subito dopo il caricamento del sistema operativo, puoi mettere in esecuzione automatica questo programmino, il quale si chiude automaticamente dopo aver messo a stato logico basso i pin della LPT (e, di fatto, così facendo spegne tutte le luci).

Ottimo, ora che abbiamo valutato quali periferiche utilizzare (es. un motore CC per la vibrazione al volante e due belle luci led per gli effetti luminosi) basterà collegare il motore DC al pad al posto di uno dei motorini di vibrazione già presenti e le luci a LED ai pin delle porte parallele del PC ... NIENTE AFFATTO! Purtroppo la porta parallela del PC può erogare una ventina di milli ampere direttamente dai pin di uscita, non di più. Per quanto riguarda le uscite dei motorini di rumble di un pad, queste possono erogare correnti superiori (fino a 100 mA), ma questi non sono certo sufficienti per pilotare un bel motore DC, il quale può consumare 1 A o più. Dobbiamo quindi costruire un circuito che possa ricevere il segnale a bassissima potenza della porta parallela (o del pad o di Arduino o altro) e dare/togliere potenza alla periferica di potenza.

Ci serve, dunque: una versione di MAME che sia in grado di rilevare output durante il gioco (es. RacerMAME160, ma NON RacerMAME106), un programma (Mamehooker) che "veda" questi output e li trasferisca ad una periferica del PC (porta parallela, pad xbox360 o altro) e infine una schedina di interfaccia che trasformi i segnali a bassa potenza in uscita dalle periferiche citate in segnali a più alta potenza in modo da movimentare/attivare luci, motori, o altro hardware.

Quest'ultimo componente hardware (la schedina di interfaccia) è il cuore di questo scritto. Abbiamo capito come far si che gli output che MAME "butta fuori" possano essere trasferiti a periferiche del PC, ma non sappiamo ancora come rendere questi segnali utilizzabili per pilotare/alimentare grossi motori di rumble o luci/LED ad alta potenza.

Un'ultima piccola nota sulla scelta del joypad sul quale lavorare. Inizialmente avevo optato per un classico pad da 10 euro, con protocollo DirectInput per la vibrazione. Con questo ho riscontrato due problemi: il primo era una certa deadzone, impossibile da rimuovere in quanto, probabilmente, impostata dal costruttore a livello di firmware; il secondo era l'impossibilità tramite MameHooker di variare l'intensità di vibrazione dei motori. Sebbene il primo problema con un po' di fortuna sia risolvibile (basta trovare un pad che non abbia tale deadzone a livello firmware), il secondo problema non è risolvibile con pad DirectInput, quindi obbliga a soluzione più drastica. Nella fattispecie, il pad xbox360 utilizza protocollo Xinput e, con questo, l'intensità di vibrazione può essere facilmente variata tramite MameHooker. Questo ti permette di settare un'intensità di vibrazione diversa per ogni gioco (e ti assicuro che serve!). Oltre a questo, il deadzone è nullo. Per completezza riporto che, di contro, il protocollo XInput è supportato da un minor numero di giochi per PC rispetto DirectInput. Sfortunatamente i due protocolli non sono compatibili fra loro e i joypad supportano l'uno o l'altro.

Di seguito lo schema di un circuito che può essere utilizzato al nostro scopo:

circuito Power LED

A sinistra si trova l'uscita dalla porta parallela (massa e uno degli otto pin di uscita della LPT, consiglio di googlare a riguardo per il pinout), direttamente collegato ad un fotoaccoppiatore (es 4N25) per isolare galvanicamente la porta parallela dal resto del circuito. Q1 è un transistor (eventualmente Darligton) NPN che utilizziamo come un vero e proprio interruttore: quando abbiamo un segnale in uscita dalla porta parallela, questo attiva il fotoaccoppiatore che fa passare una corrente che va al pin di base del transistor, il quale a sua volta consete il passaggio di corrente tra i propri collettore ed emettitore. R4 e R1 servono a limitare la corrente chiesta alla porta LPT (che come detto non può erogare grandi correnti) dal fotoaccoppiatore e la corrente alla base di Q1. R2 serve a ridurre la corrente di alimentazione del carico, qui rappresentato da un LED. Essendo attraversata da correnti che possono essere anche importanti, è bene prevedere l'uso di una resistenza di adeguata potenza (insomma, le resistenzine da 1/4 di Watt che siete abituati a vedere nelle PCB arcade non bastano) e R3 è una resistenza extra che garantisce che Q1 non conduca in caso di un piccolo passaggio di corrente di "perdita" dall'optoisolatore.

Ora, ti starai chiedendo: "OK, capito, però ora voglio costruire il mio circuito ma non vedo i valori di alcuni componenti nello schema!" Beh, corretto, non li ho messi apposta: il circuito e in particolare i componenti di cui non ho riportato i valori vanno dimensionati adeguatamente in funzione alla corrente che si pervede verrà richiesta dal carico (sia esso un LED, un motore grosso come una casa o altro).

Giusto per dare qualche indicazione su come dimensionare il circuito, facciamo il caso di voler pilotare un LED di potenza (3W, 3.5 V) da 700 mA nominali (un LED bello cicciottello insomma) con una corrente di 600 mA e alimentando il circuito a 5V (tipico nei cabinati come voltaggio). Si potrebbe usare anche la linea dei 12V, ma non è necessario in questo caso. Q1 può essere un MJE800 (può sostenere fino a 4.0A, quindi molto più dei nostri 0.6A, e dissipare fino a 40W; noi al massimo necessiteremo di (1.4 + 0.7)V * 0.6A = 1.3W, quindi siamo dentro alla grande). Inoltre il transistor lo avevo cannibalizzato da una scheda destinata al macero, quindi soluzione migliore non c'era :). Cosa sono quei 1.4V e 0.7V? Sono il primo la caduta di tensione tra base ed emettitore di Q1, il secondo la caduta di tensione fra collettore ed emettitore, sempre di Q1. Questi dati si possono vedere nel datasheet del transistor ma, in generale, si considera una caduta di tensione di 0.7V fra base ed emettitore o collettore ed emettitore di un transistor; un transistor Darlington come quello che ho usato io è sostanzialemte una coppia di transitor, quindi si coniderano 1.4V per base - emettitore. Anche se il transistor in uso è definito "low speed switching", per i nostri usi va benissimo (difficilmente lo faremo ciclare a velocità dell'ordine di qualche nanosecondo!!).

Bene, dobbiamo decidere quanto debba valere la resistenza di base R1 per consentire il passaggio di una corrente di base adeguata per "accendere" il circuito (per consentire cioè un passaggio di corrente tra collettore ed emettitore di Q1). Solitamente il parametro che si prende come riferimento è il "guadagno" o hFE del transistor, cioè il rapporto tra corrente di collettore e corrente di base. Noi sappiamo che ci serve una corrente di collettore di 0.6A, dai datasheet del transistor (fig. 7 a destra) possiamo vedere che il guadagno è circa 2500 a 25 gradi centigradi per una corrente di collettore di 0.6A e voltaggio Vce di 3V, ne segue che la corrente di base deve essere (maggiore di) Ib=Ic/hFE=0.6/2500=0.2 mA. Detto che 0.2 mA sono una corrente veramente minima, ho deciso comunque di dimensionare la resistenza per far circolare 2 mA e assicurarmi la saturazione. Dalla legge di Ohm ne segue R1=Vb/Ib=(5.0-0.7-1.4)V/0.002A=1450 Ohm, che ho approssimato qui per eccesso a 1.5 K Ohm. Cosa sono quei 0.7V e 1.4V? Ancora una caduta di potenziale, la prima ai capi del fotoaccoppiatore (0.7V) e tra base ed emettitore di Q1 (1.4V in quanto il Darlington è sostanzialmente una coppia di transistor).

Piccola nota: è importante mantenere bassa la corrente che pilota la base dei transistor perchè, moltiplicata per la caduta di tensione tra base ed emettitore, resitutisce il valore della potenza che viene dissipata (quindi che viene trasformata in calore) dal transistor stesso. Nel caso di un transistor di Darlinghton, tra l'altro, come detto tale caduta di tensione è di 1.4V, quindi doppia rispetto un transistor "normale"!

Evvai, abbiamo R1!! Ora dobbiamo calcolare R2 e siamo apposto! R2 è più semplice da calcolare: vogliamo 0.6A passare per il LED. Sappiamo che il LED provoca una caduta di potenziale di 3.5V, Q1 fra collettore ed emettitore ne "ruba" 0.7 ne segue che R2=(5-3.5-0.7)V/0.6A=1.33 Ohm, che approssimiamo a 1.5 Ohm... FATTO!

circuito power LED

Un circuito analogo può essere utilizzato anche per muovere un motore DC (o altro carico induttivo) alimentato a 12V. Nel caso del motore DC (o carichi induttivi in genere) bisogna prevedere l'uso di un diodo di ritorno (D1) pena la distruzione del circuito dopo pochi cicli di accensione e spegnimento. Il circuito risulterebbe tipo:

 

circuito motore

In questo caso ho aggiunto anche un fusibile, F1, dato che le correnti cominciano ad essere importanti (1-2 A). Il nostro MJE800 è qui sostituito da un BDX53, il quale resiste a spunti di corrente maggiori. Se vuoi alimentare il motore a tensioni superiori (o inferiori) devi ricalcolare la resistenza di base (R2 in questo caso) per permettere la saturazione.

Se sei pigro e vuoi evitare di metter su il circuitino di qui sopra, sia per le luci che per la vibrazione al volante, puoi pensare di procurarti dei relay a stato solido (Solid State Relay) che accettino una tensione continua sia in ingresso (solitamente 3-32V DC) che in uscita (solitamente 5-60V DC). Attento a non confonderti ed acquistarne uno che controlli una corrente alternata in uscita! Sono i più comuni. Per agevolare la ricerca, digita su google SSR25DD (o SSR40DD se prevedi che il tuo motore possa assorbire più di una decina di ampere).

Mi sembra di aver dato abbastanza info per iniziare a sperimentare nel "magico mondo" degli outputs. Ti assicuro che cambia completamente l'approccio al gioco e il feeling che ritorna ricompensa al 100% lo "sforzo" necessario alla realizzazione del dispositivo ;)

Se vuoi approfondire l'argomento, ho trovato un ottimo articolo che spiega come utilizzare un transistor come switch QUI.

 

 

 

 

Disclaimer: RacerMAME is 100% free. Use RacerMAME at your own risk. MAME is a trademark owned by Nicola Salmoria.