Necesito alguien que sepa electrónica

Started by Yawin, February 07, 2011, 10:52:29 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Yawin

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.

Sigue el desarrollo de mi motor RPG: https://www.youtube.com/watch?v=TbsDq3RHU7g

process main()
       begin
           loop
               pedo();
               frame;
            end
       end


SplinterGU

Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Yawin

Mola, aunque como todavía tengo mucho que aprender sobre todos estos temas, croe que quiero seguir intentando hacerme mi matriz de leds xD
Sigue el desarrollo de mi motor RPG: https://www.youtube.com/watch?v=TbsDq3RHU7g

process main()
       begin
           loop
               pedo();
               frame;
            end
       end

Drumpi

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).
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Yawin

Pues, la verdad, no me he enterado de mucho. Tendré que leerlo más lentamente xD
Sigue el desarrollo de mi motor RPG: https://www.youtube.com/watch?v=TbsDq3RHU7g

process main()
       begin
           loop
               pedo();
               frame;
            end
       end

Drumpi

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.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Yawin

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?
Sigue el desarrollo de mi motor RPG: https://www.youtube.com/watch?v=TbsDq3RHU7g

process main()
       begin
           loop
               pedo();
               frame;
            end
       end

Drumpi

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.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Yawin

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.
Sigue el desarrollo de mi motor RPG: https://www.youtube.com/watch?v=TbsDq3RHU7g

process main()
       begin
           loop
               pedo();
               frame;
            end
       end

Drumpi

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).
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

SplinterGU

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.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Yawin

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.
Sigue el desarrollo de mi motor RPG: https://www.youtube.com/watch?v=TbsDq3RHU7g

process main()
       begin
           loop
               pedo();
               frame;
            end
       end

Drumpi

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.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

SplinterGU

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.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2