4095 LEDs y todo-todo-todoSorprendentemente, el controlador ATmega328, que subyace al Arduino Uno, hace frente a la salida de imagen en dicha pantalla. Todo resultó ser una consola de "bolsillo" (que pesaba varios kilogramos), en la que se cosió un juego basado en Space Invaders. Los planes para idear algo más, porque queda mucha memoria libre.
Debajo del corte, puede leer acerca de cómo se organiza dicha pantalla y cómo se puede controlar.
A veces, en lugar de encontrar
computadoras viejas en la colección , las hago yo mismo con
materiales improvisados .
Esta vez quería hacer algo compacto con una resolución a nivel de consolas y computadoras de principios de los 80. Es cierto que la pantalla de 64x64 píxeles no llega al Atari 2600, sino hasta 64 píxeles más que la pantalla del Nokia 3310, donde también había juegos. Por lo tanto, debería haber sido suficiente con un margen al menos para un juego cómodo de tetris o pong.
Además de la pantalla, obtuve una placa compatible con el Arduino Uno, y comencé a pensar en cómo volar con todo esto.
Adafruit vende estas pantallas y puede encontrar
ejemplos de su uso en su sitio web. También hay un enlace a la
biblioteca para trabajar con ellos. La biblioteca es compatible con Arduino Uno y Arduino Mega.
Esta biblioteca organiza la memoria de video, donde almacena los colores de los píxeles. El programa de usuario vuelve a pintar estos píxeles y la imagen se muestra en el controlador de interrupción del temporizador. Con pantallas pequeñas, esto funciona bien, pero en mi caso este método no es bueno. Incluso si se asigna medio byte por cada píxel (un bit por R, G, B y un extra), entonces para una matriz de 64x64, se necesitarán 2 kilobytes de memoria. Y eso es todo lo que tiene el ATmega328P. Por supuesto, puedes tomar un procesador más potente, pero este no es el camino de los Jedi.
Después de todo, ¿quién nos obliga a almacenar todas las líneas de la pantalla a la vez? Puede volver a calcular cada línea antes de mostrarla. Para gráficos primitivos de varios sprites, estos cálculos no deberían tomar demasiado tiempo, por lo que todo debería funcionar.
Estaba en el
bosque de una escuela de informática de verano, era demasiado vago para buscar documentación en microcircuitos y rastrear la placa para comprender a qué estaba conectado. Por lo tanto, seleccioné el algoritmo para trabajar con la pantalla de las bibliotecas descargadas previamente:
- Establezca la dirección de la línea de salida en las entradas de la pantalla.
- Rellene la matriz con los colores de los píxeles de sprite que se cruzan con la fila actual.
- Cambiamos a su vez todos los píxeles en un registro de desplazamiento, que controla los LED
- Hacemos clic en los datos recibidos y los enviamos a las salidas de los registros.
Como resultado, se selecciona una matriz con un tamaño de solo cuatro líneas de la pantalla para la memoria de video. ¿Por qué cuatro? Eso es porque al mismo tiempo empujamos los datos en dos filas, porque la matriz tiene dos grupos de entradas: R1 / G1 / B1 y R2 / G2 / B2. Controlan dos líneas espaciadas con una separación de 16 píxeles.
Pero entonces, ¿por qué no dos líneas, sino cuatro? Resulta que la matriz de 64x64 consta de dos matrices independientes de 32x64. Sería posible conectar salidas de procesador separadas a cada una, pero ATmega328 no tiene suficiente. Afortunadamente, un fabricante atento proporcionó la conexión en cascada de estas matrices: la salida del registro de desplazamiento de una se puede conectar a la entrada de la otra. Luego obtenemos la matriz lógica 32x128, que se muestra físicamente como 64x64. Es decir, en cada fase necesitamos insertar dos líneas de 128 píxeles en los registros, y esto es 4 líneas de la pantalla física.

Hicimos un prototipo de la consola durante la escuela de informática de verano. El primer juego fue algo remotamente parecido a
Space Invaders .
En realidad, los LED realmente quemaron sus ojos. Es poco probable que pueda ajustar su brillo con PWM: ATmega no tiene suficiente velocidad. Necesitamos tomar algún tipo de ARM o FPGA.
La versión final que diseñé en una caja de madera. La pantalla está protegida por plexiglás lijado. Debido a la dispersión de la luz, los ojos ya no se queman, pero ahora es más difícil grabar el trabajo de la consola en el video: toda la imagen se vuelve borrosa.
Todo el programa utiliza 1101 bytes (53%) de RAM y 6432 (19%) bytes de ROM. Todavía hay espacio para hacer varios juegos y menús para su selección.
Referencias- Fuentes del proyecto: github.com/Dovgalyuk/BackspaceInvaders
- Descripción de la matriz en adafruit: learn.adafruit.com/32x16-32x32-rgb-led-matrix
- Biblioteca de gestión de matriz Adafruit: github.com/adafruit/RGB-matrix-Panel
- Biblioteca Adafruit para dibujar primitivas gráficas: github.com/adafruit/Adafruit-GFX-Library
- Un proyecto similar en un procesador más potente: learn.adafruit.com/ledgames-beaglebone-black-64x64-led-game/overview
- El artículo trata sobre la administración de una pantalla más pequeña: geektimes.ru/post/275548