Quante volte abbiamo visto in TV, durante i giochi a premi, i concorrenti premere affannosamente il proprio pulsante, per accaparrarsi il diritto di rispondere alle domande del presentatore? Anche a casa, spesso, tra parenti e amici si suole giocare ai quiz. In tutti questi casi occorre un sistema per sancire, in modo inequivocabile, colui che ha diritto a rispondere, avendo premuto il pulsante prima degli altri.
Il circuito
Indipendentemente dal numero dei pulsanti, la filosofia di funzionamento è sempre la stessa. Si tratta di un ciclo infinito all'interno del quale viene controllato lo stato logico dei pulsanti. Appena si verifica una pressione degli stessi il sistema avverte con un segnale luminoso (ed eventualmente sonoro) quale ingresso è stato attivato prima di tutti.
Schema elettrico e connessioni
Il sistema proposto nell'esempio controlla quattro utenze ma, con lo stesso principio, è possibile modificare tale numero secondo le proprie esigenze. La figura 1 mostra lo schema elettrico e il relativo cablaggio. Le quattro porte, configurate come ingressi, sono collegate a massa, durante lo stato di riposo, grazie alle relative resistenze di pull-down. La pressione di uno dei pulsanti, rilevata dal software, attiva la specifica routine che illumina il corrispondente indicatore.

Lo sketch
In figura 2 è mostrato lo sketch da digitare sull'IDE di Arduino. Esso risulta abbastanza semplice. La funzione setup() configura le porte 4, 5, 6 e 7 quali ingressi digitali, per i pulsanti dei concorrenti e le porte 8, 9, 10 e 11 quali uscite digitali, per il pilotaggio dei diodi LED. Inoltre, tali uscite sono poste, inizialmente, a un livello logico basso. Il cuore del programma, ovviamente, risiede nella funzione loop(). In un ciclo infinito "while" vengono controllati continuamente, e molto velocemente, i quattro pulsanti. Non appena uno dei quattro concorrenti preme il suo pulsante, la variabile "ChiHaPremuto" riceve il numero identificativo del giocatore e il ciclo infinito termina subito. Quindi ha luogo l'accensione della relativa lampada, effettuata tramite l'omonima funzione, alla quale è passato, come parametro, il numero della porta di output da gestire.

Il sistema è equo?
Sembrerebbe che un siffatto sistema di gestione delle priorità sia esente da ogni forma d'ingiustizia. È invece no, per motivi non imputabili alla filosofia di funzionamento ma alla sequenzialità di esecuzione delle istruzioni, il prototipo potrebbe giudicare erroneamente chi ha premuto prima il pulsante. E lo dimostriamo con un esempio. Si supponga che l'esecuzione del software sia arrivata alla riga 25, ossia dopo il controllo del pulsante del giocatore numero 1. Proprio in tale istante il concorrente numero 1 preme il suo pulsante e subito dopo (parliamo di millisecondi) il concorrente numero 2 fa lo stesso. La successiva istruzione di programma è quella del controllo dello stato dell'input del giocatore numero 2, che viene decretato come "vincitore" ma in realtà chi ha premuto per prima è stato il concorrente numero 1.
Anche se tale evenienza è molto rara si potrebbe verificare. Si può risolvere il problema adottando un sistema hardware più complesso e utilizzando una ramificata rete di porte logiche.
Per chi inizia ora e voglia dotarsi di tutto l'occorrente, Arduino Uno si trova facilmente a un prezzo abbordabile.