4095 LED et tout-toutÉtonnamment, le contrôleur ATmega328, qui sous-tend l'Arduino Uno, gère la sortie d'image sur un tel écran. Tout cela s'est avéré être une console «de poche» (pesant plusieurs kilogrammes), dans laquelle un jeu basé sur Space Invaders a été cousu. Les plans pour trouver autre chose, car il reste beaucoup de mémoire libre.
Sous la coupe, vous pouvez lire comment un tel affichage est organisé et comment il peut être contrôlé.
Parfois, au lieu de trouver de
vieux ordinateurs dans la collection , je les fabrique moi-même à partir de
matériaux improvisés .
Cette fois, je voulais faire quelque chose de compact avec une résolution au niveau des consoles et des ordinateurs du début des années 80. Certes, l'écran 64x64 pixels n'atteint pas l'Atari 2600, mais jusqu'à 64 pixels de plus que l'écran Nokia 3310, où il y avait aussi des jeux. Cela aurait donc dû être suffisant avec une marge au moins pour un jeu confortable de tetris ou de pong.
En plus de l'affichage, j'ai obtenu une carte compatible avec l'Arduino Uno et j'ai commencé à réfléchir à la façon de voler avec tout cela.
Adafruit vend de tels écrans et vous pouvez trouver des
exemples de leur utilisation sur son site Web. Il existe également un lien vers la
bibliothèque pour travailler avec eux. La bibliothèque prend en charge Arduino Uno et Arduino Mega.
Cette bibliothèque organise la mémoire vidéo, où elle stocke les couleurs des pixels. Le programme utilisateur repeint ces pixels et l'image est affichée dans le gestionnaire d'interruption du temporisateur. Avec de petits écrans, cela fonctionne bien, mais dans mon cas, cette méthode n'est pas bonne. Même si un demi-octet est alloué pour chaque pixel (un bit par R, G, B et un supplémentaire), alors pour une matrice 64x64, 2 kilo-octets de mémoire seront nécessaires. Et c'est tout ce que l'ATmega328P possède. Vous pouvez, bien sûr, prendre un processeur plus puissant, mais ce n'est pas la voie du Jedi.
Après tout, qui nous oblige à stocker toutes les lignes de l'écran en même temps? Vous pouvez recalculer chaque ligne avant de l'afficher. Pour les graphiques primitifs de plusieurs sprites, ces calculs ne devraient pas prendre trop de temps, donc tout devrait fonctionner.
C'était dans les
bois d'une école d'informatique d'été, c'était trop paresseux pour chercher de la documentation sur les microcircuits et tracer le tableau pour comprendre à quoi était connecté. Par conséquent, j'ai sélectionné l'algorithme pour travailler avec l'affichage à partir des bibliothèques précédemment téléchargées:
- Réglez l'adresse de la ligne de sortie aux entrées de l'écran
- Remplissez le tableau avec les couleurs des pixels de l'image-objet qui se croisent avec la ligne actuelle.
- Nous décalons tour à tour tous les pixels dans un registre à décalage, qui contrôle les LED
- Nous cliquons sur les données reçues et les soumettons aux sorties des registres
Par conséquent, un tableau d'une taille de seulement quatre lignes d'écran est sélectionné pour la mémoire vidéo. Pourquoi quatre? En effet, en même temps, nous poussons les données sur deux lignes - parce que la matrice a deux groupes d'entrées: R1 / G1 / B1 et R2 / G2 / B2. Ils contrôlent deux lignes espacées de 16 pixels.
Mais alors pourquoi pas deux lignes, mais quatre? Il s'avère que la matrice 64x64 se compose de deux matrices 32x64 indépendantes. Il serait possible de connecter des sorties de processeur distinctes à chacune, mais ATmega328 n'en a pas assez. Heureusement, un fabricant attentionné a prévu la mise en cascade de ces matrices - la sortie du registre à décalage de l'une peut être connectée à l'entrée de l'autre. Ensuite, nous obtenons la matrice logique 32x128, qui est physiquement affichée en 64x64. Autrement dit, dans chaque phase, nous devons pousser deux lignes de 128 pixels dans les registres - et cela représente 4 lignes de l'écran physique.

Nous avons réalisé un prototype de la console lors de l'école d'informatique d'été. Le premier jeu ressemblait à distance à
Space Invaders .
En réalité, les LED ont vraiment brûlé leurs yeux. Il est peu probable que vous puissiez régler leur luminosité en utilisant PWM - ATmega n'a pas assez de vitesse. Nous devons prendre une sorte d'ARM ou de FPGA.
La version finale que j'ai conçue dans une caisse en bois. L'écran est protégé par du plexiglas sablé. En raison de la dispersion de la lumière, les yeux ne sont plus brûlés, mais maintenant il est plus difficile d'enregistrer le travail de la console sur la vidéo - l'image entière devient floue.
L'ensemble du programme utilise 1101 octets (53%) de RAM et 6432 (19%) octets de ROM. Il y a encore de la place pour faire plusieurs jeux et menus pour leur sélection.
Les références- Sources du projet: github.com/Dovgalyuk/BackspaceInvaders
- Description de la matrice sur adafruit: learn.adafruit.com/32x16-32x32-rgb-led-matrix
- Bibliothèque de gestion de la matrice Adafruit: github.com/adafruit/RGB-matrix-Panel
- Bibliothèque Adafruit pour dessiner des primitives graphiques: github.com/adafruit/Adafruit-GFX-Library
- Un projet similaire sur un processeur plus puissant: learn.adafruit.com/ledgames-beaglebone-black-64x64-led-game/overview
- L'article concerne la gestion d'un affichage plus petit: geektimes.ru/post/275548