Prototype 262.144 combinaisons de couleurs LED et 64 pixels

    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:
  1. Nous prenons le premier groupe de 3 octets de trois tableaux et les mettons dans les tampons de chaque couleur de la colonne.
  2. Nous activons la minuterie avec un temps de retard minimum de 128 ticks.
  3. Nous prenons le groupe suivant de 3 octets de trois tableaux et les mettons dans les tampons de chaque couleur de la colonne.
  4. On active le timer par un double retard par rapport à l'étape précédente.
  5. Répétez l'échantillon 4 fois de plus et doublez le temps de retard à chaque fois.
  6. 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écharger
Graphisme


Frais


Dessins Lay6 - Télécharger
Graphisme
1


2


( , , )





Firmware


Sources et HEX assemblés dans MPLABX X IDE v2.30 - téléchargement
Code principal
#ifndef MAIN_C
#define MAIN_C

// Local includes
#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 we are not in the configured state just return
    if ((USBDeviceState < CONFIGURED_STATE) || (USBSuspendControl == 1)) return;

    //Check if data was received from the host.
    if (!HIDRxHandleBusy(USBOutHandle))
    {
        switch (ReceivedDataBuffer[0])
        {
            case 0x80: // get red packet
                while (--temp) dataR[temp-1] = ReceivedDataBuffer[temp];
                break;

            case 0x81: // get green packet
                while (--temp) dataG[temp-1] = ReceivedDataBuffer[temp];
                break;

            case 0x82: // get blue packet
                while (--temp) dataB[temp-1] = ReceivedDataBuffer[temp];
                break;

            case 0x90: // start
                column = 0b00000001;
                cursor = BlockSize;
                bright = MinBright;
                TMR0ON = 1;
                SWDTEN = 0;
                break;

            case 0x91: // stop
                UdnOff;
                UlnOff;
                TMR0ON = 0;
                SWDTEN = 0;
                break;

            case 0x92: // power off
                UdnOff;
                UlnOff;
                TMR0ON = 0;
                SWDTEN = 0;
                SLEEP();
                break;
        }

        // Re-arm the OUT endpoint for the next packet
        USBOutHandle = HIDRxPacket(HID_EP, (BYTE*) & ReceivedDataBuffer, 64);
    }
}

void main(void)
{
    // Set all port as digital input/output
    PCFG3   = 1;

    // Clear all ports
    //          76543210
    PORTA   = 0b00000000;
    PORTB   = 0b00000000;
    PORTC   = 0b00000000;
    PORTD   = 0b00000000;
    PORTE   = 0b00000000;

    // Configure ports (1 - inputs; 0 - outputs)
    //          76543210
    TRISA   = 0b00000000;
    TRISB   = 0b00000000;
    TRISC   = 0b00000000;
    TRISD   = 0b00000000;
    TRISE   = 0b00000000;

    // Configure interrupts for Timer0
    //          76543210
    INTCON  = 0b10100000;

    // Configure Timer0 as 8bit and 128 prescaler
    //          76543210
    T0CON   = 0b01000110;

    USBDeviceInit();

    while(1)
    {
        // Check bus status and service USB interrupts.
        USBDeviceTasks();

        // Application-specific tasks.
        ProcessIO();
    };
}

void interrupt tc_int() // High priority interrupt
{
    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.

Dégradé


Visualiseur

: Tape Five — Soulsalicious

: ( ) ( ). .. , .







  • ( UDN)
  • USB
  • smd
  • 74F374 74HC574,
  • 74F374
  • 74HC138,
  • 3 ULN, UDN

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


All Articles