Estoy tratando de construir un controlador tipo MIDI que tenga el cuello como una guitarra. En ese cuello, hay una enorme matriz de sensores de presión. El controlador emulará 3 cadenas.
La forma en que esto funciona es: hay 3 tiras largas de cinta de cobre de doble cara (0.5 cm de ancho, hasta el cuello) que están conectadas a la alimentación (3.3V o 5V probablemente, no importa por ahora). En estas tiras hay una capa de Velostat, que cambia la resistividad en función de la presión. En la parte superior del velostat 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 del velostat. Como el cuello mide unos 40 cm de largo, habrá al menos 80 filas.
Si imagina las 3 tiras inferiores de 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 también podría multiplexar las columnas, entonces podría haber filas.) Sin embargo, hay algunas condiciones especiales que podrían facilitarlo: como se trata de un controlador similar a una guitarra, ¡no es necesario medir todas las interacciones! Solo importa el toque más cercano al cuerpo del controlador. También una resolución de 8 bits debe ser lo suficientemente precisa. 255 niveles de presión son probablemente más de lo que se necesita de todos modos.
Ahora los bits difíciles:
La medición debe ser en tiempo real y suficiente para detectar golpes de martillo, etc. (no tengo idea de cuán alta debe ser la frecuencia de muestreo, estimada en varios kHz para una buena medición y capacidad de reproducción) y la salida digital del controlador debe ser MIDI (en 3 canales separados, uno por cadena) o una señal digital que puede procesarse con una Raspberry Pi.
Ahora que mi conocimiento es realmente limitado, no puedo pensar en las herramientas adecuadas para el trabajo. Sin embargo, lo que sí sé es: es posible. Hay un controlador similar pero diferente que usa una técnica muy similar (que prácticamente realicé 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 pensé), se llama ROLI Litoral.
TL; DR:
aproximadamente 240 sensores
se puede separar en grupos de 80 que funcionan con la misma línea
Esta es una aplicación en tiempo real, necesito adquirir 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 que me ayudaras a lograr el terrible desastre que me propuse producir.
Cosas que he pensado hasta ahora:
Multiplexando filas y columnas, leyendo cada celda con un ADC MCP3008 o más grande y encadenando ATmegas (en cadena o en forma de árbol) que solo empuja la interacción más baja en cuanto a la posición hasta la señal final, pero según mis cálculos, eso podría posiblemente ser atrapado por La comunicación sobrecarga. También un modelo anterior incluía potenciómetros de cinta, que he descartado, porque el diseño era malo (varios intentos, no fue lo suficientemente bueno).
EDITAR / ACTUALIZAR:
Gracias por las buenas sugerencias hasta ahora! Gracias a ellos ahora puedo expresar mi problema mucho más claramente:
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 cercanos detectarán el toque, pero solo 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 leerse con una profundidad de 8 bits, procesarse y los resultados deben enviarse con una velocidad de al menos 1 kHz. Por lo tanto, una sola lectura / procesamiento debe tomar menos de un milisegundo. El resultado final por columna debe ser: 4 bytes para un float32 y 1 byte para un uint8. El float32 indicará la posición promedio 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 por encima de cierto umbral. Aquí es donde el procesamiento entra en la mezcla: la columna se desplazará hacia abajo hasta que una lectura sobrepase un umbral. Esto contará como el inicio de una interacción. La presión y la posición de cada sensor se memorizan 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, solo se procesarán dos sensores: el que lee la presión más alta (resistencia más baja) y el más alto directamente encima o debajo de ella. La posición del punto flotante se calcula promediando las dos posiciones del sensor ponderadas por sus presiones. La presión general de la interacción será solo la suma de ambas presiones fijadas entre 0 y 255 (agregue ambas presiones de la unidad 8 en un uint16 y divida por 2 sin redondear, descarte los bits innecesarios; esto debería ser rápido). Esto debe suceder para cada columna. El resultado del tamaño de 15 bytes se enviará a través de SPI a una computadora pequeña (Raspberry Pi B3) que actúa como sintetizador. No estoy establecido en 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 pueda manejar. Como 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 CI por valor de varios cientos de dólares para un proyecto de pasatiempo. ¿Qué hardware recomendarías? ¿Hay advertencias no obvias de las que debo tener cuidado?
El enfoque que obtuve de las respuestas hasta ahora era alimentar cada columna individualmente, luego leer las filas con 5 ADC de 16 canales (ADS7961) conectados a un Arduino a través de SPI. Me preocupa que este no sea el enfoque más fácil / más barato o que no sea lo suficientemente rápido como para alcanzar una velocidad de> 1 kHz.
Descargo de responsabilidad: normalmente soy un químico teórico y un terrible aficionado cuando se trata de ingeniería eléctrica, todo lo que sé es autodidacta y sin antecedentes profesionales (que es la razón por la que busco ayuda de personas más conocedoras). Sin embargo, conozco el software. Cualquier cosa relacionada con el software, lo descubriré con suficiente tiempo. Además, soy alemán, así que disculpe las fallas gramaticales ocasionales.
Respuestas:
Dependiendo de su rango de precios, es posible que desee considerar usar un FPGA entre su Raspberry Pi y los ADC, como la placa DE0-Nano , que tiene un buen soporte como placa de desarrollo FPGA introductoria. Esta solución tiene la ventaja de permitirle escribir código que registrará múltiples / muchos ADC al mismo tiempo y formateará sus datos de una manera que sea presentable a la Raspberry Pi.
Usted mencionó que estaba considerando el MCP3008. Este chip es SPI, por lo que puede conectar algunos dispositivos juntos en el mismo bus con diferentes pines CS. Suponga que conectó tres chips a un bus, de modo que obtiene 24 canales ADC por 6 pines (tres líneas de datos y tres líneas CS). Esto significa 240 canales para 60 pines, lo que está fácilmente dentro de las capacidades de FPGA.
Si ejecuta la línea de reloj MCP3008 a su frecuencia máxima de 2MHz, tomaría (15 relojes / canal) * (8 canales / chip) * (3 chips / bus) * (1/2000000 segundos / reloj) = 0.18ms a lea los 240 sensores, correspondientes a la frecuencia de muestreo de 5.56kHz.
fuente
La respuesta obvia es muxing, esto significa que crea dinámicamente la ruta eléctrica. Por lo tanto, solo recorra toda la matriz, una a la vez, o tantas entradas ADC (convertidor analógico a digital) como tenga.
Si tiene 3 ADC, puede leer una fila a la vez, luego cambia las entradas a mux y voilla, ahora está leyendo la segunda fila y luego continúa. El problema con esta configuración es que tienes 80 filas, y no hay ningún mux 80: 1 (ochenta entradas a una entrada) que yo sepa. Pero hay 16: 1 muxes que puedes juntar para obtener 16 * 5 = 80 entradas.
Se vería algo así:
Las 4 señales de entrada a los 16: 1 muxes pueden conectarse entre sí.
Así que al final tienes un byte con señales de control en este patrón:
Esto significa que necesitará 5 × 16: 1 muxes y un 8: 1 mux = 6 IC's,
Multiplique eso por 3 porque es posible que desee leer una fila a la vez.
Esto significa que tendrá 18 circuitos integrados, 7 señales de control. Puede reducir la cantidad de circuitos integrados si aumenta la cantidad de entradas analógicas. Es 18 con solo 3 entradas analógicas.
Si en su lugar usó 240/16 = 15 IC, entonces obtuvo 15 salidas analógicas de los muxes 15 × 16: 1. Entonces podría conectarlo en cascada con un 16: 1 mux, o 16: 8 mux. Al final, serían 16 IC si lo "optimizas" con 16: 1 muxes. Pero esto significaría que su solución de software no sería tan ... elegante como la anterior, sería entrecruzado y módulo y otras cosas, pero bueno, guarda 2 circuitos integrados.
Es posible, pero es no un buen diseño.
Solucionemos esto de otra manera ... más eficiente en espacio y dinero.
* 20 minutos después * Hmmm ... todas las soluciones que se me ocurren son demasiado difíciles de configurar y / o requieren una calibración avanzada ...
Bueno, entonces supongo que su diseño es apropiado para su tarea en cuestión.
La mejor de las suertes.
OP quiere medir la posición y la presión. Eso son dos parámetros. Esto significa que necesitamos empaquetar esa información dentro de una señal de voltaje para poder leerla y descifrarla. O necesitamos empaquetarlo en alguna otra unidad, como ohmios, inductancia, capacitancia.
Estas son algunas de mis ideas, donde solo pienso en una columna. Simplemente multiplique la idea por 3 y tendrá la solución completa para una guitarra de 3 columnas.
Primera idea
Use dos cables paralelos (baja resistencia) que van desde la parte inferior de la guitarra hasta el cuello de la guitarra. Conecte la tierra a uno de los cables en la parte inferior de la guitarra. Haga un sistema de medición LR y mida la inductancia y la resistencia del otro cable, también en la parte inferior.
Cuando toque ambos cables con un dedo, conectará los dos cables y habrá algunos inductancia aquí. Cuanto más arriba toque la guitarra, más largo será el circuito y más inductancia medirá. Cuanto más fuerte presiona, más superficie hay entre los dos cables y menor es su resistencia.
No tiene que ser dos "cables", pueden ser dos cintas conductoras u otra cosa.
Por qué no compartí esto antes: para que esto sea confiable, debe calibrar los sensores para cada individuo porque cada persona tiene una cantidad diferente de resistencia en su piel. Siempre que juegues, sudarás y, por lo tanto, reducirás aún más la resistencia, por lo que deberás compensar esto. Todos sudan de manera diferente, por lo que esto también tendrá que calibrarse por persona.
Entonces la inductancia => posicional del dedo. La resistencia => lo fuerte que presionaste.
La desviación de los valores que medirá estará en nano Ω y nano H, lo que significa que necesitará un conocimiento adecuado sobre CMRR y SNR. De lo contrario, todo lo que verá será la tensión de red, suponiendo que esto se haga en interiores. O algunas otras frecuencias de wifi o lámparas u otras fuentes de ruido. Tal vez se necesitará un filtro digital adecuado. Y ... probablemente ya está fuera del alcance de las capacidades de OP y del esfuerzo mental aceptable. Entonces esta idea se descarta.
Segunda idea:
Haga una superficie conductora plana en la guitarra que esté conectada a tierra.
Use un cable o cinta conductora o simplemente un conductor plano. Ponga un poco de pintura no conductora sobre él o una cinta regular no conductora sobre él.
Sujételo a la guitarra desde la parte inferior hasta el cuello de la guitarra. Conecte el cable en la parte inferior de la guitarra a altas frecuencias, en el rango de cientos de MHz. Ahora comenzarás a obtener reflejos notables. Porque técnicamente tienes una ... mala línea de transmisión donde solo un lado está protegido.
Por lo tanto, enviará un pulso de onda cuadrada corta y medirá el tiempo que tarda en regresar debido a la reflexión debido a que su dedo está encima del cable aislado. Y luego mides la amplitud de la punta reflejada en la parte inferior de la guitarra. Entonces el tiempo de viaje => posicional del dedo. La amplitud de la reflexión => cuán fuerte presionaste.
Esto no es lo más fácil de configurar ... si no sabes lo que estás haciendo. Entonces, nuevamente, esto podría ser un gran esfuerzo para que OP lo aborde. Entonces esta idea se descarta.
Se vería algo así:
Asumí la impedancia característica como 150 Ω, en otras palabras, una línea de transmisión muy mala. En realidad, podría ser peor, no sé, nunca he hecho esto.
Aquí está el enlace en caso de que alguien quiera perder el tiempo.
Una de las partes más difíciles será hacer coincidir los puntos finales con cierta resistencia, para esto es posible que necesite un osciloscopio u otro instrumento costoso.
La otra parte difícil será medir realmente el TOF (Tiempo de vuelo), hay algunos circuitos integrados, pero no son baratos ... pero siempre puedes hacer una fuente de corriente constante y llenar un pequeño condensador y luego simplemente lee el voltaje.
La idea aquí es que cuando un dedo se acerca al cable, su dedo se convertirá en una parte del circuito y actuará como un condensador. Cuanto más cerca esté tu dedo, más capacitivo. Es por eso que la resistencia en la punta del dedo disminuirá.
https://en.wikipedia.org/wiki/Transmission_line desplácese hacia abajo un poco y verá que el parámetro capacitivo es parte del denominador.
Siempre que un punto en el cable no coincida, habrá un reflejo, y puede leerlo en la "salida" desde donde se origina su señal. Si no hay reflejo en ninguna parte, su señal terminará en cualquiera de los puntos finales.
Cuanto más empuje hacia abajo, más área de su dedo quedará plana => más capacitancia debido al área. Además, cualquier material no conductor que tenga entre el cable y el dedo se apretará muy ligeramente para aumentar aún más la capacitancia.
Tercera idea:
Pegue un theremin dentro de la guitarra y mida la frecuencia y la amplitud. No sé exactamente qué generará un theremin, pero seguramente se puede usar algo.
En este punto me estoy quedando sin ideas y digo que he pasado 20 minutos. Cuando en realidad quizás gasté 10. Oh, bueno. Ahora seguramente he pasado otros 10 minutos para escribir esto, por lo que todo suma.
fuente
Tres ideas:
1. Hacer algo de multiplexación en el lado de la oferta
Efectivamente, el circuito que ha descrito es una gran cantidad de resistencias variables, cada una con un extremo en común a un voltaje de suministro. Desea leer todos los valores de resistencia y las otras respuestas hasta ahora han sugerido enfoques para multiplexar la señal en el lado analógico.
Pero también podría hacer parte o toda esta multiplexación en el lado de oferta , dividiendo el 'riel' de la oferta en n secciones. Conecte juntos conjuntos de n almohadillas de sensores que tienen un riel de suministro diferente. Ahora energice solo un riel de suministro a la vez y use una entrada ADC para leer cada conjunto de pads. (Así es como suele funcionar el circuito que lee el teclado de una computadora, y la forma en que se conectan los interruptores a menudo se denomina 'interruptor de punto de cruce'). En última instancia, puede usar un solo ADC, conectado a todos los 'rieles', y hacer toda la multiplexación conectando la potencia a cada pad por turno.
El único inconveniente es que todos los otros pads deben estar aislados del riel de alimentación, no conectados a tierra, lo que sería el caso si solo usara una salida digital para cada uno. Hay varias maneras de resolver esto, incluido el cableado de cada pad a través de un diodo, un transistor bipolar o FET, o, no sé qué tan rápido se puede hacer en la práctica, pero en principio es posible, usando el pin de entrada-salida de un microcontrolador y configurándolo como salida alta o como entrada, cuando debe tener una impedancia relativamente alta.
La precisión de medir sus sensores con esta técnica puede no ser perfecta en comparación con el uso de una sola fuente de voltaje fijo y multiplexores analógicos de alta calidad, pero sospecho que será lo suficientemente bueno, especialmente porque estoy seguro de que los sensores de presión tendrán cierta tolerancia en su resistencia: de todos modos, es posible que deba calibrar esto para cada sensor utilizando una fuerza de referencia.
2. Use algunos microcontroladores con muchas entradas ADC
Por ejemplo, el PICAXE 40X2 tiene 27 pines que se pueden usar como entrada analógica, por lo que puede cubrir sus necesidades con 9 de ellos. Está programado en un lenguaje BASIC simple y puede actuar como un esclavo i2c, por lo que puede leer los 9 chips con un microcontrolador adicional, o probablemente puede enviar la salida de cada chip como datos en serie y leerlo en la computadora host a través de convertidores de serie a USB. No puedo prometer exactamente qué tan rápido irá eso, pero creo que debería funcionar bien si registra el PICAXE a la velocidad máxima (de 64 MHz, utilizando un resonador externo de 16 MHz). Por supuesto, si está satisfecho con la programación de microcontroladores en C, puede hacer lo mismo con el PIC18F45K22 en el que se basa el PICAXE.
3. Use unidades de entrada analógica listas para usar
Finalmente, si no le importa gastar dinero para ahorrar tiempo, y la portabilidad no es una prioridad alta, por ejemplo, si está bien que el instrumento esté atado al bastidor de un equipo por unos cables gruesos, puede comprar suficiente dispositivos de entrada analógica de recuento de canales para medir todos los sensores a la vez. Por ejemplo, el Computador de medición USB-2633 lee 64 entradas analógicas por un poco más de US $ 1k.
fuente
Podría valer la pena considerar un acondicionamiento de señal de fuerza bruta (quizás pasivo) seguido de ADC más pequeños o MCU / ADC con 16 o más entradas de ADC MUX'd cada uno. Eso es solo 40 fichas. Un ejemplo de un chip que podría funcionar es el ADS7961QDBTRQ1 , que tiene un modo de canal de incremento automático y 16 entradas.
La velocidad de datos general incluso a una frecuencia de muestreo de 4 kHz y 240 bytes por muestra es de aproximadamente 1 MB / s, lo que no da demasiado miedo. Quizás una CPU maestra con un bus SPI de 10MHz o 20MHz que se comunica con los esclavos. Use 2 buses SPI si el ancho de banda no está allí. La parte mencionada anteriormente funciona a 20MHz, por lo que un solo SPI funcionará.
O tal vez pueda usar un solo chip TI: el DDC2256AZZF , que tiene muestreo simultáneo de 64 canales y 256 entradas ... pero no es particularmente económico (alrededor de $ 350 USD) y viene en una matriz LFBA de 323 pines de 14x14 mm, por lo que no va a trabajar con un tablero de conexiones blanco.
fuente
Para una aplicación de interfaz humana en tiempo real, una frecuencia de muestreo global de multi-khz parece alta. Probablemente, 50Hz es suficiente ( https://en.wikipedia.org/wiki/Input_lag#Typical_overall_response_times ). Esto significa que debe muestrear todos los sensores en <20 ms, por lo que 80us por sensor. Esto no es demasiado difícil y puede ser gestionado básicamente por todos los microcontroladores normales de 8 bits (es decir, Atmega88 puede hacerlo en <30us).
También puede medir todas las interacciones y luego descartar las que no necesita, ya que medirlas no es tecnológicamente difícil. El problema proviene de la multiplexación. Estoy un poco confundido con tu publicación, porque dice que los sensores están alimentados 80 a la vez. Lo habitual es, como usted dice, multiplexar columnas y filas. Si no lo hace, tendrá que lidiar con> 80 cables que salen de su dispositivo, lo que realmente no es una gran idea. Necesita encontrar una manera de dividirlo en una matriz, de modo que obtenga 30 cables (que todavía es mucho). Entonces podría multiplexarlos, etc., pero si yo fuera usted, simplemente tendría múltiples microcontroladores y los conectaría a un maestro. Podría usar un ADC dedicado en lugar de las MCU esclavas, pero yo personalmente me quedaría con las MCU.
Has identificado correctamente que las comunicaciones pueden ser un problema, pero esto no es un gran problema, al menos entre las MCU. Un Atmega a 8MHz puede hacer SPI a 2MHz, por lo que enviar todos los datos del sensor tomará <1 ms. La pregunta entonces es qué desea hacer con estos datos después de que el MCU maestro los tenga.
fuente
Su método más simple puede ser construir todo en un circuito flexible largo con una cadena de 10 colectores abiertos de ocho bits en serie a registros paralelos distribuidos por el flex para alimentar cada columna de almohadillas individualmente.
Puede usarlos para conducir cada columna en todas las filas simultáneamente y multiplexar las líneas de retorno comunes a su ADC. Las líneas de retorno necesitarían pull-ups apropiados para que obtenga un voltaje divisor de resistencia con la resistencia del botón.
simular este circuito : esquema creado con CircuitLab
El micro controlador enviaría entonces un bit cero por la cadena de registros, por lo que solo se alimenta una columna por vez. Las conexiones restantes estarían flotando.
fuente
La forma obvia de hacer esto (ya que solo necesita ver un solo toque en cada cadena) es conectar los trastes a un divisor de voltaje y luego medir el voltaje en cada cadena
eso te dirá la ubicación táctil.
Para obtener presión táctil, coloque un condensador desde tierra hasta cada traste y mida la resistencia de CA en cada cuerda.
La desventaja de este enfoque es que las cuerdas responderán a toques más altos
fuente
Si puede obtener un cable que tenga una resistencia por pulgada razonablemente uniforme que esté en algún lugar entre 100 ohmios y 100K para la longitud de la guitarra, puede simplemente hacer que el cuello sea de un material que sea moderadamente conductivo, con una resistencia superficial que disminuye con la presión y luego mide la resistencia entre el cuello y cada extremo de cada cuerda. La suma de las resistencias, menos la resistencia de una cuerda, indicaría dos veces 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 cuello.
Tenga en cuenta que este enfoque podría detectar presiones simultáneas en las tres cadenas, pero no funcionaría si una cadena se puede presionar en varios lugares. En una guitarra, tal diseño impediría el uso de acordes de barra, una limitación bastante severa, pero otros instrumentos pueden no requerir tocar cuerdas en múltiples puntos.
fuente
Vi esta publicación y estaba pensando que podría ser posible con un solo chip. Supongo que tomas algún tipo de placa de microcontrolador, como la placa bluepill barata. Tiene un ARM M3, con 10 canales ADC de uso gratuito. Si coloca las columnas en 3 grupos de 3 cadenas, conéctelas a 9 canales ADC libres. Use los otros 21 pines para alternar las filas de pines, para un total de 63 'trastes'. El microcontrolador tiene dos ADC de 1 Msps de 12 bits que se pueden usar con retardo de fase para admitir 2Msps, lo que debería ser suficiente para nunca perder un martillo o notar cualquier modulación. Creo que puedes usar la conexión USB y hacer que 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 manejar el espacio del 'traste' con más de 30 trastes, ¿o será más como una pantalla táctil?
No sé exactamente cómo funcionan esas hojas de velocímetro, pero ¿no puedes poner como pequeños puntos de terminación en el fondo de una hoja más grande y correlacionar la ubicación y la presión del dedo con el voltaje en varios puntos? Entonces, probablemente pueda salirse con la suya con menos detección y soportar cosas como curvas y vibrato.
fuente