19 de julio de 2012

despertar a un dispositivo de pantalla táctil basado en, por ejemplo en forma de tabletas, con una forma muy básica de reconocimiento de gestos

Resumen: Este artículo discute la idea de despertar a un dispositivo de pantalla táctil basado en, por ejemplo en forma de tabletas, con una forma muy básica de reconocimiento de gestos. Varias ideas se discuten acerca de cómo implementar esto usando sólo un sensor de proximidad. Estas incluyen consideraciones sobre la distribución física, las limitaciones de velocidad, los umbrales de detección, y un panorama de la integración de sistemas de alto nivel, como el contexto. Un código de ejemplo se proporciona para ilustrar así las implementaciones de software.

Una versión similar de este artículo aparece en los productos electrónicos , 1 de junio de 2012.

Introducción

En este artículo se explica cómo despertar a un dispositivo de pantalla táctil basado en como una tableta ... sin un toque.En su lugar se utiliza una forma muy básica de reconocimiento de gestos y de un sensor de proximidad novela. Los temas tratados incluyen diseño físico, limitaciones de velocidad, los umbrales de detección y de alto nivel de integración de sistemas, y el factor "humano". El código de ejemplo ilustra las implementaciones de software.

Cocinando Algunas ideas salvajes

Si alguna vez se utilizó un dispositivo de pantalla táctil mientras se cocina, usted probablemente ha notado que después de una receta de su dispositivo no es tan fácil como parece. Conocedores de la tecnología cocineros, como la suya en verdad, les gusta usar computadoras tablet o teléfonos inteligentes a las recetas de referencia mientras prepara la cena. "Bien", dirá usted, "pero lo que es tan difícil eso?" El dispositivo de mano que normalmente se va a dormir después de un minuto o dos, ya que mantener la pantalla en la puede quemar hasta un poder considerable. Entonces, cuando usted desea hacer referencia a algo y el dispositivo está dormido, usted se enfrenta con dos opciones: o bien obligar a la pantalla para quedarse en forma permanente, o la tinta se corra riesgo de la pantalla con manchas de alimentos manos. Siempre hay la opción de lavarse las manos cada vez que algo tiene que ser revisado, pero constante lavado y secado es tedioso y el agua los desechos.

Aquí es donde yo me pregunto, "¿Puedo evitar que mantiene la pantalla en forma permanente y también evitar el peligro de enganche del dispositivo?" No es, en realidad, una manera de hacer las dos cosas. Puede gesto de la pantalla para volver en, pero sin tocarla. Parece complicado, ¿verdad? Afortunadamente, esto es más sencillo que hacer lo que parece.

Cómo conocer mejor a los sensores de proximidad

Muchos dispositivos de pantalla táctil, especialmente smartphones, tiene infrarrojos (IR) sensores de proximidad construido adentro Estos sensores se utilizan generalmente para encender la pantalla y se apaga durante una llamada y, por tanto, evitar la entrada no deseada que se aplique en el teléfono. Este sensor, y algunos software de diseño inteligente, es todo lo que necesitas para hacer una activación sin contacto funcionan con el movimiento de una mano.

La idea básica es cuando el dispositivo está dormido, es decir, cuando la pantalla táctil se apaga y el procesador de aplicaciones se encuentra en un modo de bajo consumo, tienen el sensor de proximidad "look" para un cambio bastante grande de las lecturas de fondo y reaccionar adecuadamente . Esto es casi exactamente como el sensor de proximidad ya opera para apagar la pantalla durante una llamada telefónica. En nuestra aplicación, los datos se interpreta simplemente algo diferente.

Usted comienza por señalar la cantidad de cuentas "normales" de fondo leída por el sensor. Esto puede ser recuentos cero, aunque es útil para tener en cuenta las compensaciones sistémicos (por ejemplo, la retrodispersión o diafonía ), cuando sea aplicable. Luego se creó para activar cualquiera de una interrupción o enviar una señal al procesador de aplicaciones cuando la señal sube más allá del umbral que se estableció. Esto hará que el sistema para volver en línea y encienda la pantalla. En general, este es bastante sencillo y se puede implementar con una luz ambiental y sensor de proximidad de infrarrojos.

Esta demostración utiliza la MAX44000 , que tiene una proximidad de leer todos los 1.56ms o tan lento como cada 100ms (cuando se intercalan con el sensor de luz ambiental). Suponiendo un rango de detección máximo de 10 cm y un LED con un ángulo de radiación de ± 15 °, entonces el área de cobertura es de aproximadamente 22cm ² o aproximadamente 5.35cm de ancho. Un objetivo en movimiento a través de esta área de la pantalla se deben tomar muestras al menos una vez a la vista. Por lo tanto, el mejor gesto que puede ser detectada de forma fiable, o "recoger", en el más lento y también el más bajo consumo de energía de velocidad de muestreo es de aproximadamente 0.53mps. También estamos suponiendo aquí que el sensor debe detectar una sola muestra por encima de un umbral para que luego de reconocer un objetivo sencillo que pasa a través del área de cobertura.

Todo está en la muñeca ...

Como un enfoque teórico, esto es muy simple. Cuando el dispositivo entra en modo de espera, establezca su sensor de proximidad para explorar el entorno y enviar una interrupción cuando se detecta un objetivo, indicado por la señal de movimiento por encima de un umbral preestablecido. Esto puede hacerse simplemente por el sensor de sondeo repetidamente durante el I ² C interfaz. Desafortunadamente, esto también puede consumir más energía que la mayoría de los operadores les gustaría.

Este es el punto en el que las capacidades específicas de su sensor de proximidad convertido en más importante. El sensor de MAX44000 está diseñado para que el procesador de aplicaciones de adoptar un enfoque más manos libres (y menor consumo de energía) enfoque.

Al permitir que las interrupciones internas de la MAX44000 de proximidad (bit 1 en 0x01 registro), puede escribir el umbral de alerta para un registro interno (0x0B y 0x0C). Cuando la lectura proximidad pasa este umbral, un indicador de interrupción se eleva. Esto lleva a la MAX44000 de baja activa baja pin INT, lo que indica una interrupción en la línea externa.Cuando el procesador de aplicaciones da cuenta de que esta línea ha sido impulsado bajo, puede ser ya sea despertado para llevar el dispositivo fuera de su estado de baja energía y llevar la pantalla de nuevo en línea, o puede hacer cualquier otra cosa que hay que hacer.

... Pero no vamos a Mano-Wave A través de este

Como suele suceder, la aplicación práctica no es tan fácil como el teórico. Lamentablemente, manos libres despertar no es tan simple como la búsqueda de una muestra por encima de un umbral. En cambio, hay varios factores a considerar cuando se intenta aplicar este diseño.

Nivel de Señal y Diseño

Tal vez el aspecto más crítico es el nivel de señal elegido para generar una condición de activación. Un importante disyuntiva existe entre la capacidad de respuesta del sistema y su inmunidad a la detección falsa. Establecer el umbral de baja hace que sea más fácil de detectar una entrada (por ejemplo, su mano que saluda), pero aumenta el riesgo de detección falsa de ruido transitorio o movimiento incidente. Por el contrario, un umbral demasiado alto, es casi seguro reducir la probabilidad de una falsa detección de cero, pero también puede provocar que el sistema para detectar sólo objetivos muy cercanos o incluso no responder a la mayoría de la entrada (por ejemplo, la mano que agita frenética).

La mejor manera de abordar esto es, primero, para mitigar la cantidad de ruido en el sistema. Esto puede hacerse por soluciones ópticas o encaminamiento cuidadoso eléctrica y colocación de los componentes. Al reducir el ruido de fondo, se reducen las posibilidades de una detección falsa. A continuación, elija un "promedio" de distancia de detección (por ejemplo, 4 cm a 5 cm) y medir la señal con un objetivo de referencia. Una tarjeta gris al 18% es ideal. Nótese que podría parecer obvio, pero si la aplicación utiliza un cristal oscuro en frente del sensor, entonces las mediciones se debe hacer con que el vidrio en su lugar. El nivel de señal medido se puede utilizar como una mejor estimación para ajustar el umbral. Una buena regla es para ajustar el nivel del 8% al 15% de la escala completa, a pesar de su nivel puede variar.

Umbral El sensor de proximidad de MAX44000 registra permiten establecer un umbral de activación basado en el experimento anterior. Figura 1 muestra una señal frente trama distancia para una tarjeta de gris 18% con una unidad de 100mA de corriente y el vidrio no en frente del sensor. La línea azul es una opción posible para el umbral de activación.

Figura 1.  Distancia vs intensidad de la señal utilizando el sensor de proximidad MAX44000 con un 18% de la tarjeta gris, 100mA de corriente, y el vidrio no.
Figura 1. Distancia vs intensidad de la señal utilizando el sensor de proximidad MAX44000 con un 18% de la tarjeta gris, 100mA de corriente, y el vidrio no.

Ruido y filtrado de paso bajo

Si el ruido sigue siendo una preocupación, se puede implementar un filtro de paso bajo para limpiar la señal. Existen dos maneras de hacer esto con el MAX44000, porque también tiene unos pocos bits para permitir la persistencia umbral antes de un indicador de interrupción se eleva. Este ajuste, que requiere la proximidad de lectura para permanecer fuera del umbral para un número determinado de muestras, se puede utilizar para reducir los efectos del ruido.

Un método ligeramente más complejo implica almacenar las lecturas del sensor en una cola de datos, entonces la aplicación de un filtro FIR personalizado para ellos en el software. Por desgracia, este enfoque tiene un defecto. Si lavelocidad de muestreo del sensor de proximidad no se puede aumentar, entonces la velocidad a la que se puede deslizar su mano a través del campo del sensor de visión y todavía ser detectados se reduce. La tasa de muestreo de 100 ms efectiva es particularmente vulnerable a esto. Cuando se utiliza el umbral de persistencia, esta detección reducida puede ser tanto como 16x (aunque el 4x persisten debería ser suficiente).

Velocidad de onda

Esto nos lleva a la velocidad de la onda siguiente consideración,. La velocidad máxima está determinada por primera, el sensor de campo de vista, en segundo lugar, la distancia de la onda del sensor; tercero, la frecuencia de muestreo, y cuarto, el nivel de umbral. La determinación de los dos primeros criterios es evidente: el ángulo que el sensor puede ver, junto con la distancia del blanco desde el sensor, se puede utilizar con algo de trigonometría básica para calcular la distancia que el objetivo puede viajar mientras que el sensor trata de recoger arriba. Por ejemplo, si el ángulo de visión del sensor es de 30 grados en total y el rango válido es de hasta 10 cm, entonces el objetivo puede viajar 5.35cm sobre el sensor y todavía ser visto. Esta es un área de cobertura de aproximadamente 78 cm ². Esta lineal distancia, junto con la velocidad de muestreo, implica un límite de velocidad. En concreto, si la frecuencia de muestreo es T, entonces el objetivo debe atravesar el área visible en no menos de T. Por ejemplo, si T es 100 ms (el MAX44000 la tasa más baja), y luego siguiendo el ejemplo anterior, la velocidad máxima permitida es teóricamente 1mps . (Esto es realmente muy rápido.) Es posible que desee para capturar múltiples muestras para confirmar su evaluación, por lo que este límite de velocidad es probable que se reduce.

El umbral de detección también juega un papel importante en la velocidad máxima permitida. Como regla general, cuanto menor sea el umbral, más rápido será el gesto que puede ser recogido. Como se mencionó anteriormente, este umbral bajo debe ser cuidadosamente seleccionado para evitar falsas detecciones.

El "Human" Factor

Esta solicitud está sujeta a las inconsistencias de la mano del hombre y la persona se agita. En consecuencia, el diseño debe incluir los casos de uso para determinar qué tan rápido se mueven los usuarios típicos de sus manos delante de la pantalla, la distancia de la pantalla, y si se llevan guantes. Esta interacción con el dispositivo también puede variar mucho entre las aplicaciones como los teléfonos inteligentes, tabletas, o algo por el tablero de un automóvil. En última instancia, la aplicación debe tener en cuenta para estos interfaz de usuario y las variables de la experiencia durante el proceso de diseño.

Hay una última cosa a considerar, cuando es una onda no es una onda? Para ser más específicos, ¿cómo puede saber si un dispositivo de una señal recibida proviene de una mano que saluda o de otro movimiento tan simple como que se coloca dentro de una caja, una bolsa o mochila, o boca abajo en alguna superficie? Tenemos que enfrentar la verdad aquí no hay una respuesta fácil a esta pregunta, a menos que el contexto se da al dispositivo. ¿Cómo que se hace es un asunto totalmente diferente.

Al final, usted puede elegir para poner en práctica esta solución despertar sólo cuando el dispositivo de pantalla táctil se está ejecutando ciertas aplicaciones o se puede exigir al usuario que le permita Además, muchos de estos dispositivos tienen acelerómetros que se puede decir que el dispositivo cuando está acostado boca -abajo. La función también se puede desactivar si el dispositivo fue puesto a dormir de forma manual por el usuario (por ejemplo, cuando el dispositivo está apagado).

Inténtelo usted mismo

Para su comodidad, tres piezas de código de ejemplo se adjuntan al presente artículo. El primero implementa una versión conceptualmente simple activación de esta solución con los controles manuales de la lectura de la proximidad de la MAX44000. El segundo código se expande en la primera y pone en práctica el concepto de filtrado se discutió anteriormente. El último código muestra una forma rápida de hacer esto utilizando la función de activación de la interrupción de MAX44000.

Ejemplo de Código 1

__interrupt void TimedInterrupt( void )
{

uint8 proximity_counts;
....
....


if ( device_status == SLEEP_MODE )
{
// read one byte from register 0x16
proximity_counts = read_i2c_register(MAX44000_ADDR,0x16,1);
if (proximity_counts > WAKEUP_THRESHOLD)
{
device_status = WAKE_MODE;
...
}
else
{
// do whatever it is you need to in sleep mode
...
...
}
}

...
...

}

Ejemplo de código 2
// example interrupt function where this might be implemented
__interrupt void TimedInterrupt( void )
{

uint8 proximity_counts;
uint8 filtered_counts;
....
....


if ( device_status == SLEEP_MODE )
{
// read one byte from register 0x16
proximity_counts = read_i2c_register(MAX44000_ADDR,0x16,1);

// weights[QUEUE_SIZE] contains the filter weights for the FIR filter
// data_queue[QUEUE_SIZE] is a FIFO queue meant to be the input to the filter
filtered_counts = fir_filter(proximity_counts,weights,data_queue);

if (filtered_counts > WAKEUP_THRESHOLD)
{
device_status = WAKE_MODE;
...
}
else
{
// do whatever it is you need to in sleep mode
...
...
}
}

...
...

}

/**
* fir_filter()
*
* Implements an FIR filter in the form
* y = w[0]*x[0] + w[1]*x[1] + ... + w[QUEUE_SIZE]*x[QUEUE_SIZE]
*
* Arguments:
* uint8 input - newest datapoint taken (that is, x[0])
* uint8 *weights - w[0]...w[QUEUE_SIZE]
* uint8 *queue - the discrete sequence x[0]...x[QUEUE_SIZE]
*
* Returns:
* The FIR-filtered output, y
*/
uint8 fir_filter(uint8 input, uint8 *weights, uint8 *queue)
{

uint8 i;
int sum = 0;

// pop first entry in the queue, then
// push new data into the last position
push_into_queue(queue,input);

// input is now x[0]
for (i=0; i<QUEUE_SIZE; ++i)
{
sum += weights[i]*queue[i];
}

return (sum/QUEUE_SIZE);
}

Example Code 3
// this handles hardware-level interrupts on the micro
__interrupt void irq_handler( void )
{
...

// if the hardware interrupt came from the MAX44000 sensor
// pulling its \INT pin low
if ( irq_source == MAX44000 )
{
// if the device is in sleep mode
if (device_status == SLEEP_MODE)
{
device_status = WAKE_MODE; // wake up the device
...
// reconfigure whatever else you need here as the system wakes up
}
// otherwise, handle it however it is you wish
else
{
...
}
}

...
}

/**
* configure_max44000_for_sleep_mode()
*
* Sets up the MAX44000 to trigger a hardware interrupt when the proximity
* counts go above some set threshold.
*
* Arguments:
* uint8 upper_threshold - the set threshold (8-bit mode)
*
* Returns:
* n/a
*/
void configure_max44000_for_sleep_mode(uint8 upper_threshold)
{
uint8 max44000_thresh_registers[] = {0x0B,0x0C};
uint8 max44000_upper_thresh[] = {0x40,0};

max44000_upper_thresh[1] = upper_threshold;

// do a consecutive write of 0 followed by upper_threshold to
// registers 0xB and 0xC, respectively
// MAX44000_ADDR is usually 0x94
// interrupt will trigger only if proximity value is above the threshold
write_i2c_register(MAX44000_ADDR,max44000_thresh_registers,
max44000_upper_thresh,2);


// write to bits 2 and 3 of register 0x0A here if you wish to set the
// persist time to anything other than one sample

// writes to register 0x01 to enable interrupts on the MAX44000
max44000_enable_interrupt();

return;
}

Por:
Ilya Veygman, Ingeniero de Aplicaciones Estratégico

15 de junio 2012

image

No hay comentarios:

Publicar un comentario