Jugamos Tetris en la pantalla electromec谩nica.



Un d铆a, al mirar los anuncios en Avito, me encontr茅 con algo muy interesante: un tablero intermitente o una pantalla de flip-dot en ingl茅s. Dichas pantallas se utilizan para mostrar informaci贸n en aeropuertos, estaciones de tren, estadios o indicadores de ruta en el transporte p煤blico.

Pens茅 que con este tipo de pantalla puedes hacer muchas cosas interesantes.

Donde se instal贸 mi pantalla, uno solo puede adivinar el resto de la inscripci贸n ("STORE"). Tal vez fue un puesto de informaci贸n en la estaci贸n de tren o en la parada OT: escriba sus ideas en los comentarios.

La pantalla era una matriz de celdas que med铆a 7 filas por 30 columnas. Cada celda conten铆a una placa redonda, giratoria de dos colores y un LED verde. La placa ten铆a una cierta cantidad de elementos l贸gicos de la serie 74HCxxx y otros microcircuitos, lo que result贸 ser casi suficiente para controlar la pantalla a trav茅s de una interfaz serial simple.

Despu茅s de la compra, pas茅 un poco de tiempo buscando informaci贸n sobre c贸mo trabajar con dichas pantallas, dado que solo ten铆a la parte que muestra directamente la imagen, y generalmente tambi茅n hay un controlador que puede controlar el teclado o el puerto UART con el software de PC .

No fue posible determinar la afiliaci贸n del fabricante mediante las inscripciones en el tablero, pero tal vez no lo intent茅 mucho, porque fue m谩s interesante descubrir c贸mo funciona, dibujar un diagrama del dispositivo y desarrollar un m贸dulo para interactuar con un microcontrolador t铆pico.

Pero primero, ten铆a que establecerse un objetivo espec铆fico, para el cual puede aplicar esta pantalla en la vida cotidiana. La primera idea era un reloj que mostraba informaci贸n extendida sobre el clima en la calle y en el hogar, hora, fecha, mensajes cortos de motivaci贸n;), etc. Luego pens茅 que si gira la pantalla 90 , se parece a un vidrio para Tetris, as铆 que se decidi贸 hacer Tetris, y luego se ver谩.

驴C贸mo funcionan las pantallas electromec谩nicas?


Muy simple: cada celda de la pantalla (casilla de verificaci贸n) consta de un disco: un im谩n permanente plano pintado de amarillo en un lado y negro en el otro, y un electroim谩n ubicado debajo del disco. Al aplicar un impulso el茅ctrico a la bobina del electroim谩n, la bandera se voltea y, lo que es m谩s importante, se fija en una posici贸n. Al cambiar la direcci贸n de la corriente y aplicar un pulso repetido, la bandera se gira y se fija por el otro lado. Para la conmutaci贸n, un pulso con una duraci贸n de 1 milisegundo y un voltaje de 12 voltios es suficiente.
La resistencia de una bobina de electroim谩n es de aproximadamente 18 ohmios.

Dispositivo celular, Fuente: hoja de datos de Eldi

C贸mo gira el disco, fuente: Pantalla Flip-Disc

Por conveniencia, las bobinas a trav茅s de dos diodos se combinan en una matriz de filas y columnas. Para cambiar a cualquier lugar de la pantalla, debe activar la fuente actual (fuente actual) en la l铆nea y el sumidero actual (sumidero actual) en la fila, en la intersecci贸n de la cual hay una bobina de electroim谩n o, por el contrario, cambiar al otro lado. De hecho, esto es similar a controlar motores de CC a trav茅s de un puente H, solo en modo pulsado.



Con c贸mo gestionar las banderas en teor铆a, lo descubrimos. Es hora de pasar a la implementaci贸n pr谩ctica.

Ingenier铆a inversa de pantalla


Armado con un mult铆metro y Kicad, comenc茅 a volver a dibujar el dise帽o de la pantalla, comenzando por controlar los LED. Result贸 que esta parte es autosuficiente, y al aplicar se帽ales de alimentaci贸n y control, puede encender cualquier LED en cualquier fila de la pantalla a trav茅s de una interfaz bastante simple. Solo una l铆nea puede estar activa en cualquier momento, por lo que la salida de la imagen debe ser din谩mica.



El circuito del m贸dulo consiste en una matriz de LED cuyos c谩todos est谩n conectados a los controladores de LED Toshiba TB62705. Desde el punto de vista de la l贸gica de control, estos son registros de desplazamiento de 8 bits ordinarios conectados en una cadena. Los 谩nodos de los LED en cada fila est谩n conectados y conectados a los drenajes de los transistores MOSFET. Las fuentes est谩n conectadas a la salida del convertidor DC-DC, y las puertas de los 7 transistores est谩n conectadas a las salidas del decodificador 3: 8 74HC238.

Por lo tanto, para controlar los LED, debe seleccionar la l铆nea de pantalla enviando su n煤mero a la entrada del decodificador, luego cargar 32 bits de datos a trav茅s de las entradas SERIAL y CLOCK del primer controlador LED. Luego presente el registro. "1" a la entrada LATCH, y los LED correspondientes se iluminan mientras se mantiene el LATCH en "1".

Para parpadear los LED, utilic茅 la placa Teensy 3.5 compatible con Arduino . Un ejemplo de c贸digo de control LED se puede encontrar en GitHub


La segunda parte del esquema, responsable de gestionar las luces intermitentes, es un poco m谩s complicada.


La parte de potencia del control del altavoz consiste en un par de circuitos de fuente / sumidero de corriente, cuyas salidas est谩n conectadas a trav茅s de diodos protectores a la primera salida de cada bobina en la columna. El chip Toshiba TBD62783 se us贸 como fuente de corriente, y el ULN2803 favorito de TI se us贸 como drenaje. Las segundas conclusiones de las bobinas se combinan en filas y se conectan al conector de la placa de pantalla. Aparentemente, esto se hizo para eliminar la gesti贸n de cadenas en un m贸dulo separado, ya que varias pantallas se pueden combinar en una pantalla larga. Sin embargo, no est谩 claro por qu茅 los desarrolladores colocaron todos los componentes necesarios en cada placa de pantalla para controlar los LED.

La l贸gica consta de ocho decodificadores 3: 8 74HC238, cuyas entradas de control est谩n conectadas en paralelo. Las salidas de los decodificadores pares est谩n conectadas a las entradas de control de las fuentes de corriente, y las impares est谩n conectadas a las entradas de los desag眉es. Las entradas permisivas del 74HC238 est谩n conectadas a otro decodificador 3: 8, lo que elimina por completo la situaci贸n cuando la fuente de corriente y los circuitos de corriente est谩n activos al mismo tiempo. La entrada de habilitaci贸n del decodificador com煤n est谩 conectada al chip comparador y se activa solo cuando los valores en su entrada coinciden. Es probable que esta parte del diagrama tambi茅n sea responsable de combinar varios m贸dulos en una pantalla grande.

Por lo tanto, para seleccionar una columna espec铆fica, debe enviar su n煤mero (0-7) en el grupo al bus COL_A0-A2, y luego activar las salidas del 74HC238 espec铆fico suministrando su n煤mero a las entradas COL_EN_A0-A2 del decodificador com煤n. Adem谩s, la entrada A0 se puede usar como un indicador de fuente / sumidero, y los 2 bits restantes, como un n煤mero de grupo (0-3).

La l贸gica de control y las entradas de alimentaci贸n se enrutan a dos conectores IDC de 50 pines. El cableado de uno de ellos se muestra en el diagrama.



Despu茅s de analizar el circuito, me di cuenta de que parpadear las banderas sin la ayuda de Kicad y un soldador no funcionaba y proced铆 a crear un m贸dulo para seleccionar cadenas y emparejar.

M贸dulo adaptador y gesti贸n de cadenas




Para simplificar el dise帽o, decid铆 repetir la implementaci贸n de la selecci贸n de columna y colocarlo en el circuito TBD62783 y ULN2803 emparejado con decodificadores 74HC238 para seleccionar la l铆nea deseada, as铆 como un chip l贸gico 74HC00 (4xNAND) para separar claramente los modos SET, RESET y PULSE, que activan directamente el suministro de voltaje al electroim谩n seleccionado. Para guardar las conclusiones del microcontrolador, se decidi贸 conectar las se帽ales de selecci贸n de fila y columna a las salidas de un registro de desplazamiento.

Como resultado, para administrar la bandera que necesita:

  1. env铆e y arregle sus coordenadas en c贸digo de serie a trav茅s de SERIAL / CLOCK / LATCH
  2. seleccione el estado SET / RESET deseado
  3. activar brevemente PULSE

Decodificaci贸n del byte de coordenadas:



La primera versi贸n del circuito sin un registro de desplazamiento se ensambl贸 en una placa de prueba sin soldadura. Despu茅s de comprobar y un poco de emoci贸n de que todo arder铆a, encend铆 la alimentaci贸n y puls茅 manualmente un pulso de PULSO presionando r谩pidamente un bot贸n. La corriente que flu铆a a trav茅s de la bobina del electroim谩n se limitaba por si acaso a una fuente de alimentaci贸n de laboratorio. La casilla de verificaci贸n cambi贸 con 茅xito, y al cambiar el nivel SET / RESET, volvi贸 a cambiar. "Esto es un 茅xito", pens茅, y comenc茅 a transferir el circuito a una placa de pruebas normal usando mi MGTF-0.07 favorito y un cable kynar de un solo n煤cleo para autobuses de alimentaci贸n / tierra.

Para conectarme a la pantalla a trav茅s del conector de 50 pines en la placa, era necesario usar 22 contactos + alimentaci贸n, por lo que no quer铆a meterme con el cableado individual. Se sugiri贸 el uso de un cable plano, para IDE o, m谩s bien, dispositivos SCSI antiguos.

Una peque帽a b煤squeda en Google me llev贸 a una herramienta especial para prensar conectores IDC, que se decidi贸 comprar de inmediato: Crimper ProsKit 6PK-214 para conectores IDC . Habiendo entrenado en conectores peque帽os, la primera vez que hice un bucle de 20 cent铆metros con conectores IDC-50F en los extremos.

Escribimos un programa de control


Como mencion茅 anteriormente, TEENSY 3.5 se utiliz贸 como controlador de control, cuyo entorno de desarrollo es el IDE Arduino, por lo que el programa se escribi贸 en el dialecto arduino C.

La funci贸n principal de cambiar el estado de un punto de pantalla
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); } 

Realic茅 varios experimentos para determinar el voltaje 贸ptimo de la fuente de energ铆a y el tiempo de alimentaci贸n del pulso. Result贸 que 12V y 1ms son suficientes para una fijaci贸n estable de la bandera en una de las posiciones.

Despu茅s de que la prueba se llena con un color, not茅 que un "p铆xel" est谩 roto y no se voltea. La medici贸n de la resistencia de la bobina con un mult铆metro mostr贸 varios megaohmios, y un examen detallado revel贸 que surgi贸 una conclusi贸n. Fue muy afortunado que el "p铆xel" que no funcionaba fuera del borde de la pantalla, as铆 que logr茅 soldar el cable. El problema ha sido resuelto.

Foto de la celda reparada

Esto es lo que sucedi贸 despu茅s de los primeros experimentos con rellenos y salida de texto:


Tetris


Escribir una implementaci贸n de Tetris en C fue m谩s f谩cil de lo que pensaba. Gracias a Javier L贸pez y su tutorial Tetris tutorial en C ++ para principiantes . Reescrib铆 las funciones principales tal como las entend铆, y adapt茅 el c贸digo a las caracter铆sticas de mi pantalla (falta de bordes y baja resoluci贸n). No voy a aburrir los detalles del trabajo, el manual describe todo en detalle.

Para el control, se utiliz贸 un m贸dulo de joystick anal贸gico, por lo que tuve que escribir una funci贸n para convertir los valores en la salida ADC a constantes digitales. Hubo una dificultad en el orden, por un lado, para evitar falsos positivos, y por otro, para garantizar la jugabilidad correcta. Si la posici贸n del joystick no cambia despu茅s de la siguiente lectura del estado, se agrega un retraso.

Despu茅s de jugar durante unos 10 minutos, me di cuenta de que estaba aburrido, porque la velocidad de la ca铆da de las formas no cambia y la puntuaci贸n no se muestra en absoluto. No hay elemento de competencia.

Mostrar una cuenta con banderas era feo debido a la falta de espacio en la pantalla, por lo que se decidi贸 usar LED para crear un plano alternativo para mostrar informaci贸n. Encontr茅 en Internet una peque帽a representaci贸n de la fuente 3x5 para n煤meros del 0 al 9 y escrib铆 una funci贸n para mostrar la puntuaci贸n por el n煤mero de l铆neas eliminadas. Para mayor belleza, decid铆 agregar el parpadeo de la l铆nea llena cuando desaparece.

La naturaleza din谩mica de la pantalla provoc贸 la idea de llamar a la funci贸n de actualizaci贸n de la parte LED de la pantalla en una interrupci贸n del temporizador. La frecuencia de interrupci贸n y el tiempo de retenci贸n de la cadena de LED en el estado activo determinan el brillo del resplandor.

Tambi茅n lo hice para que la velocidad de ca铆da de las figuras de tetramino aumente a medida que se borran las l铆neas. En la primera versi贸n, las cifras se desplazaron una l铆nea hacia abajo cada 200 ms. Si quitas este n煤mero 40 ms cada 10 l铆neas eliminadas, entonces el ritmo del juego se acelera enormemente, y hay inter茅s. 隆Mi r茅cord es de 38 l铆neas!

Ese caso raro cuando el video vertical encaja perfectamente.


El c贸digo del proyecto , el dise帽o de la pantalla y el m贸dulo de interfaz se publican en GitHub.

Si tiene alguna idea de qu茅 m谩s puede hacer con dicha pantalla, escriba los comentarios.

Enlaces utiles:

1. Hackaday: pantalla Flip-Dot y controlador de bricolaje .
2. Tutorial de Tetris en plataforma C ++ independiente centrado en la l贸gica del juego para principiantes .
3. Repositorio de proyectos en GitHub .

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


All Articles