
Hola a todos !!!
Me alegra poder mostrarte mi nuevo oficio de nuevo.
Esta vez armé una lámpara arduino controlada por gestos.
Este proyecto me llevó mucho tiempo, que siempre me falta.
Ensamblé la primera versión de la lámpara muy rápidamente y funcionó perfectamente para mí en el tablero, pero cuando la moví a un lugar permanente en el estuche, todo comenzó, todos los problemas con congelamientos, falsos positivos y otros problemas salieron. Buscando en Internet, encontré en sitios extranjeros muchas quejas relacionadas con los problemas del sensor APDS9960, pero no encontré soluciones a estos problemas. Tuve que pasar un poco de tiempo estudiando la hoja de datos de este sensor y entendiendo su funcionamiento. Al final, valió la pena y pude escribir un código de trabajo estable.
Y así, todo en orden.
Descripción de la lámpara
El énfasis principal en esta lámpara no estaba en la visualización, sino en el control de gestos, todas las demás funciones son secundarias.
La lámpara se enciende con gestos hacia la izquierda o hacia la derecha, y también puede encenderla con un gesto hacia usted, pero esto no es del todo conveniente. A continuación, con los gestos hacia la izquierda y hacia la derecha, puede desplazarse por los efectos de iluminación. Si comienza a girar hacia la derecha, la lámpara primero cambiará sus colores de blanco a rojo, incluidos todos los colores primarios y las transiciones entre ellos.
Si después de encender la lámpara comenzamos a girar hacia la izquierda, veremos efectos de iluminación dinámicos, como "Fuego", "Matriz", "Lámpara de lava", "Arco iris", "Confeti", "Chispas", "Lámpara ardiente". Si necesita volver a una lámpara normal, en lugar de dar la vuelta, puede apagar la lámpara con un gesto suyo y encender cualquiera de los tres gestos.
El apagado se realiza mediante un gesto tuyo.

El brillo está regulado por el gesto de acercarse y alejarse del sensor. Primero debe acercar la palma de la mano al sensor lo más posible y luego levantarla bruscamente. La lámpara cambiará al modo de ajuste de brillo, acercando cada vez más la palma de su mano, necesita encontrar el brillo apropiado y fijar su mano durante un par de segundos, para que se conserve el valor del brillo. Cuando se mantiene el brillo, la lámpara le informará apagando suavemente la luz y luego encendiéndola con un nuevo nivel de brillo.
No presté mucha atención a los efectos visuales, ya que planeo hacer una segunda versión de la lámpara en el mini controlador Wemos D1. En el que planeo llevar todo al ideal. Por la misma razón, sigo usando solo una línea de LED, que consta de 4 tiras ws2812b, en lugar de cuatro.
APDS9960 Interrupciones
En realidad, los principales problemas de la lámpara LED están asociados con ella. Las interrupciones en apds9960 viven sus propias vidas, puede funcionar desde cualquier cosa, por ejemplo, por interferencia EM o por estar cerca del sensor de una persona, por la ondulación en la nutrición y posiblemente por otra cosa.

Primero intenté solucionar el problema con los cambios en el hardware. El filtrado de energía no ayudó, incluso con una batería 18650, el sensor aún seguía viviendo. Traté de cambiar la resistencia de carga de la señal INT a + 5V y esto tampoco tuvo éxito.
Cuando se realizó el estudio, se comprendió por qué ocurrieron interrupciones falsas. El principal problema son los reflejos aleatorios de la señal IR. El fabricante recomienda cubrir el sensor y todo lo que lo rodea con una capa de goma negra. No tengo esa pintura y no me molesté con ella. Aunque con seguridad esto podría reducir ligeramente la cantidad de falsos positivos.
Escribí un código que filtra todos los disparadores aleatorios, pero encontré otro problema. Después de que se dispara la interrupción, la información del gesto se transmite a través del bus I2C no al instante, pero tiene un cierto retraso. Y si la fuente de alimentación debido a la tira de LED de dirección es ruidosa, el tiempo de transmisión, teniendo en cuenta estas interferencias, siempre será diferente. Tuve que tener en cuenta este hecho y reescribir el código para determinar los gestos de una manera nueva.
Definición de gestos
Si el código no utiliza la interrupción del sensor, entonces no hay problemas con la definición del gesto. Pero en este caso, se pierde la multitarea. Si se activa un efecto dinámico en la lámpara, entonces requiere un código cíclico, constantemente ejecutable, y se requerirán interrupciones para eliminar el controlador del ciclo.
Para mejorar la estabilidad del reconocimiento de gestos, también era necesario reducir la sensibilidad del receptor en la biblioteca. Para hacer esto, reemplace la línea en el archivo SparkFun_APDS9960.h:
if (! setLEDBoost (LED_BOOST_300))en
if (! setLEDBoost (LED_BOOST_150))Si descargó la biblioteca de este artículo, no necesita hacer nada, todo ya se ha solucionado allí.
También seleccioné experimentalmente la corriente del LED de 50 mA, en el que los gestos son más estables y no hay necesidad de forzar el LED infrarrojo con una corriente de 100 mA.
Y también cometí un error al colocar el microcontrolador en la parte inferior de la lámpara y el sensor de gestos en la cubierta superior. Debido a esto, para conectar arduino y apds9960, tuve que usar cables de 30 cm de largo, lo que también agregó inestabilidad adicional al sensor. Como resultado, derroté todos estos problemas mediante programación.
Esquema

Para alimentar el dispositivo, uso un cargador de mi teléfono inteligente, con un voltaje de salida de 5V y una corriente de 2A. Pero, de hecho, una lámpara con luz blanca encendida con el brillo máximo no consume más de 1.3 A. Por lo tanto, cualquier fuente de energía con una corriente de salida de al menos 1.3 A es adecuada.
El estabilizador dc-dc mini360 se puede reemplazar con cualquier otro convertidor de voltaje reductor, con una corriente de salida de al menos 150 mA.
En el diagrama a continuación, no uso un convertidor de nivel lógico, pero esta es mi decisión personal. Y, por lo tanto, no acepto responsabilidad por adelantado en caso de que, si falla, el sensor APDS9960 se conecte sin un convertidor de nivel TTL.
En lugar de Arduino Nano, puede usar el controlador Arduino UNO o sus clones.
Asegúrese de verificar la presencia de puentes en el sensor de gestos, están marcados en rojo en la foto a continuación. En caso de ausencia, se debe aplicar un soldador a estos caminos de contacto, aplicar y calentar la soldadura hasta que se forme una gota uniforme. Ahora los chinos están suministrando estos sensores sin puentes. Sin estos puentes, el funcionamiento del sensor no está garantizado.

Componentes utilizados
Arduino Nano - 1 pieza
Sensor de gestos APDS9960 - 1 pieza
Tiras de LED ws2812b - 4 piezas
Convertidor reductor Mini360 - 1 pieza
Cables de conexión - 1 juego.
Código de programa para Arduino
El código se divide en dos partes. En la primera parte está el código principal que funciona con el sensor, y en la segunda parte está el código para todos los efectos de iluminación.
Puede agregar cualquier efecto usted mismo por analogía con mi código, pero lo más importante, no olvide agregar una función para salir del gesto del efecto en bucle. Para hacer esto, agregue la siguiente línea al final del ciclo
if (check_int ()) return;Descripción de las funciones principales del programa.
ProcessingGesture () procesa interrupciones del sensor de gestos.
processingProximity () procesa interrupciones desde el sensor de proximidad.
gesto_int () - interrumpe el manejador desde el sensor de gestos.
proximidad_int () - interrumpe el controlador del sensor de proximidad.
Descripción de constantes
APDS9960_INT - entrada para una interrupción externa. Arduino Nano y UNO tienen solo dos entradas de este tipo, 2 y 3.
PIN: aquí debe especificar la salida a la tira de LED. Puede especificar cualquier pin digital al que estén conectadas las correas ws2812b.
NUM_PIX: aquí indicamos el número de LED de dirección en la cinta utilizada.
rango: el límite de error es de 0 a 10. Si, al ajustar el brillo, se fija una mano sobre el sensor durante 2 segundos, entonces las lecturas deben guardarse, pero si las lecturas no se guardan, aumente gradualmente el límite de error.
Descargue la biblioteca APDS9960Descargar el boceto de la lámparaVideo que muestra el funcionamiento de la lámpara.
Resumen
La lámpara en vivo se ve mejor que en el video. Ahora a todos los que lo vieron de mí se les pide que recojan lo mismo para ellos. Por el momento, no me gusta cómo funciona el ajuste de brillo, pero estoy trabajando en ello. No lo prometo pronto, pero la próxima versión de la lámpara ya está en desarrollo.
¡Gracias por leer el artículo hasta el final! Si aún tiene preguntas, puede hacerlas en los comentarios del artículo.
PS
Idea de lámpara inspirada
aquíTomé los principales efectos
aquí