Je veux partager l'expérience de la création d'un écran LED 8x8 pixels, de combinaisons de couleurs 262k (18 bits), d'une fréquence d'images de 180 FPS et d'une connexion USB. Je suis également prêt à écouter les suggestions d'optimisation et de raffinement. À l'avenir, je prévois d'utiliser les meilleures pratiques pour créer un affichage de la station météo domestique.Préface
Tout a commencé avec le schéma de contrôle le plus simple pour une ligne de 8 LED via un port LPT. La version suivante était une carte 5x8 de LED tricolores, également connectée au LPT et, en fait, était un tableau de quinze tampons 8 bits avec un décodeur pour leur adressage. Plus tard, après avoir rencontré des microcontrôleurs, j'ai décidé de créer un écran similaire, mais avec une connexion USB. Initialement prévu pour n'utiliser que 8 couleurs. Par la suite, il a trouvé un moyen de contrôler la luminosité de chaque diode à l'aide d'une minuterie par analogie avec PWM, et après avoir finalisé la partie logicielle, l'appareil actuel s'est avéré. Théoriquement, vous pouvez travailler avec 16 millions de couleurs, mais les LED conventionnelles ne conviennent pas à ce mode en termes de reproduction des couleurs et de répétabilité. De plus, des problèmes avec la couleur des différentes diodes sont déjà visibles sur la configuration actuelle.Description du poste
L'appareil est basé sur le microcontrôleur PIC18F4550 fonctionnant à une fréquence de 48 MHz. Un contrôleur USB intégré et une bibliothèque prête à l'emploi pour l'utiliser, Timer0 en mode 8 bits, qui implémente l'indication dynamique. Pour stocker trois couleurs dans une colonne, trois déclencheurs 8 bits sur 74F374 ont été utilisés. L'utilisation d'un tel tampon permet de réduire le temps d'affichage d'une trame de 3 fois. Remarque: Lorsque j'ai sélectionné le tampon 74F374, je n'ai pas fait attention au câblage de ses pieds, mais je ne l'ai compris qu'au niveau du support de montage, j'ai donc dû compliquer considérablement la carte. Il est préférable d'utiliser des analogues plus pratiques. Par exemple, 74HC574. Les LED sont connectées via les touches ULN2803 et UDN2982. Les résistances de limitation de courant sont uniquement dans le canal rouge, car leur tension d'alimentation est inférieure au bleu et au vert. Pour la résistance bleue et verte ne sont pas installés, car chute de tension suffisante sur les touches. Remarque: Pour une reproduction des couleurs plus précise, il est préférable de sélectionner des résistances de limitation de courant plus précises dans chaque canal. Le microcontrôleur dans un cycle sans fin interroge l'état USB et, lorsqu'un paquet de données arrive, selon la commande, démarre / arrête l'affichage ou prépare les données pour l'affichage. En raison de la limitation de la taille d'un paquet à 64 octets, les données pour chaque couleur sont transmises dans un paquet séparé de 48 octets - 6 octets pour chacune des 8 colonnes, codant la luminosité de chaque LED dans la colonne. Après avoir reçu chaque paquet, il est copié de la mémoire USB dans un tableau de sa couleur. Après réception de la commande de démarrage d'indication, le MK active le minuteur en mode 8 bits et un diviseur par 128. Le minuteur utilise la fréquence de fonctionnement du microcontrôleur comme impulsions d'horloge. Une augmentation du compteur de minuterie se produit toutes les 4 mesures. La période de temporisation minimale est de 10,6 μs (1/48 * 4 * 128), soit environ 2,8 fois le temps de traitement d'interruption (46 opérations, contre 128 échantillons de temporisation). Lorsque le temporisateur déborde, une interruption vectorielle élevée est effectuée. Le gestionnaire d'interruption désactive l'indication, met à jour les données dans les tampons, transfère 1 octet de chaque matrice de couleurs en fonction du curseur, puis active l'indication. Entre une nouvelle valeur dans le temporisateur à partir du tampon temporaire, décrémente le curseur, décale le tampon temporaire pour le temporisateur. Si la mémoire tampon du temporisateur a dépassé la valeur maximale, c.-à -d. décalé plus de 5 fois, le tampon de temporisation est réinitialisé à la valeur minimale et le pointeur de la colonne sélectionnée est décalé.En conséquence, l'algorithme d'indication dynamique suivant est obtenu:- Nous prenons le premier groupe de 3 octets de trois tableaux et les mettons dans les tampons de chaque couleur de la colonne.
- Nous activons la minuterie avec un temps de retard minimum de 128 ticks.
- Nous prenons le groupe suivant de 3 octets de trois tableaux et les mettons dans les tampons de chaque couleur de la colonne.
- On active le timer par un double retard par rapport à l'étape précédente.
- Répétez l'échantillon 4 fois de plus et doublez le temps de retard à chaque fois.
- Nous réinitialisons la minuterie et commençons à traiter la colonne suivante de l'étape 1.
Ainsi, nous pouvons définir 2 ^ 6 = 64 options de luminosité pour chaque diode de la colonne. En combinant la luminosité de chacune des trois couleurs de base, nous obtenons 64 * 64 * 64 = 262144 couleurs. Le temps de traitement pour une colonne est (2 ^ 6-1) * 10,6 μs = 672 μs. Le temps par image de 8 colonnes est de 672 * 8 = 5,4 ms, ce qui correspond à peu près à 186 images par seconde.Composants utilisés
- PIC18F4550 - MicrocontrĂ´leur
- 74F374 - Déclencheur pour conserver les valeurs de colonne actuelles
- ULN2803 - Clé pour le contrôle de la cathode
- UDN2982 - Clé pour contrôler les anodes
- LED RGB à 4 broches avec une cathode commune (toutes les LED peuvent être utilisées)
Schéma
Schéma au format DSN - TéléchargerFrais
Dessins Lay6 - TéléchargerFirmware
Sources et HEX assemblés dans MPLABX X IDE v2.30 - téléchargementCode principal#ifndef MAIN_C
#define MAIN_C
#include "config.h"
#include "usb.h"
#include "HardwareProfile.h"
#include "usb_function_hid.h"
#include "genericHID.h"
#define UdnOn LATA&=0b11111110
#define UdnOff LATA|=0b00000001
#define UlnOn LATD
#define UlnOff LATD =0b00000000
#define LineBufer LATB
#define WriteR LATE|=0b00000001
#define WriteG LATE|=0b00000010
#define WriteB LATE|=0b00000100
#define WriteRst LATE =0b00000000
#define Columns 8
#define BrightLevels 6
#define BlockSize (Columns*BrightLevels)
#define MinBright 0b11111111
unsigned char cursor;
unsigned char bright;
unsigned char column;
unsigned char dataR[BlockSize];
unsigned char dataG[BlockSize];
unsigned char dataB[BlockSize];
void ProcessIO(void) {
unsigned char temp = BlockSize + 1;
if ((USBDeviceState < CONFIGURED_STATE) || (USBSuspendControl == 1)) return;
if (!HIDRxHandleBusy(USBOutHandle))
{
switch (ReceivedDataBuffer[0])
{
case 0x80:
while (--temp) dataR[temp-1] = ReceivedDataBuffer[temp];
break;
case 0x81:
while (--temp) dataG[temp-1] = ReceivedDataBuffer[temp];
break;
case 0x82:
while (--temp) dataB[temp-1] = ReceivedDataBuffer[temp];
break;
case 0x90:
column = 0b00000001;
cursor = BlockSize;
bright = MinBright;
TMR0ON = 1;
SWDTEN = 0;
break;
case 0x91:
UdnOff;
UlnOff;
TMR0ON = 0;
SWDTEN = 0;
break;
case 0x92:
UdnOff;
UlnOff;
TMR0ON = 0;
SWDTEN = 0;
SLEEP();
break;
}
USBOutHandle = HIDRxPacket(HID_EP, (BYTE*) & ReceivedDataBuffer, 64);
}
}
void main(void)
{
PCFG3 = 1;
PORTA = 0b00000000;
PORTB = 0b00000000;
PORTC = 0b00000000;
PORTD = 0b00000000;
PORTE = 0b00000000;
TRISA = 0b00000000;
TRISB = 0b00000000;
TRISC = 0b00000000;
TRISD = 0b00000000;
TRISE = 0b00000000;
INTCON = 0b10100000;
T0CON = 0b01000110;
USBDeviceInit();
while(1)
{
USBDeviceTasks();
ProcessIO();
};
}
void interrupt tc_int()
{
UdnOff;
UlnOff;
LineBufer = dataR[cursor-1]; WriteR;
LineBufer = dataG[cursor-1]; WriteG;
LineBufer = dataB[cursor-1]; WriteB;
UdnOn;
UlnOn = column;
WriteRst;
TMR0L = bright;
if (!--cursor) cursor = BlockSize;
bright <<= 1;
asm("BTFSS _bright, 5, 0"); asm("RLNCF _column, 1, 0");
asm("BTFSS _bright, 5, 0"); bright = MinBright;
TMR0IF = 0;
}
#endif
Appareil en fonctionnement
Pour le contrôle, j'utilise un lecteur radio Internet écrit en C, basé sur la bibliothèque BASS.DLL. Une démonstration de dégradé sur toute la palette de couleurs disponible fonctionne pendant une pause, le taux de rafraîchissement des images (paquets transmis à l'appareil) est de 20 Hz. Lors de la lecture de musique, un visualiseur fonctionne en utilisant la matrice FFT obtenue par BASS.DLL, le taux de rafraîchissement des images (paquets transmis à l'appareil) dans ce mode est de 29 Hz.Visualiseur
: Tape Five — Soulsalicious
: ( ) ( ). .. , .- ( UDN)
- USB
- smd
- 74F374 74HC574,
- 74F374
- 74HC138,
- 3 ULN, UDN