2 votos

74HC595 8x16led matrix arduino

Actualmente estoy intentando aprender cómo funciona el multi shifting y por ello he empezado un proyecto en el que quiero manejar 2X 8x8 LED matrix con un Arduino. He encontrado que debo trabajar con el chip 74HC595.

Este es el esquema que estoy usando para probar cómo funciona el chip.

Scematic over 8x8

Pero cuando uso esto con el siguiente código, no se encienden todos los LEDs y algunos son menos brillantes que el resto.

#define DATA 10
#define CLOCK 11
#define LATCH 12

void latch();
uint8_t pic[] = {250,250,250,250,250,250,250,250};

void setup() {
  pinMode(DATA, OUTPUT);
  pinMode(CLOCK, OUTPUT);
  pinMode(LATCH, OUTPUT);
}

void loop() {
  for (int i=0; i<8; i++) {
    shiftOut(DATA, CLOCK, LSBFIRST, ~pic[i]);
    shiftOut(DATA, CLOCK, LSBFIRST, 128 >> i);
    latch();
    //delay(100);
  }

}

void latch() {
  digitalWrite(LATCH, HIGH);
  delayMicroseconds(10);
  digitalWrite(LATCH, LOW);
  delayMicroseconds(10);
}

8x8 LED matrix Error Light

¿Qué puede causar eso? ¿Tengo un mal cableado o un mal código?

ACTUALIZACIÓN

He probado mi matriz de LEDs con el código de @vicatcu. Primero me encontré con un montón de malas conexiones que ahora se fijan, espero.

Ahora he encontrado 2 columnas completas, 1 fila completa y un par de LED's más que no se encienden, la fila del medio donde hay 3 LED's que no se encienden se enciende cuando pongo todo a 0 en vez de 250.

LED matrix 2.0

Si quito el "~" del código, obtengo esto:

LED'matrix removed ~

Actualización 2

Probé la idea de @James y moví las resistencias de las columnas a las filas, pero eso no solucionó el problema sino que sólo movió algunos de los píxeles de luz encendida Scematic over 8x8 2.0

8x8 LED matrix Error Light 2.0

1voto

ianb Puntos 659

El 74HC595 alimentado a 4,5 voltios cuando conduce una corriente de carga de 6 mA producirá un voltaje de salida de algo menos de 4,5 voltios; más bien 4,3 voltios ( Tabla 7.5 en las características eléctricas ). Este es un valor típico y puede ser tan bajo como 3,98 voltios.

Usted está tratando de conducir hasta 8 LEDs simultáneamente desde una salida de fila. Puede que quieras conseguir 10 mA por LED. Digo esto porque un LED típico cae nominalmente 2 voltios y una caída de diodo adicional de 0,7 voltios (diodos de matriz) significa que podría haber 2,3 voltios a través de cada resistencia de columna de 220 ohmios. Entonces, 10 mA es mi estimación y, si quieres 8 LEDs activados, una corriente de 80 mA.

Bueno, en primer lugar, no se puede esperar que el HC595 suministre ese tipo de corriente. Si usted mira las calificaciones máximas absolutas en la hoja de datos es dice 35 mA por pin de salida por lo que, sus expectativas son muy superior a su hardware.

Y esto causa el problema que ves porque erosiona a la tensión de salida a tal grado que la corriente entregada a cada LED se vuelve "variable". Un lote de LEDs puede indicar que la caída media de voltios a 10 mA es de 2,00 voltios pero, el rango de caídas de voltios puede ser de 1,9 voltios a 2,1 voltios.

Si se hacen los cálculos en esos extremos cuando el HC595 sólo emite (digamos) 3,5 voltios (debido a la desorbitada sobredemanda), se encontraría que la corriente en un LED que funciona felizmente con 1,9 voltios es de 4,1 mA mientras que la corriente entregada en un LED que necesita 2,1 voltios es de 3,2 mA.

Eso es lo que produce las incoherencias de brillo.

0voto

JW. Puntos 145

Analicemos lo que está pasando aquí. El código está implementando un esquema de multiplexación, es decir, en un momento dado, sólo una fila de LEDs está siendo "dirigida" (es decir 128 >> i la fila a la que se dirige el i-ésimo bit). Te aconsejo que cambies el nombre de la variable llamada SHIFT a CLOCK ya que así es como la mayoría de la gente espera que se llame. Normalmente, la variable que se llama STORE se llama LATCH . Debe declarar int pic[] como uint8_t pic[] para que tenga el tamaño adecuado (8 bits en lugar de 16 bits) para lo que está tratando de expresar también.

Dicho todo esto, no creo que nada de esto explique el resultado de la foto. Creo que es más probable que sea un error de cableado de algún tipo o un problema de alimentación. ¿Puede el 74HC595 alimentar/descargar 100mA? Porque eso es lo que le estás pidiendo con 8 LEDs, una fuente de alimentación de 5V y una resistencia de 220 Ohm.

Yo empezaría con un sketch mucho más sencillo que te permita estimular cada píxel de la matriz de forma individual, y de forma que esté bajo tu control a través del terminal serie, por ejemplo. Algo así:

#include <stdint.h>

#define DATA 10
#define SHIFT 11
#define STORE 12

uint8_t row = 0, col = 0;

void store();

void setup() {
  Serial.begin(9600);
  Serial.println("Test One LED at a time");
  pinMode(DATA, OUTPUT);
  pinMode(SHIFT, OUTPUT);
  pinMode(STORE, OUTPUT);

  // initialize the shift registers
  shiftOut(DATA, SHIFT, LSBFIRST, 0);
  shiftOut(DATA, SHIFT, LSBFIRST, 0);   
  store();

}

void loop() {
  if (Serial.available()) {
    Serial.read();
    Serial.print("Lighting row "); Serial.print(row);
    Serial.print(" and column "); Serial.println(col);

    uint8_t rowval = (1 << row);
    uint8_t colval  = ~(1 << col);
    shiftOut(DATA, SHIFT, LSBFIRST, colval);
    shiftOut(DATA, SHIFT, LSBFIRST, rowval);   
    store();

    col++;
    if (col > 7) {
      col = 0;
      row++;
      if (row > 7) {
        row = 0;
      }
    }
  }
}

void store() {
  digitalWrite(STORE, HIGH);
  delayMicroseconds(10);
  digitalWrite(STORE, LOW);
  delayMicroseconds(10);
}

Y mira a ver si consigues que cada LED se encienda de uno en uno. Asegúrate de configurar el Monitor Serial para que no tenga "final de línea" y por cada carácter que envíes, el LED avanzará una posición en el orden mayor de la fila. En el arranque, ningún LED debería estar iluminado.

0voto

ozmank Puntos 127

Analicemos el problema, que se debe a que los controladores son incorrectos para una impedancia adecuada. (cableado incorrecto y fallas en las uniones de cables del CI, tal vez por sobrecalentamiento)

La resistencia del controlador 74HCxx es demasiado alta. Para una prueba de concepto, aumente todas las resistencias de 220 Ohm a, por ejemplo, 0,5~1k Ohm y tolere una baja intensidad de iluminación.

Dan las especificaciones del conductor con -10% de tolerancia Vcc como 4.5V y 6V

Consideremos el peor caso a 4,5V porque el Ron sube en los CMOS a medida que se calientan.

Zol = Vol(max)/Io= 0,4V/6mA = 67 Ohms ; Zoh = -0,8V/-6mA= 133 Ohms

Cada LED tendrá una resistencia efectiva en serie que depende de la corriente alrededor de 10 Ohms

Así, la corriente total es (5V-2,1)/ (67+133+(1~10?) = 20 mA

Los que no tienen luz es porque el cableado es defectuoso o el CI está demasiado caliente.

Hacen IC's adecuados para la conducción de Matrix.

0voto

kolstad Puntos 6

Tienes las resistencias en el circuito catódico. Las resistencias deben ir al otro lado de los LEDs en el circuito anódico.

En este momento estás conduciendo cada columna de 8 leds con una resistencia de caída compartida y forzando a los 8 a tener la misma caída de tensión hacia delante. Esto provoca el acaparamiento de la corriente y puede fundir algunos de los LEDs.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X