Tabla de contenido:

Implementación del sensor de gestos APDS9960 sin bloqueo: 5 pasos
Implementación del sensor de gestos APDS9960 sin bloqueo: 5 pasos

Video: Implementación del sensor de gestos APDS9960 sin bloqueo: 5 pasos

Video: Implementación del sensor de gestos APDS9960 sin bloqueo: 5 pasos
Video: Sensor APDS9960, Mucha Funcionalidad a Bajo Precio 2024, Mes de julio
Anonim
Implementación del sensor de gestos APDS9960 sin bloqueo
Implementación del sensor de gestos APDS9960 sin bloqueo
Implementación del sensor de gestos APDS9960 sin bloqueo
Implementación del sensor de gestos APDS9960 sin bloqueo
Implementación del sensor de gestos APDS9960 sin bloqueo
Implementación del sensor de gestos APDS9960 sin bloqueo

Preámbulo

Este Instructable detalla cómo crear una implementación sin bloqueo del sensor de gestos APDS9960 utilizando SparkFun_APDS-9960_Sensor_Arduino_Library.

Introducción

Así que probablemente se esté preguntando qué es el no bloqueo. ¿O incluso bloqueando para el caso?

Más importante aún, ¿por qué es importante tener un derecho que no bloquee nada?

De acuerdo, cuando un microprocesador ejecuta un programa, ejecuta secuencialmente líneas de código y, al hacerlo, realiza llamadas y devoluciones de funciones de acuerdo con el orden en que las escribió.

Una llamada de bloqueo es simplemente una llamada a cualquier tipo de funcionalidad que provoca una detención de la ejecución, es decir, una llamada a una función en la que la persona que llama no reanudará la ejecución hasta que la función llamada termine de ejecutarse.

Entonces, ¿por qué es importante?

En el caso de que haya escrito algún código que necesite ejecutar regularmente muchas funciones de forma secuencial, como leer una temperatura, leer un botón y actualizar una pantalla, si el código para actualizar la pantalla es una llamada de bloqueo, su sistema no responderá a presiones de botones y cambios de temperatura, ya que el procesador pasará todo su tiempo esperando que la pantalla se actualice y no leyendo el estado del botón o la última temperatura.

Por mi parte, quiero crear un dispositivo de escritorio IoT compatible con MQTT sobre WiFi que lea valores de temperatura / humedad locales y remotos, niveles de luz ambiental, presión barométrica, realice un seguimiento del tiempo, muestre todos estos parámetros en una pantalla LCD, inicie sesión en un uSD tarjeta en tiempo real, leer entradas de botones, escribir en LED de salida y monitorear gestos para controlar cosas en mi infraestructura de IoT y todo lo cual debe ser controlado por un ESP8266-12.

Desafortunadamente, las únicas dos fuentes de la biblioteca APDS9960 que pude encontrar fueron las bibliotecas SparkFun y AdaFruit, ambas extraídas del código de la aplicación de Avago (el fabricante de ADPS9960) y poseen una llamada llamada "readGesture" que contiene un while (1) {}; bucle que, cuando se usa en el proyecto anterior, hace que el ESP8266-12E se reinicie cada vez que el sensor ADPS9960 se sature (es decir, cuando un objeto permaneció cerca o había otra fuente de infrarrojos iluminando el sensor).

En consecuencia, para resolver este comportamiento, elegí mover el procesamiento de los gestos a un segundo procesador en el que el ESP8266-12E se convirtió en el microcontrolador maestro y este sistema en el esclavo, como se muestra en las fotografías 1 y 2 anteriores, los diagramas de descripción general del sistema y composición del sistema, respectivamente.. La imagen 3 muestra el circuito prototipo.

Para limitar los cambios que necesitaba hacer en mi código existente, también escribí una clase contenedora / biblioteca llamada imaginativamente "APDS9960_NonBlocking".

Lo que sigue es una explicación detallada de la solución sin bloqueo.

¿Qué piezas necesito?

Si desea construir la solución I2C que funcione con la biblioteca APDS9960_NonBlocking, necesitará las siguientes partes.

  1. 1 de ATMega328P aquí
  2. 1 de PCF8574P aquí
  3. 6 resistencias de 10K aquí
  4. 4 resistencias de 1K aquí
  5. 1 diodo 1N914 aquí
  6. 1 transistor PN2222 NPN aquí
  7. 1 cristal de 16 MHz aquí
  8. 2 condensadores de 0.1uF aquí
  9. 1 condensador electrolítico de 1000uF aquí
  10. 1 condensador electrolítico de 10 uF aquí
  11. 2 condensadores de 22pF aquí

Si desea leer la salida del sensor de gestos a través de la interfaz paralela, puede soltar el PCF8574P y tres resistencias de 10K.

¿Qué software necesito?

Arduino IDE 1.6.9

¿Qué habilidades necesito?

Para configurar el sistema, use el código fuente (proporcionado) y cree los circuitos necesarios, necesitará lo siguiente;

  • Un mínimo de conocimientos de electrónica,
  • Conocimiento de Arduino y su IDE,
  • Comprensión de cómo programar un Arduino integrado (consulte Instructable 'Programación de ATTiny85, ATTiny84 y ATMega328P: Arduino como ISP')
  • Un poco de paciencia.

Tópicos cubiertos

  • Breve descripción del circuito
  • Breve descripción general del software
  • Prueba del dispositivo de detección de gestos APDS9960
  • Conclusión
  • Referencias

Paso 1: descripción general del circuito

Resumen del circuito
Resumen del circuito

El circuito se divide en dos secciones;

  • La primera es la conversión de I2C en serie a paralelo que se realiza mediante las resistencias R8… 10 e IC1. Aquí R8… R10 establece la dirección I2C para el chip de expansión de E / S de 8 bits IC1 un NXP PCF8574A. Los rangos de direcciones válidos para este dispositivo son 0x38… 0x3F respectivamente. En el ejemplo de software I2C proporcionado, 'I2C_APDS9960_TEST.ino' '#define GESTURE_SENSOR_I2C_ADDRESS' debería modificarse para adaptarse a este rango de direcciones.
  • Todos los demás componentes forman un Arduino Uno esclavo embebido y tienen las siguientes funciones;

    • R1, T1, R2 y D1 proporcionan una entrada de reinicio del dispositivo esclavo. Aquí, un pulso alto activo en IC1 - P7 forzará a U1 a reiniciarse.
    • R3, R4, son resistencias de limitación de corriente para las líneas TX / RX de programación del dispositivo integrado.
    • C5 y R7 permiten que Arduino IDE programe automáticamente U1 a través de un pulso en la línea DTR de un dispositivo FTDI adjunto.
    • R5 y R6 son resistencias pull up I2C para el APDS9960 con C6 que proporciona desacoplamiento de riel de suministro local.
    • U1, C1, C2 y Q1 forman el Arduino Uno integrado y su reloj respectivamente.
    • Finalmente, C3 y C4 proporcionan un desacoplamiento de carril de suministro local para U1.

Paso 2: descripción general del software

Descripción general del software
Descripción general del software
Descripción general del software
Descripción general del software
Descripción general del software
Descripción general del software

Preámbulo

Para compilar correctamente este código fuente, necesitará las siguientes bibliotecas adicionales para programar el Arduino Uno U1 integrado;

SparkFun_APDS9960.h

  • Por: Steve Quinn
  • Propósito: Esta es una versión bifurcada del sensor SparkFun APDS9960 bifurcada de jonn26 / SparkFun_APDS-9960_Sensor_Arduino_Library. Tiene algunas modificaciones para ayudar con la depuración y tiene un detector desensibilizado para reducir la activación espuria.
  • De:

APDS9960_NonBlocking.h

  • Por: Steve Quinn
  • Propósito: proporciona una interfaz limpia para incrustar esta implementación sin bloqueo del sensor de gestos APDS9960 en su código Arduino.
  • De:

Consulte el siguiente Instructable sobre cómo programar un microcontrolador Arduino Uno (ATMega328P) integrado si no está familiarizado con cómo lograrlo;

PROGRAMACIÓN DE ATTINY85, ATTINY84 Y ATMEGA328P: ARDUINO COMO ISP

Descripción funcional

El microcontrolador esclavo integrado ATMega328P sondea la línea INT del ADPS9960. Cuando esta línea baja, el microcontrolador lee los registros ADPS9960 y determina si se ha detectado un gesto válido. Si se ha detectado un gesto válido, el código para este gesto 0x0… 0x6, 0xF se coloca en el puerto B y 'nGestureAvailable' se afirma como bajo.

Cuando el dispositivo maestro ve "nGestureAvailable" activo, lee el valor en el puerto B y luego pulsa "nGestureClear" bajo temporalmente para acusar recibo de los datos.

El dispositivo esclavo luego des-afirma 'nGestureAvailable' alto y borra los datos en el puerto B. La imagen 5 anterior muestra una captura de pantalla tomada de un analizador lógico durante un ciclo completo de detección / lectura.

Descripción general del código

La imagen 1 de arriba detalla cómo funciona el software en U1, el esclavo incrustado Arduino Uno, junto con la imagen 2 cómo interactúan las dos tareas de fondo / primer plano. La imagen 3 es un segmento de código que describe cómo utilizar la biblioteca APDS9960_NonBlockinglibrary. La imagen 4 muestra un mapeo entre los pines digitales de Arduino Uno y los pines de hardware reales en el ATMega328P.

Después de reiniciar, el microcontrolador esclavo incrustado inicializa el APDS9960 permitiendo que la detección de gestos active su salida INT y configure su E / S, adjuntando la rutina de servicio de interrupción (ISR) 'GESTURE_CLEAR ()' para interrumpir el vector INT0 (pin digital 2, pin 4 de hardware IC), configurándolo para un disparador de flanco descendente. Esto forma la entrada nGestureClear del dispositivo maestro.

El pin de salida de interrupción 'INT' del APDS9960 está conectado al pin digital 4, el pin 6 del IC de hardware, que está configurado como una entrada a U1.

La línea de señal 'nGestureAvailable' en la clavija digital 7, la clavija 13 del IC de hardware se configura como una salida y se establece en alto, inactivo (anulado).

Finalmente, los bits del puerto B 0… 3 respectivamente se configuran como salidas y se ponen a nivel bajo. Estos forman el nibble de datos que representa los diversos tipos de gestos detectados; Ninguno = 0x0, Error = 0xF, Arriba = 0x1, Abajo = 0x2, Izquierda = 0x3, Derecha = 0x4, Cercano = 0x5 y Lejos = 0x6.

Se programa la tarea en segundo plano 'Loop' que sondea continuamente la salida INT de interrupción APDS9960 mediante la lectura del pin digital 4. Cuando la salida INT del APDS9960 se activa, indica que el sensor se ha activado, el microcontrolador intenta interpretar cualquier gesto llamando a 'readGesture () 'con es while (1) {}; ciclo infinito.

Si se ha detectado un gesto válido, este valor se escribe en el puerto B, se confirma la salida 'nGestureAvailable' y se establece el semáforo booleano 'bGestureAvailable', lo que evita que se registren más gestos.

Una vez que el maestro detecta la salida activa 'nGestureAvailable', lee este nuevo valor y pulsa 'nGestureClear' activo bajo. Este flanco descendente activa la tarea en primer plano 'ISR GESTURE_CLEAR ()' para que se programe suspendiendo la ejecución de la tarea en segundo plano 'Loop', limpiando el puerto B, el semáforo 'bGestureAvailable' y la salida 'nGestureAvailable'.

La tarea en primer plano 'GESTURE_CLEAR ()' ahora está suspendida y la tarea en segundo plano 'Bucle' se reprograma. Ahora se pueden detectar más gestos del APDS9960.

Al usar tareas de primer plano / segundo plano activadas por interrupciones de esta manera, el bucle infinito potencial en 'readGesture ()' del dispositivo esclavo no afectará el funcionamiento del dispositivo maestro y tampoco impedirá la ejecución del dispositivo esclavo. Esto forma la base de un sistema operativo en tiempo real (RTOS) muy simple.

Nota: El prefijo 'n' significa activo bajo o afirmado como en 'nGestureAvailable'

Paso 3: Prueba del dispositivo de detección de gestos APDS9960 sin bloqueo

Prueba del dispositivo de detección de gestos APDS9960 sin bloqueo
Prueba del dispositivo de detección de gestos APDS9960 sin bloqueo
Prueba del dispositivo de detección de gestos APDS9960 sin bloqueo
Prueba del dispositivo de detección de gestos APDS9960 sin bloqueo
Prueba del dispositivo de detección de gestos APDS9960 sin bloqueo
Prueba del dispositivo de detección de gestos APDS9960 sin bloqueo
Prueba del dispositivo de detección de gestos APDS9960 sin bloqueo
Prueba del dispositivo de detección de gestos APDS9960 sin bloqueo

Preámbulo

Aunque el módulo APDS9960 se suministra con + 5v, utiliza un regulador + 3v3 integrado, lo que significa que sus líneas I2C cumplen con + 3v3 y no + 5v. Es por eso que elegí usar el Arduino Due compatible con + 3v3 como el microcontrolador de prueba, para evitar la necesidad de cambiadores de nivel.

Sin embargo, si desea utilizar un Arduino Uno real, deberá cambiar el nivel de las líneas I2C a U1. Vea el siguiente Instructable donde he adjuntado un conjunto de diapositivas útil (I2C_LCD_With_Arduino) que brinda muchos consejos prácticos sobre el uso de I2C.

Prueba de interfaz I2C

Las fotografías 1 y 2 de arriba muestran cómo configurar y programar el sistema para la interfaz I2C. Primero deberá descargar e instalar la biblioteca APDS9960_NonBlocking. aquí

Prueba de interfaz paralela

Las fotos 3 y 4 detallan lo mismo para la interfaz paralela

Paso 4: Conclusión

Conclusión
Conclusión

General

El código funciona bien y detecta gestos de forma receptiva sin falsos positivos. Ha estado funcionando durante algunas semanas como dispositivo esclavo en mi próximo proyecto. He probado muchos modos de falla diferentes (y también el curioso moggie doméstico de Quinn) que anteriormente resultó en un reinicio del ESP8266-12, sin ningún efecto negativo.

Posibles mejoras

  • Lo obvio. Vuelva a escribir la biblioteca del sensor de gestos APDS9960 para que no se bloquee.

    De hecho, me comuniqué con Broadcom, quien me puso en contacto con un distribuidor local que ignoró de inmediato mi solicitud de soporte, simplemente no soy un SparkFun o AdaFruit, supongo. Así que esto probablemente tendrá que esperar un poco

  • Transfiera el código a un microcontrolador esclavo más pequeño. Usar un ATMega328P para una tarea es un poco exagerado. Aunque inicialmente miré el ATTiny84, no llegué a usar uno ya que sentí que el tamaño compilado del código era un ajuste de línea de límite. Con la sobrecarga adicional de tener que modificar la biblioteca APDS9960 para que funcione con una biblioteca I2C diferente.

Paso 5: referencias

Requerido para programar el arduino integrado (ATMega328P - U1)

SparkFun_APDS9960.h

  • Por: Steve Quinn
  • Propósito: Esta es una versión bifurcada del sensor SparkFun APDS9960 bifurcada de jonn26 / SparkFun_APDS-9960_Sensor_Arduino_Library. Tiene algunas modificaciones para ayudar con la depuración y tiene un detector desensibilizado para reducir la activación espuria.
  • De:

Requerido para incrustar esta funcionalidad sin bloqueo en su código arduino y dar ejemplos resueltos

APDS9960_NonBlocking.h

  • Por: Steve Quinn
  • Propósito: proporciona una interfaz limpia para incrustar esta implementación sin bloqueo del sensor de gestos APDS9960 en su código Arduino.
  • De:

Sistema operativo en tiempo real

https://en.wikipedia.org/wiki/Real-time_operating_system

Hoja de datos de APDS9960

https://cdn.sparkfun.com/assets/learn_tutorials/3/2/1/Avago-APDS-9960-datasheet.pdf

Recomendado: