Lampe à commande gestuelle sur Arduino

image

Bonjour à tous !!!
Je suis heureux de pouvoir vous montrer à nouveau mon nouveau métier.
Cette fois, j'ai assemblé une lampe Arduino à commande gestuelle.

Ce projet m'a pris beaucoup de temps, ce qui me manque toujours.
J'ai assemblé la première version de la lampe très rapidement et cela a parfaitement fonctionné pour moi sur la planche à pain, mais quand je l'ai déplacée à un endroit permanent dans le boîtier, tout a commencé, tous les problèmes de gel, de faux positifs et d'autres problèmes sont sortis. Googler sur Internet, j'ai trouvé sur des sites étrangers de nombreuses plaintes liées aux problèmes du capteur APDS9960, mais je n'ai pas trouvé de solutions à ces problèmes. J'ai dû passer un peu de temps à étudier la fiche technique de ce capteur et à comprendre son fonctionnement. En fin de compte, cela a payé et j'ai pu écrire du code fonctionnant de manière stable.

Et donc, tout est en ordre.

Description de la lampe


L'accent principal de cette lampe n'était pas sur la visualisation, mais sur le contrôle gestuel, toutes les autres fonctions sont secondaires.

La lampe s'allume avec des gestes à gauche ou à droite, et vous pouvez également l'allumer avec un geste vers vous-même, mais ce n'est pas tout à fait pratique. Ensuite, gestes gauche et droite, vous pouvez faire défiler les effets d'éclairage. Si vous commencez à retourner vers la droite, la lampe changera d'abord ses couleurs du blanc au rouge, y compris toutes les couleurs primaires et les transitions entre elles.

Si après avoir allumé la lampe, nous commençons à retourner vers la gauche, nous verrons des effets d'éclairage dynamiques, tels que «Feu», «Matrice», «Lampe de lave», «Arc-en-ciel», «Confettis», «Étincelles», «Lampe de feu». Si vous devez revenir à une lampe ordinaire, au lieu de la retourner, vous pouvez éteindre la lampe avec un geste de vous-même et allumer l'un des trois gestes.
La désactivation se fait par un geste de vous-même.



La luminosité est régulée par le geste d'approcher et de s'éloigner du capteur. Vous devez d'abord amener votre paume le plus près possible du capteur, puis la relever brusquement. La lampe passera en mode de réglage de la luminosité, en rapprochant de plus en plus la paume, vous devez trouver la luminosité appropriée et verrouiller votre main pendant quelques secondes afin que la valeur de luminosité soit préservée. Lorsque la luminosité est maintenue, la lampe vous en informe en éteignant doucement la lumière, puis en l'allumant avec un nouveau niveau de luminosité.

Je n'ai pas prêté beaucoup d'attention aux effets visuels, car j'ai l'intention de faire une deuxième version de la lampe sur le mini contrôleur Wemos D1. Dans lequel je prévois de tout mettre à l'idéal. Pour la même raison, j'utilise toujours une seule ligne de LED, composée de 4 bandes ws2812b, au lieu de quatre.

APDS9960 interruptions


En fait, les principaux problèmes de la lampe LED lui sont associés. Les interruptions dans apds9960 vivent leur propre vie, cela peut fonctionner à partir de n'importe quoi, par exemple à partir d'interférences EM ou à proximité du capteur d'une personne, d'une ondulation dans la nutrition, et peut-être d'autre chose.



J'ai d'abord essayé de résoudre le problème des modifications du matériel. Le filtrage de puissance n'a pas aidé, même avec une batterie 18650, le capteur a continué à vivre sa vie. J'ai essayé de commuter la résistance de charge du signal INT à + 5V et cela n'a pas non plus réussi.

Au fur et à mesure que l'étude est arrivée, on a compris pourquoi de fausses interruptions se sont produites. Le problème principal est la réflexion aléatoire du signal IR. Le fabricant recommande de recouvrir le capteur et tout ce qui l'entoure d'un revêtement en caoutchouc noir. Je n'ai pas une telle peinture et je n'en ai pas pris la peine. Bien sûr, cela pourrait réduire légèrement le nombre de faux positifs.

J'ai écrit du code qui filtre tous les déclencheurs aléatoires, mais j'ai rencontré un autre problème. Une fois l'interruption déclenchée, les informations sur les gestes sont transmises via le bus I2C pas immédiatement, mais avec un certain retard. Et si l'alimentation électrique due à la bande d'adresse LED est bruyante, le temps de transmission, en tenant compte de ces interférences, sera toujours différent. J'ai dû tenir compte de ce fait et réécrire le code pour déterminer les gestes d'une nouvelle manière.

Définition du geste


Si le code n'utilise pas d'interruption du capteur, il n'y a pas de problème avec la définition du geste. Mais dans ce cas, le multitâche est perdu. Si un effet dynamique est activé sur la lampe, il nécessite en conséquence un code cyclique, constamment exécutable, et des interruptions seront nécessaires pour retirer le contrôleur du cycle.

Afin d'améliorer la stabilité de la reconnaissance gestuelle, il était également nécessaire de réduire la sensibilité du récepteur dans la bibliothèque. Pour ce faire, remplacez la ligne dans le fichier SparkFun_APDS9960.h:

if (! setLEDBoost (LED_BOOST_300))
sur
if (! setLEDBoost (LED_BOOST_150))

Si vous avez téléchargé la bibliothèque de cet article, vous n'avez rien à faire, tout y a déjà été corrigé.
J'ai également sélectionné expérimentalement le courant de la LED 50 mA, dans lequel les gestes sont déterminés de la manière la plus stable et il n'est pas nécessaire de forcer une LED infrarouge avec un courant de 100 mA.

Et j'ai également fait une erreur en plaçant le microcontrôleur au bas de la lampe et le capteur de gestes dans le capot supérieur. Pour cette raison, pour connecter Arduino et APDS9960, j'ai dû utiliser des fils de 30 cm de long, ce qui a également ajouté une instabilité supplémentaire du capteur. En conséquence, j'ai vaincu tous ces problèmes par programme.

Schéma




Pour alimenter l'appareil, j'utilise un chargeur de mon smartphone, avec une tension de sortie de 5V et un courant de 2A. Mais en fait, une lampe à lumière blanche allumée à une luminosité maximale ne consomme pas plus de 1,3 A. Par conséquent, toute source d'alimentation avec un courant de sortie d'au moins 1,3 A convient.

Le stabilisateur dc-dc mini360 peut être remplacé par tout autre convertisseur de tension abaisseur, avec un courant de sortie d'au moins 150 mA.

Dans le schéma ci-dessous, je n'utilise pas de convertisseur de niveau logique, mais c'est ma décision personnelle. Et par conséquent, je n'accepte aucune responsabilité à l'avance en cas de défaillance du capteur APDS9960 connecté sans convertisseur de niveau TTL.

Au lieu d'Arduino Nano, vous pouvez utiliser le contrôleur Arduino UNO ou ses clones.

Assurez-vous de vérifier la présence de cavaliers sur le capteur gestuel, ils sont marqués en rouge sur la photo ci-dessous. En cas d'absence, un fer à souder doit être appliqué sur ces voies de contact, appliquer et chauffer la soudure jusqu'à formation d'une goutte uniforme. Maintenant, les Chinois fournissent ces capteurs sans cavaliers. Sans ces cavaliers, le fonctionnement du capteur n'est pas garanti.



Composants utilisés


Arduino Nano - 1 pcs.
Capteur de geste APDS9960 - 1 pc.
Bandes LED WS2812B - 4 pcs.
Convertisseur abaisseur Mini360 - 1 pc.
Fils de connexion - 1 jeu.

Code de programme pour Arduino


Le code est divisé en deux parties. Dans la première partie est le code principal qui fonctionne avec le capteur, et dans la deuxième partie est le code pour tous les effets d'éclairage.

Vous pouvez ajouter n'importe quel effet vous-même par analogie avec mon code, mais surtout, n'oubliez pas d'ajouter une fonction pour quitter le geste de l'effet en boucle. Pour ce faire, ajoutez la ligne suivante à la fin de la boucle si (check_int ()) return;

Description des principales fonctions du programme
processingGesture () traite les interruptions du capteur de mouvements.
processingProximity () traite les interruptions du capteur de proximité.
gesture_int () - interrompt le gestionnaire depuis le capteur de gestes.
proximite_int () - interrompt le gestionnaire du capteur de proximité.

Description des constantes


APDS9960_INT - entrée pour une interruption externe. Arduino Nano et UNO n'ont que deux entrées de ce type, 2 et 3.

PIN - ici, vous devez spécifier la sortie vers la bande LED. Vous pouvez spécifier n'importe quelle broche numérique à laquelle les sangles ws2812b sont connectées.

NUM_PIX - nous indiquons ici le nombre de LED d'adresse dans la bande utilisée.
plage - la limite d'erreur est de 0 à 10. Si, lors du réglage de la luminosité, une main est fixée au-dessus du capteur pendant 2 secondes, les lectures doivent être enregistrées, mais si les lectures ne sont pas enregistrées, augmentez progressivement la limite d'erreur.

Téléchargez la bibliothèque APDS9960
Télécharger le croquis de la lampe

Vidéo montrant le fonctionnement de la lampe



Résumé


La lampe en direct est meilleure que dans la vidéo. Maintenant, tous ceux qui l'ont vu de moi sont priés de recueillir la même chose pour eux. Pour le moment, je n'aime pas le fonctionnement du réglage de la luminosité, mais j'y travaille. Je ne le promets pas bientôt, mais la prochaine version de la lampe est déjà en développement.

Merci d'avoir lu l'article jusqu'au bout! Si vous avez encore des questions, vous pouvez les poser dans les commentaires sous l'article.

PS


Idée de lampe inspirée ici
J'ai pris les effets principaux ici

Source: https://habr.com/ru/post/fr484278/


All Articles