17 votos

Lectura de un gran número de sensores analógicos en tiempo real

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.

3voto

Callum Rogers Puntos 6769

El método más sencillo puede ser construir todo en un largo circuito flexible con una cadena de 10 registros de colector abierto de serie a paralelo distribuidos a lo largo del flexible para alimentar cada columna de almohadillas individualmente.

Puedes usarlos para manejar cada columna en todas las filas simultáneamente y multiplexar las líneas de retorno comunes a tu ADC. Las líneas de retorno necesitarían pull-ups apropiados para obtener un voltaje de divisor de resistencia con la resistencia del botón.

schematic

simular este circuito - Esquema creado con CircuitLab

El microcontrolador enviaría entonces un único bit cero por la cadena de registros para que sólo se alimente una columna cada vez. El resto de las conexiones serían flotantes.

1voto

Chad Johnson Puntos 248

La forma obvia de hacerlo (ya que sólo necesitas ver un solo toque en cada cuerda) es conectar los trastes a un divisor de tensión y luego medir la tensión en cada cuerda

que le dirá la ubicación de los toques.

para obtener la presión de toque pon un condensador desde tierra a cada traste y mide la resistencia de CA en cada cuerda.

el lado negativo de este enfoque es que las cuerdas responderán a toques más altos

0voto

Alex Andronov Puntos 178

Si puedes conseguir algún cable que tenga una resistencia por pulgada razonablemente uniforme que esté entre 100 ohmios y 100K para la longitud de la guitarra, podrías simplemente hacer el mástil de un material que sea moderadamente conductor, con una resistencia superficial que disminuya con la presión, y luego medir la resistencia entre el mástil y cada extremo de cada cuerda. La suma de las resistencias, menos la resistencia de una cuerda, indicaría el doble de la resistencia del punto de contacto. Después de restar la resistencia del punto de contacto de cada resistencia medida, la relación de las resistencias restantes indicaría el punto de contacto en el mástil.

Tenga en cuenta que este enfoque sería capaz de detectar las pulsaciones simultáneas en las tres cadenas, pero no funcionaría si una cadena puede ser presionada en varios lugares. En una guitarra, un diseño de este tipo impediría el uso de acordes de barra -una limitación bastante severa- pero otros instrumentos pueden no requerir tocar las cuerdas en múltiples lugares.

0voto

MassCorr Puntos 173

He visto este post y he pensado que podría ser posible con un solo chip. Yo te sugeriría que tomaras algún tipo de placa microcontroladora, como la placa barata de bluepill. Tiene un ARM M3, con 10 canales ADC libres para usar. Si pones las columnas en 3 grupos de 3 cadenas, conéctalas a 9 canales ADC libres. Usa los otros 21 pines para alternar las filas de pines, para un total de 63 'trastes'. connection matrix, resistors are the velostat cells, the gpio drives at 3.3v or is in input mode, the ADC pins measure the voltage drop across the velostat cell El microcontrolador tiene dos ADCs de 1 Msps y 12 bits que se pueden utilizar con retardo de fase para soportar 2Msps, lo que debería ser suficiente para no perder nunca un martillo en o notar cualquier modulación. Creo que puedes usar la conexión USB y hacer que la cosa funcione como un controlador midi USB. Podrías usar un microcontrolador más grande para más entradas, pero no veo cómo vas a gestionar el espacio entre los 'trastes' con más de 30 trastes, ¿o va a ser más como una pantalla táctil?

No sé exactamente cómo funcionan esas hojas de velostato, pero ¿no se pueden poner como pequeños puntos de terminación en la parte inferior de una hoja más grande y correlacionar la ubicación y la presión del dedo con el voltaje en múltiples puntos? Entonces, probablemente se puede salir con mucho menos de detección, y apoyar cosas como curvas y vibrato.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X