Realizzare una scacchiera elettronica


14

Voglio fare una scacchiera di legno su cui puoi giocare con pezzi regolari (cioè, pezzi non modificati che utilizzano codici RFID, magneti, ...), ma che è collegato a un software che prende nota delle mie mosse e agisce come il secondo giocatore.

Ho pensato a come rilevare i pezzi sul tabellone e ho preso le decisioni che non ho bisogno di riconoscere quale pezzo è dove: la "verità" è nel software, quindi se sposto un pezzo da A a B , il software è in grado di scoprire quale pezzo è stato spostato.

Quindi, ho avuto l'idea di praticare due fori in ciascun campo della scacchiera, uno al centro e uno nell'angolo in alto a destra:

  • Quello al centro verrà utilizzato per un sensore di luminosità per rilevare se un pezzo è in piedi sul campo o meno.
  • Quello nell'angolo verrà utilizzato per un LED per mostrare quale pezzo l'utente deve spostare per il computer, in modo che la situazione del mondo reale corrisponda nuovamente alla situazione del software.

Voglio usare un Raspberry Pi come base hardware per l'esecuzione del software, che sarà scritto in Node.js (ma questo non dovrebbe essere importante per questa domanda).

Quindi, quello che finisco con sono 64 sensori di luminosità e 64 LED, che devo indirizzare individualmente. In altre parole: ho bisogno di 64 uscite e 64 ingressi. E ovviamente questo è qualcosa che un Raspberry Pi non gestisce immediatamente - e penso che ci debba essere un modo migliore che avere 128 porte I / O.

Dal momento che penso che rilevare lo stato della scheda sia il compito più importante, ho iniziato a cercare nel web come gestire una matrice di switch 8x8. Ho trovato il suggerimento di utilizzare un microcontrollore che esegue la scansione sequenziale delle colonne della scheda e in ciascuna colonna rileva se viene utilizzata o meno una riga (= un campo).

Ciò ridurrebbe la complessità con 8 uscite e 8 ingressi (per poter leggere lo stato della scheda).

Su questo, ho alcune domande:

  1. I miei pensieri sono giusti, ovvero è questo l'approccio corretto o esiste un'alternativa migliore alla quale dovrei fare attenzione?
  2. Dato che non ho esperienza con i microcontrollori, cosa devo cercare? Ho solo bisogno di un microcontrollore con 16 pin, programmabile in una lingua che sono in grado di scrivere, o ...?
  3. Qualcuno ha creato una simile scheda e ha qualche consiglio o conosce un tutorial che ti guida attraverso il processo?

1
Hai l'idea giusta. Ci vorrà un po 'di raffinatezza sull'applicazione di rilevamento. A seconda delle dimensioni e del peso dei pezzi è possibile utilizzare uno schema di rilevamento di blocco della luce o pulsante tattile. La vera domanda qui è come hai intenzione di dire quale pezzo è cosa? Probabilmente avranno bisogno anche di pezzi personalizzati. Forse metti un tag RFID su ciascuno e poi ogni quadrato ha uno scanner RFID? Overkill, ma un pensiero.
mcmiln,

1
Il percorso di scansione a matrice che descrivi non sarà in grado di far fronte con 4 pezzi su 2 file e 2 colonne. Osserva i decodificatori a 3-8 linee (74138) ed estrapola a 5-64
Icy

2
La formazione iniziale dei pezzi è sempre la stessa, quindi il software sa quale pezzo è dove. Se poi sposti un pezzo da A a B, il software sa quale pezzo è stato spostato dove. Naturalmente ciò non consente di iniziare con formazioni arbitrarie, ma è possibile anche installarle manualmente nel software.
Golo Roden,

1
Questo sembra ... ingombrante. Sarei andato con un metodo video software. OpenCV e una videocamera. E un proiettore.
Passante

2
questa guida può essere utile per quanto riguarda l'organizzazione del sensore / rilevamento
user2813274

Risposte:


5

Poiché un'immagine vale più di mille parole, ecco un esempio di LDM-24488NI : una matrice a 64 led

inserisci qui la descrizione dell'immagine

Per la tua applicazione avrai bisogno di una di queste matrici per i LED e un'altra per i sensori, per un totale di 32 pin IO. Dato che il tuo RPi non ne ha così tanti, dovrai usare demux da 1 a 8 per selezionare singole righe e colonne:

inserisci qui la descrizione dell'immagine

Per i LED, è possibile utilizzare demultiplexer sia per le righe che per le colonne, poiché è necessario solo un led alla volta. Per i sensori, consiglierei di utilizzare un demux per righe e singole righe per colonne, per poter rilevare più sensori attivi in ​​una riga. Ciò porterà il conteggio dei pin richiesto a 17 pin, che un RPi può gestire.


12

Sì, il multiplexing mentre descrivi è un modo comune di affrontare le matrici di cose.

La parte più difficile riguarderà la natura analogica dei sensori di luce. I LDR CdS (resistori dipendenti dalla luce) sono probabilmente i migliori in questo caso perché sono sensibili, economici e producono un'ampia risposta facilmente misurabile nell'intervallo di luminosità umana. Elettricamente, sono resistori, con la resistenza che diminuisce con una luce più intensa.

Semplificherebbe il multiplexing se si utilizza un micro con 8 ingressi analogici. Ciò significa che metà del tuo mux è integrato nel micro. Si attiva una riga di LDR e si leggono i segnali a 8 colonne direttamente con il micro, ad esempio.

La scansione di 64 ingressi analogici in sequenza può essere facilmente eseguita istantaneamente in termini umani con normali micro. Diciamo che puoi prendere una nuova lettura ogni 100 µs. È "lungo", anche per micro piccoli ed economici. Ciò significa che l'intera scheda verrà scansionata ogni 6,4 ms, il che è molto più veloce di quanto si possa percepire un ritardo.

Il multiplexing dei LED è ancora più semplice poiché tutto ciò avviene con le uscite digitali. Molti micro hanno ben più di 16 uscite digitali, quindi questo non è un problema. Ci saranno altre cose che dovranno accadere e utilizzerai i pin più velocemente di quanto potresti aspettarti ora, ma un micro a 64 pin dovrebbe davvero essere abbastanza buono, se non uno a 44 pin.

Probabilmente dedicherei un micro solo alla gestione dell'I / O della scheda. Questo è ottimizzato per avere abbastanza pin I / O, ingressi A / D e simili. Quindi si interfaccia al motore di calcolo principale tramite UART. Il protocollo sembrerebbe "illumina il quadrato 3,2" o "il pezzo rimosso dal quadrato 5,4". Ciò consente anche un'interfaccia hardware totalmente diversa in futuro, purché si mantenga lo stesso protocollo.


7

Per i LED , il modo più ovvio per farlo è quello di avere un output per ogni riga e ogni colonna della scacchiera: un totale di 8 + 8 = 16 pin. Gli anodi sarebbero collegati ai fili di fila e i catodi al filo di colonna. Per il LED che si desidera accendere, si renderebbe positivo il filo dell'anodo (logica 1) e negativo il filo catodico (logica 0), mantenendo gli altri nello stato inverso (quindi i LED rimanenti hanno polarizzazione neutra o inversa).

Sto assumendo qui che il microcontoller fornisce tensioni sufficientemente alte / basse per consentirti di collegare un LED dall'uno all'altro. In caso contrario, sarà necessario un transistor o un buffer per ciascuna linea. Con alimentazione a 5 V è stretto, considerando che il LED scende di circa 2 V e si desidera una ragionevole caduta di tensione sul resistore di limitazione corrente (si noti che è necessario installarli solo nelle linee di riga o nelle linee di colonna, non in entrambe).

Se le tue uscite sono tri-state (ovvero, oltre alla logica 0 e alla logica 1, possono essere impostate su uno stato ad alta impedenza, magari configurandole temporaneamente come ingressi), puoi diventare intelligente e utilizzare una griglia 4x8, con LED collegato in coppie antiparallele. In questa configurazione è importante impostare le uscite non utilizzate su un'impedenza elevata, altrimenti si accenderanno i LED indesiderati.

In entrambi i casi, dovrai pensare al sorteggio attuale e se è accettabile rischiare la possibilità di un errore del software che illumini tutti i LED di fila contemporaneamente (che, se non considerato, potrebbe sovracorrente quella riga del microcontrollore .)


Il caso dei sensori è più complicato. Presumo che tu usi sensori resistivi, sebbene i fototransistor non siano necessariamente condotti in una sola direzione.

Puoi usare le stesse uscite a 8 righe che usi per illuminare i tuoi LED, ma avrai bisogno di 8 ingressi a colonna dedicati al rilevamento. Senza dubbio avrai visto circuiti per tastiere come questa. Tieni presente che questi sono progettati solo per avere un tasto premuto alla volta . Se l'utente preme insieme 1,3,7 e 9, la tastiera non è in grado di rilevare se l'utente rilascia uno di questi quattro tasti perché esiste ancora un percorso corrente attraverso gli altri tre interruttori.

Una soluzione utilizzata sulle tastiere musicali (che sono progettate per avere più di un elemento della matrice che conduce alla volta) è quella di avere un diodo in serie con ogni singolo interruttore.

Un'altra soluzione sarebbe quella di acquistare quattro CI di decodifica da 4 a 16 con uscite open collector (o drain aperto se si utilizzano IC MOSFET) come questo: http://www.unicornelectronics.com/ftp/Data%20Sheets/74159.pdf Open collector significa che le uscite dell'IC affondano solo la corrente, non la fonte. In questo modo è possibile collegare 16 sensori a 16 uscite del chip e condividere le altre estremità con una resistenza di pullup (collegare anche qui l'ADC). Portate un'uscita bassa (conduttiva) e le altre 15 rimangono alte (non conduttrici). Ciò è in contrasto con l'uscita logica standard, dove le altre 15 uscite riverserebbero corrente nel punto comune.

L'ingresso a questi circuiti integrati è binario a 4 bit per selezionare una delle 16 uscite, ma hanno anche un ingresso aggiuntivo per abilitare / disabilitare il chip. Quindi potresti potenzialmente avere un array di 64 lavandini open collector, collegati a 64 sensori, con le altre estremità dei sensori tutte comuni a un singolo resistore pullup e convertitore analogico-digitale. Per questo occorrerebbero un totale di 8 uscite sul microcontrollore: quattro per prendere i segnali di selezione da 4 a 16 (comuni a tutti e quattro i chip) e quattro per prendere i segnali di abilitazione (uno per ogni chip).

EDIT: da 3 a 8 decodificatori (chiamati anche 1 di 8 = 1 riga su 8) sembrano essere più disponibili di 4 a 16, ma 8 IC sono molto più disordinati di 4. Un altro tipo di IC che potrebbe essere utile è il contatore ottale (e suo cugino più comune il contatore dei decadi , che può essere configurato come contatore ottale collegando la nona uscita alla linea di ripristino). Questi richiedono un impulso seriale per avanzare da un'uscita all'altra, quindi occorrerebbe meno Pin I / O sul microcontrollore rispetto ai circuiti integrati del decodificatore. In genere hanno ingressi aggiuntivi per il ripristino e l'abilitazione. Esistono anche IC chiamati registri a scorrimento , che sono disponibili in due tipi: uno per convertire serie in parallelo, l'altro per convertire parallelo in serie. Finalmente ci sonobuffer, che puoi mettere tra il tuo Rasberry Pi e la tua scacchiera in modo che il Pi non venga distrutto in caso di sovracorrente. Tutti questi possono essere utili nei circuiti multiplexing.


1
Menzionate i registri a scorrimento: potrebbero essere usati anche per le uscite a LED. Un altro contatore più un registro a scorrimento a 8 bit che può essere tristato potrebbe guidare l'intero array con appena più di due o tre pin, se sono abbastanza veloci da evitare lo sfarfallio visibile.
Hobbs

@hobbs Non credo che lo sfarfallio sia un problema in quanto OP vuole solo accendere uno o due LED contemporaneamente. Persino il tristato non è realmente necessario se hai solo un registro decimale / contatore ottale / inversione decimale / ottale per comandare i LED. 3 pin sono perfettamente raggiungibili: reset comune, avanzamento colonna, avanzamento riga. Potrebbe essere la strada da percorrere: salvare tutti gli altri pin per il problema più difficile dei sensori.
Level River St,

Per i LED è possibile utilizzare anche il driver LED MAX7219 / 7221. Ciò ridurrà il numero di ingressi a 3 - orologio, dati, blocco.
jnovacho,

4

Il multiplexing è davvero una pratica comune.

Ci sono un paio di modi in cui puoi ottenere di più dalle tue pin lampone

Uno è usare un chip per fare un po 'di sollevamento pesante per te. Ad esempio, se si dispone di 8 ingressi e 8 uscite per leggere lo stato della scheda, è possibile utilizzare un contatore per aumentare gli 8 ingressi uno alla volta. Per questo avrai bisogno di 2 pin su Arduino: uno per ripristinare il primo pin e uno per "passare alla riga successiva". Hai appena salvato 6 pin!

Salvare 6 pin potrebbe non essere sufficiente - vediamo dove possiamo andare da qui: se ri-organizzi la tua griglia 8x8 in una griglia 16x4, puoi usare qualcosa come http://www.instructables.com/id/16-Stage -Decade-Counter-Chain-Using-two-4017-Chi /? ALLSTEPS (ignora la metà superiore, le due linee che scendono dall'alto verso il basso sono il tuo "reset", proveniente da in alto a sinistra, e il " vai alla riga successiva ", che si chiama CLK, per l'orologio, qui). Ora puoi contare gli 8 nella metà sinistra del tabellone, seguiti dagli 8 nella metà destra del tabellone; collegare tra loro le colonne A ed E, B e F, C e G e D e H.

Congratulazioni, ora hai due pin di uscita (reset e clock) e 4 pin di input, per un totale di 6 - che consente di risparmiare 10 pin! Nota che il raspberry pi non ha convertitori da analogico a digitale, quindi avrai bisogno di un lavoro extra per questo.

Ora per i LED. Hai già un alimentatore controllato (i contatori a due decenni): riusiamo a riutilizzarli. Metti i tuoi 64 LED dai tuoi 16 pin di alimentazione, tramite un resistore (ogni LED DEVE avere il proprio resistore!), Su altri 4 binari (stesso layout come sopra: AE, BF, CG e DH). Collegare queste 4 rotaie tramite 4 transistor a 4 pin e mettere tutti i pin su "alto" - poiché entrambi i lati del LED sono ora a 5 volt, i LED saranno spenti. Quindi, quando vuoi accendere un LED, assicurati che i tuoi due decenni siano nella posizione giusta (come se stessi leggendo il sensore su quel quadrato), imposta uno dei 4 binari su basso. La corrente dovrebbe ora fluire dal "massimo" dal contatore del decennio, al "basso" in quella specifica ferrovia. Ehi presto, la luce si accende! Dare un po 'di ritardo, quindi spegnerlo nuovamente prima di modificare nuovamente il contatore dei decenni.

Se vuoi un maggiore controllo, puoi usare qualcosa come un chip TLC5940 - http://playground.arduino.cc/Learning/TLC5940 - ogni chip può impostare 16 LED (quindi ne avresti bisogno 4 di questi) a un livello di luminosità da 0 (spento) a 1024 (pieno acceso), in modo da poter sfumare i singoli LED dentro e fuori, con un ottimo controllo. Dalla memoria, questi richiedono circa 4 pin e possono essere collegati in cascata, quindi 4 pin digitali (uno dei quali deve essere PWM - questi hanno il simbolo "~" accanto al pin) controlleranno un numero qualsiasi di LED.

In bocca al lupo!


È RPi, non Arduino.
Dmitry Grigoryev l'

Mi scuso, hai ragione. Quasi tutto ciò che ho detto vale ancora, quindi ho apportato alcune modifiche minori, per farlo funzionare
AMADANON Inc.,

0

Non credo che avrai bisogno di un LED nell'angolo in alto a destra. Un sensore nel mezzo, come dici, sarebbe abbastanza. La parte ingannevole sarà il codice per la scacchiera. Immagina di avere una scacchiera. La riga verrà indicata come 'alfabeto' e la colonna indicata come 'numero'.

Quindi per prima cosa hai bisogno di un programma per programmare il tipo di pezzo nella posizione iniziale. Successivamente, quando sposti i tuoi pezzi, il codice genererà la posizione iniziale del pezzo nella posizione finale. Ciò ridurrà della metà il tuo contributo.


5
Forse non ho spiegato bene ... i LED non sono pensati per la lettura nello stato attuale, sono pensati per mostrare quale mossa vuole fare il computer. Quindi, l'utente si muove: i sensori di luminosità indicano al software cosa ha fatto l'usato. Il software calcola la sua prossima mossa e fa lampeggiare due LED, l'utente sposta il pezzo e poi è di nuovo il turno dell'essere umano.
Golo Roden,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.