Lo pongo aquí, porque en la sección de ayuda sobraría.
Bueno, la cosa es que me estoy diseñando una pantalla de leds de 6x6 (primero empiezo por algo pequeñito. Bien, la cosa es que tengo únicamente 13 salidas (que se pueden configurar también como entrada) y una toma de tierra. Con estas cosas, no se cómo montarmelo para que funcione como si fiese una pantalla. Este es el esquema que he diseñado, pero no me va bien porque no me permitiría hacer, entre otras cosas, diagonales.
mira esto
http://www.youtube.com/watch?v=BJnjYCqKCLM&feature=related
http://www.youtube.com/watch?v=egckHLFJBpc&feature=related
http://www.watterott.com/en/Arduino-S65-Shield
Mola, aunque como todavía tengo mucho que aprender sobre todos estos temas, croe que quiero seguir intentando hacerme mi matriz de leds xD
Emmmm, pues no sé que quieres que te diga, pero ese esquema no te va a funcionar, salvo que lo que intentes es iluminar sólo un led.
Un led es como una bombilla, pero tienes que prestar atención al + y al - de la pila. Si lo que intentas es conectar entre sí cada fila en un terminal, y lo mismo con columnas con otro terminal, en cuanto intentes encender dos leds se te iluminarán 4.
Lo que tienes que hacer es unir todos los terminales de masa, y luego tener un terminal por cada led que haya en la matriz, en tu caso, 6x6=36 terminales sin contar el de tierra.
Pero no te desanimes porque eso tiene fácil solución: si sólo dispones de 13 salidas, puedes usar unos circuitos integrados adicionales que te simplificarán la lógica. Uno de ellos es un decodificador, hay de varios tipos: 2-4, 3-8 o 4-16 son los más comunes. Supongo que te imaginas el funcionamiento, pero si no, básicamente por la entrada metes un valor binario y obtienes tensión en una única salida. El valor binario lo introduces usando 0v para el 0 lógico, y la tensión de alimentación para el 1.
Otro método es usar registros: son unos componentes que almacenan un dato, y si conectas varios en serie sólo necesitas dos líneas para introducir los datos: una que se irá poninendo alternativamente a 1 y a 0 para que vayan pasando los datos, y otra con el valor. Es un sistema algo más complejo, y debo tener por ahí la documentación de una práctica en la que lo llevé a cabo (esquemas eléctricos y el ASM del 68000).
La otra opción es que sólo se ilumine un led cada vez usando el sistema que propones inicialmente. Es el sistema que se usa en las calculadoras, y es que en cada ciclo de reloj sólo se enciende uno de los leds, pero hay tantos ciclos por segundo que el ojo humano no es capaz de percibir esos cambios tan rápidos. Creo que existen controladores de este tipo, pero eso requiere una búsqueda más específica.
El primer método es el más sencillo, y hay algunos integrados que se pueden conectar en cascada (no olvides poner a cero las entradas que no uses) de forma que con 6 terminales tendrás más que de sobra. El segundo es el que recomiendo, expansible hasta el infinito y bastante barato, aunque te toca hacer una función que se encargue de enviar los datos uno a uno (no es difícil). El tercero es lo ideal, pero no sé dónde puedes encontrar este tipo de controladores, ni si te van a servir ni cuanto te van a costar.
Eso sí, ten en cuenta que puedes usar lógica positiva o negativa para la matriz de leds: lógica positiva significa que tienes un terminal comun conectado a masa y cada led se enciende con una tensión positiva, y la negativa es que tienes el terminal común conectado a tensión positiva y los leds se activan con una tensión cero. No hay ninguna pega en hacerlo de una forma o de otra, lo recomendable es usar lógica negativa por temas de potencia que no voy a explicar (si no quieres), pero para los novatos, la lógica positiva es la más sencilla.
Espero que te sirva de guía y no haberme puesto demasiado técnico. Si aun quieres la práctica, dímelo que la tengo que buscar (no sé dónde anda ^^U).
Pues, la verdad, no me he enterado de mucho. Tendré que leerlo más lentamente xD
Bueno, pues si no entiendes algo me lo preguntas y trataré de ser más claro. No te puedo dar un curso intensivo de electrónica digital en un hilo del foro ^^U
Lo que tienes que tener claro es que hay varias formas, y más o menos cómo son. Entenderlo ya es algo más complicado, pero vamos, que el primer método es el mejor si eres novato, el de los decodificadores, sobre todo si no necesitas usar más salidas del dispositivo.
Vale, he estado leyendo. A ver, por un lado, acabo de ver que para lo que quiero, de esas 13 salidas sólo puedo emplear 5 (porque son las que puedo emplear para hacer fade). La segunda opción es la que creo que me va a resultar mejor, pero no la entiendo xD
Por otro lado, un amigo me ha recomendado emplear un demultiplexor o algo asi. No he entendido ni papa en la wikipedia (he entendido que es algo asi como un switch). ¿Crées que es una buena opción?
Un demultiplexor, o DEMUX, en un circuito que tiene tres partes: una entrada, varias salidas y unas entradas de control. Básicamente es como un interruptor de varias posiciones:
Tomaremos como ejemplo un DEMUX 1-4: esto significa que tiene una entrada y 4 salidas, por lo que tiene dos líneas de control. Según la combinación de las señales en estos dos terminales de control, tendremos el valor de entrada en una de las 4 salidas ¿Cómo se selecciona la salida? usando números binarios: con dos bits (dos líneas de control) podemos representar 4 números (cuatro salidas), desde el 00 (ambas con 0V) hasta la 11 (ambas con 5V, por ejemplo):
control1 control0 Puerto de salida
0 0 --> 1
0 1 --> 2
1 0 --> 3
1 1 --> 4
Supongo que tienes alguna noción de electrónica digital ¿no? Sabes que el 1 se representa con una tensión y el 0 con 0V ¿no? porque si no sabes eso, mal vamos.
Es más, supongo que sabes algo de álgebra binaria ¿o tampoco? porque entonces empieza a buscarte algunos tutoriales porque me parece que estás corriendo muchísimo :D
Si tienes nociones, pues te busco la práctica y te la pongo para que le eches un vistazo. Lo que no puedo es hacerte el esquema eléctrico completo, más que nada, por falta de tiempo ^^U
PD: se me olvidaba, con este dispositivo, el DEMUX, estás en las mismas, sólo puedes activar un único led cada vez, por lo tanto sólo sirve para el tercer caso: representar un único led en cada ciclo a mucha velocidad. No sería mala idea usarlo, pero como tienes 36 leds, necesitas uno de 1-64 (que usaría 5 lineas para indicar el led en el que se va a actura, y otro para decir si está encendido o apagado) o dos de 1-32, o cuatro de 1-16, pero luego tienes que añadir unos componentes más (se puede solucionar poniendo unos cuantos en cascada).
Dime los que puedes conseguir y te dibujo el esquema, que eso sí es sencillo, pero luego tienes que estar enviando los datos todo el tiempo.
Pero si con el demux sólo puedo tener un led encendido a cada vez, necesito otra cosa. xD
Algebra binaria... se supone que si, lo dí en una asignatura. Y si, he leido cosas sobre electrónica digital.
Como te he dicho, puedes tener un led encendido cada vez, pero si cambias de led unas 400 veces por segundo, la impresión que te da es que hay más de uno encendido ;)
Ya te digo: en las calculadoras, sólo se ve uno de los trozos negros de los números por cada ciclo, pero va tan rápido que parece que están todos "encendidos", si no espera a que le gasten las pilas, notarás un ligero parpadeo (y si te fijas bien, parece que hay un ligero barrido de un lado a otro).
Quote from: Drumpi on February 10, 2011, 01:55:27 AM
Como te he dicho, puedes tener un led encendido cada vez, pero si cambias de led unas 400 veces por segundo, la impresión que te da es que hay más de uno encendido ;)
Ya te digo: en las calculadoras, sólo se ve uno de los trozos negros de los números por cada ciclo, pero va tan rápido que parece que están todos "encendidos", si no espera a que le gasten las pilas, notarás un ligero parpadeo (y si te fijas bien, parece que hay un ligero barrido de un lado a otro).
exacto.
yawin, en el caso del bicho en cuestion vos tenes el led prendido porque el firm esta mandando un OUT constantemente, o sea, en un cartel luminoso, un led no queda prendido porque vos le mandas un estado de prenderte, tenes que mantener el estado en el tiempo, enviando constantemente OUT a modo de BARRIDO, y de esta forma, vos podes mantener muchos LED prendidos "a la vez", aunque realmente no es a la vez, pero como lo haces a mucha velocidad da la sensacion de que si estan.
esto lo se, porque yo hice el firm de los carteles luminosos del senado de la nacion argentina, y tenia que hacer eso, no se si aun mantienen esos carteles o ya pusieron unos mas nuevos.
Ahora tengo que aprender cómo programar multiproceso en c, porque mi idea es:
-En un proceso, tener lo que podríamos llamar el video que se va a mostrar. La animación. La idea sería que este va guardando en una matriz el estado en el que tiene que estar cada led.
-En otro proceso voy "refrescando" el estado de los leds conforme a la matriz y conforme la forma de ir encendiéndolos y apagándolos.
Depende de en qué estés programando.
Normalmente los microcontroladores traen un timer programable, que generan una excepción al llegar a cero (una señal, para entendernos). En el código se puede crear una función específica para esa excepción que podría ser perfectamente la del refresco de la matriz de leds, y una vez que acaba, el programa sigue por donde iba de forma transparente.
En los procesadores normales no sé si hay algo similar, pero sí con los SO, dado que los programas pueden mandarse señales de forma similar (al menos en Linux).
Si no, puedes llamar al proceso refrescar a cada "frame" :D (en esto ya no estoy tan seguro de como iría, porque entre refresco y refresco tiene que operar, y ese intervalo de tiempo se podría notar en la imagen).
Si no, siempre puedes usar el tema de los registros que te mencioné, de forma que sólo tienes que enviar los datos cuando haya cambios. Estaba esperando a que me lo pidieses para buscarlo, pero veo que es mejor que lo haga ya ^^U
Y creo que tambien venden matrices de leds con buffer de memoria, que hace el barrido luminoso de forma automática, pero como digo, son específicos (en tamaño) y pueden ser algo caros.
Quote from: Drumpi on February 11, 2011, 02:45:11 AM
Depende de en qué estés programando.
Normalmente los microcontroladores traen un timer programable, que generan una excepción al llegar a cero (una señal, para entendernos). En el código se puede crear una función específica para esa excepción que podría ser perfectamente la del refresco de la matriz de leds, y una vez que acaba, el programa sigue por donde iba de forma transparente.
En los procesadores normales no sé si hay algo similar, pero sí con los SO, dado que los programas pueden mandarse señales de forma similar (al menos en Linux).
Si no, puedes llamar al proceso refrescar a cada "frame" :D (en esto ya no estoy tan seguro de como iría, porque entre refresco y refresco tiene que operar, y ese intervalo de tiempo se podría notar en la imagen).
Si no, siempre puedes usar el tema de los registros que te mencioné, de forma que sólo tienes que enviar los datos cuando haya cambios. Estaba esperando a que me lo pidieses para buscarlo, pero veo que es mejor que lo haga ya ^^U
Y creo que tambien venden matrices de leds con buffer de memoria, que hace el barrido luminoso de forma automática, pero como digo, son específicos (en tamaño) y pueden ser algo caros.
claro, interrupciones de hardware... pero va a tener que programarlo desde asm... aunque tambien seguro puede desde C... lo ideal seria que se arme un driver para luego poder usarlo desde cualquier aplicacion.
A ver:
Ya se que existen matrices de leds ya hechas. Pero lo bonito es hacerla yo xD
Por otro lado, un amigo que hace ingeniería electrónica me dijo que soportaban multitarea. Si es así, no entiendo para qué es lo que tu dices xD
Es que aun no has dicho sobre qué estás programando ¿es un PC? ¿una BeagleBoard? ¿una placa con microcontrolador? ¿una consola? ¿una consola DIY? ¿una calculadora?...
Aun no he encontrado la práctica, pero sí la primera mitad, en plan borrador, donde se habla de eso (lo pongo adjunto).
Lo que usábamos eran "shift registers", que van desplazando los datos que le llegan por la entrada por cada ciclo de reloj. No da muchas pistas la práctica, pero es un comienzo, a ver si encuentro la final.
Quote from: Drumpi on February 11, 2011, 09:11:34 PM
Es que aun no has dicho sobre qué estás programando ¿es un PC? ¿una BeagleBoard? ¿una placa con microcontrolador? ¿una consola? ¿una consola DIY? ¿una calculadora?...
Aun no he encontrado la práctica, pero sí la primera mitad, en plan borrador, donde se habla de eso (lo pongo adjunto).
Lo que usábamos eran "shift registers", que van desplazando los datos que le llegan por la entrada por cada ciclo de reloj. No da muchas pistas la práctica, pero es un comienzo, a ver si encuentro la final.
si lo ha dicho (en otro hilo)... arduino...
Estoy programando una placa Arduino Uno.
Bueno, pues hoy me he puesto con un poco de copia de copias de seguridad y he encontrado la memoria completa. Sé que es posible que sea muy densa, pero vienen los esquemas completos.
En concreto, el que buscas, yawin, se encuentra en la página 11 (si no he contado mal), y lo que necesitas es ver la mitad inferior, o sea, todo lo que hay conectado a la VIA1 hacia abajo (verás las dos salidas, una hacia el reloj de todos los integrados, y la otra a la entrada del primer shift register, y cómo se conectan estos entre si).
El array de leds no tiene mucho misterio: debes conectar el cátodo de todos los LEDs a masa, y cada uno de ellos a una salida de los shift registers (suponiendo que 1 sea activo y 0 inactivo, si no tendrás que hacerlo al revés).
Por cierto, pensaba que Arduino era esa consola que te montabas tu a piezas, pero veo que no, que sólo es una placa de desarrollo muy simple, así que no te tienes que comer mucho la cabeza ;)
Muchas gracias. Le echaré un vistazo en cuanto pueda.
De momento, toma karma. Te lo mereces ^__^
Lo que me merecía era una matrícula con esta práctica, mi compañero y yo, porque encima fuimos 2 los que la hicimos (lo normal era hacerla entre 4), y le metimos tantas mejoras que el ordenador sólo servía para arrancar :D
Pero como otro grupo metió la DUART (un periférico del 68000, que no era obligatorio usar, pero sí para dicha nota), pues se la dieron a ellos y no a nosotros, pese a que les dábamos mil vueltas y más :D (juer, sólo en tamaño de tablero los cuadruplicábamos :P).
Lo más cerca que estuve nunca de la mejor nota posible en la carrera ;D
Nah, espero que se sirva, y si programas en ASM, lo mismo el código hasta te puede ayudar.
xD Me encantaría programar en ASM, pero no tengo ni idea ni de como va