Como usar um ânodo comum de 7 segmentos e 4 dígitos?

9

Tome esta pergunta como um exemplo para a (minha) resposta abaixo.

Eu tenho um display LED de 7 segmentos e 4 dígitos, mas não faço ideia de como conectá-lo.

Não entendo a diferença entre ânodo / cátodo comum e não tenho 2 pinos por LED, o que é estranho. Recentemente, uma pergunta sobre um "ânodo comum de 7 segmentos e 4 dígitos" foi excluída. Naquele exato momento, eu estava digitando uma resposta.

No entanto, ainda quero compartilhar minha resposta com você ou com a pessoa que a pediu. Verifique / atualize minha resposta com mais informações. Especificamente, alguém poderia adicionar código de trabalho, não posso no momento.

Paulo
fonte
Apenas curioso. Você postou uma pergunta para poder respondê-la?
PhillyNJ
Na verdade, existe uma opção para isso. No entanto, os comentários na minha pergunta também contam a "história de fundo". Eu estava respondendo uma pergunta que foi excluída. E senti a necessidade de postar minha resposta, no entanto. Então sim, eu fiz. Mas é um método válido e eu tive a resposta antes da pergunta. Então, isso fez sentido para mim. Se você tiver uma pergunta (e resposta) realmente boa, eu poderia apenas encorajá-lo a fazer o mesmo, pois isso pode ser útil para alguém em algum momento.
Paul Paul

Respostas:

7

Como complemento à resposta de Paul, escrevi um pequeno programa para mostrar como conduzir a exibição de quatro dígitos de 7 dígitos de sua figura:

esquema de fiação

Este é realmente um display de cátodo comum, portanto o programa assume isso, assim como a fiação específica da figura. A parte interessante é a refresh_display()função, que deve ser chamada periodicamente. O algoritmo é o seguinte:

  • dirigir os 7 ânodos com os sinais apropriados para um dos dígitos que queremos mostrar
  • defina HIGHa saída que controla o cátodo desse dígito através do transistor NPN
  • aguarde 2,5 ms (para uma taxa de atualização de 100 Hz)
  • definir LOWa saída de controle de cátodo
  • mova para o próximo dígito.

Note-se que a espera é feita sem bloquear a CPU, usando a técnica descrita no tutorial Blink Without Delay Arduino. Aqui está o programa:

const int NB_DIGITS     = 4;  // 4-digit display
const int FIRST_ANODE   = 2;  // anodes a..g on pins 2..8
const int FIRST_CATHODE = 9;  // cathodes, right to left, on pins 9..12

// Digits to display, from right to left.
uint8_t digits[NB_DIGITS];

// Set all the used pins as outputs.
void init_display()
{
    for (int i = 0; i < 7; i++)
        pinMode(FIRST_ANODE + i, OUTPUT);
    for (int i = 0; i < NB_DIGITS; i++)
        pinMode(FIRST_CATHODE + i, OUTPUT);
}

// This should be called periodically.
void refresh_display()
{
    // Our 7-segment "font".
    static const uint8_t font[10] = {
        //abcdefg
        0b1111110, // 0
        0b0110000, // 1
        0b1101101, // 2
        0b1111001, // 3
        0b0110011, // 4
        0b1011011, // 5
        0b1011111, // 6
        0b1110000, // 7
        0b1111111, // 8
        0b1111011  // 9
    };

    // Wait for 2.5 ms before switching digits.
    static uint32_t last_switch;
    uint32_t now = micros();
    if (now - last_switch < 2500) return;
    last_switch = now;

    // Switch off the current digit.
    static uint8_t pos;
    digitalWrite(FIRST_CATHODE + pos, LOW);

    // Set the anodes for the next digit.
    pos = (pos + 1) % NB_DIGITS;
    uint8_t glyph = font[digits[pos]];
    for (int i = 0; i < 7; i++)
        digitalWrite(FIRST_ANODE + i, glyph & 1 << (6-i));

    // Switch digit on.
    digitalWrite(FIRST_CATHODE + pos, HIGH);
}

/***********************************************************************
 * Example usage.
 */

void setup()
{
    init_display();
}

void loop()
{
    uint32_t now = millis();

    // Change the number displayed every second.
    static uint32_t last_change;
    if (now - last_change >= 1000) {
        digits[3] = digits[2];
        digits[2] = digits[1];
        digits[1] = digits[0];
        digits[0] = (digits[0] + 1) % 10;
        last_change = now;
    }

    refresh_display();
}

Paul forneceu um link para um tutorial sobre Parallax que sugere o uso da biblioteca Multiplex7Seg Arduino. Essa biblioteca é mais geral que o código de exemplo acima, pois não faz suposições sobre os pinos usados. Mas a grande diferença entre a biblioteca e esse código está na maneira como os tempos são gerenciados:

  • A biblioteca é acionada pela interrupção de estouro do Timer 2. Isso deve proporcionar um tempo muito estável, ao custo de ter um temporizador dedicado a esse trabalho.
  • O código acima depende do usuário chamando com refresh_display()bastante frequência. Ele não requer recursos de hardware dedicados, mas não funciona bem com programas que demoram muito para loop(): não vai gostar de você ligar delay().
Edgar Bonet
fonte
É por isso que eu gosto de coisas de código aberto. Você pode compartilhar a carga de trabalho com o resto do mundo e criar algo realmente agradável. Que é compartilhado com o resto do mundo novamente :) Você pode aprender muito com outros desenvolvedores e esse conhecimento será persistente e não apenas oculto para todos os outros.
Paul
Eu tenho uma pergunta em mente em relação ao valor do resistor de base do Tranistor. Eu tenho um grande problema com o cálculo do valor do resistor. Qual é o motivo do uso do resistor de 4.7K em quatro transistores 2N2222? Se um único segmento consumir 10mA, haverá um consumo máximo de corrente de 80mA para todos os segmentos, incluindo DP. Se V (BE * sat) = 1,3v e I (B) = 15mA, 300ohm serão suficientes. Existe algum erro no meu cálculo?
Maruf
@ maruf: O I_B mínimo necessário é o I_C esperado dividido pelo ganho mínimo do transistor. Se você deseja 80 mA no coletor e espera um ganho de pelo menos 100 (pode ser otimista, eu não verifiquei a folha de dados), então você precisa de pelo menos 80/100 = 0,8 mA na base. Então o valor máximo do resistor de base é a queda de tensão através dele (cerca de 5 V - 0,7 V) dividida por essa corrente, ou cerca de 5,3 kΩ.
Edgar Bonet
5

Vou tentar levá-lo através do básico completo dos LEDs, etc. Como os displays de 4 dígitos e 7 segmentos são uma combinação de várias "técnicas de LED".

LED de fiação

LEDs, ou diodos emissores de luz, são uma das coisas divertidas do Arduino.

Essencialmente, são fáceis de usar, ligam e acendem.

Eles podem ser irritantes, porque eles têm algum tipo de polaridade, o que significa que eles só funcionam quando você os liga corretamente. Se você inverter as tensões positiva e negativa, elas não acenderão.

Por mais irritante que seja, também é bastante útil.

Cathode vs Anode

Em um LED tradicional, o lead longo é o ânodo (+). O outro líder é o cátodo (-).

"Ou, se alguém cortou as pernas, tente encontrar a borda plana na caixa externa do LED. O pino mais próximo da borda plana será o pino catódico negativo". - Sparkfun

Fonte: https://learn.sparkfun.com/tutorials/polarity/diode-and-led-polarity

Sparkfun

Fiação básica

Não tenho certeza se isso está correto, pois rasguei a imagem da Internet.

Fiação básica de LED

A fiação de um LED é bastante fácil, o ânodo (+) se conecta à tensão positiva, de preferência através de um resistor limitador de corrente. O cátodo (-) se conecta ao terra (com um resistor limitador de corrente, se você não tiver um no lado positivo).

O resistor limitador de corrente evitará o curto-circuito do LED, danificando o LED ou o microcontrolador / Arduino.

Vários LEDs, matrizes, RGB leds

Com vários LEDs, você costuma tê-los com o lado positivo conectado (+), "ânodo comum" ou todos conectados ao (-) "cátodo comum".

Basicamente, tudo se resume a isso.

Cátodo / ânodo comum RGB

Para um cátodo comum, você fornece corrente aos pinos que deseja usar.

Para um ânodo comum, você afunda a corrente através do LED.

Multiplexagem (vários dígitos, 7 segmentos)

Você deve verificar o tutorial de paralaxe: http://learn.parallax.com/4-digit-7-segment-led-display-arduino-demo

Parallax 4digit7seg

Quando você tem muitos LEDs, geralmente é inteligente "multiplexá-los". Normalmente, você passa rapidamente por "grupos" de LEDs, para que pareçam estar ligados ao mesmo tempo.

Normalmente, você reduz a corrente de uma coluna de LEDs e fornece corrente para os LEDs individuais de uma linha.

Ou você fornece corrente para uma coluna de LEDs e afunda a corrente de LEDs individuais de uma linha.

Para que você possa escolher qual coluna ativar e quais LEDs dessa coluna acenderão. Alterar essas colunas / linhas rapidamente permitirá controlar vários LEDs com muito menos pinos.

Existem até controladores de vídeo para isso, se você não quiser cuidar da mudança no seu software.

Então, quando você tem um ânodo comum de 4 dígitos e 7 segmentos multiplexados

O diagrama será mais parecido com este:

insira a descrição da imagem aqui

http://www.mytutorialcafe.com/Microcontroller%20Application%20C%207segmen.htm

Paulo
fonte