Gestengesteuerte Lampe auf Arduino

Bild

Hallo allerseits !!!
Ich bin froh, dass ich Ihnen wieder mein neues Handwerk zeigen kann.
Diesmal habe ich eine gestengesteuerte Arduino-Lampe zusammengestellt.

Dieses Projekt hat mich viel Zeit gekostet, was mir immer fehlt.
Ich habe die erste Version der Lampe sehr schnell zusammengebaut und sie funktionierte perfekt für mich auf dem Steckbrett, aber als ich sie an einen festen Platz im Gehäuse verlegte, fing alles an, und alle Probleme mit Einfrierungen, Fehlalarmen und anderen Problemen traten auf. Beim Googeln im Internet habe ich auf ausländischen Websites viele Beschwerden im Zusammenhang mit den Problemen des APDS9960-Sensors gefunden, aber keine Lösungen für diese Probleme gefunden. Ich musste ein wenig Zeit damit verbringen, das Datenblatt dieses Sensors zu studieren und seine Funktionsweise zu verstehen. Am Ende hat es sich ausgezahlt und ich konnte stabil funktionierenden Code schreiben.

Also alles in Ordnung.

Beschreibung der Lampe


Das Hauptaugenmerk dieser Lampe lag nicht auf der Visualisierung, sondern auf der Gestensteuerung, alle anderen Funktionen sind zweitrangig.

Die Lampe schaltet sich mit Gesten nach links oder rechts ein, und Sie können sie auch mit einer Geste gegen sich selbst einschalten, was jedoch nicht ganz praktisch ist. Als nächstes können Sie mit den Gesten nach links und rechts durch die Lichteffekte scrollen. Wenn Sie nach rechts spiegeln, ändert die Lampe zunächst ihre Farben von Weiß nach Rot, einschließlich aller Primärfarben und der Übergänge zwischen ihnen.

Wenn wir nach dem Einschalten der Lampe nach links drehen, sehen wir dynamische Lichteffekte wie „Feuer“, „Matrix“, „Lavalampe“, „Regenbogen“, „Konfetti“, „Funken“ und „Feurige Lampe“. Wenn Sie zu einer normalen Lampe zurückkehren müssen, können Sie die Lampe mit einer Geste von Ihnen ausschalten und eine der drei Gesten einschalten, anstatt sie umzudrehen.
Das Ausschalten erfolgt durch eine Geste von Ihnen.



Die Helligkeit wird durch die Geste reguliert, sich dem Sensor zu nähern und sich von ihm weg zu bewegen. Zuerst müssen Sie Ihre Handfläche so nah wie möglich an den Sensor heranführen und ihn dann scharf anheben. Die Lampe wechselt in den Helligkeitseinstellungsmodus und bewegt die Handfläche näher und näher. Sie müssen die entsprechende Helligkeit finden und Ihre Hand für ein paar Sekunden sperren, damit der Helligkeitswert erhalten bleibt. Wenn die Helligkeit beibehalten wird, informiert Sie die Lampe darüber, indem sie das Licht sanft ausschaltet und es dann mit einer neuen Helligkeitsstufe einschaltet.

Ich habe nicht viel auf visuelle Effekte geachtet, da ich vorhabe, eine zweite Version der Lampe auf dem Wemos D1 Mini-Controller herzustellen. In dem ich vorhabe, alles zum Ideal zu bringen. Aus dem gleichen Grund verwende ich immer noch nur eine LED-Reihe, die aus vier statt vier ws2812b-Streifen besteht.

APDS9960-Interrupts


Tatsächlich sind die Hauptprobleme der LED-Lampe damit verbunden. Unterbrechungen in apds9960 führen ein eigenes Leben. Sie können von allem, zum Beispiel von EM-Störungen oder von der Nähe des Sensors einer Person, von Störungen in der Ernährung und möglicherweise von etwas anderem herrühren.



Zuerst habe ich versucht, das Problem mit Änderungen in der Hardware zu beheben. Die Leistungsfilterung hat nicht geholfen, auch mit einem 18650-Akku hat der Sensor seine Lebensdauer beibehalten. Ich habe versucht, den Lastwiderstand des INT-Signals auf + 5V zu schalten, was ebenfalls keinen Erfolg brachte.

Als die Studie kam, wurde klar, warum es zu falschen Unterbrechungen kam. Das Hauptproblem sind zufällige Reflexionen des IR-Signals. Der Hersteller empfiehlt, den Sensor und alles drum herum mit einer schwarzen Gummibeschichtung abzudecken. Ich habe keine solche Farbe und ich habe mich nicht darum gekümmert. Dies kann jedoch die Anzahl der Fehlalarme leicht verringern.

Ich habe Code geschrieben, der alle zufälligen Trigger herausfiltert, aber auf ein anderes Problem gestoßen ist. Nachdem der Interrupt ausgelöst wurde, werden die Gesteninformationen nicht sofort, sondern mit einer gewissen Verzögerung über den I2C-Bus übertragen. Und wenn die Stromversorgung aufgrund des Adress-LED-Streifens verrauscht ist, ist die Übertragungszeit unter Berücksichtigung dieser Störungen immer unterschiedlich. Ich musste diese Tatsache berücksichtigen und den Code für die Bestimmung von Gesten neu schreiben.

Gestendefinition


Wenn der Code keinen Interrupt vom Sensor verwendet, gibt es keine Probleme mit der Definition der Geste. In diesem Fall geht jedoch Multitasking verloren. Wenn ein dynamischer Effekt für die Lampe aktiviert ist, ist dementsprechend ein zyklischer, ständig ausführbarer Code erforderlich, und es sind Interrupts erforderlich, um die Steuerung aus dem Zyklus zu entfernen.

Um die Stabilität der Gestenerkennung zu verbessern, musste auch die Empfindlichkeit des Empfängers in der Bibliothek reduziert werden. Ersetzen Sie dazu die Zeile in der Datei SparkFun_APDS9960.h:

if (! setLEDBoost (LED_BOOST_300))
auf
if (! setLEDBoost (LED_BOOST_150))

Wenn Sie die Bibliothek aus diesem Artikel heruntergeladen haben, müssen Sie nichts weiter tun, da bereits alles repariert wurde.
Ich habe auch experimentell den Strom der 50-mA-LED ausgewählt, wobei die Gesten am stabilsten bestimmt werden und es nicht erforderlich ist, eine Infrarot-LED mit einem Strom von 100 mA zu erzwingen.

Außerdem habe ich einen Fehler gemacht, indem ich den Mikrocontroller unten an der Lampe und den Gesten-Sensor oben in der Abdeckung platziert habe. Aus diesem Grund musste ich 30 cm lange Drähte verwenden, um arduino und apds9960 zu verbinden, was auch zu einer zusätzlichen Instabilität des Sensors führte. Infolgedessen habe ich all diese Probleme programmatisch besiegt.

Schema




Um das Gerät mit Strom zu versorgen, verwende ich ein Ladegerät von meinem Smartphone mit einer Ausgangsspannung von 5 V und einem Strom von 2A. Tatsächlich verbraucht eine Lampe mit weißem Licht, das bei maximaler Helligkeit eingeschaltet wird, nicht mehr als 1,3 A. Daher ist jede Stromquelle mit einem Ausgangsstrom von mindestens 1,3 A geeignet.

Der Stabilisator dc-dc mini360 kann durch jeden anderen Abwärtsspannungswandler mit einem Ausgangsstrom von mindestens 150 mA ersetzt werden.

In der folgenden Abbildung verwende ich keinen Logikpegelkonverter. Dies ist jedoch meine persönliche Entscheidung. Und deshalb übernehme ich im Voraus keine Verantwortung für den Fall, dass bei einem Ausfall der APDS9960-Sensor ohne TTL-Pegelwandler angeschlossen wird.

Anstelle von Arduino Nano können Sie den Arduino UNO-Controller oder dessen Klone verwenden.

Vergewissern Sie sich, dass die Jumper auf dem Gesten-Sensor vorhanden sind. Sie sind auf dem Foto unten rot markiert. In Abwesenheitsfällen sollte auf diese Kontaktbahnen ein Lötkolben aufgebracht, das Lot aufgetragen und erwärmt werden, bis sich ein gleichmäßiger Tropfen bildet. Jetzt liefern die Chinesen diese Sensoren ohne Jumper. Ohne diese Jumper kann die Funktion des Sensors nicht garantiert werden.



Verwendete Komponenten


Arduino Nano - 1 Stück
Gesten-Sensor APDS9960 - 1 Stck.
LED Streifen ws2812b - 4 Stck.
Mini360 Tiefsetzsteller - 1 Stck.
Verbindungskabel - 1 Satz.

Programmcode für Arduino


Der Code ist in zwei Teile unterteilt. Im ersten Teil befindet sich der Hauptcode, der mit dem Sensor zusammenarbeitet, und im zweiten Teil der Code für alle Lichteffekte.

Sie können jeden Effekt in Analogie zu meinem Code selbst hinzufügen, aber vergessen Sie vor allem nicht, eine Funktion hinzuzufügen, um die Geste aus dem Schleifeneffekt zu entfernen. Fügen Sie dazu die folgende Zeile am Ende der Schleife hinzu, wenn (check_int ()) return;

Beschreibung der Hauptfunktionen des Programms
processingGesture () verarbeitet Interrupts vom Gestensensor.
processingProximity () verarbeitet Interrupts vom Näherungssensor.
gesture_int () - Interrupt-Handler vom Gesten-Sensor.
proximity_int () - Interrupt-Handler vom Näherungssensor.

Beschreibung der Konstanten


APDS9960_INT - Eingang für einen externen Interrupt. Arduino Nano und UNO haben nur zwei solche Eingänge, 2 und 3.

PIN - hier müssen Sie die Ausgabe für den LED-Streifen festlegen. Sie können einen beliebigen digitalen Pin angeben, an den die ws2812b-Bänder angeschlossen sind.

NUM_PIX - hier geben wir die Anzahl der Adress-LEDs im verwendeten Band an.
Bereich - Die Fehlergrenze liegt zwischen 0 und 10. Wenn beim Einstellen der Helligkeit 2 Sekunden lang ein Zeiger über dem Sensor fixiert ist, sollten die Messwerte gespeichert werden. Wenn die Messwerte nicht gespeichert werden, erhöhen Sie die Fehlergrenze schrittweise.

Laden Sie die APDS9960-Bibliothek herunter
Laden Sie die Lampenskizze herunter

Video zeigt den Betrieb der Lampe



Zusammenfassung


Die Lampe sieht live besser aus als im Video. Jetzt wird jeder, der ihn von mir gesehen hat, gebeten, dasselbe für sie zu sammeln. Im Moment gefällt mir nicht, wie die Helligkeitsanpassung funktioniert, aber ich arbeite daran. Das verspreche ich nicht, aber die nächste Version der Lampe ist bereits in der Entwicklung.

Vielen Dank für das Lesen des Artikels bis zum Ende! Wenn Sie noch Fragen haben, können Sie in den Kommentaren unter dem Artikel fragen.

PS


Lampenidee hier inspiriert
Ich habe hier die Haupteffekte genommen

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


All Articles