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:
- 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.
- 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
- 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.