Autor Tema: De matriz de leds, a letrero electronico  (Leído 295067 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado marturetjulio

  • PIC10
  • *
  • Mensajes: 44
Re: De matriz de leds, a letrero electronico
« Respuesta #285 en: 10 de Mayo de 2010, 20:45:49 »
hola amigo Cryn muchisimas gracias por tu explicación...la entendi y bueno he tratado de seguir tus consejos y bueno logre hacer un código según lo que entendi lo voy a postear espero me puedas guiar y decirme si esa es la forma de paso tuve que leer el data sheet del 4094 que es el registro de desplazamiento que tu empleas...discúlpame de verdad que sea tan terco y no me conforme con copiar tu codigo y simularlo...es solo que quisiera hacerlo yo mismo no con la calidad que tu tienes claro pero bueno que al menos funcione el desplazamiento jeje...gracias de verdad por todas tus explicaciones amigo yo sigo intentando e intentando jeje.. este codigo es un arreglo que le hice a un codigo que posteo una ves ariel en un codigo que maneja un 4094 con display. a quien le agradesco mucho tambien por sus tutoriales en ucontrol.

#include <18f452.h>
#fuses xt,nolvp,nowdt,noprotect
#use delay(clock=4000000)
#BYTE PORTB = 0x06
#BYTE PORTD = 0x08
#define DATA PIN_D1
#define CLOCK PIN_D0
#define STROBE PIN_D2

int   const letra[8]={0x3E,0X08, 0X08, 0X08, 0X08, 0X08,0X88,0x70};
int filas[8]={128,64,32,16,8,4,2,1};
//--------------------------------------------------
//Main----------------------------------------------
//--------------------------------------------------
int t;

// declaración de la función escribir_4094
void escribir_4094(int caracter);
// programa principal
void  main(){
   output_d(0x0);
   output_b(0x0);
   set_tris_d(0x0);
   set_tris_b(0x0);
  while(true){
     for(t=0;t<8;t++){
         escribir_4094(t);             
         delay_us(30);
     }
   }
}
void escribir_4094(int caracter){
int contador_8;
   output_low(DATA);
   output_low(STROBE);
   output_low(CLOCK);
   for(contador_8=0;contador_8<8;contador_8++){
      output_bit(DATA,bit_test(letra[caracter],contador_8));
      output_high(CLOCK);
      delay_cycles(1);
      output_low(CLOCK);
   }
   output_b(~filas[caracter]);
   output_low(CLOCK);
   output_high(STROBE);
   delay_cycles(1);
   output_low(STROBE);
   }



Expeciencia es simplemente el nombre que le damos a nuestros errores!!!

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: De matriz de leds, a letrero electronico
« Respuesta #286 en: 10 de Mayo de 2010, 22:41:11 »
Vas por muy buen camino marturetjulio, ya dentro te poco te sacarás la espina del cartel.

No hombre, no te preocupes, entiendo perfectamente y me gusta tu idea de sacar tus propias cosas adelante.

No es ningún problema usar un registro de desplazamiento u otro, ya que todos funcionan prácticamente igual, la característica de los 4094 es el strobe, que los 74164 no lo poseen, con el strobe tienes un mejor control. Si te recomendaría un registro sería el TPIC6595 de texas, que es un mounstrito en suministro de corriente ya que posee salidas de mosfet, aunque me parece que son algo difíciles de conseguir y hasta quizá un poco caros. Pero los 74HC595 son como sus hermanos menores y en brillo para los leds son la mejor solución, los 164 no los probé, me quedé con los tpic y con los 595 (que ambos tienen strobe) y no probé nada más, ya que los 4094 son una lágrima para el brillo de los leds.

Tu código va muy bien, ahora te falta el desplazo que tanto buscas. Algo que puedo reiterarte de las recomendaciones es que utilices un buffer, es decir un otro arreglo donde ahi puedas cargar tu mensaje a mostrar. Ya que me parece que tienes en el cartel la letra J desplazada hacia abajo, por falta de un buffer.

Hay dos opciones que puedes usar para el desplazo:
-Guardar en tu arreglo las letras por filas
-Guardar en tu arreglo las letras por columnas

por filas:                        por columnas:              orden en el array:

00011000                       00111111                    array[0]
00111100                       01000100                    array[1]
01100110                       01000100                    array[2]
01100110                       01000100                    array[3]
01111110                       00111111                    array[4]
01100110                       
01100110                       
00000000                       

letra 8x8                        letra 5x7
Ambos son una letra 'A'

Con la primera opción tienes que hacer algo similar a lo que hice acá en mi código, no necesariamente con una matriz, también podría ser en un arreglo. Como te dije yo escogí la matriz porque me pareció más sencillo el manejo e ir desplazando los datos del buffer que posteriormente se enviará a los registros, el buffer se carga con las letras del mensaje que quieres mostrar.

Con la segunda opción deberás reacomodar los datos de las letras, ya que las tendrías almacenadas por columnas, pero esta reacomodación, te dará un mejor control del cartel, ya que el desplazamiento ya no será por el mismo desplazamiento de los bytes(como el caso anterior), sino por un índice o puntero a las columnas que estarán en tu buffer.

Esta segunda idea no la se explicar muy bien, pero seguro que comprendes la idea del master BrunoF que seguramente la ha dejado plasmada en el link del hilo donde habían las imágenes fila por fila. Como te dije para mi es un poco difícil poder explicarla, ya que ni yo la comprendí a la primera :oops:  jeje

A seguirle machando, ya de acá a unos días o mucho menos seguro que nos sorprendes con tu avance.

saludos
.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: De matriz de leds, a letrero electronico
« Respuesta #287 en: 10 de Mayo de 2010, 23:03:05 »
Bueno. Creo que es hora de explicarlo paso a paso. Hay mucha gente interesada en esto por lo visto. Hubiese jurado que Suky había hecho un tutorial de matrices de LEDs, pero no logré encontrarlo.

En cuanto pueda empiezo por lo más básico. Crear el buffer que contendrá la información a mostrar y en base a ello empezaremos a ver cómo manipularlo. Por ahora deberíamos empezar con eso y aprender a controlar el tema del refresco,etc.

En cuanto tenga un rato abro un hilo para dedicarselo a ésto. Mis carteles comerciales utilizan una cierta estructura creada por mi, que podríamos llegar a adoptar. Habría que ver qué sale y tal vez podamos hasta estandarizar un poco todo.

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: De matriz de leds, a letrero electronico
« Respuesta #288 en: 11 de Mayo de 2010, 00:08:32 »
Vendría muy bien .. no tenes un videillo por ahí para ir abriendo boca?
El papel lo aguanta todo

Desconectado fgaretto

  • PIC10
  • *
  • Mensajes: 33
    • Automatización y sistemas de control - Desarrollos con microcontroladores
Re: De matriz de leds, a letrero electronico
« Respuesta #289 en: 14 de Mayo de 2010, 11:07:23 »
Cryn: buenos días. Tengo algunos dudas con respecto al programa de la hoja 5 , te agradecería si pudieras resolverlas.
int matriz[matriz_num+1][size_matriz_col]={"\0"};  // por qué se inicializa con '0' ?


#int_TIMER0
void  TIMER0_isr(void){

   ShowFila();                  //Mostremos la fila actual...
   Fila++;
   if(Fila==8){
      Fila=0;
      VSync=1;                         
      if(Inhibit!=0)            // no entiendo bien este if-else
         Inhibit--;
      else
         desplazar_izq();
  }
  else
     VSync=0;
}


Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: De matriz de leds, a letrero electronico
« Respuesta #290 en: 14 de Mayo de 2010, 11:32:32 »
int matriz[matriz_num+1][size_matriz_col]={"\0"};  // por qué se inicializa con '0' ?
Para que no me muestre basura por la matriz al comienzo del programa.

#int_TIMER0
void  TIMER0_isr(void){

   ShowFila();                  //Mostremos la fila actual...
   Fila++;
   if(Fila==8){
      Fila=0;
      VSync=1;                         
      if(Inhibit!=0)            // no entiendo bien este if-else
         Inhibit--;
      else
         desplazar_izq();
  }
  else
     VSync=0;
}
Este If else sirve para mostrar una determinada cantidad de veces lo que el buffer tiene, para que posteriormente se desplaze el mensaje una posición, en mi caso muestro 5 veces el mismo cuadro y después desplazo, ese valor determinará la velocidad del desplazamiento, si se muestra muchos más cuadros obviamente el desplazamiento será más lento, y por el contrario mientras menos cuadros más rápido pasa el mensaje y a veces no se puede ni leer XD

Un cuadro para mi es la muestra de una pasada de todas las filas.

Saludos.
.

Desconectado fgaretto

  • PIC10
  • *
  • Mensajes: 33
    • Automatización y sistemas de control - Desarrollos con microcontroladores
Re: De matriz de leds, a letrero electronico
« Respuesta #291 en: 14 de Mayo de 2010, 11:44:59 »
Muchas gracias Cryn, qué velocidad de respuesta !!
Por último te pido, si es posible, que me explique aunque sea en pocas palabras esta función:
void desplazar_izq(void){
   int i,j,a;

   if(desplazos==8 || desplazos==0){
      load_letra(mensaje[msj][letra]);
      desplazos=0;
   }
   for(i=0;i<8;i++){
      for(j=0;j<6;j++){
         a=matriz[j];
         carries[j]=shift_left(&a,1,0);
         matriz[j]=a;
      }
      for(j=0;j<6;j++){
         if(j!=5)
            matriz[j]|=carries[j+1];
         else
            matriz[j]|=carries[0];
      }
   }
   Inhibit=5;
   desplazos++;
   if(desplazos==8){
      letra++;
      if(letra>msj_length[msj])
         letra=0;
   }
}



Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: De matriz de leds, a letrero electronico
« Respuesta #292 en: 14 de Mayo de 2010, 13:11:32 »
Código: C
  1. void desplazar_izq(void){
  2.    int i,j,a;
  3.  
  4.    if(desplazos==8 || desplazos==0){  //uso caracteres de 8x8, por tanto deberé cargar una nueva letra si ya se han hecho 8 desplazos o ninguno.
  5.       load_letra(mensaje[msj][letra]);  //cargo la nueva letra
  6.       desplazos=0;                           //restablezco el valos de desplazos
  7.    }
  8.    for(i=0;i<8;i++){  //este for desplaza un bit a la izquierda de mi buffer matriz de cada fila, la matriz es de 6x8, en hadware tenía un cartel 8x40,
  9. //con un buffer de 5x8 bastaba, pero el 6to apareció por ser uno temporal para ir cargando ahí el nuevo caracter
  10.       for(j=0;j<6;j++){
  11.          a=matriz[j][i];  se carga el primer byte en una variable temporal
  12.          carries[j]=shift_left(&a,1,0); //desplazo esa variable temporal un bit a la izquierda, y almaceno en valor desplazado en un arreglo.
  13.          matriz[j][i]=a; //guardo el nuevo valor de la variable temporal que esta desplazada, en la misma posición de antes
  14.       }
  15.       for(j=0;j<6;j++){  //coloco los carries donde corresponden
  16.          if(j!=5)
  17.             matriz[j][i]|=carries[j+1];
  18.          else
  19.             matriz[j][i]|=carries[0];
  20.       }
  21.    }
  22.    Inhibit=5;   //restablezco valor de Inhibit
  23.    desplazos++;  //incremento el valor de desplazos
  24.    if(desplazos==8){   //si se han hecho 8 desplazos
  25.       letra++;  //hay que pasar a mostrar la siguiente letra del mensaje
  26.       if(letra>msj_length[msj])   //si se ha llegado a la última letra
  27.          letra=0;     //se comienza desde la primera letra del mensaje
  28.    }
  29. }

Eso más o menos...
.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: De matriz de leds, a letrero electronico
« Respuesta #293 en: 14 de Mayo de 2010, 15:32:59 »
He creado a comenzar una librería para explicar y estandarizar un poco todo.

Está aquí: Librería Matríz de LEDs Universal[Compilador CCS]
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado fgaretto

  • PIC10
  • *
  • Mensajes: 33
    • Automatización y sistemas de control - Desarrollos con microcontroladores
Re: De matriz de leds, a letrero electronico
« Respuesta #294 en: 14 de Mayo de 2010, 18:05:18 »
Cryn, nuevamente gracias !
Estoy simulando tu código en proteus y me parece que algo tengo mal ya que el comportamiento no es el correcto.
Lo hice con un 16F628A ya que así lo tenía armado anteriormente.
Te adjunto los archivos por si podés darle una mirada.
Saludos.

Desconectado fgaretto

  • PIC10
  • *
  • Mensajes: 33
    • Automatización y sistemas de control - Desarrollos con microcontroladores
Re: De matriz de leds, a letrero electronico
« Respuesta #295 en: 14 de Mayo de 2010, 18:18:13 »
brunoF, espero ansioso ese tutorial

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: De matriz de leds, a letrero electronico
« Respuesta #296 en: 15 de Mayo de 2010, 11:07:04 »
Cryn, nuevamente gracias !
Estoy simulando tu código en proteus y me parece que algo tengo mal ya que el comportamiento no es el correcto.
Lo hice con un 16F628A ya que así lo tenía armado anteriormente.
Te adjunto los archivos por si podés darle una mirada.
Saludos.
Está casi todo OK, si cambias el orden de las matrices en tu esquema verás el mensaje desplazandose, la que está de 1ra a la izquierda la llevas al lado 1ro derecha, el 2izquierda será 2derecha y así sucesivamente..

Y una cosa más:
const int msj_length[num_msj]={31};
sirve para determinar el largo del mensaje, en tu caso deberías usar 4, en vez de 31. Esa parte la deje así porque ya no trabajé mucho sobre el cartel, pero podrías optimizar el código para que el programa sea el que cuente la cantidad de caracteres (strlen, por ejemplo de la librería string.h) o directamente buscar el caracter NULL para que se sepa que se ha terminado el mensaje.

Te adjunto el esquema modificado
.

Desconectado marturetjulio

  • PIC10
  • *
  • Mensajes: 44
Re: De matriz de leds, a letrero electronico
« Respuesta #297 en: 15 de Mayo de 2010, 23:05:57 »
hola amigos he intentado lo que me aconsejo cryn pero no entiendo como crear el otro buffer y ir rotando sobre el de verdad que lo intente de varias formas y nada...solo quiero aprender a rotar las letras estoy empleando un 4094 el cual emplea 3 pines para enviarle la data...bueno yo entiendo que primero se coloca el STROBE en bajo y el CLOCK Y EL DATO.. luego envio los primeros 8 bits al registro de desplazamiento y luego se coloca al STROBE en alto para que el registro los muestre en su salida...pero como hago ahora para rotar los valores de las columnas...yo entiendo que debo rotarlo para ver el desplazamiento pero no se como hacerlo en codigo...espero me puedan ayudar y  disculpen mi ignorancia...

este es el código que he realizado pero con su simulación...lo que hice fue colocarle otro contador para que no se corra hacia abajo la letra pero por fa que alguien me ayude a crear otro arreglo para rotar porque no entiendo como hacerlo

#include <18f452.h>
#fuses xt,nolvp,nowdt,noprotect
#use delay(clock=4000000)
#BYTE PORTB = 0x06
#BYTE PORTD = 0x08
#define DATA PIN_D1
#define CLOCK PIN_D0
#define STROBE PIN_D2

int   const letra[16]={0x3E,0X08, 0X08, 0X08, 0X08, 0X08,0X88,0x70,0X00, 0X7F, 0X80, 0X80, 0X80, 0X80, 0X7F, 0X00};
int desplazando[8];
int filas[8]={128,64,32,16,8,4,2,1};
//--------------------------------------------------
//Main----------------------------------------------
//--------------------------------------------------
int t;

// declaración de la función escribir_4094
void escribir_4094(int caracter);
// programa principal
void  main(){
   output_d(0x0);
   output_b(0x0);
   set_tris_d(0x0);
   set_tris_b(0x0);
  while(true){
     for(t=0;t<8;t++){
         escribir_4094(t);       
         delay_ms(3);
     }
   }
}
void escribir_4094(int caracter){
int contador2;
int contador_8;
for(contador2=0;contador2<8;contador2++){
   output_low(DATA);
   output_low(STROBE);
   output_low(CLOCK);
   for(contador_8=0;contador_8<8;contador_8++){
      output_bit(DATA,bit_test(letra[caracter],contador_8));
      output_high(CLOCK);
      delay_cycles(1);
      output_low(CLOCK); 
   }
   output_b(~filas[caracter]);
   output_low(CLOCK);
   output_high(STROBE);// transfiere los datos a las salidas del registro 4094
   delay_cycles(1);
   output_low(STROBE);
  }
}
Expeciencia es simplemente el nombre que le damos a nuestros errores!!!

Desconectado fgaretto

  • PIC10
  • *
  • Mensajes: 33
    • Automatización y sistemas de control - Desarrollos con microcontroladores
Re: De matriz de leds, a letrero electronico
« Respuesta #298 en: 17 de Mayo de 2010, 14:58:23 »
Cryn, era eso nomás, el orden de las matrices, muchas gracias.
Tengo pensado armar fisicamente una matriz de 8x24. Hace un tiempo compré leds de 5 mm de los comunes, tu qué opinas? utilizo esos leds o compro los que tienen mayor brillo ?
Con respecto al registro de desplzamiento, compro los 4094 o 595 ?
Es necesaria la utilización de los ULN2803 o 2003?
Saludos.
Fernando.

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: De matriz de leds, a letrero electronico
« Respuesta #299 en: 17 de Mayo de 2010, 16:24:12 »
hola amigos he intentado lo que me aconsejo cryn pero no entiendo como crear el otro buffer y ir rotando sobre el de verdad que lo intente de varias formas y nada...solo quiero aprender a rotar las letras estoy empleando un 4094 el cual emplea 3 pines para enviarle la data...bueno yo entiendo que primero se coloca el STROBE en bajo y el CLOCK Y EL DATO.. luego envio los primeros 8 bits al registro de desplazamiento y luego se coloca al STROBE en alto para que el registro los muestre en su salida...pero como hago ahora para rotar los valores de las columnas...yo entiendo que debo rotarlo para ver el desplazamiento pero no se como hacerlo en codigo...espero me puedan ayudar y  disculpen mi ignorancia...

este es el código que he realizado pero con su simulación...lo que hice fue colocarle otro contador para que no se corra hacia abajo la letra pero por fa que alguien me ayude a crear otro arreglo para rotar porque no entiendo como hacerlo
Hola marturetjulio, como te dije en el MP la idea del buffer es solamente por tener una copia, para poder manipular a gusto y placer los datos que se enviaran al cartel.


Cryn, era eso nomás, el orden de las matrices, muchas gracias.
Tengo pensado armar fisicamente una matriz de 8x24. Hace un tiempo compré leds de 5 mm de los comunes, tu qué opinas? utilizo esos leds o compro los que tienen mayor brillo ?
Con respecto al registro de desplzamiento, compro los 4094 o 595 ?
Es necesaria la utilización de los ULN2803 o 2003?
Dependerá del uso que le des, o mejor dicho del ambiente donde lo colocarás, si es para ambiente cerrado, quizá con los leds comunes no haya ningún problema, si más bien será para verlo en las afueras, con mucha luz solar, los led's de alto brillo serán los que seguramente darán un mejor rendimiento, aunque tengas leds de alto brillo casi siempre estarás a merced de ese brillo y a la vez el ángulo de visibilidad, lo que te obligará a hacer algunas pruebas para llegar al led adecuado.

Los 4094 son muy pobres en corriente, y por tanto en brillo para los leds y necesitan ayuda de los ULN2803
Los 74HC595 son muy buenos con corriente, prácticamente no hace falta usar ULN's.

Los ULN2003 y los ULN2803 difieren en pines, el 2003 tiene 7 salidas, el 2803 lleva 8. Después en características eléctricas son similares. Te conviene usar el 2803, porque para tu cartel solo usarías 3, en cambio si usas los 2003 necesitarás forzosamente 4 integrados, y quedarán pines sin uso.

Saludos
.


 

anything