Tutorial ARDUTEKA - Matriz LED Bicolor + 74CH595

Hola de nuevo!

En este nuevo proyecto, vamos a aprender a conectar una matriz de LED 8x8 bicolor a través de unos registros de desplazamiento (Shift register) que nos van a permitir ahorrar muchos pines en nuestra placa, obteniendo un resultado tan espectacular como se puede ver en este video:

Podéis descargar el archivo del programa desde AQUI!!

Si queréis saber como empezar a desarrollar este proyecto acceder AQUI.

La idea de este post es que sigáis desarrollando el software o incluso el hardware, mejorándolo y ampliándolo y también para que todos aquellos que tengáis algún problema a la hora de llevarlo a cabo, expongáis vuestras dudas y así dejarlas registradas para el resto de los días!!

Un saludo!!

Hola:
Pues, hice el mismo programa, con una matriz bicolor, pero sin los registros de desplazamiento.
Al programar el arduino, y conectarlo a la matriz de led, solo se encienden 3 columnas.
Necesito ayuda.
Tambien quiero saber como hacer para unir 2 matrices led, es decir, que cuando se termine de desplegar el mensaje en una matriz que automaticamente se pase a la otra.

Y, si tengo que usar los registros de desplazamiento, cuales serian los equivalentes al 74hc595? porque por donde vivo, no hay en existencia en las electronicas.

Saludo !!!

Quisiera saber que debo cambiar, tanto en el diseño del circuito como en el código en el caso en que las filas de la matrix 8x8 sean los ánodos.

Gracias !!!

Buenas. Yo soy nueva en el uso de Arduino. Ha sido mi proyecto para finalizar la FP y la aplicación que he realizado es precisamente esto, el envió de un texto a 3 matrices de leds de 8x5 (no son bicolor). A diferencia del tutorial de Arduteka, yo he enviado los datos de los registros de desplazamiento a las columnas, por lo que si veis mi abecedario comprobareis que es diferente al de ese tutorial.
Como novedad he incluido las siguientes cosas:

  • Desplazamiento mediante interrupciones por overflow
  • Modificaciones en la funcion shiftOut. He creado dos funciones basadas en esta anterior.
  • Una de ellas es para introducir la fila de datos entera. Como mis matrices son de 5 columnas, solo me interesa enviar 5 bits a la linea de datos, por lo que la funcion la he modificado para tomar solo esos bits.
  • La otra está modificada para mostrar tantos bits como veces me haya desplazado. Es decir, mostraré mas bits segun el valor que tenga una variable que incrementaré cada vez que ocurra la interrupción.

He visto en un comentario anterior como se preguntaba sobre enlazar varias matrices, en este proyecto puedes ver como lo he realizado yo. Aquí os dejo el programa en un adjunto (no se si esto funciona asi). Espero que a alguno os sirva de ayuda.

ED: En este ejemplo usé 3 matrices de leds y el dato se iba desplazando por todas ellas. Subo de nuevo el programa con mejores comentarios.

PROYECTO_COMENT.ino (5.76 KB)

Muy buenas

Después de hacer mil pruebas y mirar por varios blogs al final me he decidido postear aqui para ver si alguien puede ayudarme.

Estoy intentando hacer esta practica pero me dan unos resultados extraños.

Despues de estar haciendo muchas pruebas he simplificado el codigo para que al ser lo mas corto posible sea mas dificil que haya fallos. Este es el codigo

int pinLatch = 10;
int pinDatos = 11;
int pinReloj = 12;

int gnd[8] = {2, 3, 4, 5, 6, 7, 8, 9};

byte frase[8] = {255,0,0,0,0,0,0,0};

void setup(){

  for (int i=2;i<=12; i++){
    pinMode(i, OUTPUT);
  }
  
  for (int g=2;g<=9;g++){
    digitalWrite(g, HIGH);
  }

}
void loop(){

    for (int i=0; i<8; i++){
       digitalWrite(gnd[i], LOW);
       digitalWrite(pinLatch, LOW);
       shiftOut(pinDatos, pinReloj, MSBFIRST, frase[i]);
       digitalWrite(pinLatch, HIGH);
       digitalWrite(gnd[i], HIGH);
    }
}

El circuito es el mismo que el de la practica pero con solo un registro 7HC959N, con solo los leds verdes conectados y sin desplazar las letras.

El resultado que obtengo es que siempre se encienden una fila mas abajo de lo que deberia ser.

Si envio la matriz 255,0,0,0,0,0,0,0 se me enciende la fila 2, si pongo 0,255,0,0,0,0,0,0 se enciende la fila 3 y si envio 0,0,0,0,0,0,0,255 se enciende la primera.

Pero si hago un delay:

void loop(){

    for (int i=0; i<8; i++){
       digitalWrite(gnd[i], LOW);
       digitalWrite(pinLatch, LOW);
       shiftOut(pinDatos, pinReloj, MSBFIRST, frase[i]);
       digitalWrite(pinLatch, HIGH);
[color=red]delay(250);[/color]
       digitalWrite(gnd[i], HIGH);
    }
}

Con este codigo si que se encienden las filas en orden pero claro, no todas a la vez sino de una en una.

A la unica conclusion que he podido llegar es que el reloj del registro de desplazamiento es mas lento que el de arduino i por eso no hace bien la representacion sino pongo un delay. La verdad es que yo de programar si que se, pero de electronica se lo basico y no tengo ni idea de que puede estar pasando

Si alguien pudiera ayudarme se lo agradeceria mucho. Mentras tantos empezare a investigar la funcion shiftout y investigando mas a fondo el 7HC959N

Muchas gracias

Hola a todos,
En primer lugar decir que soy novato en tema de electrónica.
El registro de desplazamiento es 74CH595 o es 74HC595?? Porque estoy intentando comprarlos pero solo veo que hay HC.
Y otra pregunta ¿Que diferencias hay entre 74HC595N o 74HC595D? Afecta algo a la programación?

Gracias y un saludo

Bueno, vamos al tema, el chip se llama 74HC595 como bien dices.
¿Diferencias entre N y D? Buscamos en google el datasheet del 74HC595 -> http://www.nxp.com/documents/data_sheet/74HC_HCT595.pdf
Página 2, apartado 4 -> N es empaquetado DIP16 y D es empaquetado SO16, hmm, ¿Cual será el que necesitemos?

Busquemos en el pdf por DIP16 y SO16 para ver que tipo de empaquetado es cada uno y poder saber cual queremos.
Página 17, empaquetado SO16, vaya, es de montaje superficial, probablemente no sea el que quieras ni lo tengan en la tienda de barrio de electrónica.
Página 16, empaquetado DIP16, hey! Es la cucaracha de toda la vida! Me servirá para montarlo en un protoboard :smiley:

No es muy recomendable realizar el montaje tal cual está expuesto, ya que se puede llegar a cuadruplicar el límite de corriente de los pines de Arduino, tanto de los de entrada/salida como el de GND.

Por otra parte, el esquemático es erróneo, ya que el pin Q7' del primer 74HC595 hay que conectarlo al pin DS del segundo 74HC595, no al Q7'.

Un saludo :wink:

chiva muy de acuerdo contigo! los circuitos que pone la gente (y yo me incluyo) pueden tener fallos. Por eso cuando empiezas de novatillo tienes que buscar más fuentes de información y no quedarte con la primera que tienes. Contrastarlas y sacar conclusiones. Y para todo esto tenemos al Sr. Google que nos ayuda en nuestro comienzo :smiley:

Me gusta tu estilo, jajaja.

Por cierto erikcrane, puede que tengas cableada mal la matriz, si no prueba también a controlar el 74HC595 mediante SPI, con una búsqueda por Google te sale, aunque supongo que ya lo tendrás desmontado, pero bueno :d

Gracias por la respuesta y por aclararme las dudas!
Busque en google y estuve en varias paginas intentando entenderlas pero fue en plan.... =( + baba colgando.

Gracias de nuevo

todos los códigos que veo con el 595 es usando el shiftout, hay alguna forma de hacerlo enviando los datos bit a bit??

Dead pool, de nada :wink:

Scottie, para que quieres hacer eso? De todas maneras puedes hacerlo a mano
Desactivar latch, conmutar pin segun quieras 0 o 1 y hacer una secuencia de clock para que lo procese el 74HC595, así 8 veces y al acabar activar el latch.
En el datahsheet tienes el diagrama de tiempos y señales.

chiva:
Me gusta tu estilo, jajaja.

Por cierto erikcrane, puede que tengas cableada mal la matriz, si no prueba también a controlar el 74HC595 mediante SPI, con una búsqueda por Google te sale, aunque supongo que ya lo tendrás desmontado, pero bueno :d

Hace meses que la desmonte pero ya encontre el fallo y cue algo curioso pq yo vengo de programar sin tener en cuenta el mundo fisico y era un problema de que una parte de la matriz (filas o columnas, ahora no recuerdo) estaba controlada por la cucaracha esta y lo otro por salidas directas del arduino. Como el 595 se guarda los estados de las salidas hasta que no vuelve a tener un nuevo latch(creo que era ese) las filas me salian desplazadas una posicion. Habia dos maneras de resolverlo (habia otra pero era muy sucia), o la matriz de las letras haces que las filas vayan desplazadas una posicion y asi compensas el error o pones 595 en las columnas tambien.

Cuando este con el ordenador posteare el codigo que consegui, por si a alguien le sirve algun dia. Pero igualmente me mirare otra vez esto que me dices, con tal de aprender si tengo que montar la matriz mas veces pues que asi sea :smiley:

Pues justamente me tocó montar este circuito (bien hecho) la semana pasada, matriz de leds bicolor, controlada por 2 74HC595 y en los cátodos transistores para no quemar el arduino y funciona perfectamente.
Lo único que controlé los 74HC595 por SPI, pero debería ser exactamente igual con shiftOut.

En algo te debiste equivocar, algún numerillo que se escapó o algo, es un poco lioso.

Hola, me he comprado el kit de arduino started, y una matriz de 8x8 como la del tutorial, es de un solo color.
Mi duda es: ¿como podria programar un pic 16f628A con arduino? pues arduino esta muy bien, pero si quiero dejarlo montado el proyecto, (no sobre la board de pruebas) como es logico no dejare el arduino dentro, tendria que comprarme un arduino cada vez que hago algo sabes a que me refiero, entonces me gustaria que me dijera como podria programar el pic para ponerselo al circuito de la matriz, y una ultima duda mas, se puede programar en c? pues el lenguaje usado parece C, pero a la hora de copilarlo con Pic C me da errores de copilacion, un saludo y muchas gracias de antemano.

chiva:
Bueno, vamos al tema, el chip se llama 74HC595 como bien dices.
¿Diferencias entre N y D? Buscamos en google el datasheet del 74HC595 -> http://www.nxp.com/documents/data_sheet/74HC_HCT595.pdf
Página 2, apartado 4 -> N es empaquetado DIP16 y D es empaquetado SO16, hmm, ¿Cual será el que necesitemos?

Busquemos en el pdf por DIP16 y SO16 para ver que tipo de empaquetado es cada uno y poder saber cual queremos.
Página 17, empaquetado SO16, vaya, es de montaje superficial, probablemente no sea el que quieras ni lo tengan en la tienda de barrio de electrónica.
Página 16, empaquetado DIP16, hey! Es la cucaracha de toda la vida! Me servirá para montarlo en un protoboard :smiley:

No es muy recomendable realizar el montaje tal cual está expuesto, ya que se puede llegar a cuadruplicar el límite de corriente de los pines de Arduino, tanto de los de entrada/salida como el de GND.

Por otra parte, el esquemático es erróneo, ya que el pin Q7' del primer 74HC595 hay que conectarlo al pin DS del segundo 74HC595, no al Q7'.

Un saludo :wink:

Hola Chiva!

Es cierto, las imágenes están mal, en el tutorial comento que se debe conectar el Q7 del primero al DS del segundo, pero a la hora de hacer el esquema me colé.. Lo modifico en breves!!

El tema de la corriente en las salidas de Arduino, supongo que te refieres al color que está conectado directamente a Arduino tomé como referencia el tutorial de Arduino.cc http://www.arduino.cc/playground/Main/DirectDriveLEDMatrix pero de todas maneras, revisaré en cuanto pueda todo el circuito y si lo modificaré, ok?

Gracias por el feedback! Cada día voy aprendiendo un poco más! :wink:

Un saludo.

Hola a todos..

Estamos haciendo un proyecto para una asignatura de FP.
Manejamos las anodos (filas) con un 74hc595 y las columnas (catodos) con 74hc595 también
Queremos usar un transistor PNP BC557 para atacar a cada fila y tener una mayor intensidad lumínica y proteger las salidas del arduino.
El problema parece ser que no conmuta del todo bien ya que al mostrar un caracter, ilumina la fila entera.
Aqui sin usar el transistor, como debería mostrar el mensaje

Con el transistor atacando la fila 2

Hola, me gustan vuestros proyectos y me gusta trastearlos. Vereis tengo una duda, vuestro proyecto de la matriz es con cátodo común, yo la que tengo es con ánodo común. Mi pregunta es: que modificaciones tengo que hacer a la hora de programar y de hacer el montaje. Espero que podais ayudarme pues estoy empezando con arduino y es un mundo muy amplio. Gracias de antemano, recibid un cordial saludo.

Hola amigo encontraste las modificaciones ala programacio. Para que trabaje con un display 8x8 bicolor de anodo comun? Es que no me trabaja, y me urge agradeseria ayuda porfavor

Hola a todos.. miren lo que pasa es que en base a este proyecto he estado tratando de mejorarlo y ampliarlo y me encontre con que al ampliarlo a una matriz de 6x40 osea aumentar dos matrices de leds mas al circuito tambien le aumente dos registros de desplazamiento como verán el figura.. el código igual lo modifique.. pero tengo un problema .. cuando ya lo enciendo en proteus para correr la simulación no hace nada solo se muestran una cadena de símbolos raros y no se encienden las matrices pares osea se encienden las primeras 8 columnas, las siguientes 8 no se encienden, luego las siguientes si....y así .. quisiera que me ayuden verificando el código ... a ver si me he equivocado en algo ... y tambien le den una revisión al circuito.

PT: adjunto código y el esquema en proteus ..

saludos

:slight_smile:

letrero.PDF (214 KB)

letrero.ino (7.52 KB)