2020/07/05

Un gioco che sembra facile…

Mi sembra un’idea semplice che persino io dovrei riuscire a realizzare: una pulsantiera per prenotare il turno di un gioco che accetta fino a 4 giocatori (squadre).

Immagino uno scatolotto che ha 4 ingressi, ai quali è possibile attaccare, tramite un filo lungo (niente bluetooth…), i pulsanti (con impugnatura ergonomica… o no). In corrispondenza di ogni ingresso due LED: uno per testimoniare il funzionamento del pulsante e un altro per indicare il “vincitore”.

Un display (4 cifre da 8 segmenti) sullo scatolotto indica il tempo (in millisecondi…). Un tastino sullo scatolotto permette di selezionare e mostrare il tempo degli altri pulsanti (i perdenti). Un quinto pulsante serve per inizializzare/avviare il temporizzatore ed è in mano al “mastro di gioco” — cioè per esempio chi legge la domanda, o un operatore incaricato di questo compito una volta che il presentatore ha letto la domanda (o quel che sia nel gioco).

Come timer dovrei usare il 555, e serve un contatore che “manda” i conteggi a N latch che latchano solo quando il giocatore preme il corrispondente bottone (solo il reset fatto dal mastro di gioco li può sbloccare). Dei comparatori possono essere usati per far sì che si accenda il LED del più veloce, e il display visualizzerà il suo tempo. Un pulsante consentirà di vedere a che tempo si sono “latchati” gli altri.

Sto immaginando un progetto digitale, come si può intuire.

Con 4 posso arrivare a 9999 millisecondi, ma facciamo che invece il massimo sia tale che siano sufficienti 12 bit. Mi servono contatori a 12 bit, e per ogni “pulsante” deve essere possibile memorizzare questi 12 bit.

Usando un flip-flop D, ne servirebbero 12×4… usando 74LS74 che ne contiene 2, servirebbero 24 di questi componenti… Usando un 74LS273 che ne contiene 8, ne bastano 6. Dopodiché serve un componente per poter selezionare quale valore deve visualizzare il display, e quindi poi serve un qualcosa che decodifichi questo valore in modo adatto per un display costituito da 4 cifre di otto segmenti ciascuna (dovrebbero essere solo sette: non sono interessato il punto: il numero visualizzato è espresso in millesimi).

Poi come detto mi serve un componente (o un blocco) per contare (un contatore) fino a 212: sarà il timer (555?) a far incrementare ogni volta questo contatore, che poi sarà resettato dal pulsante del mastro di gioco.

I 12 flip-flop D di un pulsante bloccano il valore fornito da questo contatore quando il pulsante viene premuto. (Ogni seconda pressione del tasto non deve avere effetto, quindi non serve debounce?)

Il primo flip flop D che “scatta” deve far partire un altro conteggio? Il timer va ancora per qualche ciclo, in modo che gli altri abbiano tempo per premere, se premono. Se non premono il valore indicato dovrà essere il massimo (tutte e 12 le linee su).

Servono condensatori e resistenze adeguate per far sì che il timer dia un impulso al millisecondo. La precisione non è essenziale, visto che si procede per differenze.

Dei comparatori non credo che servano: si può fare una logica per cui il primo flip-flop a bloccare un valore è anche il vincitore.

Dopo che il primo ha premuto il pulsante, quanti “cicli” (millisecondi) devono passare? Ovvero, dato un evento a cui N persone devono reagire, qual è la “variabilità” della reazione. (Al di là del termine statistico corretto: mi interessa sapere quanti ms ha senso aspettare prima di rinunciare definitivamente a “sentire” anche la pressione degli altri bottoni.

Raggiunto questo limite, la “memoria” dei vari pulsanti non premuti viene portata tutta su, in modo che sul display mostrino il massimo. (Il valore massimo può essere visualizzato in modo speciale, per esempio con tutte “lineette” invece che con il valore effettivo.)

Ricapitolando i componenti per ora:

  • condensatori, resistenze (da contare)
  • 1 × timer 555…
  • 6 × 74LS273
  • 8 × LED
  • 7 × pulsanti (uno in più di quanto detto prima perché voglio un reset esplicito…)
  • 1 × display (questo?

Ma non è finita: il display è tale per cui accende solo una cifra per volta. Quindi occorre passare rapidamente da una cifra all’altra (abbastanza rapidamente da non far vedere che si spegne). Forse si può usare sempre il timer (che quindi non si ferma mai in realtà) per selezionare a rotazione le cifre.

  • 1 × 74HC595 (shift register)

E poi: come converto il numero binario rappresentato dalle 12 linee in un numero a base 10 e dunque in 7×4 (numero delle cifre) linee che, una per volta, vanno ad accendere le cifre del display?

Finisce che sarebbe molto più facile e forse anche economico progettare il tutto con un µC adeguato (ATmega usato da papà mi sembra un po’ eccessivo per un progetto simile: basta e avanza un µC molto più elementare).

Ma proseguendo la strada dell’idea iniziale (solo componenti passivi e componenti digitali “elementari”)… mancano due componenti/blocchi:

  • convertitore 12-bit a decimale (BCD × 4 cifre)
  • multiplexer (deve selezionare 4 gruppi di 12 linee in ingresso e uscire con le 12 linee selezionate)

Le 12 linee selezionate dal multiplexer vanno al convertitore 12-bit a decimale BCD, che in qualche modo va al display (una cifra per volta a rotazione)

Mancano ancora parecchi componenti mi sa, se voglio evitare, come in effetti voglio, µC. Altrimenti: rinunciare all’idea di memorizzare i millisecondi e permettere di visualizzarli. Cioè, detta altrimenti, uno si deve fidare della macchina e basta: il circuito accenderà il LED di chi è arrivato prima e questa prima “attivazione” va a bloccare la possibilità di accensione dei LED degli altri giocatori, dando quindi contezza di chi sia il vincitore.

Per 12-bit a 4 cifre BCD, cfr. pure questo forum in cui un commentatore in effetti suggerisce l’uso di µC… (Lui 16-bit… basta tenerne 4 sempre a 0 si può riciclare la soluzione.)

Senza usare un µC il progetto è più “dispendioso”.

Ho buttato alcuni dei componenti alla rinfusa in KiCad, tanto per avere un’immagine per questo post:

Visto che il progetto è semplice ma nello stesso tempo presenta delle “complicazioni” interessanti, forse lo continuo davvero.

Fritzing?

In questo video lo schema è marcato Fritzing, e quindi suppongo che l’immagine della breadboard sia pure generata con Fritzing, e mi sembra più 2D-osa… :think: Ma forse solo perché non compaiono componenti con lunghi piedini (il disegno delle resistenze e dei circuiti integrati è ok…)

Il testo associato dovrebbe essere questo: Arduino lesson – 4 Digit 7 Segment LED Display.

Nessun commento:

Posta un commento

Commenta solo per dare un contributo utile, una critica costruttiva o fare un'osservazione acuta. Non commentare solo per dire che esisti anche tu o che ti piace o dispiace quello che hai letto e visto su questo blog.