Controlador MIDI para Davinci Resolve

Hola a todos! Quería hablaros un poco del proyecto que estoy intentando hacer y si puede ser, que opinéis sobre él, ya que toda ayuda es bienvenida, y más cuando estás empezando :D.

Hace una semana descubrí el mundo de Arduino y la verdad es que me he enganchado a las posibilidades que ofrece. Me estoy empapando de información sobre Arduino a raíz del proyecto que quiero hacer.

Os introduzco un poco. Davinci Resolve es un software de color muy utilizado en producciones audiovisuales. Como todo, existen controladores externos para manejarlo de manera más cómoda y rápida, pero la verdad es que valen una pasta.


Este modelo, que es el más básico, ronda los 1200€. Viendo esto, me propuse hacer un panel que enviase señales de alguna manera para que Davinci las interpretase. Todo esto sin tener muy claro como funciona Arduino.

Buscando información encontré otro post en un foro de un chico que hizo algo que para mí es lo ideal. Os dejo un enlace al foro que incluye fotos y la explicación de como lo hizo, la verdad es una gozada.

En resumen: 3 trackballs, un montón de encoders, un LCD y una botonera externa, todo conectado en un Teeny. Como no es una consola oficial, Davinci no la reconoce, y este chico se aplicó un truco que realmente tiene potencial. Utilizó ControllerMate (un programa de mac) para mapear las señales MIDI que llegan desde la consola y hacer determinadas cosas como mover el ratón en una dirección. En este vídeo se ve muy bien el funcionamiento. El diseño de la consola es ideal, y decidí copiar el número de botones y encoders.

El resumen del proyecto es el siguiente:

  • Crear una matriz de 7x8 botones en un lateral.
  • Crear otra matriz de 13 encoders en el otro lateral.
  • Conectar un LCD.
  • Conectar 3 trackballs y que funcionen como dispositivos independientes.
  • Que todas estas señales se conviertan en MIDI antes de salir de Arduino.
  • Que las señales MIDI que llegan al PC sean interpretadas por AutoHotkey (como ControllerMate pero en Windows) para realizar determinados atajos o combinaciones de ratón.

En todo esto voy avanzando poco a poco, pero me surgen varias dudas en cuanto al conexionado. En el siguiente post os explico un poco el "prototipo" (por llamarlo de alguna manera) en el que he estado cacharreando.

Seguimos con el proyecto!

Para el panel mi idea es utilizar lo siguiente:

  • Arduino Pro Micro (por la compatibilidad HID, el precio y el tamaño)
  • 3 MCP23017. Un microprocesador que permite conectar 16 entradas y salidas al arduino por SDA y SCL (aunque esto aún no pude probarlo).
  • 56 botones CherryMX para darle un tacto duro al teclado.
  • 13 encoders rotatorios con pulsador.
  • 1 LCD 100x16 y su adaptador I2C.
  • 3 trackballs con conexion PS/2.

En cuanto a los botones, veo que el acercamiento óptimo es hacer una matriz de 7x8 para reducir el número de pines utilizados (de 56 a 15). Aquí hay un buen ejemplo con fotos de lo que creo que sería ideal. Ya os digo que tampoco estoy seguro de que sea la mejor opción, si conocéis otra estoy abierto a sugerencias evidentemente.

En cuanto a los 13 encoders del otro lado, sus pulsadores sí que van conectados en otra matriz de 3x5, reduciendo también el número de pines. Los 2 canales necesarios para detectar dirección de cada uno irían conectados a los MCP23017 (los encoders necesitarían 26 pines).

Como veis, sin los MCP23017 no es posible conectar todo. Mi plan es utilizar uno en la matriz de 56 botones, utilizando 15 de los 16 pines disponibles. El pin libre podría utilizarse para un LED de status.
El segundo de los MCP23017 recoge los inputs de 8 de los 10 encoders de la parte superior derecha, llenando sus entradas.
El tercero de ellos se utiliza para lo mismo que el segundo, así como para recibir la señal de la matriz de botones de los encoders (la de 3x5).

A pesar de esto, faltaría un encoder por conectar, así como la pantalla del LCD. Pero teniendo en cuenta que los MCP23017 van a los puertos 2 y 3 del Arduino (SDA y SCL), nos quedan la mayoría disponibles. Por lo tanto, el encoder que falta irá con sus pines directo al Arduino. El LCD se comunica por I2C por lo que también utiliza SDA y SCL. Para todo esto, habrá que configurar el LCD y cada uno de los MCP23017 para que funcionen en address diferentes.

Faltaría ver cómo se conectan los trackballs, pero aún no me ha llegado el que pedí así que necesitaría experimentar un poco con él para decidirlo.

Sé que no suelen gustar los esquemáticos de Fritzing, pero la verdad no sé representarlo de otra manera. Os adjunto la distribución sin cableado.

Ahora claro, falta poner a prueba la teoría. En el siguiente os enseño el prototipo que tengo, pero tengo dudas respecto al cableado de todo. Lo he planteado en Fritzing, y lo adjunto aquí por si alguien quiere echarle un vistazo para comprobarlo. Un saludo!

Mira, de entrada felicitarte por el proyecto, yo en la parte hard nada, si puedo en soft con gusto y si luego vas a liberar el proyecto, estoy interesado en incorporarlo a nuestra carrera. Soy docente en una universidad pública (escasos recursos) y eso podría sernos útil.

De entrada ya te digo una cosa ¿si vas a ahora $1.200 porque usar un arduino barato y no uno potente?

Malograr el proyecto por complicar el código, la velocidad o cualquier otro aspecto que te permita AHORRAR $1.200 no vale la pena

Gracias

Bueno, vamos a ver el prototipo. Ahora mismo no tengo todos los materiales, pero con lo que tengo he conseguido que funcione.

Ahora mismo tengo:

  • 5 botones baratos del típico kit de Arduino.
  • 1 potenciometro de 10k que utilicé para probar antes de comprar los encoders.
  • 2 encoders con botón.
  • Protoboard.
  • Arduino Pro Micro.

Conectados de la siguiente manera:

Los colores son los mismos que en la realidad para que podáis verlo mejor.

En cuanto al código, estoy usando varias cosas.

El código va en el siguiente post porque no me cabe aquí.

A pesar de no saber de programación, creo que es un código fácil de entender. Me basé en uno de los ejemplos de las librerías MIDI y incorporé alguna cosa más para poder añadir más de un encoder y que lo leyese correctamente. Como véis, una vez detecta la pulsación de una tecla, manda una señal MIDI. Los encoders mandan notas en función de la dirección en la que giren.

Ahora mismo el programa funcione bien, y con el HairlessMidi podemos comprobar que entran las señales adecuadas a través de MIDI. Os adjunto aquí un vídeo del prototipo.

Y por ahora esto es lo que tengo. Estoy esperando a que me lleguen más piezas para poder continuar con las pruebas. Me faltaría explicaros lo que he avanzado por la parte del AutoHotkey, pero ahora se me hizo un poco tarde. Mañana os cuento!

Pensé que podría poner aquí el código del prototipo, pero no me cabe. Lo subí a Github por si queréis echarle un ojo!

TonyDiana:
Mira, de entrada felicitarte por el proyecto, yo en la parte hard nada, si puedo en soft con gusto y si luego vas a liberar el proyecto, estoy interesado en incorporarlo a nuestra carrera. Soy docente en una universidad pública (escasos recursos) y eso podría sernos útil.

De entrada ya te digo una cosa ¿si vas a ahora $1.200 porque usar un arduino barato y no uno potente?

Malograr el proyecto por complicar el código, la velocidad o cualquier otro aspecto que te permita AHORRAR $1.200 no vale la pena

Gracias

Gracias! Utilizo la Arduino Pro Micro porque tiene el chip ATMEGA32U4 que tiene compatibilidad HID, de manera que es un dispositivo plug&play. De todas maneras, sí me planteo cambiar de microcontrolador.
En cuanto a liberar el proyecto, sin problema!

ESP32, para alegría de alguien, igual de económico y más potente. Yo ahora liado con el Arduino DUE, más complicado por aspectos del micro

No te olvides que tienes la posibilidad de conectar los pulsadores a resistencias y leerlos de forma analógica por medio de pines ADC.
Es muy sencillo, por ej. para 11 pulsadores pones en serie 10 resistencias de 1K ohms (en total 10K ohms)
En el extremo de cada resistencia conectas un pulsador que cierre a masa, uno de los 2 extremos de la serie a un pin ADC y en el mismo pin una resistencia de 4K7 a 5V.
Al cerrar cada pulsador tienes diferentes valores de tensión, o sea, distintas lecturas del ADC.
Con estos valores propuestos, si no hay ninguno pulsado leerá 1023 (5V) de la resistencia de 4K7. Si pulsas el mas cercano al pin leerá 0 (0V) porque pone el pin directamente a masa. Si pulsas el más alejado leerá alrededor de 700 (unos 3.4V). Los otros darán distintos valores intermedios.
Así que con una simple lectura y 11 if() decodificas el boton pulsado y con un costo mínimo.
Se pueden ajustar los valores de las resistencias para poder agregar más interruptores por pin.
Podrías ahorrarte tranquilamente un MCP.

Saludos

PD: Hay al menos un keypad de Adafruit que trabaja de esta forma, también los controles al volante de la mayoría de los autos (por si a alguien le parece un delirio)

¡¡ JOPA QUE BUENA IDEA!!

gatul:
No te olvides que tienes la posibilidad de conectar los pulsadores a resistencias y leerlos de forma analógica por medio de pines ADC.
Es muy sencillo, por ej. para 11 pulsadores pones en serie 10 resistencias de 1K ohms (en total 10K ohms)
En el extremo de cada resistencia conectas un pulsador que cierre a masa, uno de los 2 extremos de la serie a un pin ADC y en el mismo pin una resistencia de 4K7 a 5V.
Al cerrar cada pulsador tienes diferentes valores de tensión, o sea, distintas lecturas del ADC.
Con estos valores propuestos, si no hay ninguno pulsado leerá 1023 (5V) de la resistencia de 4K7. Si pulsas el mas cercano al pin leerá 0 (0V) porque pone el pin directamente a masa. Si pulsas el más alejado leerá alrededor de 700 (unos 3.4V). Los otros darán distintos valores intermedios.
Así que con una simple lectura y 11 if() decodificas el boton pulsado y con un costo mínimo.
Se pueden ajustar los valores de las resistencias para poder agregar más interruptores por pin.
Podrías ahorrarte tranquilamente un MCP.

Saludos

PD: Hay al menos un keypad de Adafruit que trabaja de esta forma, también los controles al volante de la mayoría de los autos (por si a alguien le parece un delirio)

Hola, gracias por la info! Parece interesante, lo había visto pero pensé que al final sería más fácil hacer una serie de filas y columnas. Como ya pedí los MCP voy a intentar desarrollarlo con ellos, pero si veo que se me complica mucho, puedo volver a esta opción. Y no sabía que los volantes funcionaban así!

TonyDiana:
ESP32, para alegría de alguien, igual de económico y más potente. Yo ahora liado con el Arduino DUE, más complicado por aspectos del micro

Por cierto, muy interesante lo del ESP32, le eché ayer un vistazo y parece mucho más potente. La verdad como veis aún hay muchas cosas que se me pasan, pero sería fácil implementarlo. En función de cómo de complejo termine siendo el código, cambiaré a esta. Lo que pasa que estuve mirando y hay varias diferentes con el mismo microprocesador, no? Por ejemplo el NodeMCU entiendo que es un ESP32?

@feelinn Si ya encargaste el hardware ni te preocupes, pensé que todavía estabas evaluando y te daba otra alternativa.

Por cierto, solo para redondear la idea, justamente teniendo libres los ADC (cosa que no sé si es así) armas filas de botones y lees cada una con un pin distinto, con un Uno fácilmente puedes leer 50 o más pulsadores (y pueden ser muchos mas). Y el código para leerlos es muy simple.

@gatul, ¿puedes poner un esquema del comentario #7 para los que de esquemas vamos perdidos? por gusto he intentado dibujarlo y he quemado 3 veces la puerta del arduino en el papel :stuck_out_tongue_closed_eyes:

esquema-teclado-4x4-1-pin.jpg

¿Algo como esto?

esquema-teclado-4x4-1-pin.jpg

Yo creo que intentaste dibujarlo y se te quemaron los papeles! Jajaja

Eso es matricial. No es eso.
Es algo como esto

Quise hacerlo en easyEDA desde el celular pero no encuentro los pulsadores. :o

Acá, como ejemplo, el control de audio al volante de un Toyota Corolla. Misma configuración, solo falta en el esquema la R pullup que está en el equipo y le sobra una pulldown que estimo que es para reducir ruidos eléctricos (es de 100K).

Ver los 4 pulsadores de la izquierda, el es solo un pulsador con entrada dedicada.
El cable celeste es masa (GND), el marrón es la entrada del ADC en el equipo.

Entiendo mejor tu esquema que el otro pero me encanta la sencillez yo habría necesitado 50 pines para 6 botones

¿Eso es un divisor de voltaje?

Básicamente, si, estás en lo cierto.

¿A ver si ahora lo ves mejor?

Está más claro tu esquema a mano, pero entiendo la idea, gracias

Hola! Gracias por la explicación de los botones. Sigo esperando piezas para poder probar el prototipo. Aprovecho si os parece para preguntar una cosilla en cuanto al cableado de la matriz de botones, a ver si alguien me puede resolver la duda.

Mi idea es, como dije, hacer una serie de filas y columnas. Las columnas llevarían +5V, conectados a cada uno de los pines de cada switch. Por otro lado, las filas se conectan al otro pin del switch por medio de un diodo (para evitar el ghosting). Cada fila y cada columna está conectado a uno de los pines de un MCP23017. Según entendí, las filas (que no tienen corriente +5V) estarían en un estado de alta impedancia debido a que no estarían conectado a GND. Debería conectar una resistencia en algún punto a Gnd para hacer un pull down? No sé si lo estoy entendiendo bien o si se me está pasando algo :confused:.

Y aprovecho también para hacer una pregunta un poco novata. Es suficiente el Arduino para dar potencia al LCD, botones y encoders? había pensado en añadir otro LCD pequeño de status, pero no sé si es viable en cuanto a potencia.

Disculpad las preguntas, sé que pueden parecer un poco básicas pero la verdad estoy aprendiendo sobre la marcha. Gracias a todos!

Mi área es más el software, luego te ayudará alguien más preparado en ello pero de momento este enlace puede interesarte

https://www.aladuino.com.mx/blog/limites-de-voltaje-corriente-y-alimentacion-del-arduino/