Inhaltsverzeichnis:

Ausgefallener LED-Hut - Gunook
Ausgefallener LED-Hut - Gunook

Video: Ausgefallener LED-Hut - Gunook

Video: Ausgefallener LED-Hut - Gunook
Video: If This Is a Man by Primo levi Full audiobook with subtitles. 2024, November
Anonim
Image
Image
Ausgefallener LED-Hut
Ausgefallener LED-Hut

Ich wollte schon immer ein Arduino-Projekt machen, hatte aber nie großartige Ideen dafür, bis meine Familie zu einer schicken Hutparty eingeladen wurde. Mit zwei Wochen Vorlaufzeit war ich neugierig, ob ich einen bewegungssensitiven LED-Animationshut sowohl planen als auch ausführen könnte. Es stellte sich heraus, dass ich es könnte! Ich bin wahrscheinlich ein wenig über Bord gegangen, aber das Gesamtprojekt hat ungefähr 80 Dollar gekostet. Mit Experimentieren und etwas Codierung könnten Sie es für weniger tun.

Das Ziel mit dem Hut war folgendes:

  1. Lassen Sie eine Reihe von Lichtern von der vorderen Mitte des Hutes nach hinten wandern, ein Licht auf jeder Seite
  2. Ändern Sie die Bewegungsgeschwindigkeit des Lichts, die durch die Neigung des Hutes von vorne nach hinten bestimmt wird
  3. Lassen Sie die Lichter umkehren, wenn das Hutband nach unten geneigt war (d. h. die Wirkung der Schwerkraft auf die Lichter nachahmen)
  4. Ändern Sie die Farbe basierend auf der Neigung des Hutes von links nach rechts
  5. Erschütterungen wahrnehmen und einen Spezialeffekt anzeigen
  6. Spüren Sie, wie sich der Träger dreht und zeigen Sie einen speziellen Effekt
  7. Lassen Sie es vollständig im Hut enthalten

Schritt 1: Benötigte Teile

Benötigte Teile
Benötigte Teile
Benötigte Teile
Benötigte Teile
Benötigte Teile
Benötigte Teile

Ich habe die folgenden Hauptkomponenten verwendet (einschließlich Nicht-Amazon-Links):

  • Teensy LC-Mikrocontroller - Ich habe ihn aufgrund seiner geringen Größe einem normalen Arduino vorgezogen und er hat eine spezielle Verbindung zur Steuerung meiner LEDs sowie eine starke Bibliotheks- und Community-Unterstützung.
  • Bosch BNO055-basierter Positionssensor - ehrlich gesagt einer der ersten, zu denen ich Dokumentation gefunden habe. Es gibt viel billigere Optionen, aber sobald Sie den Bosch herausgefunden haben, tut es viel für Sie, was Sie sonst im Code tun müssten
  • WS2812 adressierbarer LED-Streifen - Ich habe eine Länge von 1 Meter mit 144 LEDs pro Meter gewählt. Diese Dichte lässt das Licht eher so aussehen, als ob es sich bewegt, anstatt dass einzelne Elemente nacheinander aufleuchten.

Und die folgenden Nebenkomponenten:

  • Ein Hut - jeder Hut mit Hutband ist ausreichend. Dies ist ein $6-Hut aus einem lokalen Geschäft. Wenn es hinten eine Naht hat, ist es einfacher, die Verkabelung durchzubringen. Achten Sie darauf, ob das Hutband aufgeklebt ist, da dies auch zusätzliche Schwierigkeiten verursacht. Dieser ist oben entlang genäht, aber der Boden lässt sich leicht hochziehen.
  • 4,7K Ohm Widerstände
  • 3x AAA Batteriefach - bei Verwendung von 3 AAA Batterien wird die Spannung genau in dem von der Elektronik gewünschten Bereich ausgegeben, was die Sache vereinfacht. AAA passt leichter in einen Hut als AA und hat trotzdem eine tolle Laufzeit.
  • Kleiner Draht - Ich habe einen festen Draht verwendet, den ich von einem früheren LED-Projekt herumgelegt hatte.
  • Lötkolben und Lot
  • Etwas Elasthan, das der Innenfarbe des Hutes entspricht, und Faden

Empfohlen, aber optional:

  • Schnellverbinder für die Batteriekabel
  • Helping Hands Werkzeug, diese Dinge sind sehr klein und schwer zu löten

Schritt 2: Ändern Sie den Hut

Modifiziere den Hut
Modifiziere den Hut
Modifiziere den Hut
Modifiziere den Hut
Modifiziere den Hut
Modifiziere den Hut
Modifiziere den Hut
Modifiziere den Hut

Sie benötigen einen Platz im Hut, um die Elektronik zu montieren, und einen Platz für die Batterie. Meine Frau arbeitet beruflich mit Kleidung, also habe ich sie um Rat und Hilfe gebeten. Am Ende haben wir zwei Taschen mit Elasthan erstellt. Die erste kleinere Tasche nach vorne ist wie die Mütze selbst zugespitzt, so dass der Positionssensor beim Einbau der Elektronik relativ gut gehalten wird, sich aber bei Bedarf leicht entfernen lässt. Die zweite Tasche auf der Rückseite dient zur Fixierung des Akkus.

Die Taschen waren mit Garn, das der Farbe des Hutes entsprach, entlang der Kronenlinie vernäht. Je nach Hutstil und Material wird er mit dieser Technik aus YMMV gefertigt.

Wir haben auch festgestellt, dass das Hutband an einer Seite in sich selbst steckt und an dieser Stelle vollständig mit dem Hut vernäht war. Wir mussten die Originalnaht entfernen, um die LEDs unter dem Band laufen zu lassen. Während des Baus wurde es mit Stecknadeln festgehalten und nach Fertigstellung mit passendem Faden genäht.

Schließlich haben wir die Naht auf der Rückseite des Hutes geöffnet, wo sie vom Band bedeckt ist. Wir haben den Kabelbaum, der mit den LEDs geliefert wurde, durch diese Naht gesteckt und die erste LED im Streifen so ausgelegt, dass sie direkt auf der Naht liegt. Wir haben dann die LEDs um den Hut gewickelt und den Streifen so geschnitten, dass die letzte LED direkt neben der ersten liegt. Der LED-Streifen kann nur mit dem Hutband an Ort und Stelle gehalten werden, je nach Band und Material müssen Sie die LEDs jedoch möglicherweise durch Nähen oder Kleben befestigen.

Schritt 3: Verdrahten Sie es

Verdrahten Sie es
Verdrahten Sie es

Das Teensy-Board und die LEDs arbeiten mit 3,3 V bis 5 V für die Stromversorgung. Aus diesem Grund habe ich mich für 3 AAA-Batterien entschieden, die Ausgangsspannung von 4,5 V liegt gut in diesem Bereich und sie haben viel Laufzeit für die Art und Weise, wie ich die LEDs programmiert habe. Sie sollten in der Lage sein, weit über 8 Stunden Laufzeit zu erreichen.

Strom verkabeln

Ich habe die positiven und negativen Leitungen von der Batteriebox und den LEDs zusammen verdrahtet und dann an den entsprechenden Stellen auf den Teensy gelötet. Der Pluspol der Batterie muss mit dem oberen rechten Pin des Teensy im Diagramm (auf der Platine mit Vin bezeichnet) verbunden werden, und der Minuspol kann mit einem beliebigen Pin mit der Bezeichnung GND verbunden werden. Praktischerweise befindet sich einer direkt auf der gegenüberliegenden Seite des Boards oder direkt neben dem Vin-Pin. Das vollständige Pinbelegungsdiagramm für die Platine finden Sie unten auf dieser Seite. Und in einigen Fällen ist eine Papierkopie bei der Bestellung des Boards enthalten.

Wenn Sie Code ausführen möchten, bei dem nur wenige LEDs gleichzeitig eingeschaltet sind, können Sie die LEDs über den Teensy selbst mit Strom versorgen, indem Sie einen 3,3-V-Ausgang und GND verwenden. Wenn Sie jedoch versuchen, zu viel Strom zu ziehen, können Sie die Platine beschädigen. Um die meisten Optionen zu haben, ist es am besten, die LEDs direkt mit Ihrer Batteriequelle zu verbinden.

Verdrahtung der LEDs

Ich habe mich für das Teensy LC für dieses Projekt entschieden, da es einen Pin hat, der es viel einfacher macht, adressierbare LEDs zu verdrahten. Auf der Unterseite der Platine spiegelt der zweite Pin von links Pin #17 wider, hat aber auch 3,3 V drauf. Dies wird als Pull-up bezeichnet, und auf anderen Platinen müssten Sie einen Widerstand verdrahten, um diese Spannung bereitzustellen. Im Fall des Teensy LC können Sie einfach von diesem Pin direkt zu Ihrem LED-Datenkabel verdrahten.

Verdrahtung des Positionssensors

Einige der verfügbaren BNO055-Boards sind viel strenger in Bezug auf die Spannung und benötigen nur 3,3 V. Aus diesem Grund habe ich den Vin auf der BNO055-Platine vom dedizierten 3,3-V-Ausgang des Teensy verdrahtet, der der dritte Pin rechts unten ist. Sie können dann den GND des BNO055 mit einem beliebigen GND des Teensy verbinden.

Der Positionssensor BNO055 verwendet I2c, um mit dem Teensy zu kommunizieren. I2c erfordert Pull-Ups, also habe ich zwei 4,7K Ohm-Widerstände von einem 3,3-V-Ausgang am Teensy mit den Pins 18 und 19 verdrahtet. Ich habe dann Pin 19 mit dem SCL-Pin auf der BNO055-Platine und 18 mit dem SDA-Pin verdrahtet.

Tipps/Tricks zur Verkabelung

Um dieses Projekt zu machen, habe ich Massivdraht anstelle von Litzen verwendet. Ein Vorteil von Massivdraht ist das Löten an Prototypenplatinen wie diese. Sie können etwas Draht abisolieren, um 90 Grad biegen und durch die Unterseite eines der Anschlüsse stecken, so dass das abgeschnittene Ende des Drahtes über Ihrer Platine ragt. Sie brauchen dann nur noch eine kleine Menge Lötzinn, um es an der Klemme zu halten, und Sie können den Überschuss leicht abschneiden.

Der massive Draht kann schwieriger zu bearbeiten sein, da er tendenziell so bleiben möchte, wie er gebogen wird. Für dieses Projekt war das jedoch ein Vorteil. Ich schneide und formte meine Drähte so, dass die Ausrichtung des Positionssensors beim Einsetzen und Entfernen der Elektronik aus dem Hut zum Anpassen und Programmieren konsistent war.

Schritt 4: Programmierung

Nachdem alles zusammengebaut ist, benötigen Sie ein Arduino-kompatibles Programmierwerkzeug. Ich habe die eigentliche Arduino IDE verwendet (funktioniert mit Linux, Mac und PC). Sie benötigen auch die Teensyduino-Software, um mit dem Teensy-Board verbunden zu werden. Dieses Projekt verwendet stark die FastLED-Bibliothek, um die Farb- und Positionsprogrammierung der LEDs durchzuführen.

Kalibrieren

Das erste, was Sie tun möchten, ist Kris Winers exzellentes GitHub-Repository für den BNO055 zu besuchen und seinen BNO_055_Nano_Basic_AHRS_t3.ino-Sketch herunterzuladen. Installieren Sie diesen Code bei laufendem Serial Monitor und er wird Ihnen sagen, ob die BNO055-Platine ordnungsgemäß online geht und ihre Selbsttests besteht. Es führt Sie auch durch die Kalibrierung des BNO055, wodurch Sie später konsistentere Ergebnisse erhalten.

Erste Schritte mit der Fancy LED-Skizze

Der Code für den Fancy LED-Hut ist speziell angehängt und auch in meinem GitHub-Repository. Ich plane, den Code weiter zu optimieren, und diese werden im GitHub-Repository veröffentlicht. Die Datei hier spiegelt den Code wider, als dieses Instructable veröffentlicht wurde. Nachdem Sie die Skizze heruntergeladen und geöffnet haben, müssen Sie einige Dinge ändern. Die meisten der wichtigsten Werte, die geändert werden müssen, stehen als #define-Anweisungen ganz oben:

Zeile 24: #define NUM_LEDS 89 - ändern Sie dies in die tatsächliche Anzahl der LEDs auf Ihrem LED-Streifen

Zeile 28: #define SERIAL_DEBUG false - Sie möchten dies wahrscheinlich wahr machen, damit Sie die Ausgabe auf dem seriellen Monitor sehen können

Positionserkennungscode

Die Positionserkennung und die meisten Ihrer Optimierungen beginnen bei Zeile 742 und gehen bis 802. Wir erhalten Pitch-, Roll- und Yaw-Daten vom Positionssensor und verwenden sie, um Werte einzustellen. Je nachdem, wie Ihre Elektronik montiert ist, müssen Sie diese möglicherweise ändern. Wenn Sie den Positionssensor mit dem Chip zur Hutoberseite montieren und der auf der Platine aufgedruckte Pfeil neben dem X zur Vorderseite der Mütze zeigt, sollten Sie Folgendes sehen:

  • Pitch nickt mit dem Kopf
  • Roll neigt dazu, den Kopf zu neigen, z. B. Berühre dein Ohr an deiner Schulter
  • Yaw ist die Richtung. Sie blicken (Norden, Westen usw.).

Wenn Ihr Board in einer anderen Ausrichtung montiert ist, müssen Sie Pitch/Roll/Yaw austauschen, damit es sich wie gewünscht verhält.

Um die Roll-Einstellungen anzupassen, können Sie die folgenden #define-Werte ändern:

  • ROLLOFFSET: mit Ihrem Hut stabil und so zentriert wie möglich, wenn die Rolle nicht 0 ist, ändern Sie dies um die Differenz. D.h. Wenn Sie Roll bei -20 sehen, wenn Ihr Hut zentriert ist, machen Sie diese 20.
  • ROLLMAX: der für die Rollmessung zu verwendende Höchstwert. Am einfachsten zu finden, wenn Sie den Hut tragen und Ihr rechtes Ohr in Richtung Ihrer rechten Schulter bewegen. Sie benötigen dazu ein langes USB-Kabel, während Sie den seriellen Monitor verwenden.
  • ROLLMIN: der niedrigste Wert für die Rollmessung, wenn Sie Ihren Kopf nach links neigen

Ähnlich für Tonhöhe:

  • MAXPITCH - der Maximalwert beim Nachschlagen
  • MINPITCH - der minimale Wert, wenn Sie nach unten schauen
  • PITCHCENTER - der Tonhöhenwert, wenn Sie geradeaus schauen

Wenn Sie SERIALDEBUG oben in der Datei auf true setzen, sollten Sie die aktuellen Werte für die Roll/Pitch/Yaw-Ausgabe auf dem seriellen Monitor sehen, um diese Werte zu optimieren.

Andere Parameter, die Sie möglicherweise ändern möchten

  • MAX_LED_DELAY 35 - die langsamste Bewegung des LED-Partikels. Dies ist in Millisekunden. Es ist die Verzögerung beim Wechsel von einer LED zur nächsten im String.
  • MIN_LED_DELAY 10 - das Fasten, das das LED-Partikel bewegen kann. Wie oben ist es in Millisekunden.

Abschluss

Wenn Sie so weit gegangen sind, sollten Sie einen voll funktionsfähigen und lustigen LED-Hut haben! Wenn Sie mehr damit machen möchten, finden Sie auf der nächsten Seite einige erweiterte Informationen zum Ändern von Einstellungen und zum Selbermachen. sowie einige Erläuterungen dazu, was der Rest meines Codes tut.

Schritt 5: Erweitert und optional: Im Code

Aufprall- und Schleudererkennung

Die Aufprall-/Schleudererkennung erfolgt mit den High-G-Sensorfunktionen des BNO055. Sie können die Empfindlichkeit mit den folgenden Zeilen in initBNO055() optimieren:

  • Zeile #316: BNO055_ACC_HG_DURATION - wie lange die Veranstaltung dauern muss
  • Zeile #317: BNO055_ACC_HG_THRESH – wie hart der Aufprall sein muss
  • Zeile #319: BNO055_GYR_HR_Z_SET - Drehzahlschwellenwert
  • Zeile #320: BNO055_GYR_DUR_Z - wie lange die Rotation überhaupt dauern muss

Beide Werte sind 8-Bit-Binärwerte, derzeit ist die Auswirkung auf B11000000 eingestellt, das sind 192 von 255.

Wenn ein Aufprall oder eine Drehung erkannt wird, setzt das BNO055 einen Wert, nach dem der Code direkt am Anfang der Schleife sucht:

// Erkennen Sie alle ausgelösten Interrupts, d. h. aufgrund von hohem G-Byte intStatus = readByte(BNO055_ADDRESS, BNO055_INT_STATUS); if(intStatus > 8) { impact(); aufrechtzuerhalten. Sonst if (intStatus > 0) {spin(); }

Suchen Sie nach der Zeile void impact() oben im Code, um das Verhalten beim Aufprall zu ändern, oder nach void spin(), um das Spinverhalten zu ändern.

Helfer

Ich habe eine einfache Hilfsfunktion (void setAllLeds()) erstellt, um alle LEDs schnell auf eine einzige Farbe einzustellen. Man verwendet es, um sie alle auszuschalten:

setAllLeds(CRGB::Schwarz);

Oder Sie können eine beliebige Farbe auswählen, die von der FastLED-Bibliothek erkannt wird:

setAllLeds(CRGB::Rot);

Es gibt auch eine Funktion fadeAllLeds(), die alle LEDs um 25 % dimmt.

Die Teilchenklasse

Um die Verdrahtung stark zu vereinfachen, wollte ich eine einzelne LED-Reihe verwenden, die sich jedoch wie mehrere Strings verhalten. Da dies mein erster Versuch war, wollte ich es so einfach wie möglich halten, also behandle ich die eine Saite als zwei, wobei die mittlere(n) LED(s) dort die Aufteilung wäre. Da wir entweder eine gerade oder eine ungerade Zahl haben können, müssen wir dies berücksichtigen. Ich beginne mit einigen globalen Variablen:

/* * Variable und Container für LEDs */ CRGB leds[NUM_LEDS]; static unsigned int curLedDelay = MAX_LED_DELAY; static int centerLed = NUM_LEDS / 2; static int maxLedPos = NUM_LEDS / 2;static bool oddLeds = 0; static bool PartikelDir = 1; static bool speedDir = 1;unsigned long dirCount; unsigned long hueCount;

Und etwas Code in setup():

if(NUM_LEDS % 2 == 1) { ungeradeLEDs = 1; maxLedPos = NUM_LEDS/2; aufrechtzuerhalten. Sonst { OddLeds = 0; maxLedPos = NUM_LEDS/2 - 1; }

Wenn wir ungerade Zahlen haben, möchten wir den 1/2 Punkt als Mitte verwenden, ansonsten wollen wir den 1/2 Punkt - 1. Dies ist mit 10 oder 11 LEDs leicht zu sehen:

  • 11 LEDs: 11/2 mit ganzen Zahlen sollte 5 ergeben und Computer zählen von 0. Also ist 0 - 4 eine Hälfte, 6 - 10 ist die andere Hälfte und 5 liegt dazwischen. Wir behandeln #5 in diesem Fall so, als ob es Teil von beiden wäre, d.h. es ist #1 für beide virtuellen LED-Strings
  • 10 LEDs: 10/2 ist 5. Aber da Computer von 0 zählen, müssen wir eine entfernen. Dann haben wir 0 - 4 für die eine Hälfte und 5 - 9 für die andere. #1 für den ersten virtuellen String ist 4 und #1 für den zweiten virtuellen String ist #5.

Dann müssen wir in unserem Partikelcode von unserer Gesamtposition bis zu den tatsächlichen Positionen auf der LED-Reihe zählen:

if(oddLeds) { Pos1 = centerLed + currPos; Pos2 = centerLed - currPos; aufrechtzuerhalten. Else { Pos1 = centerLed + currPos; Pos2 = (centerLed -1) - currPos; }

Der Code hat auch Bedingungen, bei denen das Partikel die Richtung ändern kann, also müssen wir das auch berücksichtigen:

if(particleDir) { if((currPos == NUM_LEDS/2) && oddLeds){ currPos = 0; aufrechtzuerhalten. Sonst if((currPos == NUM_LEDS/2 - 1) && (!oddLeds)){ currPos = 0; } sonst { currPos++; } } Else { if ((currPos == 0) && oddLeds) { currPos = centerLed; aufrechtzuerhalten. Sonst if((currPos == 0) && (!oddLeds)){currPos = centerLed - 1; } sonst { currPos--; } }

Wir verwenden also die beabsichtigte Richtung (particleDir), um zu berechnen, welche LED als nächstes leuchten soll, müssen aber auch berücksichtigen, ob wir entweder das echte Ende des LED-Strings oder unseren Mittelpunkt erreicht haben, der auch als Ende für jeder der virtuellen Strings.

Wenn wir das alles herausgefunden haben, zünden wir bei Bedarf das nächste Licht an:

if(particleDir) { if(oddLeds) { Pos1 = centerLed + currPos; Pos2 = centerLed - currPos; aufrechtzuerhalten. Else { Pos1 = centerLed + currPos; Pos2 = (centerLed -1) - currPos; } } else { if(oddLeds) { Pos1 = centerLed - currPos; Pos2 = centerLed + currPos; } else { Pos1 = centerLed - currPos; Pos2 = (centerLed -1) + currPos; } } leds[Pos1] = CHSV(currHue, 255, 255); LEDs[Pos2] = CHSV(currHue, 255, 255); FastLED.show();}

Warum überhaupt eine Klasse machen? So wie es ist, ist dies ziemlich einfach und muss nicht wirklich in einer Klasse sein. Ich habe jedoch Pläne für die Zukunft, den Code zu aktualisieren, damit mehr als ein Partikel gleichzeitig auftreten kann und einige rückwärts arbeiten, während andere vorwärts gehen. Ich denke, es gibt einige wirklich großartige Möglichkeiten für die Spindetektion mit mehreren Teilchen.

Empfohlen: