reed switch

ciao a tutti,

ho in mente di farmi una scacchiera elettronica che mi memorizzi su scheda sd o usb le partite giocate.

l'idea è quella di utilizzare i reed switch per fare una griglia tipo


l'idea è semplice: dei reed switch (uno sotto ogni casella della scacchiera), e un magnete posto alla base dei pezzi. quando il pezzo è sulla casella, il reed switch si dovrebbe chiudere e quindi segnala che è presente un pezzo.

al di fuori dei vari algoritmi per la gestione di tutto che so già come farli, ho un dubbio sulla parte hw:

avrei trovato questi reed switch https://www.distrelec.it/ishop/Datasheets/03749298.pdf ma non capisco una cosa (sono abbastanza ignorante in elettronica :smiley: ). il datasheet mi da come switching voltage max 200 VDC. vuol dire che al massimo lo posso collegare ad una tensione di 200vdc? se lo collego a +5v di arduino, e ci collego ad una estremità un pin digitale settato in input, quando il reed si chiude fa passare i 5v e pertanto sul pin dovrebbe segnarmi 1. è giusto o sto dicendo una cavolata?

certo che puoi usarli su arduino, considerali come un pulsantino, quindi metti una resistenza di pullup o pulldown a seconda di come vuoi il segnale

E come fai a sapere qual è il pezzo appoggiato in una determinata casella? Con questo sistema sai solo che c'è un pezzo, non quale.

leo72:
E come fai a sapere qual è il pezzo appoggiato in una determinata casella? Con questo sistema sai solo che c'è un pezzo, non quale.

la posizione di partenza è uguale per tutte le partite. ogni tot ms o con qualche interrupt appena c'è una variazione di qualche pin di input vado a leggermi tutti gli stati dei reed e li confronto con la situazione precedente. guardo quali si sono modificati e capisco qual'è il pezzo che è stato mosso.

detto a parole è molto semplice, poi sono sicuro che smadonnerò non poco quando lo farò :slight_smile:

Mah... non mi pare sicura come cosa. Se uno inavvertitamente urta con la mano un paio di pezzi e li fa cadere e poi non si ricorda come stavano e li rimette a caso?

leo72:
Mah... non mi pare sicura come cosa. Se uno inavvertitamente urta con la mano un paio di pezzi e li fa cadere e poi non si ricorda come stavano e li rimette a caso?

beh diciamo che io ho intenzione di usarla in una situazione ideale in cui i giocatori (io e un mio amico :smiley: ) siano "composti" e non facciano cadere i pezzi. quello che dici tu ovviamente è un problema, non tanto per il fatto che non si ricordi quale sia la posizione (non mi è mai capitato di far cadere un pezzo e di non ricordarmi dov'era), tanto quella di verificare che sia una mossa regolamentare (se mi cade un pezzo per terra per esempio, lo stato di quel reed passerà da 1 a 0, però non ho la corrispondenza con un altro reed che sia passato da 0 a 1). insomma io la faccio abbastanza semplice, ma poi dovrò pensarci bene per gestire le varie "eccezioni". quello che mi interessa come primo step è gestire la situazione ideale in cui i giocatori non facciano cadere i pezzi e in cui si eseguano mosse regolamentari.

reizel:
certo che puoi usarli su arduino, considerali come un pulsantino, quindi metti una resistenza di pullup o pulldown a seconda di come vuoi il segnal

perfetto grazie mille per l'info :slight_smile:

se il pezzo fosse solo uno, la cosa dovrebbe essere semplice, dovrebbe bastare leggere il cambio di tensione (anzi, di corrente sarebbe meglio) di tutti i PA e PB. Ma visto che i pezzi sono tanti, la cosa diventa quasi impossibile con quello schema (non so se matematicamente sia possibile). Se tutti i reed shift sono della stessa resistenza, analizzando la corrente e conoscendo a priori che si sposta una sola pedina, e lo stato iniziale delle pedine, analizzando la corrente dovresti farcela, anche se è molto complicato.

Per quanto riguarda l'errore umano, basta fare una griglia led: led spento = stato ok, led acceso = se c'è una pedina allora non ci deve essere(esempio mossa errata), se non c'è la pedina, ci deve essere.
per esempio mentre muovi, appena togli la pedina la casella si illuminerà per avvertirti che lì manca la pedina. se la appoggi da un'altra parte, calcola la mossa: se errata, si accende anche il led della casella in cui c'è la pedina, altrimenti si spegne il led di partenza. ciò è anche molto utile per indicare che la mossa è stata accettata, e quindi per debuggare il programma.

Però non riconosce le pedine: per riconoscere le pedine lo schema elettrico è da cambiare sicuramente, e ogni pezzo ha un magnete,e quindi dovrebbe attivare il reed shift, in modo differente (non so se quei sensori funzionano così).

Un trucco può essere di leggere i sensori uno per uno usando un multiplexer o simili. togli un sacco di complessità software, possibilità di errore di lettura, e semplifichi la parte hardware. Poi fai un pool sul multiplexer, se non supporta un interrupt di avviso cambio stato su un pin.

sollazzo:
l'idea è quella di utilizzare i reed switch per fare una griglia tipo

http://2.bp.blogspot.com/-jCmysxfe5xw/TatsQIhYGgI/AAAAAAAAABA/852d7LhTqKE/s1600/Reed+switch+wiring.png

l'idea è semplice: dei reed switch (uno sotto ogni casella della scacchiera), e un magnete posto alla base dei pezzi. quando il pezzo è sulla casella, il reed switch si dovrebbe chiudere e quindi segnala che è presente un pezzo.

Ci sono 2 problemi :

  • La matrice di contatti reed da te proposto puó decodificare solo un reed azionato; con 2 giá non si capisce quale é azionato. Immaginati Tu decvi discriminare 32 contatti chiusi su 64. Serve aggiungere un diodo in serie a ogni contatto per poter ovviare a questo problema.
  • i contatti Reed sono cattivi. non funzionano cosí smplicemente come si pensa. All inteno hanno 2 linguette che se vengono polarizzate N e S indotto da un magnete esterno allineato all'asse del Reed si attraggono e chiudono il contatto. Questo vuol dire che se metti un magnete sotto ogni figura non é detto che aziona in modo affidabile il reed. Per ovviare questo puoi mettere vicino a ogni reet un piccolo mangete per "polarizzare" il reed e insieme al magnete della piedina aziona il reed.

Non vedo grandi problemi sul identificare quale piedina sia stata mossa visto che la posizione di partenza é sempre uguale. L' unico problema che vedo é quando si batte una piedina avversaria. La soliuzione potrebbe essere che per battere una piedina del avversario deve essere rimossa prima quella e poi spostata la propria.

In casi di problemi si puó fare in modo che si alza tutte le piedine in un carta sequenza per far riconoscere a Arduino le posizioni.

Ciao Uwe

La proposta con le luci non mi piace perché temo che deconcentra i giocatori.

Un altro problema da gestire e' che essendo molto sensibile il reed alla calamita del pezzo muovendo il pezzo si possono attivare in sequenza tutti i reed che si incontrano dalla posizione a alla b.
Bella idea cmq, potresti partire con la dama avendo solo due pezzi da gestire

Testato:
Un altro problema da gestire é che essendo molto sensibile il reed alla calamita del pezzo muovendo il pezzo si possono attivare in sequenza tutti i reed che si incontrano dalla posizione a alla b.
Bella idea cmq, potresti partire con la dama avendo solo due pezzi da gestire

Secondo me non c'é questo problema se si alza la piedina. Se ci si sposta sostandolo strisciando in superfice c'é il problema descritto.
Ciao Uwe

innanzitutto grazie a tutti per le risposte.

stasera mi sono trovato col socio con cui voglio fare la scacchiera e abbiam tirato giù un paio di problematiche/soluzioni.

per quanto riguarda i vostri post:

lesto:
se il pezzo fosse solo uno, la cosa dovrebbe essere semplice, dovrebbe bastare leggere il cambio di tensione (anzi, di corrente sarebbe meglio) di tutti i PA e PB. Ma visto che i pezzi sono tanti, la cosa diventa quasi impossibile con quello schema (non so se matematicamente sia possibile). Se tutti i reed shift sono della stessa resistenza, analizzando la corrente e conoscendo a priori che si sposta una sola pedina, e lo stato iniziale delle pedine, analizzando la corrente dovresti farcela, anche se è molto complicato.

scusami ma non ho capito bene cosa intendi. per come l'ho intesa io (eliminando per il momento eventuali errori umani etc etc, quindi ipotizzando una situazione ideale, la situazione è questa:

  1. nello schema che ho postato le righe sono elettricamente separate dalle colonne, e i pin digitali delle righe sono di output, mentre quelli delle colonne di input.
  2. la matrice di partenza è la seguente

1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1

  1. per leggere la posizione attuale della scacchiera, due cicli for (le colonne sono i e le righe j)

for (int i = 0 ; i<8;i++) {
set pin i to high and set other pin to low;
// faccio passare corrente alla prima riga mentre le altre le setto a low
// rispetto allo schema che ho postato, non cè un unico bus a +5v sempre attivo, ma ogni riga è collegata ad un pin separato dagli altri (forse era qui che non mi ero spiegato bene)

for(int j = 0;j<8;j++) {
read status of pin j and save to matrix
// leggo lo stato di ogni casella di quella riga e la salvo in una nuova matrice.
// se c'è il pezzo, il magnete chiude il contatto e dovrei leggere 1 sul pin di input, mentre se non ce nessun pezzo leggo 0.
}
}

in questo modo penso che con 8 pin di output e 8 di input riesco a gestirmi tutta la scacchiera.

ipotizzando che abbia mosso una pedina, dopo la mossa ho per esempio questa matrice:

1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0
1 1 1 1 0 1 1 1
1 1 1 1 1 1 1 1

confronto questa matrice con quella precendete e scopro che c'è stato un cambiamento, che in pezzo di è mosso da e2 a e4 (coordinate della scacchiera). io a priori so che in e2 ci sta un pedone, e quindi so che in e4 ci è finito un pedone. poi questo come lo gestirò via software non lo so ancora che non ho ancora cominciato a smanettarci, ma credo che non sarà un problema troppo complicato in virtù della conoscenza iniziale delle varie posizioni dei pezzi.

lesto:
Per quanto riguarda l'errore umano, basta fare una griglia led: led spento = stato ok, led acceso = se c'è una pedina allora non ci deve essere(esempio mossa errata), se non c'è la pedina, ci deve essere.
per esempio mentre muovi, appena togli la pedina la casella si illuminerà per avvertirti che lì manca la pedina. se la appoggi da un'altra parte, calcola la mossa: se errata, si accende anche il led della casella in cui c'è la pedina, altrimenti si spegne il led di partenza. ciò è anche molto utile per indicare che la mossa è stata accettata, e quindi per debuggare il programma.

l'idea del led potrebbe tornare utile, magari non per ogni casella. parlando col socio abbiam pensato di aggiungere un pulsante da premere alla fine di ogni mossa (alla fine è quello che succede a scacchi quando si gioca con il cronometro: dopo ogni mossa lo si preme. abbiam già pensato ad un'eventuale integrazione con un cronometro, ma questo è un altro discorso). l'idea di aggiungere il pulsante da premere elimina qualsiasi problema dovuto all'errore umano o al cattivo posizionamento dei pezzi: interfacciandolo con due led il gioco è fatto.

ogni volta che si muove un pezzo, si preme il pulsante, e solo allora si controllato lo stato della scacchiera e si calcola la mossa effettuata: se si accende il led verde, la mossa è regolare. se si accende il rosso, c'è qualcosa che non va. quindi l'aggiunta di due leddini potrebbe tornare utile, specialmente in fase di debug.

uwefed:
Ci sono 2 problemi :

  • La matrice di contatti reed da te proposto puó decodificare solo un reed azionato; con 2 giá non si capisce quale é azionato. Immaginati Tu decvi discriminare 32 contatti chiusi su 64. Serve aggiungere un diodo in serie a ogni contatto per poter ovviare a questo problema.

ma sono proprio necessari i diodi? leggendo con i due cicli for come ho scritto poco sopra non dovrebbe funzionare? dovrei riuscire a decodificare ogni singolo reed indipendentemente da quanti ce ne sono azionati.

uwefed:

  • i contatti Reed sono cattivi. non funzionano cosí smplicemente come si pensa. All inteno hanno 2 linguette che se vengono polarizzate N e S indotto da un magnete esterno allineato all'asse del Reed si attraggono e chiudono il contatto. Questo vuol dire che se metti un magnete sotto ogni figura non é detto che aziona in modo affidabile il reed. Per ovviare questo puoi mettere vicino a ogni reet un piccolo mangete per "polarizzare" il reed e insieme al magnete della piedina aziona il reed.

Questo potrò verificarlo solamente con l'hardware in mano e facendo varie prove. dovrò sperimentare anchi diversi magneti e diversi spessori di plexiglas per vedere in che modo riesco ad azionarli senza errore. inoltre devo anche verificare che il magnete di un pezzo non interferisca anche sui reed delle caselle immediatamente vicine. potrebbero esistere alternative ai contatti reed per fare una roba di questo tipo?

uwefed:
Non vedo grandi problemi sul identificare quale piedina sia stata mossa visto che la posizione di partenza é sempre uguale. L' unico problema che vedo é quando si batte una piedina avversaria. La soliuzione potrebbe essere che per battere una piedina del avversario deve essere rimossa prima quella e poi spostata la propria.

In casi di problemi si puó fare in modo che si alza tutte le piedine in un carta sequenza per far riconoscere a Arduino le posizioni.

Ciao Uwe

Testato:
Un altro problema da gestire e' che essendo molto sensibile il reed alla calamita del pezzo muovendo il pezzo si possono attivare in sequenza tutti i reed che si incontrano dalla posizione a alla b.
Bella idea cmq, potresti partire con la dama avendo solo due pezzi da gestire

l'aggiunta del pulsante da premere alla fine di ogni mossa dovrebbe risolvere anche questo problema.

Ciao sollazzo

ma sono proprio necessari i diodi? leggendo con i due cicli for come ho scritto poco sopra non dovrebbe funzionare? dovrei riuscire a decodificare ogni singolo reed indipendentemente da quanti ce ne sono azionati.

8 1 1 1 1 1 1 1 1
7 1 1 1 1 1 1 1 1
6 0 0 0 0 0 0 0 0
5 0 0 0 0 0 0 0 0
4 0 0 0 0 1 0 0 0
3 0 0 0 0 0 0 0 0
2 1 1 1 1 0 1 1 1
1 1 1 1 1 1 1 1 1
A B C D E F G H

Considera questa posizione:
Nella riga 1,7 e 8 hai tutte la riga collegata con tutte le collonne.
La piedina in posizione E4 viene vista in A4, B4, ... H4 perché la corrente passa per i Reed delle righe 1,7,8 e nello stesso momento non viene rilevato l'assenza della piedina in E2.

Ciao Uwe

uwefed:
Ciao sollazzo

ma sono proprio necessari i diodi? leggendo con i due cicli for come ho scritto poco sopra non dovrebbe funzionare? dovrei riuscire a decodificare ogni singolo reed indipendentemente da quanti ce ne sono azionati.

8 1 1 1 1 1 1 1 1
7 1 1 1 1 1 1 1 1
6 0 0 0 0 0 0 0 0
5 0 0 0 0 0 0 0 0
4 0 0 0 0 1 0 0 0
3 0 0 0 0 0 0 0 0
2 1 1 1 1 0 1 1 1
1 1 1 1 1 1 1 1 1
A B C D E F G H

Considera questa posizione:
Nella riga 1,7 e 8 hai tutte la riga collegata con tutte le collonne.
La piedina in posizione E4 viene vista in A4, B4, ... H4 perché la corrente passa per i Reed delle righe 1,7,8 e nello stesso momento non viene rilevato l'assenza della piedina in E2.

Ciao Uwe

e se le righe le collego non ad un bus in comune ma ai singoli pin di output e ne attivo solamente uno alla volta?

voglio dire:

al primo ciclo for, setto high il pin della riga 1 e setto low i pin delle righe 2-8 e nel secondo for scorro tutte i pin delle colonne (quindi se rilevo corrente sono per forza della riga 1, in quanto tutte le altre colonne, anche se c'è un pezzo sopra, ha i pin disattivati quindi non passa corrente).
alla seconda iteriazione, setto high il pin della riga 2 e setto low i pin delle righe 1, 3-8, e scorro tutte i pin delle colonne (ora relativi alla riga 2), e cosi via.

forse non mi ero spiegato bene in questo passaggio.

effettivamente se le righe sono tutte alimentate non posso distinguere tra un pezzo in A4,B4 e così via, ma alimentandone solo una alla volta, e disattivando le altre, dovrei riuscirsci. almeno è quello che il mio cervello si ostina a farmi pensare :slight_smile:

Quello che vuoi fare per leggere i reed della matrice é giusta ma:
consideriamo la riga 2 dove non dobvrebbe laggere la posizione E
Ma il reed risulta chiuso attraverso E1 F1 F2 o altri 7 percorsi che qua non nomino.
Ciao Uwe

Qui è spiegato benissimo perché ci vogliono i diodi.

avete ragione.

ora ho capito: i diodi sono necessari per forza :slight_smile:

grazie mille per le info

sollazzo:
innanzitutto grazie a tutti per le risposte.

stasera mi sono trovato col socio con cui voglio fare la scacchiera e abbiam tirato giù un paio di problematiche/soluzioni.

per quanto riguarda i vostri post:

lesto:
se il pezzo fosse solo uno, la cosa dovrebbe essere semplice, dovrebbe bastare leggere il cambio di tensione (anzi, di corrente sarebbe meglio) di tutti i PA e PB. Ma visto che i pezzi sono tanti, la cosa diventa quasi impossibile con quello schema (non so se matematicamente sia possibile). Se tutti i reed shift sono della stessa resistenza, analizzando la corrente e conoscendo a priori che si sposta una sola pedina, e lo stato iniziale delle pedine, analizzando la corrente dovresti farcela, anche se è molto complicato.

scusami ma non ho capito bene cosa intendi. per come l'ho intesa io (eliminando per il momento eventuali errori umani etc etc, quindi ipotizzando una situazione ideale, la situazione è questa:

  1. nello schema che ho postato le righe sono elettricamente separate dalle colonne, e i pin digitali delle righe sono di output, mentre quelli delle colonne di input.
  2. la matrice di partenza è la seguente

1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1

  1. per leggere la posizione attuale della scacchiera, due cicli for (le colonne sono i e le righe j)

for (int i = 0 ; i<8;i++) {
set pin i to high and set other pin to low;
// faccio passare corrente alla prima riga mentre le altre le setto a low
// rispetto allo schema che ho postato, non cè un unico bus a +5v sempre attivo, ma ogni riga è collegata ad un pin separato dagli altri (forse era qui che non mi ero spiegato bene)

for(int j = 0;j<8;j++) {
read status of pin j and save to matrix
// leggo lo stato di ogni casella di quella riga e la salvo in una nuova matrice.
// se c'è il pezzo, il magnete chiude il contatto e dovrei leggere 1 sul pin di input, mentre se non ce nessun pezzo leggo 0.
}
}

in questo modo penso che con 8 pin di output e 8 di input riesco a gestirmi tutta la scacchiera.

ipotizzando che abbia mosso una pedina, dopo la mossa ho per esempio questa matrice:

1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0
1 1 1 1 0 1 1 1
1 1 1 1 1 1 1 1

confronto questa matrice con quella precendete e scopro che c'è stato un cambiamento, che in pezzo di è mosso da e2 a e4 (coordinate della scacchiera). io a priori so che in e2 ci sta un pedone, e quindi so che in e4 ci è finito un pedone. poi questo come lo gestirò via software non lo so ancora che non ho ancora cominciato a smanettarci, ma credo che non sarà un problema troppo complicato in virtù della conoscenza iniziale delle varie posizioni dei pezzi.

Scusa, non sapevo come funziona questa griglia e son partito per la tangente, pensavo che sia righe che colonne fossero input. Per come l'ho pensata io (velocemente, eh, niente calcoli o schemi di supporto) in effetti lo schema dovrebbe essere modificato, specialmente le resistenze di pull-up dovrebbero avere diversi valori accuratamente scelti(forse numeri primi?). quando un reed si attiva, mette in collegamento la riga (che è a pull-up) con la colonna. Quindi se la pedina rimane sulla stessa riga, la tensione resta uguale, ma cambia per le 2 colonne (quella di partenza e quella di arrivo).
A questo punto è abbastanza semplice sapere dov'è il pezzo. Quando più pezzi stanno sulla scacchiera, invece diventa più complesso, perchè bisogna smontare la tensione letta considerando l'apporto di ogni resistenza. Ah i reed non devono essere un corto circuito, ma avere tutti la stessa resistenza.

Ora sto dando un'occhiata al link di astrobeed e mi rendo conto che la mia (se funziona) è una complicazione inutile...