lunedì 30 marzo 2009

PinMAME comanda un vero Flipper - 2 parte

Provato il sistema direttamente sul playfield, tutto sembra funzionare a dovere : luci, pulsanti e bobine.
Molto tempo è stato portato via dalla realizzazione della schede che controlla i flippanti ; il playfield di prova è un Data East nel quale le bobine dei flippanti hanno una spira sola , al contrario della maggior parte dei flipper dove ve ne sono due, una di "power" per alzare la paletta ed una di "hold" per mantenerla alzata. L'alimentazione della versione a singola spira è un 50 vdc per il power che viene dato solo per i primi 40 millisecondi; allo scadere dei 40 ms , i 50 volt vengono tolti e dati i 9 volt per il mantenimento; il tutto per evitare di bruciare la bobina stessa. E' da notare che non sono presenti gli switch di end-of-stroke.

Siccome qualche lampadina era bruciata, aspetto i ricambi per poi postare qualche foto e video del playfield funzionante.

giovedì 12 marzo 2009

PinMAME comanda un vero Flipper

Descrizione generale

Il progetto nasce dalla curiosità di sapere come è gestito a livello di elettronica un flipper SS , e dalla curiosità di sapare come il PinMAME lavora e come si interfaccia con programmi come VirtualPinball.
Avendo anche a disposizione un playfield completo di tutto ad esclusione della parte elettrica/elettronica, ho incominciato a pensare come il PinMAME potesse gestire tutte le funzionalità presenti su un piano di gioco. Ed ecco nascere questo progetto ...

Il sistema è formato da due componenti : un computer sul quale gira il PinMAME ed una scheda elettronica a microcontrollore (MCU) , collegata da un lato al PC e dall'altra alle componenti del playfield.
Il trasferimento dati tra PC e MCU avviene tramite un collegamento seriale (RS232 o USB conv.)
Attualmente sono gestiti 32 solenoidi (bobine e flash) , 64 lampade e 64 interruttori.

Scheda elettronica

La scheda elettronica è costituita da tre MCU collegate tra loro per lo scambio di informazioni e la gestione delle unità esterne ; una di esse è collegata al computer via cavo sariale.
Sulla scheda trovano posto i transistor di potenza per l'attivazione dei solenoidi, quelli per le lampade, ed infine gli integrati che gestiscono gli switch.
Al fine di rendere più agevole il lavoro, non sono stati scelti componenti a montaggio superficiale;
I tre microcontrollori hanno una velocità di funzionamento a 8 MHz / 8MIPS , e sono abbastanza veloci da gestire il tutto senza rallentamenti. Il costo dei microcontrollori è di circa 8 euro ciascuno. Nel caso sia necessaria una maggiore velocità di elaborazione, sono già in cantiere 3 MCU da 160 MHz / 40 MIPS

Solenoidi / Bobine

Al momento solo 32 solenoidi sono gestiti ; essi possono essere bobine oppure flash.
Sono gestiti da una singola MCU , le cui uscite provvedo a pilotare un transistor che funge da pre-driver per il tansistor di media potenza (tipo TIP102) ; qualora la bobina consumi un amperaggio elevato, il TIP102 fungerà da pre-driver per un terzo transistor di potenza (TIP36C).
Il collegamento è quello classico : il solenoide è sempre alimentato (48 volt o 32 volt), ed il transistor che chiude a massa.

video

Il video mostra l'attività dei solenoidi numerati dal 25 al 32; le uscite della MCU sono collegate agli otto led della scheda di sviluppo; i led accesi indicano i solenoidi non attivi, mentre i led spenti indicano i solenoidi attivati

Lampade

La gestione delle 64 lampade è affidata alla seconda MCU; anche quì si è conservato lo schema classico : 8 colonne/driver e 8 righe/return.

Come per i solenoidi , ogni 10 millisecondi il computer invia lo stato di tutte le colonne e di tutte le righe alla MCU, la quale provvede ad aggiornare i transistor dei driver e dei return.

video

Il video mostra l'attività delle otto righe delle lampade collegate agli otto led della board. Come prima, i led accesi indicano le uscite poste a zero, e viceversa i led spenti indicano le uscite delle righe attive.

Switch

Il terzo ed ultimo microcontrollore è quello che sovraintende agli switch; i 64 switch sono gestiti come una matrice di 8x8, cosichè risultano facilmente collegabili ai microswitch già presenti nel playfield.

In questo caso, il microcontrollore invia al computer solo le informazione inerenti al cambiamento di stato di ogni singolo switch : in tal modo si evita di sovvracaricare di lavoro il programma sul pc e viene decongestionato il traffico dati sulla linea seriale.

video

Quì c'è poco da dire...

Considerazioni sulla sicurezza

I microcontrollori che gestiscono i solenoidi e le lampade , sono stati dotati di un watchdog. Questo fa sì che nel caso in cui la MCU non sia più in grado di eseguire correttamente il programma, essa si resetti automaticamente e ponga a livello logico basso le sue uscite, in modo tale da diseccitare le bobine e spegnere le lampade (evitando così di bruciare qualcosa).

La funzione di watchdog entra in funzione quando la MCU è bloccata per più di 500 millisecondi, oppure nel caso in cui non riceva i dati dal computer entro un tempo di 500 millisecondi. Ciò vuol dire che se il computer viene spento oppure si 'pianta', o qualcuno scollega il cavo seriale, i solenoidi e le lampade si spengono.

Sviluppi

La scheda di controllo è completata, non mi resta che raccimolare un paio d'ore per collegarla al playfield e vedere come si comporta nel complesso (già, perchè i singoli componenti sono stati testati all'inizio del progetto)...

domenica 11 gennaio 2009

Atari Breakout : circuito punteggi - bozza

In Breakout sono presenti 8 file di mattoni per 14 colonne. Partendo dal basso verso l'alto:

  • fila 1 e 2 = 1 punto ogni mattone
  • fila 3 e 4 = 3 punti ogni mattone
  • fila 5 e 6 = 5 punti ogni mattone
  • fila 7 e 8 = 7 punti ogni mattone
Per completare il gioco è richiesto di abbattere due muri; abbattuto completamente il primo (448 punti), si ottiene il secondo muro, per un punteggio complessivo di 896 punti. Non sono previsti altri muri dopo il secondo (?!?).



Schema 1a

Guardando lo Schema 1a, troviamo sei contatori BCD 9310 (location N6, M6, L6, H6, J6, K6), i primi tre utilizzati per memorizzare il punteggio del Player 2 , ed i secondi tre per memorizzare il punteggio del Player 1. Sullo schema ho suddiviso le sezioni di ciascun Player.
Ciascuna tripletta di contatori collegati in cascata sono utilizzati per memorizzare i valori delle unità, decine e centinaia dei rispettivi punteggi; è quindi da escludere la possibilità di veder memorizzato e visualizzato un punteggio superiore a 999. I contatori sono azzerati (punteggio=000) all'inizio della partita, ovvero alla pressione del pulsante Start Player il segnale /Start Game va basso azzerando i contatori.

L'incremento dei contatori avviene tramite il segnale Count1 per il giocatore 1 e Count2 per il giocatore 2. Count1-2 è un treno di impulsi generato dal contatore 74192 (location N9) ogni volta che la palla colpisce i mattoni posti nella :

  • prima e seconda fila genera 1 singolo impulso
  • terza e quarta fila genera 3 impulsi
  • quinta e sesta fila genera 5 impulsi
  • settima e ottava fila genera 7 impulsi



Schema 1b

Guardando lo schema 1b , il segnale che indica che è avvenuto l'abbattimento di un mattone è il Brick Hit. L'assegnazione dei diversi punti per le diverse file di mattoni avviene caricando sul contatore N9 i valori presettati agli ingressi pin# 15, pin# 1, pin 10# e pin# 9.

Con riferimento allo schema 1a, quando il giocatore 1 raggiunge il punteggio di 448 punti, il contatore delle unità segnerà 8 alzando il segnale D1, il contatore delle decine segnerà 4 alzando il segnale G1, ed il contatore delle centinaia segnerà 4 alzando il segnale K1.

D1,G1 eK1 vanno alla porta NAND (location M4), la cui uscita è posta alta quando il punteggio è diverso da 448, per poi andare bassa al raggiungimento dei 448;questa uscita va all'ingresso di una porta OR (location E4) e con il segnale /BP HIT (segnale che va basso quando viene colpito dalla palla il bordo superiore dello schermo o la racchetta) attiva o meno l'uscita della porta OR che funge da clock/trigger del flip-flop F4 ; in dettaglio quando il punteggio è diverso da 448 l'uscita OR è sempre alta, e va bassa solo quando il punteggio è uguale a 448 e contemporaneamente avviene un rimbalzo della palla (segnale /BP HIT).

Ho detto che l'uscita della porta OR (location E4) va al clock del flip-flop F4; questo flip-flop ha il compito di ricostituire (o ricostruire) interamente il muro quando questo è stato completamente abbattuto. Va precisato che l'abbattimento del muro è detectato dalla logica della scheda unicamente andando a testare il punteggio : se questo è uguale a 448 , allora significa che non vi è rimasto più nessun mattone.

Ad ogni modo, il flip-flop è resettato all'inizio del gioco dal segnale /Start Game che andando basso pone le uscite Q=bassa e /Q=alta; abbiamo detto che quando il punteggio è uguale a 448 (quindi nessun mattone presente) ed avviene un rimbalzo della palla, la porta OR E4 va bassa, tenendo quindi basso il segnale di clock del flip-flop; la porta OR torna alta quando è terminata la fase di rimbalzo (segnale /BP HIT nuovamante alto) : il passaggio da basso ad alto dell'uscita della porta OR e quindi del segnale di clock del flip-flop, fa sì che la sua l'uscita /Q sia bassa.

Il passaggio dallo stato alto a quello basso dell'uscita /Q del flip-flip collegata all'ingresso di trigger del multivibratore 9602 (location F3) fa sì che l'uscita FPD1 del multivibratore vada allo stato alto per poi tornare basso; l'inverso dicasi per l'uscita negata /FPD1.


Schema 1c

Il passaggio di stato dei segnali FPD1 e /FPD1 determinano secondo lo schema 1C il ripristino della memoria L3 e di conseguenza il ripristino dell'intero muro.

Lo stesso concetto fin qui espresso per il Player 1 vale per il Player 2

Due muri o tre ?

Considerando che il rispistino del secondo muro avviene solo quando il punteggio è uguale a 448 , il quale alla fine di tutta la catena setta il flip-flop F4, considerando che nussun altro segnale resetta il flip-flop (se non il segnale di inizio nuovo gioco), considerando che al secondo muro il punteggio non può che essere superiore a 448 punti, si direbbe che sia impossibile per il flip-flop F4 resettarsi per poi settarsi nuovamente, e quindi impossibile un ripristino del terzo muro.

E' piuttosto ipotizzabile che durante il gioco in modalità due giocatori si venga a creare una condizione non prevista, tale per cui l'indicazione a schermo del turno di gioco del Player 1 venga erroneamente attribuita al Player 2, e quindi il punteggio del Player 1 venga visualizzato come punteggio del Player 2 : il secondo muro del primo giocatore diverrebbe il famigerato terzo muro ma del secondo giocatore.

Il tutto però potrebbe essere un bug nella gestione della rappresentazione a video dei punteggi e turno dei giocatori; rimane comunque impossibile lo scambio "fisico" dei punteggi tra i giocatori.

Una cosa è sicura : per quanti muri ci siano, il punteggio visualizzato non potrà mai superare i 999 punti.

sabato 10 gennaio 2009

Atari Breakout : Working PCB - Aggiornamento 8

Fortunatamente le supposizioni pensate nel precedente post erano corrette . Sostituito il multivibratore (location N8) , come per incanto i punteggi...punteggiano che è un amore. (per la cronaca il 9602 è stato sostituito con un CMOS 74HC4538)
Sostituito anche l'ampli audio LM380, quindi il sonoro è ok (se alzate il volume del video , oltre che il sottofondo dei cartoni animati di mio figlio, sentite anche i vari tic e tac di Breakout).

Ora la scheda
FUNZIONA !


video

lunedì 5 gennaio 2009

Atari Breakout : not working PCB - Aggiornamento 7

Nel post precedente, ho ipotizzato che il problema per il quale non viene incrementato il punteggio è (probabilmente) dovuto al malfunzionamento del multivibratore 9602 (location N8).
Di seguito tenterò di spiegare - più che altro a me stesso - come sono giunto a questa conclusione; nel frattempo sto aspettando l'integrato di ricambio.

Il blocco che si occupa dei punteggi è grosso modo diviso in quattro sezioni :


  1. sezione di "memorizzazione" dei punteggi - tre contatori per il Player 1 e tre per il Player 2

  2. sezione di visualizzazione a video dei punteggi

  3. sezione di azzeramento punteggi a inizio partita

  4. sezione che si occupa di incrementare il punteggio (ovvero incrementa il valore dei contatori "memoria")

Considerando che all'accensione della scheda sono visualizzati su schermo valori random dei punteggi e considedrando che ad inizio partita tali valori vengono correttamente azzerati, è da presumere che le prime tre sezioni funzionino correttamente, e che sia la quarta ad avere problemi.


La quarta sezione è formata da un multivibratore (9602 location N8) configurato in modo tale che generi un singolo impulso ("one-shoot") della durata immagino inferiore di poco al microsecondo. Questo impulso permette di caricare su un contatore (74192 location N9) il valore da cui incominciare a contare; siccome tale contatore è configurato per il conto alla rovescia, una volta raggiunto l'underflow l'uscita /Borrow del contatore , attraverso tre porte AND , genera un impulso (Count 1 per il punteggio del Player 1 e Count 2 per il punteggio del Player 2) che è inviato ai contatori della sezione 1 (memorizzazione punteggi).

Al contatore 74192 arrivano correttamente tutti i segnali (due di sincronia orizzontale e lo Start Game) ad eccezione dell'impulso one-shoot generato da multivibratore; simulando tale impulso, il contatore incomincia a contare, incrementando la memoria punteggi e sul video viene visualizzato il nuovo punteggio (a riprova del funzionamento di tutta la catena).

Detto così sembrerebbe proprio che il multivibratore non funzioni... andando ad analizzare i segnali in ingresso, ne troviamo tre: il segnale Brick Hit, un altro segnale posto fisso a +5V, ed il segnale di /Attract utilizzato per disabilitare il multivibratore.

Potrebbe essere che uno di questi tre segnali non sia correttamente generato (o manchi del tutto), e che quindi il multivibratore fallisca nel suo lavoro ? Sembrerebbe proprio di no : il +5V c'è, il Brick Hit anche , così come l' /Attract ( anche perchè questi ultimi due segnali sono utilizzati da altre parti, ad esempio il Brick Hit fa cambiare di direzione la palla nel momento in cui il mattone è colpito, e l' /Attract è utilizzato , manco a dirlo, nella fase di Attract Mode).

Tutta questa bella zuppa per dire che il 9602 sembra fritto !

Aspettiamo il ricambio e vedremo...

venerdì 2 gennaio 2009

Atari Breakout : not working PCB - Aggiornamento 6

La più importante novità :

ora è giocabile!



Ma andiamo con ordine...

Dopo aver upgradato la scheda alla revisione F, è stato possibile giocare alla prima partita; tuttavia dopo aver mancato la pallina con la racchetta, il gioco non ritornava in modalità Wait Serve, ma la palla continuava a rimbalzare nella parte superiore del muro , abbattendo quasi tutti i mattoni prima di poter passare dalle brecce del muro per andare nella zona inferiore dello schermo per poter essere colpita dalla racchetta; anche quando il muro era completamente abbattuto, la palla continuava a viaggiare per il campo di gioco: una volta uscita dalla parte inferiore dello schermo, si ripresentava a video per poi scomparire nuovamente.

Sembrava che la circuiteria non riconscesse come si deve il missing ball.

Siccome il missing ball , e quindi l'attivazione del Wait Serve fa capo alla parte di circuito che avevo modificato nell'upgrade, ho subito pensato a qualche errore di collegamento da parte mia.

Andando a rivedere il lavoro svolto, ho trovato un altra diversità nei collegamenti della pcb rispetto allo schema originale Schema 1. Sullo Schema 1, il gate H2 ha il pin#12 collegato al segnale 128H, mentre sulla pcb il medesimo pin è collegato al segnale 8H' ; in questo modo è impossibile il riconoscimento del missing ball, ovvero il circuito non riesce a detectare in modo corretto che la palla ha raggiunto la parte inferiore dello schermo.



Schema 4

Dopo aver effettuato anche questa modifica, le varie fasi di gioco si svolgono in maniera corretta , potendo così giocare una intera partita !

Comunque la scheda non è ancora pienamente a posto : sebbene i mattoni colpiti dalla palla scompaiano, il punteggio non viene aggiornato, ma rimane a zero. Da una rapida verifica sembrerebbe mancare il segnale al pin#9 del multivibtatore N8, la cui uscita abilita il contatore utilizzato per incrementare il punteggio.

giovedì 1 gennaio 2009

Atari Breakout : not working PCB - Aggiornamento 5

Avendo verificato che gli schemi di Breakout sono una revisione successiva rispetto alla scheda, ho deciso (forse discutibilmente) di apportare tali aggiornamenti.
Pertanto ho modificato la pcb secondo quanto riportato nello Schema 1.
Gli effetti si sono fatti sentire: ora all'accensione l' Attract Mode funziona perfettamente, e la pallina rimbalza che è una meraviglia e il Serve Led si spegne dopo due,tre secondi.

Atari Breakout : not working PCB - Aggiornamento 4


  • Risolto il problema della tensione di alimentazione troppo bassa; ora è a 5,01 volt su ciascun componente. Banalmente il cavo di alimentazione della pcb era di sezione troppo piccola e l'effetto della sua resistenza incominciava a farsi sentire. Ma la scheda continua a fare i soliti capricci...

  • Risolta l'incongruenza tra gli schemi dei collegamenti dei vari ICs riportati sullo schematico, ed i collegamenti verificati sulla pcb : quest'ultima è la revisione "E" , lo schema cartaceo è la revisione "F". Il sottostante schema 3 è stato ricavato direttamente dalla pcb


Schema 3

Questo dovrebbe evitare la tracciatura delle pareti destra e sinistra del campo di gioco quando il monitor ha il segnale di sincronia orizzontale attivo.