Estoy tratando de construir un controlador de tipo MIDI que tiene un cuello como una guitarra. En ese mástil, hay una enorme matriz de sensores de presión. El controlador emulará 3 cuerdas.
El funcionamiento es el siguiente: Hay 3 tiras largas de cinta de cobre de doble cara (0,5 cm de ancho, tan largas como el cuello) que están conectadas a la alimentación (3,3V o 5V probablemente, no importa por ahora). Sobre estas cintas hay una capa de Velostat, que cambia la resistividad en función de la presión. Encima del velostato habrá otra capa de filas o celdas de cinta de cobre, conectada a algo, que escupe una lectura del voltaje a través de la capa de velostato. Como el cuello tiene unos 40 cm de largo, habrá al menos 80 filas.
Si te imaginas las 3 tiras inferiores de la cinta de cobre como columnas de un gráfico a lo largo del cuello, los sensores serán las celdas o las filas, dependiendo del método de medición (pensé que uno podría ser capaz de multiplexar las columnas también, entonces podría haber filas). Sin embargo, hay algunas condiciones especiales que podrían hacer esto más fácil: Como se trata de un controlador tipo guitarra, no es necesario medir todas las interacciones. Sólo importa el toque más cercano al cuerpo del controlador. Además, una resolución de 8 bits debería ser lo suficientemente precisa. 255 niveles de presión son probablemente más de lo que se necesita de todos modos.
Ahora las partes difíciles:
La medición debe ser lo suficientemente en tiempo real como para detectar martillazos, etc. (no tengo ni idea de la frecuencia de muestreo que debe ser - estimada en varios kHz para una buena medida y jugabilidad) y la salida digital del controlador debe ser MIDI (en 3 canales separados - uno por cuerda) o una señal digital que puede ser procesada con una Raspberry Pi.
Ahora bien, como mis conocimientos son realmente limitados, no pude pensar en las herramientas adecuadas para el trabajo. Lo que sí sé es que: Es posible. Hay un controlador similar pero diferente que utiliza una técnica muy parecida (que prácticamente hice ingeniería inversa hasta que me di cuenta, que tienen una patente y la información sobre cómo lo hacen no es tan arcana como pensaba), se llama ROLI Seaboard.
TL;DR:
-
aproximadamente 240 sensores
-
pueden separarse en grupos de 80 que son alimentados por la misma línea
-
esta es una aplicación en tiempo real, necesito adquirir la presión de cada sensor a medida que se toca (se aplican algunas condiciones, ver arriba)
Gracias de antemano, sé que es mucho para leer. Agradezco cualquier sugerencia y me alegraría mucho que me ayudarais a realizar el terrible lío que me he propuesto.
Cosas que he pensado hasta ahora:
Multiplexando filas y columnas, leyendo cada celda con un MCP3008 o un ADC más grande y encadenando (en cadena o en forma de árbol) ATmegas que sólo empujan la interacción más baja en cuanto a posición a la señal final, pero según mis cálculos, eso podría ser un cuello de botella por la sobrecarga de comunicación. También un modelo anterior incluía potenciómetros de cinta, que he desechado, porque el diseño era malo (varios intentos, no era lo suficientemente genial).
EDITAR/ACTUALIZAR:
¡Gracias por las buenas sugerencias hasta ahora! Gracias a ellas, ahora soy capaz de expresar mi problema con mucha más claridad:
Tengo una matriz de 80 filas * 3 columnas de sensores de presión. Cuando un humano está interactuando con la matriz de sensores, varios sensores en proximidad recogerán el toque, pero sólo a lo largo de una columna. Las columnas están separadas mecánicamente. Los sensores tienen una resistencia entre 100 Ohm y 1 kOhm. Todos estos sensores deben ser leídos con una profundidad de 8 bits, procesados y los resultados deben ser enviados con una velocidad de al menos 1 kHz. Por lo tanto, una sola lectura/procesamiento tiene que tardar menos de un milisegundo. La salida final por columna tiene que ser 4 bytes para un float32 y 1 byte para un uint8. El float32 indicará la posición media de la primera interacción a lo largo de la columna. Una interacción se define como un grupo consecutivo de sensores con una presión superior a un determinado umbral. Aquí es donde entra en juego el procesamiento: la columna se recorrerá hacia abajo hasta que una lectura supere un umbral. Esto contará como el inicio de una interacción. La presión y la posición de cada sensor se memoriza hasta el primer sensor, que cae por debajo del umbral con un máximo de (probablemente) 4 sensores consecutivos. De todos los sensores de la interacción registrada, sólo se procesarán dos sensores: el que lea la presión más alta (resistencia más baja) y el que esté directamente por encima o por debajo de ella. La posición en punto flotante se calcula promediando las dos posiciones de los sensores ponderadas por sus presiones. La presión global de la interacción será sólo la suma de ambas presiones sujetas entre 0 y 255 (sumar ambas presiones de la unidad8 en un uint16 y dividir por 2 sin redondear, descartar los bits innecesarios - esto debería ser rápido). Esto tiene que ocurrir para cada columna. El resultado del tamaño de 15 bytes se enviará entonces a través de SPI a un pequeño ordenador (Raspberry Pi B3) que actúa como sintetizador. No tengo claro el método de transmisión. Si SPI no es la herramienta adecuada para el trabajo, estoy dispuesto a tomar cualquier método de comunicación que un Raspberry Pi puede manejar. Dado que se trata de una aplicación musical-interactiva, la latencia es crucial.
Mis preguntas exactas son: ¿Se puede resolver esto con un solo microcontrolador sin romper el banco? No puedo permitirme comprar varios cientos de dólares en circuitos integrados para un proyecto de aficionado. ¿Qué hardware recomendarías? ¿Existen advertencias no obvias de las que deba cuidarme?
El enfoque que derivé de las respuestas hasta ahora fue alimentar cada columna individualmente, y luego leer las filas con 5 ADCs de 16 canales (ADS7961) conectados a un Arduino sobre SPI. Me preocupa que esto no sea el enfoque más fácil/barato o que no sea lo suficientemente rápido para alcanzar una tasa de >1 kHz.
Descargo de responsabilidad: normalmente soy un químico teórico y un terrible aficionado en lo que se refiere a la ingeniería eléctrica, todo lo que sé es autodidacta y sin ninguna formación profesional (que es a su vez la razón por la que estoy buscando ayuda de personas más conocedoras). Sin embargo, sé cómo funciona el software. Todo lo que tenga que ver con el software, lo resolveré con el tiempo suficiente. Además, soy alemán, así que disculpen los fallos gramaticales ocasionales.