Innholdsfortegnelse:

Fancy LED -hatt: 5 trinn (med bilder)
Fancy LED -hatt: 5 trinn (med bilder)

Video: Fancy LED -hatt: 5 trinn (med bilder)

Video: Fancy LED -hatt: 5 trinn (med bilder)
Video: Узнав это СЕКРЕТ, ты никогда не выбросишь пластиковую бутылку! ТАКОГО ЕЩЕ НИКТО НЕ ВИДЕЛ! 2024, Juli
Anonim
Image
Image
Fancy LED -hatt
Fancy LED -hatt

Jeg har alltid hatt lyst til å gjøre et Arduino -prosjekt, men har aldri hatt noen gode ideer for en før familien min ble invitert til en fancy hattfest. Med to ukers ledetid var jeg nysgjerrig på om jeg både kunne planlegge og utføre en bevegelsesfølsom LED -animasjonshatt. Det viste seg at jeg kunne! Jeg gikk nok litt over bord, men det totale prosjektet kostet rundt $ 80. Med eksperimentering og litt koding kan du gjøre det for mindre.

Målet med hatten var følgende:

  1. La et sett med lys bevege seg fra midten foran hatten til baksiden, ett lys på hver side
  2. Endre hastigheten på lysets reise som er diktert av hatten på hatten foran til bak
  3. La lysene snu når hattebåndet ble vippet nedover (dvs. etterligne tyngdekraftens effekt på lysene)
  4. Endre farge basert på vinkelen på hatten fra venstre mot høyre
  5. Føl sanser, og vis en spesiell effekt
  6. Føl brukeren snurre, og vis en spesiell effekt
  7. Har den helt inne i hatten

Trinn 1: Nødvendige deler

Nødvendige deler
Nødvendige deler
Nødvendige deler
Nødvendige deler
Nødvendige deler
Nødvendige deler

Jeg brukte følgende hovedkomponenter (ikke-tilknyttede Amazon-lenker inkludert):

  • Teensy LC -mikrokontroller - Jeg valgte denne fremfor en vanlig Arduino på grunn av sin lille størrelse, og den hadde en spesiell tilkobling for å kontrollere lysdiodene mine, i tillegg til sterk bibliotek- og samfunnsstøtte.
  • Bosch BNO055 -basert posisjonssensor - ærlig talt en av de første jeg fant dokumentasjon på. Det er mye billigere alternativer, men når du har funnet ut Bosch gjør det mye for deg som du ellers må gjøre i kode
  • WS2812 adresserbar LED -stripe - jeg valgte en 1 meters lengde med 144 lysdioder per meter. Å ha den tettheten hjelper lyset til å se mer ut som det beveger seg, i stedet for at enkelte elementer lyser opp i rekkefølge.

Og følgende mindre komponenter:

  • En lue - en lue med hattebånd vil klare seg. Dette er en lue på $ 6 fra en lokal butikk. Hvis den har en søm i ryggen, blir det lettere å få ledningene gjennom. Vær oppmerksom på om hattebåndet er limt på, da det også vil føre til ekstra problemer. Denne er sydd langs toppen, men bunnen trekkes lett opp.
  • 4,7K ohm motstander
  • 3x AAA batterikasse - bruk av 3 AAA batterier gir spenning nøyaktig i området elektronikken ønsker, noe som forenkler ting. AAA passer lettere inn i en lue enn AA og har fortsatt god kjøretid.
  • Liten måler - jeg brukte en solid tråd jeg hadde fra et tidligere LED -prosjekt.
  • Loddejern og loddetinn
  • Noe spandex som matcher innsiden av hatten og tråden

Foreslått, men valgfritt:

  • Hurtigkontakter for batterikablene
  • Helping Hands -verktøyet, disse tingene er veldig små og vanskelige å lodde

Trinn 2: Endre hatten

Endre hatten
Endre hatten
Endre hatten
Endre hatten
Endre hatten
Endre hatten
Endre hatten
Endre hatten

Du kommer til å trenge et sted i hatten for å montere elektronikken, og et sted for batteriet. Min kone jobber profesjonelt med klær, så jeg spurte henne om råd og hjelp. Vi endte opp med å lage to lommer med spandex. Den første mindre lommen mot fronten er spiss som hatten i seg selv, slik at når elektronikken er installert, holdes posisjonssensoren ganske godt, men kan lett fjernes om nødvendig. Den andre lommen mot baksiden er å holde batteripakken på plass.

Lommene ble sådd med tråd som passet til hatten, hele kronen. Avhengig av hatten og materialer er den laget av YMMV med denne teknikken.

Vi oppdaget også hattebåndet som sitter i seg selv på den ene siden, og det var helt sydd til hatten på det stedet. Vi måtte fjerne den originale sømmen for å kjøre lysdiodene under båndet. Under byggingen ble den holdt på plass med pinner, og deretter sydd med matchende tråd når den var fullført.

Til slutt åpnet vi sømmen på baksiden av hatten der den var dekket av bandet. Vi stakk ledningsnettet som fulgte med lysdiodene gjennom sømmen og foret den første lysdioden i stripen for å være rett på sømmen. Vi viklet deretter lysdiodene rundt hatten og kuttet stripen ned slik at den siste lysdioden skulle være rett ved siden av den første. LED -stripen kan holdes på plass bare med hattebåndet, men avhengig av båndet og materialet kan du trenge for å feste lysdiodene ved å sy eller lime.

Trinn 3: Wire It Up

Wire It Up
Wire It Up

Teensy -kortet og lysdiodene fungerer med alt fra 3.3v til 5v for strøm. Dette er grunnen til at jeg valgte å bruke 3 AAA -batterier, utgangsspenningen på 4,5v ligger fint i det området, og de har god kjøretid for måten jeg har programmert lysdiodene på. Du bør kunne få godt over 8 timers kjøretid.

Kabling av strømmen

Jeg koblet de positive og negative ledningene fra batteriboksen og lysdiodene sammen, og loddet deretter på Teensy på passende steder. Positivet fra batteriet må kobles til den øverste høyre pinnen på Teensy i diagrammet (merket Vin på brettet), og det negative kan kobles til en hvilken som helst pin merket GND. Praktisk er det en rett på motsatt side av brettet, eller rett ved siden av Vin -pinnen. Hele pinout -diagrammet for brettet finner du nederst på denne siden. Og i noen tilfeller er en papirkopi inkludert når du bestiller brettet.

Hvis du planlegger å kjøre kode som bare har noen få lysdioder slått på samtidig, kan du drive lysdiodene fra selve Teensy ved å bruke en 3.3v utgang og GND, men hvis du prøver å trekke for mye strøm kan du skade brettet. Så for å gi deg selv de fleste alternativene, er det best å koble lysdiodene direkte til batterikilden.

Kabling av lysdiodene

Jeg valgte Teensy LC for dette prosjektet, da den har en pinne som gjør det mye lettere å koble til adresserbare lysdioder. På bunnen av brettet er pinnen som er andre fra venstre speil Pin #17, men har også 3.3v på den. Dette kalles en pull-up, og på andre brett må du koble inn en motstand for å gi den spenningen. Når det gjelder Teensy LC, kan du bare koble den fra pinnen rett til LED -datatråden.

Kabling av posisjonssensoren

Noen av BNO055 -kortene som er tilgjengelige, er mye strengere på spenning og vil bare ha 3.3v. På grunn av dette koblet jeg Vin på BNO055 -kortet fra den dedikerte 3.3v -utgangen på Teensy, som er den tredje pinnen til høyre. Du kan deretter koble GND på BNO055 til en hvilken som helst GND på Teensy.

BNO055 posisjonssensoren bruker I2c for å snakke med Teensy. I2c krever pull-ups, så jeg koblet to 4,7K ohm motstander fra en 3,3v utgang på Teensy til pinne 18 og 19. Deretter koblet jeg pinne 19 til SCL-pinnen på BNO055-kortet og 18 til SDA-pinnen.

Kabeltips/triks

For å gjøre dette prosjektet brukte jeg solid tråd i stedet for strandet. En fordel med solid wire er mens lodding til prototypebrett som disse. Du kan fjerne litt ledning, bøye den til 90 grader og sette den gjennom bunnen av en av terminalene, slik at den avskårne enden av ledningen stikker opp over brettet ditt. Du trenger da bare en liten mengde loddetinn for å holde det til terminalen, og du kan enkelt kutte av overflødig.

Den solide ledningen kan være vanskeligere å jobbe med, da den gjerne vil forbli slik den er bøyd. Men for dette prosjektet var det en fordel. Jeg klippet og formet ledningene mine på en slik måte at orienteringen til posisjonssensoren ville være konsistent da jeg satte inn og fjernet elektronikken fra hatten for tweaking og programmering.

Trinn 4: Programmering

Nå som alt er satt sammen trenger du et Arduino -kompatibelt programmeringsverktøy. Jeg brukte selve Arduino IDE (fungerer med Linux, Mac og PC). Du trenger også Teensyduino -programvaren for å koble til Teensy -kortet. Dette prosjektet bruker FastLED -biblioteket sterkt til å lage farge- og posisjonsprogrammering av lysdiodene.

Kalibrering

Det første du vil gjøre er å gå til Kris Winer sitt utmerkede GitHub -depot for BNO055 og laste ned BNO_055_Nano_Basic_AHRS_t3.ino -skissen. Installer denne koden mens Serial Monitor kjører, og den vil fortelle deg om BNO055 -kortet kommer riktig på nettet og består sine selvtester. Det vil også lede deg gjennom kalibrering av BNO055, noe som vil gi deg mer konsistente resultater senere.

Komme i gang med Fancy LED -skissen

Koden for Fancy LED -hatten er spesielt vedlagt, og også på mitt GitHub -depot. Jeg planlegger å gjøre flere justeringer av koden, og de vil bli lagt ut på GitHub -repoen. Filen her gjenspeiler koden da denne instruksjonsboken ble publisert. Etter at du har lastet ned og åpnet skissen, er det noen ting du må endre. De fleste av de viktige verdiene som skal endres, er helt i toppen som #define utsagn:

Linje 24: #define NUM_LEDS 89 - endre dette til det faktiske antallet lysdioder på LED -stripen

Linje 28: #define SERIAL_DEBUG false - du vil sannsynligvis gjøre dette sant, slik at du kan se utdata på den serielle skjermen

Posisjonsdeteksjonskode

Posisjonsdeteksjon og det meste av justeringen starter på linje 742, og går gjennom 802. Vi får Pitch, Roll og Yaw -data fra posisjonssensoren og bruker den til å angi verdier. Avhengig av hvordan elektronikken din er montert, må du kanskje endre disse. Hvis du monterer posisjonssensoren med brikken mot toppen av hatten, og pilen ved siden av X trykt på tavlen pekt mot fronten av hatten, bør du se følgende:

  • Pitch nikker med hodet
  • Rull vipper hodet, f.eks. ta øret til skulderen
  • Yaw er hvilken retning. du vender mot (nord, vest, osv.).

Hvis brettet ditt er montert i en annen retning, må du bytte Pitch/Roll/Yaw for at de skal oppføre seg slik du vil.

For å justere innstillingene for rull kan du endre følgende #define verdier:

  • ROLLOFFSET: Med hatten din stabil og så sentrert som den kan være, hvis rollen ikke er 0, kan du endre dette med forskjellen. Dvs. hvis du ser Roll på -20 når hatten er sentrert, gjør du denne til 20.
  • ROLLMAX: maksimalverdi for rullemåling. Lettest å finne ved å bruke hatten og flytte høyre øre mot høyre skulder. Du trenger en lang USB -kabel for å gjøre dette mens du bruker den serielle skjermen.
  • ROLLMIN: den laveste verdien som skal brukes for rullemåling, for når du vipper hodet til venstre

Tilsvarende for Pitch:

  • MAXPITCH - maksimal verdi når du ser opp
  • MINPITCH - minimumsverdien når du ser ned
  • PITCHCENTER - pitch -verdien når du ser rett frem

Hvis du setter SERIALDEBUG til true øverst i filen, bør du se gjeldende verdier for Roll/Pitch/Yaw -utgang til den serielle skjermen for å justere disse verdiene.

Andre parametere du kanskje vil endre

  • MAX_LED_DELAY 35 - den tregeste LED -partikkelen kan bevege seg. Dette er i millisekunder. Det er forsinkelsen fra å flytte fra en LED til den neste i strengen.
  • MIN_LED_DELAY 10 - fasten som LED -partikkelen kan bevege seg på. Som ovenfor er det i millisekunder.

Konklusjon

Hvis du har gått så langt, bør du ha en fullt fungerende og morsom LED -hatt! Hvis du vil gjøre mer med det, har neste side litt avansert informasjon om hvordan du endrer innstillinger og gjør dine egne ting. samt noen forklaring på hva resten av koden min gjør.

Trinn 5: Avansert og valgfritt: Inne i koden

Effekt- og spinndeteksjon

Påvisning/spinndeteksjon utføres ved hjelp av høy-G-sensorfunksjonene til BNO055. Du kan justere følsomheten til den med følgende linjer i initBNO055 ():

  • Linje #316: BNO055_ACC_HG_DURATION - hvor lenge arrangementet må vare
  • Linje #317: BNO055_ACC_HG_THRESH - hvor hard virkningen må være
  • Linje #319: BNO055_GYR_HR_Z_SET - terskel for rotasjonshastighet
  • Linje #320: BNO055_GYR_DUR_Z - hvor lenge rotasjonen til og med må vare

Begge verdiene er 8 -biters binær, for øyeblikket er effekten satt til B11000000, som er 192 av 255.

Når det oppdages en påvirkning eller et spinn setter BNO055 en verdi som koden ser etter rett i begynnelsen av løkken:

// Finn alle avbrudd som utløses, dvs. på grunn av høy G byte intStatus = readByte (BNO055_ADDRESS, BNO055_INT_STATUS); if (intStatus> 8) {impact (); } annet hvis (intStatus> 0) {spin (); }

Se etter void impact () -linjen ovenfor i koden for å endre atferden ved impact, eller void spin () for å endre spin -oppførselen.

Hjelpere

Jeg har laget en enkel hjelperfunksjon (void setAllLeds ()) for raskt å sette alle lysdiodene til en farge. En bruker den til å slå dem alle av:

setAllLeds (CRGB:: svart);

Eller du kan velge hvilken som helst farge som er gjenkjent av FastLED -biblioteket:

setAllLeds (CRGB:: rød);

Det er også en fadeAllLeds () -funksjon som vil dempe alle lysdiodene med 25%.

Partikkelklassen

For å forenkle ledningene sterkt ønsket jeg å bruke en enkelt streng med lysdioder, men la dem oppføre seg som flere strenger. Siden dette var mitt første forsøk, ønsket jeg å holde det så enkelt som mulig, så jeg behandler den ene strengen som to, med den midterste lysdioden (e) som var der, ville splittelsen være. Siden vi enten kan ha et partall eller et oddetall, må vi ta hensyn til det. Jeg starter med noen globale variabler:

/ * * Variabel og beholdere for lysdioder */ CRGB -lysdioder [NUM_LEDS]; statisk usignert 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; usignert lang dirCount; usignert lang hueCount;

Og litt kode i oppsettet ():

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

Hvis vi har oddetall, vil vi bruke 1/2 punktet som midten, ellers vil vi ha 1/2 punktet - 1. Dette er lett å se med 10 eller 11 lysdioder:

  • 11 lysdioder: 11/2 med heltall skal evalueres til 5. og datamaskiner teller fra 0. Så 0 - 4 er den ene halvdelen, 6 - 10 er den andre halvdelen, og 5 er mellom dem. Vi behandler nr. 5 i dette tilfellet som om det var en del av begge deler, det vil si at det er nr. 1 for begge virtuelle strengene av lysdioder
  • 10 lysdioder: 10/2 er 5. Men siden datamaskiner teller fra 0 må vi fjerne en. Så har vi 0 - 4 for den ene halvdelen, og 5 - 9 for den andre. #1 for den første virtuelle strengen vil være 4, og #1 for den andre virtuelle strengen vil være #5.

Så i partikkelkoden vår må vi telle litt fra vår generelle posisjon til de faktiske posisjonene på LED -strengen:

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

Koden har også forhold der partikkelen kan endre retninger, så vi må også ta hensyn til det:

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

Så vi bruker den tiltenkte retningen (particleDir), for å beregne hvilken LED som skal tennes neste gang, men vi må også vurdere om vi har nådd enten den virkelige enden av LED -strengen, eller vårt midtpunkt, som også fungerer som en slutt for hver av de virtuelle strengene.

Når vi har funnet ut alt det, tenner vi det neste lyset etter behov:

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

Hvorfor i det hele tatt gjøre dette til en klasse? Som det er, er dette ganske greit og trenger egentlig ikke å gå i en klasse. Imidlertid har jeg planer om å oppdatere koden slik at mer enn én partikkel kan skje om gangen, og at noen jobber omvendt mens andre går fremover. Jeg tror det er noen virkelig gode muligheter for spinndeteksjon ved bruk av flere partikler.

Anbefalt: