(Ayuda) Extender entradas digitales arduino/pic MIDI

#1 por federicoib el 17/03/2013
Hola a todos, soy nuevo en el foro, pero tengo 5 años de experiencia con la electrónica y 2 con la programación en base C .

Hoy vengo a ustedes con la intención de preguntarles como hacer para trabajar con arduino o pic y extender las entradas con mux.

Estuve leyendo y encontraba siempre lo mismo sobre el 4051 "el máximo de entradas que pueden estar activas al mismo tiempo es una" .

Lo que estoy queriendo armarme es un controlador tipo "Novation Launchpad" con algunos pots. Mas adelante quisiera armarme un mixer tipo dj, pero por lo pronto estaría satisfecho con el controlador, ya que la programación para ambos es mas o menos la misma.

Resumiendo: Será que alguien me podría explicar como usar los mux para tener varias entradas encendidas al mismo tiempo? Y en el caso de que no se pueda, como trabajar con SPI por PIC y MIDI, ya que no estoy muy ducho en el tema.

Muchísimas gracias por leer, y a los que respondan, por interesarse!
Subir
#2 por mustang64 el 17/03/2013
Hola federicoib,
El truco del mux está en multiplexar muy rápido, así parece que lees varias cosas a la vez.
Un ciclo de multiplexación de 16 entradas (74HC4067) tarda menos de 10 ms.

Lo propio es hacer un bucle para leer las entradas del mux, guardar los valores y después de leer, hacer las operaciones. Cuantas más operaciones, más tardarás en hacer el siguiente bucle de lectura del mux.

En internet hay un montón de ejemplos. Basta con ir poniendo los valores correctos en S0, S1 y S2 y leer del pin.

Saludos.

M64.
Subir
#3 por antiworldx el 17/03/2013
Parecido como cuando haces el scancode de un teclado matricial :)
Subir
#4 por miscoes el 17/03/2013
Hay unos multiplexores de Microchip por I2C que con dos pines (los del puerto I2C) te controlan dieciseis pines de entrada y salida con generacion de interrupcion. Al ser I2C puedes poner unos cuantos en el bus y tambien multiplexzr con ellos.

Yo los uso con frecuencia porque me permiten gestionar un monton de entradas y cambiar de microcontrolador a modelos con menos pines. Ahora no lo tengo a mano pero si quieres mandame un privado para que no me despiste y te paso esquemas y codigo en CCS C para gestionarlos.

Otra ventaja es que pueden estar lejs del microcontrolador y solo tienes que llevar dos hilos mas los dos de alimentacion.
Subir
#5 por federicoib el 17/03/2013
Muchas gracias por contestar! estuve viendo en la pagina de arduino playground algo referido al tema, que dice como montar dos 4051 (uno como mux y el otro como demux) para controlar una matriz de 8x8 botones, con 2 pines análogos y 6 digitales. Abajo les dejo el link, y el link de la imagen ampliada:

Arduino playground 4051: http://playground.arduino.cc/learning/4051

Ejemplo 4051 ampliado: http://tomekness.files.wordpress.com/2007/05/4051_examples_72dpi.jpg

Poseo una placa arduino uno r3, se me olvido poner arriba :desdentado:

Me pareció muy interesante lo que decía miscoes sobre la comunicación I2c, que tengo entendido que es parecido a trabajar con SPI. Así que te estaré mandando mensajes privados para aprender mas del tema.

Alguien escribió:
Hay unos multiplexores de Microchip por I2C que con dos pines (los del puerto I2C) te controlan dieciseis pines de entrada y salida con generación de interrupción. Al ser I2C puedes poner unos cuantos en el bus y también multiplexar con ellos.


Tambien busqué sobre lo que decia M64 y encontre algo interesante, es una pagina que explica como multiplexar las entradas analógicas del arduino, les dejo el link:

http://bildr.org/2011/02/cd74hc4067-arduino/

Muchisimas gracias a todos! Saludos.
Subir
#6 por federicoib el 17/03/2013
Ire aportando toda la información que encuentre, así también ayudamos a otro que quiera armar proyectos similares!!

Saludos.
Subir
#7 por miscoes el 18/03/2013
Allá va...

Expansores de puertos I2C con el MCP23017 de Microchip.

Los conectas como en la imagen adjunta (Proteus-MCP...) y pones tantos como necesites. A cada uno le asignas una dirección con A0, A1 y A2 (a masa o a VCC) ya ves que hay un montón de combinaciones...

Recuerda poner siempre las resistencias de pull-up en SDA y SCL, en caso contrario se va la comunicación I2C al cuerno.

Verás que cada expansor tiene dos puertos y puedes utilizarlos como entrada o salida. Lo ideal es que los multiplexes tambien haciendo una parrilla. Mandas, por ejemplo el puerto A a las horizontales y el B a las verticales. En cada intersección pones un led o bien un switch segun quieras usarlos para salida o entrada.

En la imagen se adivina esta matriz. Uso el multiplexor que se ve para los dos contactos de un switch y el punto común va a otro multiplexor que está a la derecha y no aparece en la imagen.
En este caso concreto es el circuito de la lectura de un teclado midi con detección de velocidad de pulsación.

Ahora vamos con el código.

En la imagen "CCS-C-Inicializacións" puedes ver unas constantes definiendo las direcciones de los multiplexores y la direccion interna de los puertos dentro de cada multiplexor.
Posteriormente aparece el código que inicializa uno de ellos como entradas y otro como salidas (recuerda que cada uno tiene dos puertos que cada puerto puede ser de entrada o salida. En este caso cada uno de los muxes hace solo una función, uno entradas y otro salidas)

La mayoría de los delays son innecesarios con hardware real y en el código de producción van comentados pero los he dejado para que pueda simular sin quedarse frito en el Proteus.

En las dos imágenes restantes puedes ver la escritura en el mux de direccionamiento de "filas" y la lectura de las teclas pulsadas.

Verás que la función que "escribe" en el multiplexor de salida permite activar independientemente cada pin en cualquiera de los dos puertos. Utilízala tal y como está y te ahorras trabajo.

La función de lectura lee de golpe todo el puerto que le pidas en el mux que le pidas. No lee pin a pin. Si quieres lectura pin a pin puedes hacer luego un shifting del octeto y comprobarlo con una máscara o utilizar el método que prefieras.

No aparece en este código pero si repites la lectura, algo como:

i2c_write( iEXPANSOR + 1 ); // Enderezo + 1 para facela lectura.
delay_us(20);

iLecturaTeclado = i2c_read(); // Lectura do rexistro.
delay_us(20);

iLecturaTeclado = i2c_read(); // Lectura do rexistro.
delay_us(20);


puedes leer los dos ports de uno multiplexor sin tener que direccionarlos de nuevo. Te ahorras trabajo y tráfico en el bus I2C

Creo que los comentarios, a pesar de estar en galego que es en lo que funciona mi cerebro, son suficientes para comprender el código.
Está funcionando con un 18f4550 a 20 Mhz sin ningún tipo de problema, además de correr bien en Proteus (que, afortunadamente, tiene simulados la mayoría de los PIC y tambien el expansor...)

Un saludo y a disfrutarlo.
Archivos adjuntos:
CCS-C-inicializacions.jpg
BBCode:
CCS-C-Escribir-multiplexor.jpg
BBCode:
CCS-C-Ler-multiplexor.jpg
BBCode:
Proteus-MCP23017.jpg
BBCode:
Subir
#8 por miscoes el 18/03/2013
Brrrrrrr...

Vaya tochazo me he marcado.

Mejor cógete el código, lo utilizas tal y como está y no te complicas. Con los comentarios creo que será suficiente.

Adjunto tambien una de las "ramas" de la matriz de multiplexado. Recuerda que hacemos la lectura de las teclas (cada uno de los switches) en reposo y tambien en pulsación para poder detectar cuanto ha tardado en pulsarse y poder calcular la velocidad.

El resto de las ramas son iguales. Si quieres simularlo en Proteus recuerda que puedes asignar a cada uno de los switches el tiempo que tarda en cambiar de un estado a otro.

En tu caso probablemente no compruebes velocidad de pulsación pero si lo necesitas es relativamente fácil de hacer.
Archivos adjuntos:
Proteus-Maqueta-Mux.jpg
BBCode:
Subir
#9 por federicoib el 19/03/2013
Miscoes, estuve viendo, y en argentina (soy argentino :desdentado:) no venden el expansor de i/o MCP23017. Se podría utilizar otro pic como dispositivo esclavo del primero con la configuración i2c ? digo para tener varios pic, como receptores de las señales de los pulsadores y/o potes?

Muchísimas gracias por todos los datos que adjuntaste! me ayudaron a entender algo como se trabaja en i2c.

Cordiales saludos.
Subir
#10 por miscoes el 20/03/2013
Entonces puedes multiplexar con un 138, por ejemplo, al modo convencional.

Mírate esta página que te da la idea básica

http://home.roadrunner.com/~jgglatt/hardware/key.htm

Poniendo valores en las patas A, B y C del 138 direccionas 8 salidas que multiplicadas por las 8 entradas del pic ya son 64 entradas independientes.

Si pones otro 138 y usas las entradas de ENABLE ( G1, G2A, G2B ) puedes usar algun pin que te quede libre para activarlo (y desactivar el primero, para eso tienes entradas de enable invertidas y otra si invertir)
De ese modo tendrías ya 128 entradas.

Y así hasta el aburrimiento.
Subir
#11 por federicoib el 20/03/2013
Perfecto! Algo así era lo que estaba buscando, la verdad un crack miscoes! Muchisimas gracias, luego subire los pasos para el armado del controlador!
Subir
1
#12 por miscoes el 21/03/2013
Lo tienes casi todo resuelto aqui:

http://www.scribd.com/doc/75887934/Progetto-di-un-a-tastiera

Y en los archivos adjuntos.

Pero yo no he sido...
Subir
#13 por federicoib el 21/03/2013
No puedo abrir el pdf, me pide cuenta premium en scribd! :(
Subir
#14 por miscoes el 21/03/2013
Te va todo lo necesario en los adjuntos
Subir
#15 por federicoib el 22/03/2013
Estuve buscando muchísimo en esta pagina sobre lo que quería hacer, y lo encontré. Si bien no se puede modificar mucho las entradas, salidas etc, pero son geniales las cantidades de cosas que se pueden hacer con un par de PICs y algunos mux, sin utilizar protocolos de comunicación ni nada.

Ucapps

Tienen un foro, una wiki y demás cosas que se encuentran a la izquierda de la pagina, en el foro hay sub foros para todo lo que se quiera hacer con MIOS (Sistema operativo midi para pic, que es con el cual trabaja el midibox).

Dicho sea de paso, también les dejo una tesis sobre MIDI , que explica todo lo que tenga que ver con el, y esta basado en un MidiBox para el que lo necesite, aquí les dejo:

Tesis MIDI

Muchisimas gracias por todos los aportes, y espero que a alguien le sirva toda esta info! Cuando ponga manos a la obra, iré subiendo fotos, ya que por el momento no poseo de lo mas importante, DINERO. :juas:
Subir
Respuesta rápida

Regístrate o para poder postear en este hilo