6 votos

Detección de combinaciones de nodos emparejados

A mi sobrino de 2 años no hay nada que le guste más que enchufar/desenchufar tomas RCA. Siempre que está cerca, se cambian las entradas de la televisión, se intercambian los enchufes de audio, etc.

Así que... Para su cumpleaños, decidí construirle una cajita con un panel lleno de conectores RCA y algunos botones y bonitos leds parpadeantes y pitidos. La idea es tener un conjunto de unos 12 conectores RCA, en los que pueda conectar cables a su gusto. Para darle algo de información, un arduino generará diferentes patrones de leds parpadeantes y ruidos extravagantes (usando la biblioteca Mozzi) dependiendo de los pares de conectores RCA que estén conectados.

Mi pregunta es... ¿Cuál es una forma eficaz de detectar qué pares de tomas RCA están en cortocircuito a través de un cable? Idealmente, para 12 tomas RCA, me gustaría detectar de forma única hasta 6 pares conectados.

Tengo algunas ideas (abajo), pero no puedo evitar pensar que debe haber una solución más elegante al problema.

Posibles combinaciones Algo de combinatoria me dice que el número de formas en que puedo elegir p parejas de n jotas es:

C(n,p) = ¡n!/((n-2p)!*p!*2^p)

Eso es básicamente el número de permutaciones de pares 2p de n (=n!/((n-2p)! ¡), dividido por el número de combinaciones de inversión de pares 2^p (es decir, invertir un cable), y dividido por el número de permutaciones de pares p! (es decir, el orden de conexión de los cables)

Así, para 12 tomas y utilizando entre 0 y 6 cables, hay sum(C(12,p) para p=0..6) = 140152 emparejamientos posibles (creo...)

Algunas ideas que se me ocurrieron:

1) conecta cada uno de los 12 jacks a un pin IO digital del arduino con una resistencia pullup. Busca los emparejamientos poniendo un pin en OUTPUT LOW y comprobando si hay una señal baja en los otros once (configurados como pines INPUT). Repite 11 veces (cada vez, poniendo otro de los doce en OUTPUT LOW)

Ventaja: detectar de forma única cualquiera de los 140152 emparejamientos posibles

Desventaja: Muchas clavijas en uso

2) Crea una cadena de resistencias de 5V a tierra, a través de las 12 tomas, así GND - R - p1 - R - p2 - R - p3 - R - p4 - R - ... - p12 - 5V

Conecte también el pin p1 a una entrada analógica. Cuando se conecta un cable a dos tomas, algunas de las resistencias se puentean, cambiando la tensión en la patilla p1. Para valores iguales de R, podemos determinar sólo el número total de resistencias puenteadas. Para valores de R que se duplican secuencialmente (1,2,4,8,...), podemos deducir del voltaje en p1 exactamente qué resistencias han sido puenteadas (más o menos... estaremos limitados por el ruido y el ADC de 10 bits del arduino)

Ventaja: Simple, sólo se utiliza 1 pin analógico

Desventaja: Este método no puede identificar de forma exclusiva todos los emparejamientos 140152 (sobre todo cuando se conectan varios cables), pero no creo que mi sobrino de 2 años se dé cuenta del defecto.

3) Algo algo filtro RLC... No tengo ni idea de lo que estoy hablando.

0 votos

¿Por qué no tu primera idea? Incluso para un modesto chip Atmel (no tengo ni idea de qué tipos exactos ponen en los Arduino, ya que no es realmente un recurso profesional, así que no puedo responder oficialmente a ese respecto) 12 pines en uso es casi nada. La mayoría de los Atmels que tengo en stock tienen 14+ pines de E/S y sólo muy, muy pocos tienen menos de 12. Estoy asumiendo que la "Biblioteca Mozzi" utiliza uno o dos bloques PWM y/o pines para "audio". Me sorprendería que una placa "duino" en la vecindad de los 10 euros no pueda soportarlo todo.

0 votos

Tienes razón, no hay ninguna razón para que la solución 1 no funcione, y probablemente acabaré siguiendo ese camino. En este momento lo veo más como un interesante rompecabezas electrónico, porque siento que debe haber alguna solución circuital muy elegante, que se me escapa.

0 votos

Hay un montón de diferentes rutas de pulso y multiplexación que puede limitar el número de pines de diferentes maneras, pero la circuitería tendría que ir a alguna parte y probablemente el costo, en un pequeño pedido de proveedor local, lo mismo que todo un Arduino extra conectado por serie, I2C o SPI, por lo que supongo, empezar con un 'duino, comprar un segundo si se queda sin después de todo a ser una solución más eficaz. Por supuesto, si usted quiere teorizar más sobre trucos avanzados en lugar de "¿cuál es la mejor opción aquí", voy a estar de vuelta en enero para una pregunta más dirigida ;-).

3voto

RelaXNow Puntos 1164

Conecta todos los blindajes a tierra, de modo que lo único que hay que detectar es qué pines centrales están conectados a qué otros pines centrales.

Esto es bastante fácil de hacer con el escaneo. Configura la electrónica de manera que cada pin pueda ser conducido de una manera, pero pasivamente tirado de la otra. Dado que los pullups incorporados son más comunes en los microcontroladores, asumiré que cada línea tiene un pullup pasivo y puede ser activamente conducido a bajo.

Ahora sólo tienes que pasar por las posibles combinaciones. Conducir el pin 1 bajo (todos los otros pasivamente tirado alto), y leer todos los pines. El que está bajo está conectado al pin 1. Ahora conduce el pin 2 bajo y libera todos los demás y lee todos los pines, etc.

Digamos que lo haces lentamente, como cada 100 µs. Cada interrupción de 100 µs lees los pines del estado de salida anterior, y luego cambias al nuevo estado de salida. Eso requiere 12 interrupciones o 1,2 ms para obtener la imagen completa de qué está conectado a qué. Eso es mucho más rápido de lo que los humanos pueden notar, así que incluso con esta lenta tasa de escaneo el procesador sabrá qué está conectado a qué instantáneamente en tiempo humano.

3voto

Kiran Puntos 320

Un Arduino UNO tiene 18 pines, y el Nano, que es más fácil de usar, tiene 20 pines. Así que estarían bien para el enfoque 1. Habría 6 u 8 pines respectivamente para los ruidos y los LEDs parpadeantes.

Sólo necesitaría un pin para el ruido, por lo que un Nano tendría 7 pines para los LEDs.

Si maneja los LEDs con multiplexación, podría manejar \$3\times4=12\$ LEDs, o \$2\times3\times4=24\$ LEDs con ' Charlieplexing '. Probablemente lo limitaría a \$2\times3\times3=18\$ LEDs, así que 3 LEDs en cada grupo/cadena.

Para 3 LEDs en una 'cadena' los pines deberían ser capaces de conducirlos directamente, mantener la corriente total/pin a menos de 20mA, y debería estar bien.

0 votos

"Charlieplex" en 7 pines permitiría 7*6 = 42 leds, los leds modernos son suficientemente brillantes a 2mA.

1 votos

Otro enfoque de manejo de LEDs sería usar los mismos pines que manejan los jacks para manejar 12 LEDs, ahora cuando el cable está en su lugar ambos leds se encenderían al mismo tiempo.

1voto

Asmyldof Puntos 9125

De acuerdo, déjame sumergirme en esto en breve (para mí, así que no más de una o dos horas ;-) ).

Como primera respuesta, que se me ocurrió cuando empecé a teclear lo de lamer abajo:
Los sobrinos de tres años tienen cuerpos muy pequeños y les queda mucho desarrollo del sistema nervioso, por lo que, en última instancia, es importante que te asegures de que sólo adquieres piezas RoHS y, preferiblemente, RoHS/REACH, ya que el plomo y otros metales pesados no son buenos para los sistemas nerviosos diminutos (ni para los adultos, pero podemos soportar cantidades menores durante períodos de tiempo más largos). Así que no busques cables o cajas en los contenedores de ofertas, sino que comprueba los puntos de venta decentes, para saber que han sido calificados. Utilice también soldadura sin plomo. Para los trabajos de hobby, a menudo no me preocupo por ello con la gente y, de hecho, yo mismo utilizo mucho plomo en la creación de prototipos, pero cuando se trata de niños en desarrollo, es algo diferente.

Sobre la respuesta con la que empecé:

En primer lugar, como dejé claro en los comentarios, no hay manera de que hacer una arquitectura elaborada alrededor de un número reducido de pines de E/S vaya a ser más barato o más eficiente en tiempo que simplemente comprar la plataforma MCU con suficientes pines de E/S, pero ya que dices que estarías interesado en esos trucos de todos modos:

Imaginemos que vivimos en los tiempos en que una plataforma de procesador con algo de E/S cuesta entre 100 y $130 (yes that change of type is intentional) of equivalent now-day-money and the one you'd need for full software solution with "Whoaaaa-many" I/O pins would cost you €300 to $ 350. En ese caso, el engaño puede ser muy útil:

Hay muchas maneras, tanto analógicas como digitales con la inclusión de cableado extra, diodos, resistencias y/o condensadores para detectar rutas combinatorias hasta la totalidad de sus opciones completas 140152 con menos de 12 pines.
Por cierto, acabo de copiar esa cifra, porque ahora mismo estoy demasiado ocupado para comprobar tus cálculos.

Así que también, como un aviso: Los siguientes métodos no están totalmente pensados, como normalmente haría (y perdería medio día o más), sino ideas ligeramente explicadas.

Necesitan comprobaciones de viabilidad y estimaciones de costes, así como más cálculos matemáticos, que estoy omitiendo por falta de tiempo.

Así que trata esto como "una forma de ver algunas opciones que consigo presentar antes de que tenga que volver a ser útil", en lugar de una guía de diseño completa con componentes y esquemas exactos.

Sus opciones (las ecuaciones suponen vías analógicas y/o digitales perfectas):

  1. Escanea 12 pines, como tú mismo señalas.
  2. Utiliza los trucos del ADC para conseguir (granularidad del ADC)^n = 140152 niveles de detección.
  3. Utilice los trucos del temporizador+ADC para lograr (n-1)x(Granularidad del temporizador)x(Granularidad del ADC) = 140152+ niveles de detección. (las matemáticas aquí son un poco dudosas alrededor del valor n)
  4. Utiliza trucos de temporizador+Comperador para conseguir (Granularidad del temporizador)^n = 140152 niveles de detección.
  5. Haz mierdas raras con filtrado tonal usando RLC (tu opción 3) para lograr niveles de 140152+ usando aproximadamente (estimando mucho) 2 pines PWM independientes y 1 o 2 pines ADC.
  6. Introducir diodos en el sistema y Charlieplex (esto es probablemente lo más fácil).

Donde todas las opciones tienen n como el número de pines que necesitarías mínimamente y la granularidad es sólo un lenguaje elegante para el "número de niveles diferentes que este objeto puede expresar medido en bits menos significativos", o lo que también me refiero como "niveles" cuando está precedido por un número (a menudo el número 140152).

Opción 1: Escanear

Ya hemos hablado de ello en los comentarios y en otras respuestas. No para aquí.

Opción 2: Trucos de ADC solos

Calcula los pines... Así que... Tu ADC es probablemente de 1024 niveles, así que para conseguir el número con puros trucos de ADC necesitarías sólo 2 pines de ADC, pero también algunas partes analógicas de muy alto grado para poder amplificar 1/1024 de una respuesta a escala completa con sólo 10 LSB de error. Por cierto, también puedes conseguir un ADC de audio de 24 bits, probablemente más fácil de conseguir ese nivel de granularidad.

Utilizando redes resistivas cuidadosamente elegidas, posiblemente incluyendo algunas capacitancias para asegurarse de que la malla de cables y resistencias superiores no se convierta en una antena resonante para sus emisiones de radio locales, se puede detectar la "desaparición" de cada unión en un cambio en la señal analógica medida a través de una parte de esa red. Las soluciones más comunes son la serie "R-2R" y la serie "R-2R-4R-8R-.....". No tengo tiempo para resolverlo exactamente, pero existen varios caminos para ello.

Usando un op-amp de bajo offset de entrada (JFET) esa señal puede ser amortiguada para permitirte acercarte a una precisión de 19 bits más o menos, pero necesitarás una caja de metal y una conexión a tierra adecuada, así como algunas consideraciones de cableado. Y cuando tu sobrino lame los contactos, todo tipo de luces y sonidos podrían empezar a sonar, porque lamer es muy ruidoso, eléctricamente hablando.

Entonces necesitarías un ADC lo suficientemente bueno (>19 bits de resolución, buena linealidad diferencial e integral, etc) para capturar eso, o crear un ADC interno de 20 bits con una división de voltaje de 1 a 1024 y una amplificación de 1024 factores en la respuesta inferior. Sin embargo, este último bit es bastante complicado de conseguir por encima del ruido y los efectos térmicos, pero tal vez si se sobremuestrea se pueden obtener de 19 a 21 bits de precisión en un intento afortunado. Sin embargo, es complicado.

3. Trucos de temporizador + ADC:

Este requiere más post-matemáticas que texto completo, pero es bastante divertido. Aquí se crea una forma de onda en un pin. Puede ser un pulso o una onda cuadrada o incluso PWM, todo depende de la persona que hace las matemáticas.

Lo alimentas a través de una matriz o red de condensadores que se puentean mediante cables conectados con una resistencia conocida. Al elegir de nuevo con decisión las capacitancias, como en la red de resistencias, puedes obtener una imagen completa de los huecos y cortocircuitos en ella. Todos los condensadores deben tener una tensión nominal superior a la tensión máxima (5V, o 12V, o 3,3V, lo que sea que su unidad digital pueda generar y su sistema analógico pueda medir).

Si utilizas un temporizador de 8 bits para crear un ancho de pulso variable, un ADC de 10 bits para medir el voltaje resultante en un intervalo cambiante utilizando otro temporizador de 8 bits, me sorprendería que no pudieras conseguir cerca de un millón de niveles de rango de medición del condensador. Cambia el generador de señales por un temporizador de 16 bits y fácilmente serán decenas o cientos de millones.

Utilizando grandes capacitancias puede necesitar un buffer de salida, para forzar más fuertemente la señal y obtener resultados fiables. Es probable que haya algún chip controlador/amortiguador por debajo de 1€ que conduzca 100mA o más en capacitancias grandes, pero normalmente a los pines de la MCU no les gustan y empiezan a generar más una salida triangular o sinusoidal, en lugar de una onda cuadrada, haciendo que las matemáticas sean discutibles.

Opción 4: Utilizar trucos de temporizador y comperador

Esto es básicamente lo mismo que lo anterior, pero en lugar de medir el nivel en un intervalo, se establece un comperador para medir (muchos Atmels, y como tal 'duino's, tienen comperadores internos) un umbral preciso y conocido a través del condensador que se carga después de poner un pin de salida en alto. Midiendo el tiempo que tarda en llegar ahí, puedes usar la respuesta de carga/descarga de un condensador para desarrollar las matemáticas para calcular el tamaño del condensador, basado en el tiempo que tarda en cargarse. Usando un temporizador de 16 bits y un poco de sintonía R/C puedes conseguir hasta más de 30000 niveles de detección de condensadores.

Añade un temporizador de 8 bits (software o hardware) que incremente uno cada vez que el de 16 bits se desborde y podrás obtener más de 15 millones de niveles de detección de condensadores.

Normalmente el comperador es más estable que el ADC, por lo que el tiempo y el valor serán más estables, pero la resolución de detección con el mismo número de bits del temporizador será bastante menor. Aparte de eso, el truco del comperador es mucho más fácil de escribir código, ya que no incluye todo tipo de efectos de moiré en los dos temporizadores.

Opción 5: Trucos RLC con generación de tonos

Este necesita bastante lápiz y papel para ser realmente universal, así que se quedará aún más conceptual (espero - ya sin tiempo en este punto).

Los tonos PWM pueden ser posiblemente un segundo (y tercer) canal de audio, si esa biblioteca funciona lo suficientemente limpia.

Puede generar un tono, que luego pasa por varias etapas de filtros que pueden apilarse y acortarse dependiendo de las conexiones. Dependiendo del tono que hagas también obtendrás sobretonos, ya que crearás el tono digitalmente, a menos que introduzcas DACs de audio. Para corrientes pequeñas, los filtros RLC necesarios para dejar pasar o filtrar un solo tono pueden ser relativamente pequeños, incluso en los rangos más bajos de la frecuencia de audio.

Si cada conector tiene un filtro de banda en el conector y otro filtro de banda desde el conector a tierra, creo que hay una manera de hacer esto con un número muy limitado de generadores de tono y ADCs, pero me falta el tiempo para trabajar adecuadamente. Solo hay que hacer un pequeño detector de picos con un diodo, un condensador y una resistencia de descarga para convertir el tono en una señal de CC.

Opción 6: "Introducir diodos y charlieplex:

Aquí puedes añadir diodos a través de algunos de los pines de señal y anillos de tierra de los conectores. Algunos en una dirección, otros en la otra. De nuevo, el tiempo se acaba, así que esto tendrá que mantenerse en el nivel de la teoría superior. Es posible que también necesite algunas resistencias para que funcione correctamente, pero entonces puede simplificar la técnica de accionamiento y detección digital, incluso puede ser capaz de utilizar un ADC más eficazmente utilizando diodos y salidas charlieplexed con resistencias.

Pero para ver si eso funciona y cómo lo hace puede que tengas que tomarlo desde aquí. Mi pensamiento era básicamente: Si tienes un diodo en una dirección y otro en la otra, se combinan y se convierten en un corto a tierra para ambas direcciones. Si se combinan dos en la misma dirección son cortocircuitos en una sola dirección. Agrega algunas resistencias y posiblemente algunas redes de diodos más y puedes terminar con una forma puramente digital de 6 o 7 E/S para detectar todas tus posibles combinaciones.

Aquí me detengo.

0 votos

Buen post, ideas interesantes. Parece que te centras en el coste. Aunque no es realmente la cuestión, es interesante considerar esta pregunta como se planteó hace unas décadas, cuando los microcontroladores y el IO eran tan baratos como ahora... En mi opinión, los trucos más interesantes nacen de la necesidad de trabajar con recursos limitados.

0 votos

Una cosa que todavía no entiendo del todo en relación con cualquier solución que implique una red (resistencias, condensadores o de otro tipo) y que luego detecte qué elementos de la red han sido puenteados... Parece que siempre puedo pensar en combinaciones de pares indistinguibles considerando un cortocircuito entre dos nodos distantes. Cualquier par de nodos cortocircuitado adicional situado "dentro" de los dos primeros, no producirá ningún cambio (por lo tanto, no es detectable), ya que todo el camino ya estaba cortocircuitado por el primer emparejamiento....

0 votos

@Jesuis Lo del coste es más una cosa de convencer a otras personas para que lo lean. La mayoría de la gente hoy en día piensa "jeez, Arduino € 10,-, a quién le importa", así que me sumo, para evitar perder 2 horas en eso ^^ y que nadie lo lea.

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