Fazendo um tabuleiro de xadrez eletrônico


14

Quero fazer um tabuleiro de xadrez de madeira com o qual você possa brincar com peças regulares (ou seja, peças não modificadas que usam códigos RFID, ímãs, etc.), mas que esteja conectado a um software que observe os meus movimentos e atue como o segundo jogador.

Eu tenho pensado em como detectar peças no quadro e tomei as decisões que não preciso para reconhecer qual peça é onde: A "verdade" está no software, portanto, se eu mover uma peça de A para B , o software pode descobrir qual peça foi movida.

Então, tive a ideia de fazer dois furos em cada campo do tabuleiro de xadrez, um no centro e outro no canto superior direito:

  • O do centro será usado para um sensor de brilho para detectar se uma peça está em pé no campo ou não.
  • O do canto será usado para um LED mostrar qual peça o usuário deve mover para o computador, para que a situação do mundo real corresponda à situação do software novamente.

Quero usar um Raspberry Pi como base de hardware para a execução do software, que será escrita no Node.js (mas isso não deve ser importante para esta pergunta).

Então, acabo com 64 sensores de brilho e 64 LEDs, que preciso abordar individualmente. Em outras palavras: preciso de 64 saídas e 64 entradas. E é claro que isso é algo que um Raspberry Pi não suporta de imediato - e acho que deve haver uma maneira melhor do que ter 128 portas de E / S.

Como acho que detectar o estado da placa é a tarefa mais importante, comecei a pesquisar na Web como lidar com uma matriz de switches 8x8. Eu achei a sugestão de usar um microcontrolador que varre as colunas da placa sequencialmente, e em cada coluna detecta se uma linha (= um campo) é usada ou não.

Isso reduziria a complexidade para ter 8 saídas e 8 entradas (para poder ler o estado da placa).

Sobre isso, tenho algumas perguntas:

  1. Meus pensamentos estão corretos, ou seja, essa é a abordagem correta ou existe uma alternativa melhor que eu deveria prestar atenção?
  2. Como não tenho experiência com microcontroladores, o que preciso procurar? Eu só preciso de um microcontrolador com 16 pinos, programável em um idioma que eu possa escrever ou…?
  3. Alguém criou esse quadro e tem algum conselho ou conhece um tutorial que o orienta no processo?

1
Você tem a ideia certa. No entanto, será necessário um pouco de refinamento na aplicação de detecção. Dependendo do tamanho e peso das peças, você pode usar um esquema de detecção de bloqueio de luz ou botão tátil. A verdadeira questão aqui é como você vai dizer que peça é o quê. Provavelmente vai precisar de peças personalizadas também. Talvez coloque uma etiqueta RFID em cada um e, em seguida, cada quadrado tenha um scanner RFID? Excesso, mas um pensamento.
mcmiln

1
O roteamento de varredura de matriz que você descreve não será capaz de lidar com 4 partes em 2 linhas e 2 colunas. Observe os decodificadores de 3 a 8 linhas (74138) e extrapole para 5-64
Icy

2
A formação inicial das peças é sempre a mesma; portanto, o software sabe qual peça é onde. Se você mover uma peça de A para B, o software saberá qual peça foi movida para onde. Obviamente, isso não permite iniciar com escalações arbitrárias, mas você também pode configurar o software manualmente.
precisa

1
Isso parece ... pesado. Eu teria seguido um método de vídeo de software. OpenCV e uma câmera. E um projetor.
Transeunte

2
esta guia pode ser útil na medida em que a organização do sensor de detecção /
user2813274

Respostas:


5

Como uma imagem vale mais que mil palavras, eis um exemplo do LDM-24488NI : uma matriz de 64 led

insira a descrição da imagem aqui

Para sua aplicação, você precisará de uma matriz para LEDs e outra para sensores, exigindo um total de 32 pinos de E / S. Como o seu RPi não possui muitos, você precisará usar o demux 1 a 8 para selecionar linhas e colunas individuais:

insira a descrição da imagem aqui

Para LEDs, você pode usar desmultiplexadores para linhas e colunas, pois você só precisa de um led por vez. Para sensores, eu recomendo usar um desmuxão para linhas e linhas individuais para colunas, para poder detectar vários sensores ativos em uma linha. Isso elevará a contagem de pinos necessária para 17 pinos, com os quais um RPi pode lidar.


12

Sim, a multiplexação conforme você descreve é ​​uma maneira comum de lidar com matrizes de coisas.

A parte mais complicada será lidar com a natureza analógica dos sensores de luz. Os LDRs CdS (resistores dependentes da luz) são provavelmente os melhores nesse caso, porque são sensíveis, baratos e produzem uma grande resposta facilmente mensurável na faixa de luminosidade humana. Eletricamente, eles são resistores, com a resistência diminuindo em luz mais brilhante.

Isso simplificaria a multiplexação se você usar um micro com 8 entradas analógicas. Isso significa que metade do seu mux está embutido no micro. Você ativa uma linha de LDR e lê os sinais de 8 colunas diretamente com o micro, por exemplo.

A digitalização sequencial de 64 entradas analógicas pode ser facilmente realizada instantaneamente em termos humanos com micros comuns. Digamos que você possa fazer uma nova leitura a cada 100 µs. Isso é "longo", mesmo para micros pequenos e baratos. Isso significa que toda a placa seria digitalizada a cada 6,4 ms, muito mais rápido do que você pode perceber um atraso.

A multiplexação dos LEDs é ainda mais fácil, pois tudo é feito com saídas digitais. Muitos micros possuem bem mais de 16 saídas digitais, então isso não é problema. Há outras coisas que terão que acontecer, e você usará os pinos mais rapidamente do que o esperado agora, mas um micro de 64 pinos deve ser realmente bom o suficiente, se não um de 44 pinos.

Provavelmente dedicaria um micro apenas para lidar com a E / S da placa. Isso é otimizado para ter pinos de E / S suficientes, entradas A / D e similares. Em seguida, ele faz interface com o mecanismo de computação principal via UART. O protocolo teria a aparência de "iluminar o quadrado 3,2" ou "peça removida do quadrado 5,4". Isso também permite uma interface de hardware totalmente diferente no futuro, desde que o protocolo seja o mesmo.


7

Para os LEDs , a maneira óbvia de fazer isso é ter uma saída para cada linha e cada coluna do tabuleiro de xadrez: um total de 8 + 8 = 16 pinos. Os anodos seriam conectados aos fios da linha e os catodos ao fio da coluna. Para o LED que você deseja acender, você tornaria o fio do ânodo positivo (lógica 1) e o fio do cátodo negativo (lógica 0), mantendo os outros no estado reverso (para que os demais LEDs tenham polarização neutra ou reversa).

Estou assumindo aqui que o microcontolador fornece voltagens suficientemente altas / baixas para que você possa conectar um LED de um para outro. Se não for esse o caso, você precisará de um transistor ou buffer para cada linha. Com a alimentação de 5V, é apertado, considerando que o LED cai cerca de 2V e você deseja uma queda de tensão razoável em relação ao seu resistor limitador de corrente (observe que você só precisa instalá-los nas linhas de linha ou nas linhas de coluna, não em ambas).

Se suas saídas forem tri-state (ou seja, além da lógica 0 e lógica 1, elas podem ser definidas para um estado de alta impedância, talvez configurando-as temporariamente como entradas), você poderá ficar esperto e usar uma grade 4x8, com LEDs. conectados em pares antiparalelos. É importante definir saídas não utilizadas com alta impedância nesta configuração, caso contrário, os LEDs indesejados acenderão.

Em qualquer um dos casos, você terá que pensar no desenho atual e se é aceitável arriscar a possibilidade de um erro de software acender todos os LEDs em uma fileira ao mesmo tempo (que, se não for considerada, pode sobrecorrente dessa linha do microcontrolador .)


O caso dos sensores é mais complicado. Eu vou assumir que você usa sensores resistivos, embora os fototransistores não sejam necessariamente garantidos para conduzir em apenas uma direção.

Você pode usar as mesmas saídas de 8 linhas usadas para iluminar seus LEDs, mas precisará de 8 entradas de coluna dedicadas à detecção. Você, sem dúvida, já viu circuitos para teclados como este. Lembre-se de que eles foram projetados apenas para pressionar uma tecla de cada vez . Se o usuário pressionar 1,3,7 e 9 juntos, o teclado não poderá detectar se o usuário libera alguma dessas quatro teclas, porque ainda existe um caminho atual pelos outros três comutadores.

Uma solução usada em teclados musicais (projetados para ter mais de um elemento da matriz conduzindo por vez) é ter um diodo em série com cada comutador.

Outra solução seria comprar quatro CIs decodificadores de 4 a 16 com saídas de coletor aberto (ou dreno aberto se estiver usando ICs MOSFET) como este: http://www.unicornelectronics.com/ftp/Data%20Sheets/74159.pdf Coletor aberto significa que as saídas do IC apenas afundam a corrente, não a fonte. Assim, você pode conectar 16 sensores a 16 saídas do chip, e as outras extremidades comuns, juntamente com um resistor de pullup (você conectaria seu ADC aqui também). Você reduz uma saída (condução) e as outras 15 permanecem altas (não condutivas). Isso contrasta com a saída lógica padrão, onde as outras 15 saídas estariam despejando corrente no ponto comum.

A entrada para esses ICs é binária de 4 bits para selecionar uma das 16 saídas, mas eles também têm uma entrada extra para ativar / desativar o chip. Assim, você poderia ter um conjunto de 64 coletores de coletores abertos, conectados a 64 sensores, com as outras extremidades dos sensores comuns a um único resistor de pullup e conversor de analógico para digital. Você precisaria de um total de 8 saídas no seu microcontrolador para isso: quatro para receber os sinais de seleção de 4 a 16 (comuns a todos os quatro chips) e quatro para receber os sinais de ativação (um para cada chip).

EDIT: 3 a 8 decodificadores (também chamados de 1 de 8 = 1 linha de 8) parecem estar mais disponíveis que 4 a 16, mas 8 ICs são muito mais confusos que 4. Outro tipo de IC que pode ser útil é o contador octal (e seu primo mais comum, o contador de décadas , que pode ser configurado como um contador octal conectando sua nona saída à linha de redefinição.) Isso requer que um pulso serial avance de uma saída para a próxima, portanto, seria necessário menos Pinos de E / S no microcontrolador que os CIs do decodificador. Eles normalmente têm entradas adicionais para redefinir e ativar. Existem também os chamados registradores de deslocamento de IC , disponíveis em dois tipos: um para converter séries em paralelo e outro para converter paralelos em séries. Finalmente, existembuffers , que você pode colocar entre o Rasberry Pi e o tabuleiro de xadrez para que o Pi não seja destruído em caso de sobrecorrente. Tudo isso pode ser útil em circuitos de multiplexação.


1
Você mencionou os registros de turno - eles também poderiam ser usados ​​para as saídas de LED. Outro contador, além de um registrador de turno de 8 bits que pode tristar, pode conduzir toda a matriz com pouco mais de dois ou três pinos, se eles forem rápidos o suficiente para evitar oscilações visíveis.
Hbbs

@ Hobbs Não acho que a cintilação seja um problema, pois o OP só quer acender um ou dois LEDs ao mesmo tempo. Mesmo o tristate não é realmente necessário se você tiver apenas um registro de contador / turno de década / octal / inverso para acionar os LEDs. 3 pinos é perfeitamente possível: redefinição comum, avanço da coluna, avanço da linha. Esse pode ser o caminho a seguir - guarde todos os outros pinos para o problema mais difícil dos sensores.
Level River St

Para os LEDs, o driver de LED MAX7219 / 7221 também pode ser usado. Isso reduzirá o número de entradas para três horas, dados e trava.
Jnovacho

4

A multiplexação é de fato uma prática comum.

Existem algumas maneiras de aproveitar melhor seus pinos de framboesa pi

Uma é usar um chip para fazer parte do trabalho pesado para você. Por exemplo, se você tiver 8 entradas e 8 saídas para ler o estado da placa, poderá usar um contador para aumentar as 8 entradas uma por vez. Você precisará de 2 pinos no Arduino para isso - um para redefinir para o primeiro e outro para "ir para a próxima linha". Você acabou de salvar 6 pinos!

Salvar 6 pinos pode não ser suficiente - vamos ver para onde podemos ir daqui: Se você reorganizar sua grade 8x8 em uma grade 16x4, poderá usar algo como http://www.instructables.com/id/16-Stage -Decade-Counter-Chain-Using-two-4017-Chi /? ALLSTEPS (ignore a metade superior, as duas linhas que descem de cima para baixo são sua "redefinição", vindo da parte superior esquerda e a " vá para a próxima linha ", chamada CLK, para relógio, aqui). Agora você pode contar os 8 na metade esquerda do tabuleiro, seguidos pelos 8 na metade direita do tabuleiro; conecte as colunas A e E, B e F, C e G e D e H juntas.

Parabéns, agora você tem dois pinos de saída (redefinição e relógio) e quatro pinos de entrada, para um total de 6 - economizando 10 pinos! Observe que o raspberry pi não possui conversores analógicos para digitais, portanto, você precisará de um trabalho extra para isso.

Agora para os LEDs. Você já possui uma fonte de alimentação controlada (os dois contadores de dez décadas) - vamos reutilizá-los. Coloque os 64 LEDs dos 16 pinos de alimentação, através de um resistor (cada LED DEVE ter seu próprio resistor!), Para outros 4 trilhos (mesmo layout acima: AE, BF, CG e DH). Conecte esses 4 trilhos à via 4 transistores e 4 pinos e coloque todos os pinos em "alto" - como os dois lados do LED estão agora em 5 volts, os LEDs estarão apagados. Então, quando quiser acender um LED, verifique se as duas décadas estão na posição correta (como se estivesse lendo o sensor naquele quadrado), ajuste um dos quatro trilhos para baixo. A corrente agora deve fluir do "alto" do contador da década para o "baixo" naquele trilho específico. Ei presto, a luz acende! Aguarde um pouco e desligue-o antes de alterar o contador de décadas novamente.

Se você deseja mais controle, pode usar algo como um chip TLC5940 - http://playground.arduino.cc/Learning/TLC5940 - cada chip pode definir 16 LEDs (então você precisará de 4 deles) para um nível de brilho de 0 (desligado) a 1024 (totalmente ligado), para que você possa apagar e apagar LEDs individuais, com ótimo controle. A partir da memória, eles precisam de cerca de 4 pinos e podem ser encadeados, portanto, 4 pinos digitais (um dos quais deve ser PWM - estes têm o símbolo "~" ao lado do pino) controlarão qualquer número de LEDs.

Boa sorte!


É RPi, não Arduino.
Dmitry Grigoryev

Minhas desculpas, você está certo. Quase tudo o que eu disse ainda se aplica, então eu fiz algumas edições menores, para torná-lo trabalho
AMADANON Inc.

0

Eu não acho que você precisará de um LED no canto superior direito. Um sensor no meio, como você mencionou, seria suficiente. A parte complicada será o código para o tabuleiro de xadrez. Imagine que você tem um tabuleiro de xadrez. A linha será indicada como 'alfabeto' e a coluna indicada como 'número'.

Então, primeiro você precisa de um programa para programar o tipo de peça na posição inicial. Mais tarde, quando você mover suas peças, o código gerará a localização inicial da peça para a localização final. Isso reduzirá sua contribuição pela metade.


5
Talvez eu não tenha explicado bem… os LEDs não são para leitura no estado atual, são para mostrar qual movimento o computador deseja fazer. Então, o usuário faz o movimento: os sensores de brilho dizem ao software o que os usados ​​fizeram. O software calcula seu próximo passo e pisca dois LEDs, o usuário move a peça e, então, é a vez do humano novamente.
precisa
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.