¿Cómo conectar esta pantalla LED de 7 segmentos a Arduino?

2

Tengo la siguiente pantalla LED, que quiero conectar a Arduino UNO.

Según hoja de datos , hay un pin de reloj. ¿Tengo que crear una fuente de reloj externa para ello o puedo alimentarlo desde Arduino?

Cualquier consejo práctico sobre cómo conectarse será apreciado.

Actualizar:

Gracias a Oli Glaser, he creado un boceto para Arduino y lo presenté aquí, en caso de que alguien tenga el mismo tipo de pantalla LED.

const int CLOCK_PIN = 2; 
const int DATA_PIN  = 3; 
const int DATA_EN_PIN  = 4; 

const byte numbers[16] = {
                    0b11111100,
                    0b01100000,
                    0b11011010,
                    0b11110010,
                    0b01100110,
                    0b10110110,
                    0b10111110,
                    0b11100000,
                    0b11111110,
                    0b11100110,
                    0b11101110,
                    0b00111110,
                    0b10011100,
                    0b01111010,
                    0b10011110,
                    0b10001110
};

void loadLed(byte d1, byte d2, byte d3)
{
  digitalWrite(DATA_EN_PIN, 0);

  digitalWrite(DATA_PIN, 1);
  digitalWrite(CLOCK_PIN, 1);
  delayMicroseconds(5);
  digitalWrite(CLOCK_PIN, 0);
  delayMicroseconds(5);

  for (int i=7; i >= 0; i--)
  {
    if(d1 & (1 << i))
      digitalWrite(DATA_PIN, 1);
    else
      digitalWrite(DATA_PIN, 0);
    digitalWrite(CLOCK_PIN, 1);
    delayMicroseconds(5);      
    digitalWrite(CLOCK_PIN, 0);
    delayMicroseconds(5);
  }

  for (int i=7; i >= 0; i--)
  {
    if(d2 & (1 << i))
      digitalWrite(DATA_PIN, 1);
    else
      digitalWrite(DATA_PIN, 0);
    digitalWrite(CLOCK_PIN, 1);
    delayMicroseconds(5);      
    digitalWrite(CLOCK_PIN, 0);
    delayMicroseconds(5);
  }

  for (int i=7; i >= 0; i--)
  {
    if(d3 & (1 << i))
      digitalWrite(DATA_PIN, 1);
    else
      digitalWrite(DATA_PIN, 0);
    digitalWrite(CLOCK_PIN, 1);
    delayMicroseconds(5);      
    digitalWrite(CLOCK_PIN, 0);
    delayMicroseconds(5);
  }

  for (int i=0; i <= 10; i++)
  {
    digitalWrite(DATA_PIN, 0);
    digitalWrite(CLOCK_PIN, 1);
    delayMicroseconds(5);      
    digitalWrite(CLOCK_PIN, 0);
    delayMicroseconds(5);
  }
  digitalWrite(DATA_EN_PIN, 1);
}

void setup()
{
  pinMode(CLOCK_PIN, OUTPUT);
  pinMode(DATA_PIN, OUTPUT);
  pinMode(DATA_EN_PIN, OUTPUT);
  delay(100);
  loadLed(numbers[7], numbers[8], numbers[3]);
}


void loop()
{
}

Esto puede optimizarse, por supuesto, pero hay un pequeño problema: cada quinto reinicio del tablero mostrará basura aleatoria. Intenté jugar con retraso, establecer en 50 - no es bueno. Buscando solución.

    
pregunta Pablo

1 respuesta

2

El reloj y los pines de datos son para su entrada serial. Estos se pueden controlar directamente desde el Arduino, solo conecte cada uno a una salida digital.

Para la rutina de datos, según la hoja de datos, hay un bit de inicio, seguido de 35 bits de datos que corresponden a la tabla "Secuencia de entrada en serie" en su pregunta.

Cree una función en su "boceto" para controlar la carga en serie, algo como a continuación: no he comprobado este código. Solo necesita llamarlo cuando desee actualizar la pantalla.
Tendrá que reemplazar set_data_pin y set_clock_pin con las llamadas correctas de Arduino a los pines GPIO que haya conectado a los pines de datos del reloj en la pantalla (no uso Arduino, así que no los conozco). el delay_us (demora de microsegundos) que puede ajustarse a cualquier tiempo que desee hasta una velocidad de reloj de 500 kHz; puede agregar una definición para el valor para guardar el cambio de cada uno.
Cada segmento se desplaza de MSB a LSB, lo que corresponde con A (MSB) a DP (LSB) para cada carácter de entrada:

void load_data(char seg1, char seg2, char seg3)
{
    char i, temp;
    char position = 0;

    set_data_pin(1);  // clock start bit in
    set_clock_pin(1);
    delay_us(5);
    set_clock_pin(0);
    delay_us(5);

    temp = seg1;
    while(i<8)
    {
        set_data_pin(temp & 0x80);  // set data pin
        set_clock_pin(1);
        delay_us(5);
        set_clock_pin(0);
        delay_us(5);
        i++;
        temp = temp << i; // shift next bit out
    }

    temp = seg2;
    while(i<8)
    {
        set_data_pin(temp & 0x80);  // set data pin
        set_clock_pin(1);
        delay_us(5);
        set_clock_pin(0);
        delay_us(5);
        i++;
        temp = temp << i; // shift next bit out
    }

    temp = seg3;
    while(i<8)
    {
        set_data_pin(temp & 0x80);  // set data pin
        set_clock_pin(1);
        delay_us(5);
        set_clock_pin(0);
        delay_us(5);
        i++;
        temp = temp << i; // shift next bit out
    }

    // Last 11 bits - do something here if needed
    while(i<11)
    {
        set_data_pin(0);  // set data pin
        set_clock_pin(1);
        delay_us(5);
        set_clock_pin(0);
        delay_us(5);
        i++;
    }
}

Conexiones

  • Conecte el pin VDD a + 5V, y el pin VSS a tierra (0V)
  • Conecte los pines VLED a + 5V también.
  • Conecte el pin BAJO HABILITAR DATOS (es decir, a tierra), ya que es activo bajo .
  • Para los pines Bits 25-34, déjelos desconectados si no desea usarlos, de lo contrario puede usarlos como salidas digitales. No los ate alto o bajo (es decir, no se conecte a + 5V o tierra)
  • Para el pin BC (control de brillo), puede usar solo una resistencia para fijar el brillo, o un potenciómetro y una resistencia para controlar el brillo de la pantalla.
    Para calcular el valor podemos usar la información en la hoja de datos:

    1. El máximo absoluto \ $ I_f \ $ (corriente hacia adelante) para la pantalla es 30mA (pág. 2)
    2. La corriente de visualización suele ser 36 veces mayor que la corriente en el pin BC (pág. 4) y la corriente máxima en el pin BC es \ $ 550 \ mu A \ $ (pg.5)

    Así que con esta información podemos calcular el mejor valor para el bote. Si nuestro objetivo es un máximo de funcionamiento típico de 20 mA, entonces:

    \ $ \ dfrac {+ 5V} {20mA \ div 36} = 9k \ Omega \ $

    Este es el valor mínimo de resistencia que usaríamos (conectado entre + 5V y el pin BC)
    Si queremos variar la corriente, digamos desde \ $ 10mA - 20mA \ $, entonces podemos agregar una olla \ $ 9k \ Omega \ $ en serie con la resistencia con su limpiaparabrisas conectado a un extremo (cualquier extremo) Luego la corriente varía entre:

    \ $ \ dfrac {+ 5V} {9k \ Omega} \ times 36 = 20mA \ $

    con la olla girada completamente a la inversa

    \ $ \ dfrac {+ 5V} {9k \ Omega + 9k \ Omega} \ times 36 = 10mA \ $

    Tenga en cuenta que la hoja de datos no es particularmente útil con detalles sobre el pin de control de brillo; muestra el potenciómetro configurado para un control de voltaje variable en el diagrama que confunde un poco las cosas. Acabo de ignorar este diagrama y he tomado lo que está escrito como correcto. También estoy asumiendo que la resistencia está en el total de 5V (es decir, el pin BC está justo por encima de 0V), lo que probablemente no sea el caso, pero es mejor estar en el lado conservador si no se dan detalles. Esto significa que es posible que necesite experimentar un poco para obtener el brillo correcto; si es demasiado tenue, intente cambiar a una resistencia más baja.

respondido por el Oli Glaser

Lea otras preguntas en las etiquetas