Arduino hace Multitouch

Actualmente, muchos dispositivos de consumo utilizan sensores táctiles. Es una forma económica y confiable de reemplazar una variedad de trampas y encender todo, desde audífonos hasta autos. Sin embargo, crear un controlador táctil personalizado para un proyecto único puede resultar abrumador. Un artículo reciente de ACM muestra cómo casi cualquier sensor de capacidad puede funcionar como un sensor multitáctil con nada más que un Arduino, aunque el procesamiento por computadora interpreta los datos para funciones más avanzadas.

La clave es que Arduino excite la red a través de PWM y luego examine la señal que sale de la red. La toma de huellas dactilares cambia bastante la respuesta y el Arduino puede detectarla usando los convertidores analógicos a digitales a bordo. Puede encontrar la herramienta de software real en línea. El documento del tutorial es probablemente más interesante que el documento de ACM si solo desea utilizar el kit de herramientas.

La frecuencia óptima del disco es de 10 MHz. Los ejemplos se basan en armonías de una señal PWM de frecuencia más baja para llegar allí. La conversión analógica, por supuesto, no es tan rápida, pero debido a que el toque de su dedo es relativamente lento, tratan la señal como una entrada de amplitud modulada muy fácilmente descifrable.

Los sensores pueden ser de tinta conductora, alambre o tiras de cobre. Hay algunas aplicaciones de ejemplo, incluido un conejito impreso en 3D que puede mimar, un panel de control en una manga y una tarjeta de felicitación interactiva.

El sensor forma una imagen y OpenCV detecta la configuración táctil real. Parece que también puedes usar los datos sin procesar del Arduino, pero podría ser un poco más difícil.

Imaginamos que el papel de aluminio funcionaría con esta técnica. Si obtiene la configuración de PCB, esto podría ser útil.

  • Lucas dice:

    Por supuesto, podrían usar la salida oscilante del AVR para dar la señal que multiplican en la matriz.

    Lástima que la plataforma Arduino abstraiga características tan interesantes como esa.

    • Jm dice:

      Si la biblioteca no existe, escríbala usted mismo.

      • Lucas dice:

        Necesitas poner algunos fusibles. La cuestión es que la plataforma Arduino casi evita que las personas lean la hoja de datos del chip que están tratando de programar, por lo que obtiene tales soluciones cuando la persona intenta usar las armonías anteriores de una señal PWM para obtener una señal de 8 MHz. cuando podían obtener 8 MHz directamente de PB0 como característica estándar.

        • Harvie.CZ dice:

          OTOH, sin embargo, algunas de estas personas no leerían la hoja de datos, por lo que en lugar de un código ineficiente (esto es algo portátil y optimizable en el futuro) no tendríamos código porque sería demasiado inconveniente para los principiantes incluso comenzar a hacer algo.

          • Moryc dice:

            Entonces, ¿preferiría que miles de escritores escribieran código incorrecto porque son demasiado vagos para aprender o unas pocas docenas que escriban código bueno o al menos promedio?

          • esrever dice:

            @Moryc Algunos de los codificadores malos se convierten en buenos codificadores, pero necesitan un punto de entrada.

          • tekkieneet dice:

            Cuando busco cosas, uso -arduino para omitir esos miles de códigos incorrectos y preguntas triviales.

          • Lucas dice:

            La programación para la familia AVR no es difícil. Simplemente establece algunos bits en algunos registros y el hardware hace las cosas por usted. Lo difícil es encontrar qué registro y qué bit puede ser un poco oscuro, pero otras personas lo han descubierto frente a usted de todos modos, por lo que solo puede mirar ejemplos.

            El propósito del Arduino es ayudar un poco demasiado: te echa una cuchara y corta el bistec porque no puedes sostener un cuchillo y un tenedor, así que en lugar de simplemente comprar un ATMega328P y sumergirlo en una tabla, debes comprar un Placa Arduino porque en realidad no tienes poder con el chip y no puedes hacer nada sin un Arduino.

            El punto no es enseñar a las personas a codificar para plataformas integradas, ni siquiera mal. La cosa es vender Arduinos. Esta es una trampa para principiantes.

    • Moryc dice:

      O se podría usar un chip diferente que tenga una detección de toque de cabeza incorporada en el hardware. Pero en el país de Arduino existe este comando:
      ¡No use mejores dispositivos y programadores!
      Aparte de eso, el código Arduino es ineficiente porque necesita mucha sobrecarga para evitar que las personas usen incorrectamente entradas como salidas y salidas como entradas o hagan algo tan inseguro …

      Acabo de escribir un firmware para un interruptor multifunción sensible al tacto. El código para detectar dos campos táctiles tomó aproximadamente 40 líneas de C, incluidos algunos problemas de la máquina de estado para las funciones y evitar que se sienta un toque largo como una serie de toques cortos, y una recalibración automática constante de los sensores …

      • bbp dice:

        Apuesto a que quejarse aquí es menos esfuerzo que escribir una biblioteca.

      • David dice:

        Fresco. ¿Podrías compartir tu código?

        • Moryc dice:

          Omití todas las declaraciones de variables y otras cosas para centrarme en el código principal. Se puede encontrar un ejemplo de un código similar, por ejemplo, en la documentación del PIC16F1827. Tenga en cuenta que utilizo variables globales porque a veces necesito acceder a ellas en muchos lugares diferentes del programa. También son muy volátiles, así que no fume …

          La función de configuración se llama como primera cosa a realizar. El siguiente fragmento contiene el diseño de un módulo táctil de encabezado y un temporizador2 para generar interrupciones oportunas:
          OPTION_REG = 0;
          OPTION_REGbits.PS = 0b100;
          CPSCON0bits.CPSRNG = 0b11;
          CPSCON0bits.T0XCS = 0;
          // Tiempo de 2 períodos: 0.01 / (0.000000125 * 64 * 10)
          T2CONbits.T2OUTPS = 0b1001;
          T2CONbits.T2CKPS = 0b11;
          PR2 = 125;
          PIE1bits.TMR2IE = 1;
          INTCON = 0;
          INTCONbits.PEIE = 1;
          INTCONbits.GIE = ​​1;
          T2CONbits.TMR2ON = 1;

          Esta función realmente realiza la lectura de un sensor y recalibra la calculadora preestablecida para todo el módulo si es necesario:

          char capGet {
          sennoma char tp = 0;
          dum (! tp) {
          INTCONbits.T0IF = 0;
          TMR0 = 0;
          CPSCON0bits.CPSON = 1;
          __delay_us (10);
          CPSCON0bits.CPSON = 0;
          tp = TMR0;
          si (INTCONbits.T0IF) {
          INTCONbits.T0IF = 0;
          tp = OPTION_REGbits.PS;
          tp = (tp + 1) & 0b00000111;
          OPTION_REGbits.PS = tp;
          tp = 0;
          }
          }
          return tp;
          }

          ISR para aumentar el contador del programa principal, que se relaciona con todas las demás partes del programa. También establece una bandera para actualizar la máquina de estado 100 veces por segundo:

          temporizador de interrupción vacíoINT (vacío) {
          si (PIR1bits.TMR2IF) {
          PIR1bits.TMR2IF = 0;
          contador ++;
          contador & 0b00111111;
          state.update = 1;
          }
          }

          La pieza principal de código en la función principal está relacionada con cambiar los estados de la máquina y controlar los sensores. En ellos se enciende / apaga, los otros modos de cambio. Cada vez que state.update se establece en 1, una calculadora de variable se incrementa en 1. Esto es lo que sucede a continuación:

          si (encabezado == 10) {
          cascada = 0;
          CPSCON1bits.CPSCH = 0;
          cap0raw = capGet ();
          CPSCON1bits.CPSCH = 1;
          cap1raw = capGet ();
          if (cap0raw if (state.turnon == 0) state.turnon = 1;
          else state.turnon = 0;
          cascada = 11;
          } // arriba está el fragmento que compara la medida sin procesar con un promedio y bloquea los sensores de detección
          si no cap0awg = cap0awg * 15/16 + cap0raw / 16; // y esto actualiza el promedio
          cap0trip = cap0awg / 10; // y punto de excursión límite
          if (cap1raw if (state.mode == 7) state.mode = 0;
          else state.mode ++;
          state.switch = 1;
          contador = 0;
          cascada = 11;
          }
          si no cap1awg = cap1awg * 15/16 + cap1raw / 16;
          cap1trip = cap1awg / 10;
          }
          if (capcounter == 111) capcounter = 9; // esto configurará una próxima sesión de sombrero después de esta repetición del bucle principal, pero solo cuando se contará un segundo.

          Espero que esto ayude …

          • tekkieneet dice:

            contador ++;
            contador & 0b00111111;

            probablemente error de formato o falta = en la segunda línea.

          • Moryc dice:

            Sí, lo acabo de arreglar …

          • David dice:

            Gracias Moryc … sí, eso creo.

          • Lucas dice:

            Pégalo. De lo contrario, está lleno de errores, ya que el sistema de comentarios come caracteres especiales para el desayuno.

  • Harvie.CZ dice:

    Recomiendo encarecidamente leer el PDF “Guía de diseño de sensores táctiles capacitivos” PDF de Feargal Cleary, Microchip Technology Inc.

    http://ww1.microchip.com/downloads/en/DeviceDoc/AN2934-Capacitive-Touch-Sensor-Design-Guide-00002934A.pdf

    • Inhibir dice:

      ¡Eso es increíblemente útil, gracias! Diseñé un sensor táctil de capacidad a partir del manual de ATTiny, pero la función no se realizó lo suficientemente bien como para poder hacerlo con mi limitado tiempo libre.

      ¡Eso llenará maravillosamente los vacíos en mi experiencia con el AVR y los sensores táctiles!

  • RW versión 0.0.1 dice:

    Me preguntaba si puedes renovar tablets resistentes con pantalla táctil con esta técnica. Es posible que necesite una película protectora de pantalla en la parte superior para detener el contacto directo atornillándola.

    • Harvie.CZ dice:

      Los paneles táctiles resistivos no se dividen en conjuntos de almohadillas conductoras como lo harían los paneles capacitivos. Un panel resistivo funciona más como dos potenciómetros gigantes (uno para X y otro para Y) si lo simplifico mucho. Probablemente puedas colocar un panel de capacidad pantalla de resistencia y use un microcontrolador con DAC para leer el panel de capacitancia y proporcionar una señal analógica a un circuito original (= copiar la salida del panel táctil resistivo). Pero los dispositivos resistentes generalmente tenían los elementos de la interfaz de usuario optimizados para usar un lápiz / lápiz, lo que los hace demasiado pequeños para ser controlados por dedos humanos gruesos.

      • RW versión 0.0.1 dice:

        Sé que así es como empezaron. En la era de la resistencia tardía, aunque parecían de alguna manera volverse pardos, los primeros novatos hasta que prevaleció la capacidad.

        Realmente no significó actualizaciones para el dispositivo, pero use excedentes en nuevas versiones.

        • Lucas dice:

          No puede hacer multitáctiles con sensores de resistencia a menos que lo esté rallando.

  • alix dice:

    Toque, ¿digno de confianza? Tienes que probar mis dedos. Realmente odio las interfaces táctiles …

Alejandro Vargas
Alejandro Vargas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *