Controlador MIDI de 8 canales por Juanda Rodríguez


Publicado el sáb 11 noviembre 2017 por Juanda Rodríguez
Categoría: electronica

Etiquetas: arduino electrónica midi kicad


Hace unas semanas un colega me contó que tenía en mente construir un controlador MIDI de 8 canales con 1 fadder, 3 potenciometros (knobs) y un pulsador por canal, y me preguntó si podría usarse un Arduino para hacerlo. Inmediatamente le dije que sí, aunque en ese momento no sabía cómo.

Indagando un poco en la red encontré todo tipo de tutoriales que enseñaban como hacer un controlador MIDI, lo que no encontré es como hacer el que concretamente tenía en mente mi colega con 8 canales y todos esos fadders y knobs. Así que pensé que sería un buen ejercicio para continuar con mi aprendizaje en diseño de PCB's con KiCad y con las posibilidades de esta fabulosa placa de desarrollo que es Arduino. Así que me puse manos a la obra y este artículo es el resultado.

Si únicamente tuviesemos que implementar un canal, la electrónica sería muy sencilla; basta llevar el pin que hace de divisor de tensión en cada uno de los potenciometros a una entrada analógica de Arduino y el pulsador a una digital, tal y como se muestra en el siguiente esquema.

Las etiquetas P0_X van a las entradas de Arduino AX, con X = 0, 1, 2, 3.

Después habría que desarrollar el software que convierta la lectura de esas entradas en los códigos MIDI adecuados siguiendo las normas de dicho protocolo. Para eso he visto que hay varias librerías que me facilitarán la vida:

Y seguro que habrá más, pero he decidido atacar la parte software posteriormente. Por lo que he visto en una lectura rápida de esas librerías, todas ofrecen funciones de alto nivel para enviar notas y comandos MIDI, así que bastará leer las entradas donde hayamos conectado los mandos y, en función de su valor, enviar los comandos MIDI adecuados.

Por experiencia en bastantes proyectos, ya sé que estoy pecando de optimista y cuando le hinque el diente al software me encontraré con algún que otro problema. Para empezar tengo que estudiar el protocolo MIDI con detalle. Pero por lo pronto me mantendré optimista y aplicaré la ingenuidad que dice mi jefe cuando se habla de la parte de desarrollo: "eso es una tontería". Así podré centrarme completamente en la electrónica.

El tema es que queremos tener 8 grupos de mandos como el mostrado en la imagen anterior, y el número de entradas analógicas se nos acaba; tenemos 6 para el Arduino UNO y 8 en el nano, y si hacemos la multiplicación comprobamos que necesitamos 8 x 4 = 32. Así que nos faltan unas pocas.

Afortunadamente con los pulsadores no tenemos ese problema, pues solo necesitamos 8 al tener 1 por canal.

La solución a este problema se encuentra también a golpe de google. Y si se ha estudiado algo de electrónica vendrá a la mente de inmediato el palabro multiplexor analógico.

Este chisme coloca en uno de sus pines, el pin común, la señal aplicada en una de sus N entradas, la que nos venga bien que elegimos usando sus M pines de selección. También funciona a la inversa, las entradas se convierten en salidas y el pin común en entrada.

Uno de los multiplexores analógicos que más he visto en las búsquedas que he realizado junto con la palabra Arduino es el 4051. Tiene 8 pines de entrada/salida, 1 pin común de salida/entrada y 3 de selección (para poder seleccionar uno de los 8 pines I/O), 3 para la alimentación y 1 de inhibición.

Usando 4 de estos multiplexores tenemos la cuenta cuadrada para hacer llegar las 32 entradas al Arduino. El pin común de cada uno de los multiplexores se conectará a una entrada analógica (de la A0 a la A3), y los potenciometros homólogos de cada canal se conectarán al mismo multiplexor. El siguiente esquema muestra la organización. Solo se muestra 1 canal y 1 multiplexor por que la imagen completa quedaba demasiado extensa. En realidad hay 3 multiplexores y 7 canales más:

Y en la siguiente imagen mostramos el pinout de Arduino y como queda conectado a los multiplexores y a los pulsadores.

Y en lo que a esquemático se refiere el problema está resuelto.

Ahora toca descender al nivel físico y pensar como conectar ese montón de conexiones, que en el esquemático se han reducido drásticamente mediante el uso de etiquetas, en una PCB.

Quería que la placa se acople al zocalo de pines del Arduino UNO directamente, como cualquier otro shield. Por otro lado, no todos los componentes irán en placa; todos los mandos y botones irán en panel, pero me gustaría que la conexión de estos mandos a la placa se haga fácilmente mediante conectores simples (header pins), del mismo tipo que usaremos para conectar la placa al Arduino:

Y con esos requisitos pasé al diseño de la PCB con KiCad y a continuar mi aprendizaje en estos menesteres. También me propuse no utilizar la función autoroute para ser más consciente de los problemas que aparecen cuando se realiza este trabajo y adquirir más experiencia.

Lo primero que hice fue un símbolo y una huella para el pinout del Arduino UNO y los añadí a la librería de símbolos y huellas del proyecto. Después pensé en que cada potenciómetro tuviera 3 pines juntos y que se enchufará a la placa en un zócalo de 3 pines, y lo mismo con los botones pero con dos pines. Creo que es la manera más cómoda de enchufar a la placa los mandos del panel. A pesar de que la placa es de dos caras, con esta forma de conectar los mandos, por más vueltas que le dí no conseguí enrutar todas las conexiones.

Así que pense en otra forma de conectarlos que facilitara el enrutamiento. La siguiente idea fue colocar en la placa dos bloques de pines, uno para todos las conexiones a tierra y otro para todas las conexiones a +5V de los potenciometros. Aunque esto implica que ya no podemos conectar de "un tirón" cada potenciometro a la placa, ya que hay que enchufar cada uno de sus pines en distintas partes de la placa, me decidí por esta opción para ver si realmente facilitaba el enrutado. Y sí que lo facilitaba; de esta manera lo conseguí.

No estoy del todo satisfecho pues me hubiera gustado que cada mando se enchufara a la placa en un solo paso, así que dejo pendiente esa mejora de la placa para cuando tenga más experiencia.

Por último he colocado un plano de tierra en una de las caras de la placa y un plano de +5V en la otra. Aún no tengo claro si colocar dos planos con distintas tensiones en cada cara de la placa es apropiado o no. Tengo como asignatura pendiente el estudio de la EMC (Electromagnetic Compliance, compatibilidad electromagnética) para el diseño de PCB. Así que mientras no tenga una razón para no colocar dichos planos, así se quedará.

El resultado final lo he colocado en este repositorio de github: https://github.com/20khzdesign/midicontroller8channels, así que si alguien se anima a construirlo, mejorarlo, indicarme fallos, sugerirme mejoras, etcétera, pues le estaré muy agradecido.

Aún queda por desarrollar el software. Habrá que seguir estudiando!