Tocamos Tetris na tela eletromecânica



Um dia, olhando para anúncios no Avito, me deparei com uma coisa muito interessante - um quadro intermitente ou flip-dot em inglês. Esses monitores são usados ​​para exibir informações em aeroportos, estações de trem, estádios ou indicadores de rotas no transporte público.

Eu pensei que com esse tipo de tela você pode fazer muitas coisas interessantes.

Onde minha tela foi instalada, só podemos adivinhar a partir do restante da inscrição ("LOJA"). Talvez tenha sido um estande de informações na estação de trem ou no OT - escreva suas idéias nos comentários.

A tela era uma matriz de células medindo 7 linhas por 30 colunas. Cada célula continha uma placa redonda e rotativa de duas cores e um LED verde. A placa possuía um certo número de elementos lógicos da série 74HCxxx e outros microcircuitos, que, como se viu mais tarde, eram quase o suficiente para controlar a tela através de uma interface serial simples.

Após a compra, passei um pouco de tempo pesquisando informações sobre como trabalhar com essas telas, pois havia apenas a parte que exibe diretamente a imagem e, geralmente, há um controlador que pode controlar o teclado ou a porta UART com o software para PC. .

Não foi possível determinar a afiliação do fabricante pelas inscrições no quadro, mas talvez eu não tenha me esforçado muito, porque era mais interessante descobrir como ele funciona, desenhar um diagrama do dispositivo e desenvolver um módulo para interagir com um microcontrolador típico.

Mas primeiro, você tinha que definir uma meta específica, para a qual pode aplicar essa tela na vida cotidiana. A primeira idéia foi um relógio exibindo informações ampliadas sobre o clima na rua e em casa, hora, data, mensagens curtas de motivação;) etc. Então, pensei que, se você girar a tela 90 ° , parecerá um copo para Tetris, então foi decidido fazer Tetris, e então será visto.

Como funcionam as telas eletromecânicas?


Muito simples: cada célula da tela (caixa de seleção) consiste em um disco - um ímã plano e permanente pintado de amarelo de um lado e preto do outro, e um eletroímã localizado sob o disco. Ao aplicar um impulso elétrico à bobina do eletroímã, a bandeira vira e, mais importante, é fixada em uma posição. Ao alterar a direção da corrente e aplicar um pulso repetido, a bandeira é girada e fixada pelo outro lado. Para a comutação, basta um pulso com duração de 1 milissegundo e uma voltagem de 12 volts.
A resistência de uma bobina eletroímã é de aproximadamente 18 ohms.

Dispositivo de celular, Fonte: Eldi datasheet

Como o disco gira, fonte: Flip-Disc Display

Por conveniência, as bobinas através de dois diodos são combinadas em uma matriz de linhas e colunas. Para alternar para qualquer lugar da tela, é necessário ativar a fonte de corrente (fonte de corrente) na linha e o coletor de corrente (coletor de corrente) na linha na interseção da qual existe uma bobina de eletroímã ou, inversamente, para alternar para o outro lado. De fato, isso é semelhante ao controle de motores DC através de uma ponte H, apenas no modo pulsado.



Em como gerenciar bandeiras em teoria, descobrimos. É hora de avançar para a implementação prática.

Engenharia reversa de tela


Armado com um multímetro e Kicad, comecei a redesenhar o layout da tela, começando com o controle dos LEDs. Verificou-se que esta parte é auto-suficiente e, ao aplicar sinais de energia e controle, você pode acender qualquer LED em qualquer linha da tela por meio de uma interface bastante simples. Somente uma linha pode estar ativa a qualquer momento, portanto a saída da imagem deve ser dinâmica.



O circuito do módulo consiste em uma matriz de LEDs cujos catodos estão conectados aos drivers de LED Toshiba TB62705. Do ponto de vista da lógica de controle, esses são registros de deslocamento de 8 bits comuns conectados em uma cadeia. Os ânodos dos LEDs em cada linha são conectados e conectados aos drenos dos transistores MOSFET. As fontes são conectadas à saída do conversor DC-DC e as portas de todos os 7 transistores são conectadas às saídas do decodificador 3: 8 74HC238.

Portanto, para controlar os LEDs, é necessário selecionar a linha da tela enviando seu número à entrada do decodificador e carregar 32 bits de dados através das entradas SERIAL e CLOCK do primeiro driver de LED. Em seguida, arquive o log. “1” na entrada LATCH, e os LEDs correspondentes acendem enquanto mantém o LATCH na posição “1”.

Para piscar os LEDs, usei a placa Teensy 3.5 compatível com arduino integrada . Um exemplo de código de controle de LED pode ser encontrado no GitHub


A segunda parte do esquema, responsável pelo gerenciamento de antolhos, é um pouco mais complicada.


A parte de potência do controle do alto-falante consiste em um par de circuitos de fonte / coletor de corrente, cujas saídas são conectadas por diodos de proteção à primeira saída de cada bobina da coluna. O chip Toshiba TBD62783 foi usado como fonte atual e o ULN2803 favorito da TI foi usado como dreno. As segundas conclusões das bobinas são combinadas em linhas e conectadas ao conector na placa de tela. Aparentemente, isso foi feito para remover o gerenciamento de strings em um módulo separado, pois várias telas podem ser combinadas em uma única tela longa. No entanto, não está claro por que os desenvolvedores colocaram todos os componentes necessários em cada placa de tela para controlar os LEDs.

A lógica consiste em oito decodificadores 3: 8 74HC238, cujas entradas de controle são conectadas em paralelo. As saídas dos decodificadores pares são conectadas às entradas de controle das fontes de corrente, e as ímpares são conectadas às entradas dos drenos. As entradas permissivas do 74HC238 são conectadas a outro decodificador 3: 8, o que elimina completamente a situação em que a fonte de corrente e os circuitos de corrente estão ativos ao mesmo tempo. A entrada de habilitação do decodificador comum é conectada ao chip do comparador e é ativada apenas quando os valores em sua entrada correspondem. Essa parte do diagrama provavelmente também é responsável pela combinação de vários módulos em uma tela grande.

Portanto, para selecionar uma coluna específica, é necessário enviar seu número (0-7) no grupo ao barramento COL_A0-A2 e, em seguida, ativar as saídas do 74HC238 específico, fornecendo seu número às entradas COL_EN_A0-A2 do decodificador comum. Além disso, a entrada A0 pode ser usada como um indicador de fonte / coletor e os 2 bits restantes - como um número de grupo (0-3).

A lógica de controle e as entradas de energia são roteadas para dois conectores IDC de 50 pinos. A fiação de um deles é mostrada no diagrama.



Depois de analisar o circuito, percebi que piscar as bandeiras sem a ajuda de Kicad e um ferro de soldar não funcionava e comecei a criar um módulo para seleção de cordas e emparelhamento.

Módulo adaptador e gerenciamento de cadeias




Para simplificar o projeto, decidi repetir a implementação da seleção de colunas e colocada no circuito TBD62783 e ULN2803 emparelhado com os decodificadores 74HC238 para selecionar a linha desejada, além de um chip lógico 74HC00 (4xNAND) para separar claramente os modos SET, RESET e PULSE, que ativam diretamente a fonte de tensão ao eletroímã selecionado. Para salvar as conclusões do microcontrolador, foi decidido conectar os sinais de seleção de linha e coluna às saídas de um registrador de deslocamento.

Como resultado, para gerenciar o sinalizador, você precisa:

  1. envia e corrige suas coordenadas no código serial via SERIAL / CLOCK / LATCH
  2. selecione o estado SET / RESET desejado
  3. ativar brevemente PULSO

Decodificação do byte de coordenadas:



A primeira versão do circuito sem registro de turno foi montada em uma tábua de pão sem solda. Depois de verificar e um pouco de emoção de que tudo vai queimar, liguei a alimentação e manualmente toquei um pulso de PULSO pressionando rapidamente um botão. A corrente que flui através da bobina do eletroímã foi limitada apenas a uma fonte de energia de laboratório. A caixa de seleção foi trocada com sucesso e, ao alterar o nível SET / RESET, retornou. “Isso é sucesso”, pensei, e comecei a transferir o circuito para uma placa de ensaio normal, usando meu MGTF-0.07 favorito e um fio kynar de núcleo único para barramentos de força / terra.

Para conectar-se à tela através do conector de 50 pinos na placa, era necessário usar 22 contatos + energia, para que eu não quisesse mexer na fiação individual. Foi sugerido o uso de um cabo plano, para IDE ou, em vez disso, para dispositivos SCSI antigos.

Um pouco de pesquisa no Google me levou a uma ferramenta especial para prensar conectores IDC, que foi decidida comprar imediatamente: Crimper ProsKit 6PK-214 para conectores IDC . Tendo treinado em pequenos conectores, a primeira vez que fiz um loop de 20 centímetros com conectores IDC-50F nas extremidades.

Nós escrevemos um programa de controle


Como mencionei acima, o TEENSY 3.5 foi usado como controlador de controle, cujo ambiente de desenvolvimento é o IDE do Arduino, portanto o programa foi escrito no dialeto C. do arduino.

A principal função de alterar o estado de um ponto da tela
void update_dot(bool state, byte row, byte col) { byte cmd=0; // set 7-5 cmd bits to row 2-0 bits cmd=(row&B111)<<5; // set 4-0 cmd bits to col 4-0 bits cmd=cmd|(col&B11111); // write to Register digitalWriteFast(DOT_LATCH,LOW); for (byte i=0;i<8;i++) { byte onebit=bitRead(cmd,7-i); digitalWriteFast(DOT_CLOCK,LOW); digitalWriteFast(DOT_SERIAL_DATA,onebit); digitalWriteFast(DOT_CLOCK,HIGH); } digitalWriteFast(DOT_LATCH,HIGH); delayMicroseconds(10); digitalWriteFast(DOT_LATCH,LOW); // set set/reset pin if (state) { digitalWriteFast(DOT_SET_RESET,HIGH); } else { digitalWriteFast(DOT_SET_RESET,LOW); } // pulse digitalWriteFast(DOT_PULSE,HIGH); delay(1); digitalWriteFast(DOT_PULSE,LOW); } 

Realizei várias experiências para determinar a tensão ideal da fonte de energia e o tempo de alimentação do pulso. Verificou-se que 12V e 1ms são suficientes para uma fixação estável da bandeira em uma das posições.

Após o teste ser preenchido com uma cor, notei que um "pixel" está quebrado e não gira. A medição da resistência da bobina com um multímetro mostrou vários megaohms, e um exame detalhado revelou que uma conclusão saiu. Foi muita sorte que o "pixel" que não funcionava era da borda da tela, então consegui soldar o fio. O problema foi resolvido.

Foto da célula reparada

Eis o que aconteceu após as primeiras experiências com preenchimentos e saída de texto:


Tetris


Escrever uma implementação do Tetris em C foi mais fácil do que eu pensava. Obrigado a Javier López e seu tutorial Tetris tutorial em C ++ para iniciantes . Reescrevi as principais funções como as entendi e adaptei o código aos recursos da minha tela (falta de bordas e baixa resolução). Não vou aborrecer os detalhes do trabalho, o manual descreve tudo em detalhes.

Para controle, foi utilizado um módulo analógico de joystick, então tive que escrever uma função para converter os valores na saída ADC em constantes digitais. Houve uma dificuldade em ordem, por um lado, para evitar falsos positivos e, por outro lado, para garantir a jogabilidade correta. Se a posição do joystick não mudar após a próxima leitura do estado, será adicionado um atraso.

Depois de jogar por cerca de 10 minutos, percebi que estava entediado, porque a velocidade das formas que caem não muda e a pontuação não é exibida. Não há elemento de competição.

A exibição de uma conta com sinalizadores era feia devido à falta de espaço na tela, por isso foi decidido usar LEDs para criar um plano alternativo para exibir informações. Encontrei na Internet uma representação em bits da fonte 3x5 para números de 0 a 9 e escrevi uma função para exibir a pontuação pelo número de linhas removidas. Para maior beleza, decidi adicionar o piscar da linha preenchida quando ela desaparecer.

A natureza dinâmica da tela levou a ideia a chamar a função de atualização da parte do LED da tela em uma interrupção do timer. A frequência de interrupção e o tempo de espera da sequência de LEDs no estado ativo determinam o brilho do brilho.

Eu também fiz isso para que a velocidade de queda dos números do tetramino aumente à medida que as linhas são limpas. Na primeira versão, os números foram deslocados uma linha abaixo a cada 200 ms. Se você tirar esse número de 40 ms a cada 10 linhas excluídas, o ritmo do jogo é bastante acelerado e há interesse. Meu recorde é de 38 linhas!

Esse raro caso em que o vídeo vertical se encaixa perfeitamente.


O código do projeto , o layout da tela e o módulo de interface são publicados no GitHub.

Se você tem alguma idéia do que mais pode fazer com essa tela, escreva nos comentários.

Links úteis:

1. Hackaday: Tela Flip-Dot e Controlador DIY .
2. Tutorial do Tetris na plataforma C ++ independente, focado na lógica do jogo para iniciantes .
3. Repositório do projeto no GitHub .

Source: https://habr.com/ru/post/pt447472/


All Articles