Indholdsfortegnelse:

Fancy LED Hat: 5 trin (med billeder)
Fancy LED Hat: 5 trin (med billeder)

Video: Fancy LED Hat: 5 trin (med billeder)

Video: Fancy LED Hat: 5 trin (med billeder)
Video: Inside One of the Best Architectural Homes in South Africa 2024, November
Anonim
Image
Image
Lækker LED hat
Lækker LED hat

Jeg har altid ønsket at lave et Arduino -projekt, men aldrig haft nogen gode ideer til et, før min familie blev inviteret til en smuk hat -fest. Med to ugers leveringstid var jeg nysgerrig efter, om jeg både kunne planlægge og udføre en bevægelsesfølsom LED -animationshue. Det viste sig, at jeg kunne! Jeg gik nok lidt over bord, men det samlede projekt kostede omkring $ 80. Med eksperimentering og kodning kunne du gøre det for mindre.

Målet med hatten var følgende:

  1. Få et sæt lys til at bevæge sig fra hatten midt foran til bagsiden, et lys på hver side
  2. Ændre hastigheden på lysets rejse, der er dikteret af hatten vippes frem til bag
  3. Lad lysene vende, når hattebåndet blev vippet nedad (dvs. efterligne tyngdekraftens effekt på lysene)
  4. Skift farve baseret på hattenes hældning fra venstre til højre
  5. Føl stød, og vis en særlig effekt
  6. Mærk, at bæreren snurrer, og vis en særlig effekt
  7. Har den helt indeholdt i hatten

Trin 1: Nødvendige dele

Nødvendige dele
Nødvendige dele
Nødvendige dele
Nødvendige dele
Nødvendige dele
Nødvendige dele

Jeg brugte følgende hovedkomponenter (ikke-tilknyttede Amazon-links inkluderet):

  • Teensy LC -mikrokontroller - Jeg valgte dette frem for en almindelig Arduino på grund af dets lille størrelse, og den havde en særlig forbindelse til styring af mine lysdioder samt stærk bibliotek- og samfundsstøtte.
  • Bosch BNO055 baseret positionssensor - ærligt talt en af de første jeg fandt dokumentation om. Der er meget billigere muligheder, men når du først har fundet ud af Bosch, gør det meget for dig, som du ellers skulle gøre i kode
  • WS2812 adresserbar LED -strimmel - jeg valgte en 1 meters længde med 144 lysdioder pr. Meter. At have denne tæthed hjælper lyset med at se mere ud som om det bevæger sig, frem for at enkelte elementer lyser i rækkefølge.

Og følgende mindre komponenter:

  • En hat - enhver hat med hattebånd vil klare. Dette er en hat på $ 6 fra en lokal butik. Hvis den har en søm bagpå, vil det være lettere at få ledningerne igennem. Vær opmærksom på, hvis hattebåndet er limet på, da det også vil medføre nogle ekstra vanskeligheder. Denne er syet langs toppen, men bunden trækkes let op.
  • 4.7K ohm modstande
  • 3x AAA batteri etui - ved hjælp af 3 AAA batterier udsender spændingen nøjagtigt i det område, elektronikken ønsker, hvilket forenkler tingene. AAA passer lettere ind i en hat end AA og har stadig god driftstid.
  • Small gauge wire - Jeg brugte noget solidt tråd, jeg havde liggende fra et tidligere LED -projekt.
  • Loddejern og loddetin
  • Nogle spandex, der matcher hatten og trådens indvendige farve

Foreslået, men valgfrit:

  • Hurtige stik til batterikablerne
  • Helping Hands værktøj, disse ting er meget små og svære at lodde

Trin 2: Rediger hatten

Rediger hatten
Rediger hatten
Rediger hatten
Rediger hatten
Rediger hatten
Rediger hatten
Rediger hatten
Rediger hatten

Du skal bruge et sted i hatten til montering af elektronikken og et sted til batteriet. Min kone arbejder professionelt med tøj, så jeg spurgte hende om råd og hjælp. Vi endte med at oprette to lommer med spandex. Den første mindre lomme mod fronten er spidset som hatten selv, så når elektronikken er installeret, holdes positionssensoren rimelig godt på plads, men kan let fjernes om nødvendigt. Den anden lomme mod bagsiden er at holde batteripakken på plads.

Lommerne blev sået med tråd, der matchede hatens farve, hele kronen. Afhængigt af hatten og materialer er den lavet af YMMV med denne teknik.

Vi opdagede også hatbåndet, der stak ind i sig selv på den ene side, og det var fuldt syet til hatten på det sted. Vi var nødt til at fjerne den originale søm for at køre LED'erne under båndet. Under konstruktionen blev den holdt på plads med stifter og derefter syet med matchende tråd, når den var færdig.

Endelig åbnede vi sømmen på bagsiden af hatten, hvis den var dækket af båndet. Vi lagde ledningsnettet, der fulgte med lysdioderne gennem sømmen, og foret den første LED i strimlen for at være lige på sømmen. Vi viklede derefter LED'erne rundt om hatten og skar strimlen ned, så den sidste LED ville være lige ved siden af den første. LED -båndet kan holdes på plads bare med hatbåndet, men afhængigt af dit bånd og materiale kan du muligvis have brug for at sikre LED'erne ved at sy eller lime.

Trin 3: Tråd op

Tråd det op
Tråd det op

Teensy -kortet og lysdioderne fungerer med alt fra 3.3v til 5v for strøm. Det er derfor, jeg valgte at bruge 3 AAA -batterier, udgangsspændingen på 4,5v er pænt i det område, og de har masser af runtime til den måde, jeg har programmeret lysdioderne til at fungere. Du bør være i stand til at få godt 8 timers driftstid.

Tilslutning af strømmen

Jeg tilsluttede de positive og negative ledninger fra batterikassen og lysdioderne sammen og loddet derefter på Teensy på passende steder. Positivet fra batteriet skal forbindes til den øverste højre pin på Teensy i diagrammet (mærket Vin på tavlen), og det negative kan forbindes med en hvilken som helst ben mærket GND. Praktisk er der en direkte på den modsatte side af brættet eller lige ved siden af Vin -stiften. Det fulde pinout -diagram for tavlen findes nederst på denne side. Og i nogle tilfælde er en papirkopi inkluderet, når du bestiller tavlen.

Hvis du planlægger at køre kode, der kun har tændt nogle få lysdioder ad gangen, kan du tænde lysdioderne fra selve Teensy ved hjælp af en 3.3v udgang og GND, men hvis du forsøger at trække for meget strøm, kan du beskadige tavlen. Så for at give dig selv de fleste muligheder er det bedst at koble lysdioderne direkte til din batterikilde.

Ledninger til LED'erne

Jeg valgte Teensy LC til dette projekt, da det har en nål, der gør det meget lettere at tilslutte adresserbare lysdioder. På bunden af brættet er stiften, der er anden fra venstre spejle Pin #17, men har også 3,3v på den. Dette kaldes en pull-up, og på andre tavler skal du tilslutte en modstand for at give den spænding. I tilfælde af Teensy LC kan du bare koble fra denne pin direkte til din LEDs datatråd.

Tilslutning af positionssensoren

Nogle af de tilgængelige BNO055 -tavler er meget mere spændingsstrenge og ønsker kun 3,3v. På grund af dette tilsluttede jeg Vin på BNO055 -kortet fra den dedikerede 3.3v -udgang på Teensy, som er den tredje pin nede til højre. Du kan derefter tilslutte GND'en på BNO055 til enhver GND på Teensy.

BNO055 positionssensoren bruger I2c til at tale med Teensy. I2c kræver pull-ups, så jeg tilsluttede to 4,7K ohm modstande fra en 3,3v udgang på Teensy til ben 18 og 19. Jeg tilsluttede derefter pin 19 til SCL pin på BNO055 kortet og 18 til SDA pin.

Ledningstips/tricks

Til dette projekt brugte jeg solid tråd frem for strandet. En fordel ved fast tråd er, mens der loddes til prototype -plader som disse. Du kan fjerne noget tråd, bøje det til 90 grader og indsætte det gennem bunden af en af terminalerne, så den afskårne ende af tråden stikker op over dit bræt. Du behøver derefter kun en lille mængde loddemateriale for at holde det til terminalen, og du kan nemt afskære overskuddet.

Den solide ledning kan være sværere at arbejde med, da den har en tendens til at ville blive, hvordan den er bøjet. Men for dette projekt var det en fordel. Jeg skar og formede mine ledninger på en sådan måde, at positionssensorens retning ville være konsistent, da jeg indsatte og fjernede elektronikken fra hatten til tweaking og programmering.

Trin 4: Programmering

Nu hvor alt er samlet, skal du bruge et Arduino -kompatibelt programmeringsværktøj. Jeg brugte den faktiske Arduino IDE (fungerer med Linux, Mac og PC). Du har også brug for Teensyduino -softwaren til at have forbindelse til Teensy -kortet. Dette projekt bruger stærkt FastLED -biblioteket til at lave farve- og positionsprogrammering af lysdioderne.

Kalibrering

Det første, du vil gøre, er at gå til Kris Winer's fremragende GitHub -depot til BNO055 og downloade hans BNO_055_Nano_Basic_AHRS_t3.ino -skitse. Installer denne kode med Serial Monitor kørende, og den fortæller dig, om BNO055 -kortet kommer korrekt online og består sine selvtest. Det vil også guide dig gennem kalibrering af BNO055, hvilket vil give dig mere konsekvente resultater senere.

Kom godt i gang med Fancy LED -skitsen

Koden til Fancy LED hat er specifikt vedhæftet, og også på mit GitHub -depot. Jeg planlægger at lave flere justeringer af koden, og de vil blive lagt på GitHub -repoen. Filen her afspejler koden, da denne instruks blev udgivet. Efter at have downloadet og åbnet skitsen, er der et par ting, du skal ændre. De fleste af de vigtige værdier, der skal ændres, er helt i top som #define udsagn:

Linje 24: #define NUM_LEDS 89 - skift dette til det faktiske antal LED'er på din LED -strip

Linje 28: #define SERIAL_DEBUG false - du vil sandsynligvis gøre dette sandt, så du kan se output på den serielle skærm

Positionsdetekteringskode

Positionsregistrering og de fleste af dine tilpasninger starter ved linje 742 og går gennem 802. Vi får Pitch, Roll og Yaw -data fra positionssensoren og bruger dem til at indstille værdier. Afhængigt af hvordan din elektronik er monteret, skal du muligvis ændre disse. Hvis du monterer positionssensoren med chippen mod hatets top, og pilen ved siden af X trykt på tavlen pegede mod hatten, skal du se følgende:

  • Pitch nikker med hovedet
  • Rulle vipper dit hoved, f.eks. røre øret til din skulder
  • Yaw er hvilken retning. du står over for (nord, vest osv.).

Hvis dit bord er monteret i en anden retning, skal du skifte pitch/roll/yaw, så de kan opføre sig, som du gerne vil.

For at justere rulleindstillingerne kan du ændre følgende #define værdier:

  • ROLLOFFSET: med din hat stabil og så centreret som den kan være, hvis rullen ikke er 0, skal du ændre dette med forskellen. Dvs. hvis du ser Roll ved -20 når din hat er centreret, skal du lave denne 20.
  • ROLLMAX: den maksimale værdi, der skal bruges til rullemåling. Nemmest at finde ved at bære hatten og flytte dit højre øre mod din højre skulder. Du skal bruge et langt USB -kabel for at gøre dette, mens du bruger den serielle skærm.
  • ROLLMIN: den laveste værdi, der skal bruges til rullemåling, når du vipper dit hoved til venstre

Tilsvarende for Pitch:

  • MAXPITCH - den maksimale værdi, når du kigger op
  • MINPITCH - minimumsværdien, når du kigger ned
  • PITCHCENTER - pitchværdien, når du kigger lige frem

Hvis du indstiller SERIALDEBUG til true øverst i filen, skal du se de aktuelle værdier for Roll/Pitch/Yaw -output til den serielle skærm for at hjælpe med at justere disse værdier.

Andre parametre kan du ændre

  • MAX_LED_DELAY 35 - den langsomste, som LED -partiklen kan bevæge sig. Dette er i millisekunder. Det er forsinkelsen fra at flytte fra en LED til den næste i strengen.
  • MIN_LED_DELAY 10 - den faste, som LED -partiklen kan bevæge sig. Som ovenfor er det i millisekunder.

Konklusion

Hvis du er gået så langt, skal du have en fuldt fungerende og sjov LED -hat! Hvis du vil gøre mere med det, har den næste side nogle avancerede oplysninger om at ændre indstillinger og gøre dine egne ting. samt en forklaring på, hvad resten af min kode laver.

Trin 5: Avanceret og valgfrit: Inde i koden

Impact & spin -registrering

Stød-/centrifugeringsdetektering udføres ved hjælp af høj-G-sensorfunktionerne i BNO055. Du kan justere følsomheden af det med følgende linjer i initBNO055 ():

  • Linje #316: BNO055_ACC_HG_DURATION - hvor længe begivenheden skal vare
  • Linje #317: BNO055_ACC_HG_THRESH - hvor hård påvirkningen skal være
  • Linje #319: BNO055_GYR_HR_Z_SET - tærskel for rotationshastighed
  • Linje #320: BNO055_GYR_DUR_Z - hvor lang tid rotationen overhovedet skal vare

Begge værdier er 8 bit binært, i øjeblikket er effekten indstillet til B11000000, hvilket er 192 ud af 255.

Når der påvises en påvirkning eller et spin, indstiller BNO055 en værdi, som koden leder efter lige i begyndelsen af sløjfen:

// Registrer eventuelle udløste afbrydelser, dvs. på grund af høj G -byte intStatus = readByte (BNO055_ADDRESS, BNO055_INT_STATUS); hvis (intStatus> 8) {impact (); } ellers hvis (intStatus> 0) {spin (); }

Se efter linjen void impact () ovenfor i koden for at ændre adfærden ved impact, eller void spin () for at ændre spin -adfærden.

Hjælpere

Jeg har oprettet en simpel hjælperfunktion (void setAllLeds ()) til hurtigt at indstille alle lysdioder til en enkelt farve. Man kan bruge det til at slukke dem alle:

setAllLeds (CRGB:: Sort);

Eller du kan vælge enhver farve, der genkendes af FastLED -biblioteket:

setAllLeds (CRGB:: Rød);

Der er også en fadeAllLeds () -funktion, der dæmper alle lysdioder med 25%.

Partikelklassen

For at forenkle ledningerne meget ville jeg bruge en enkelt streng med lysdioder, men få dem til at opføre sig som flere strenge. Da dette var mit første forsøg, ønskede jeg at holde det så enkelt som muligt, så jeg behandler den ene streng som to, med den eller de midterste LED (er) der, splitten ville være. Da vi enten kunne have et lige tal eller et ulige tal, skal vi tage højde for det. Jeg starter med nogle globale variabler:

/ * * Variabel og beholdere til LED */ CRGB -lysdioder [NUM_LEDS]; statisk usigneret int curLedDelay = MAX_LED_DELAY; statisk int centerLed = NUM_LEDS / 2; static int maxLedPos = NUM_LEDS / 2; statisk bool oddLeds = 0; statisk bool particleDir = 1; statisk bool speedDir = 1; usigneret lang dirCount; usigneret lang hueCount;

Og lidt kode i setup ():

hvis (NUM_LEDS % 2 == 1) {oddLeds = 1; maxLedPos = NUM_LEDS/2; } ellers {oddLeds = 0; maxLedPos = NUM_LEDS/2 - 1; }

Hvis vi har ulige tal, vil vi bruge 1/2 punktet som midten, ellers vil vi have 1/2 point - 1. Dette er let at se med 10 eller 11 lysdioder:

  • 11 lysdioder: 11/2 med heltal skal evalueres til 5. og computere tæller fra 0. Så 0 - 4 er den ene halvdel, 6 - 10 er den anden halvdel, og 5 er mellem dem. Vi behandler #5 i dette tilfælde som om det var en del af begge dele, dvs. det er #1 for begge virtuelle strenge af LED'er
  • 10 lysdioder: 10/2 er 5. Men da computere tæller fra 0, skal vi fjerne en. Så har vi 0 - 4 for den ene halvdel og 5 - 9 for den anden. #1 for den første virtuelle streng vil være 4, og #1 for den anden virtuelle streng vil være #5.

Så i vores partikelkode skal vi tælle lidt fra vores samlede position til de faktiske positioner på LED -strengen:

hvis (oddLeds) {Pos1 = centerLed + currPos; Pos2 = centerLed - currPos; } ellers {Pos1 = centerLed + currPos; Pos2 = (centerLed -1) - currPos; }

Koden har også betingelser, hvor partiklen kan ændre retninger, så vi skal også tage højde for det:

hvis (particleDir) {if ((currPos == NUM_LEDS/2) && oddLeds) {currPos = 0; } ellers hvis ((currPos == NUM_LEDS/2 - 1) && (! oddLeds)) {currPos = 0; } ellers {currPos ++; }} andet {if ((currPos == 0) && oddLeds) {currPos = centerLed; } ellers hvis ((currPos == 0) && (! oddLeds)) {currPos = centerLed - 1; } andet {currPos--; }}

Så vi bruger den tiltænkte retning (particleDir) til at beregne, hvilken LED der skal tændes næste gang, men vi skal også overveje, om vi enten har nået den virkelige ende af LED -strengen eller vores midterpunkt, som også fungerer som en ende for hver af de virtuelle strenge.

Når vi har fundet ud af alt det, tænder vi det næste lys efter behov:

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

Hvorfor overhovedet gøre dette til en klasse? Som det er, er dette ret ligetil og behøver ikke rigtig at være i en klasse. Jeg har dog fremtidige planer om at opdatere koden for at muliggøre mere end en partikel ad gangen, og få nogle til at arbejde omvendt, mens andre går fremad. Jeg synes, der er nogle virkelig store muligheder for spindetektering ved hjælp af flere partikler.

Anbefalede: