Innehållsförteckning:

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

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

Video: Fancy LED -hatt: 5 steg (med bilder)
Video: See Which Hotels Were Caught Not Changing Bedsheets for New Guests 2024, Juli
Anonim
Image
Image
Snygg LED -hatt
Snygg LED -hatt

Jag har alltid velat göra ett Arduino -projekt, men aldrig haft några bra idéer för ett förrän min familj blev inbjuden till en snygg hattfest. Med två veckors ledtid var jag nyfiken på om jag både kunde planera och utföra en rörelsekänslig LED -animationshatt. Det visade sig att jag kunde! Jag gick nog lite överbord, men det totala projektet kostade cirka $ 80. Med experiment och lite kodning kan du göra det för mindre.

Målet med hatten var följande:

  1. Låt en uppsättning lampor röra sig från hattens mitt fram och bak, ett ljus på varje sida
  2. Ändra hastigheten på ljusets resor som dikteras av lutningen på hatten framåt och bakåt
  3. Låt lamporna vända när hattbandet lutade nedåt (dvs. efterlikna gravitationens effekt på lamporna)
  4. Ändra färg baserat på lutningen på hatten från vänster till höger
  5. Känn chocker och visa en speciell effekt
  6. Känn bäraren snurra och visa en speciell effekt
  7. Har den helt inne i hatten

Steg 1: Delar som behövs

Delar som behövs
Delar som behövs
Delar som behövs
Delar som behövs
Delar som behövs
Delar som behövs

Jag använde följande huvudkomponenter (icke-anslutna Amazon-länkar ingår):

  • Teensy LC -mikrokontroller - Jag valde detta framför en vanlig Arduino på grund av dess lilla storlek och den har en speciell anslutning för att styra mina lysdioder, samt starkt bibliotek och samhällsstöd.
  • Bosch BNO055 -baserad positionssensor - ärligt talat en av de första jag hittade dokumentation om. Det finns mycket billigare alternativ, men när du väl kommit fram till Bosch gör det mycket för dig som du annars skulle behöva göra i kod
  • WS2812 adresserbar LED -remsa - jag valde en 1 meters längd med 144 lysdioder per meter. Att ha den densiteten hjälper ljuset att se mer ut som om det rör sig, snarare än att enskilda element lyser upp i följd.

Och följande mindre komponenter:

  • En hatt - alla hattar med hattband kommer att göra. Detta är en $ 6 hatt från en lokal butik. Om den har en söm i ryggen blir det lättare att få igenom ledningarna. Var uppmärksam på om hattbandet är limmat eftersom det också kommer att orsaka lite extra svårigheter. Den här sys längs toppen, men botten dras lätt upp.
  • 4.7K ohm motstånd
  • 3x AAA -batterifodral - med 3 AAA -batterier matas ut spänning exakt inom det område elektroniken vill ha, vilket förenklar saker. AAA passar lättare i en hatt än AA och har fortfarande bra körtid.
  • Liten mättråd - Jag använde en fast tråd som jag hade lagt från ett tidigare LED -projekt.
  • Lödkolv och löd
  • Något spandex som matchar hattens inre färg och tråd

Rekommenderas, men valfritt:

  • Snabbkopplingar för batterikablarna
  • Dessa hjälpmedel är mycket små och svåra att löda

Steg 2: Ändra hatten

Ändra hatten
Ändra hatten
Ändra hatten
Ändra hatten
Ändra hatten
Ändra hatten
Ändra hatten
Ändra hatten

Du kommer att behöva en plats i hatten för att montera elektroniken och en plats för batteriet. Min fru arbetar professionellt med kläder, så jag bad henne om råd och hjälp. Vi slutade skapa två fickor med spandex. Den första mindre fickan framåt är spetsad som själva hatten så att när elektroniken är installerad hålls positionssensorn ganska bra, men kan lätt tas bort om det behövs. Den andra fickan mot baksidan är att hålla batteriet på plats.

Fickorna såddes med tråd som matchade mössans färg, alla långa kronlinjen. Beroende på stilen på hatt och material är den gjord av YMMV med denna teknik.

Vi upptäckte också hattbandet som sitter fast i sig själv på ena sidan, och det var helt sytt fast i hatten på den platsen. Vi var tvungna att ta bort den ursprungliga sömmen för att köra lysdioderna under bandet. Under bygget hölls det på plats med stift och sedan sys det med matchande tråd när det är klart.

Slutligen öppnade vi sömmen på baksidan av hatten om den var täckt av bandet. Vi stoppade kabelnätet som följde med lysdioderna genom den sömmen och kantade den första lysdioden i remsan för att vara precis på sömmen. Vi lindade sedan lysdioderna runt hatten och klippte av remsan så att den sista lysdioden skulle ligga precis bredvid den första. LED -remsan kan hållas på plats bara med hattbandet, men beroende på ditt band och material kan du behöva säkra lysdioderna genom att sy eller limma.

Steg 3: Wire It Up

Koppla upp det
Koppla upp det

Teensy -kortet och lysdioderna fungerar med allt från 3,3v till 5v för ström. Det är därför jag valde att använda 3 AAA -batterier, utspänningen på 4,5v ligger fint i det intervallet, och de har gott om körtid för hur jag har programmerat lysdioderna att fungera. Du bör kunna komma över 8 timmars körtid.

Anslutning av strömmen

Jag kopplade ihop de positiva och negativa ledningarna från batterilådan och lysdioderna och lödde sedan på Teensy på lämpliga platser. Positivet från batteriet måste anslutas till den övre högra stiftet på Teensy i diagrammet (märkt Vin på tavlan), och det negativa kan kopplas till valfri stift som är märkt GND. Bekvämt finns det en direkt på motsatt sida av brädet, eller alldeles intill Vin -stiftet. Det fullständiga pinout -diagrammet för brädet finns längst ner på denna sida. Och i vissa fall ingår en papperskopia när du beställer tavlan.

Om du planerar att köra koden som bara har några lysdioder tända samtidigt kan du driva lysdioderna från själva Teensy genom att använda en 3.3v utgång och GND, men om du försöker dra för mycket ström kan du skada brädan. Så för att ge dig själv de flesta alternativen är det bäst att koppla lysdioderna direkt till din batterikälla.

Anslutning av lysdioderna

Jag valde Teensy LC för detta projekt eftersom det har en nål som gör det mycket lättare att koppla upp adresserbara lysdioder. På botten av brädet stiftet som är andra från vänster speglar Pin #17, men har också 3.3v på den. Detta kallas en pull-up, och på andra brädor måste du koppla in ett motstånd för att ge den spänningen. I fallet med Teensy LC kan du bara leda från den stiftet direkt till din LED -datatråd.

Anslutning av positionssensorn

Några av de BNO055 -kort som finns är mycket strängare på spänning och vill bara ha 3,3v. På grund av detta kopplade jag Vin på BNO055 -kortet från den dedikerade 3.3v -utgången på Teensy, vilket är den tredje stiftet till höger. Du kan sedan ansluta GND på BNO055 till valfri GND på Teensy.

BNO055 positionssensorn använder I2c för att prata med Teensy. I2c kräver pull-ups, så jag kopplade två 4,7K ohm motstånd från en 3,3v utgång på Teensy till stift 18 och 19. Jag kopplade sedan stift 19 till SCL-stiftet på BNO055-kortet och 18 till SDA-stiftet.

Kabeltips/knep

För att göra detta projekt använde jag fast tråd snarare än strandade. En fördel med fast tråd är vid lödning till prototyper som dessa. Du kan ta bort lite tråd, böja den till 90 grader och sätt in den genom botten på en av terminalerna, så att den avskurna änden av tråden sticker upp ovanför brädet. Du behöver då bara en liten mängd löd för att hålla den vid terminalen, och du kan enkelt klippa av överskottet.

Den fasta tråden kan vara svårare att arbeta med eftersom den tenderar att vilja förbli hur den är böjd. Men för detta projekt var det en fördel. Jag klippte och formade mina trådar på ett sådant sätt att lägesgivarens orientering skulle vara konsekvent när jag satte in och tog bort elektroniken från hatten för tweaking och programmering.

Steg 4: Programmering

Nu när allt är monterat behöver du ett Arduino -kompatibelt programmeringsverktyg. Jag använde själva Arduino IDE (fungerar med Linux, Mac och PC). Du behöver också Teensyduino -programvaran för att ansluta till Teensy -kortet. Detta projekt använder starkt FastLED -biblioteket för att göra färg- och positionsprogrammering av lysdioderna.

Kalibrering

Det första du vill göra är att gå till Kris Winers utmärkta GitHub -förvar för BNO055 och ladda ner hans BNO_055_Nano_Basic_AHRS_t3.ino -skiss. Installera den koden med seriell bildskärm igång och den kommer att berätta om BNO055 -kortet korrekt kommer online och klarar sina självtester. Det kommer också att leda dig genom kalibrering av BNO055, vilket ger dig mer konsekventa resultat senare.

Kom igång med Fancy LED -skissen

Koden för Fancy LED -hatten är specifikt bifogad, och även på mitt GitHub -förråd. Jag planerar att göra fler justeringar av koden och de kommer att läggas ut på GitHub -repo. Filen här återspeglar koden när denna instruktionsbok publicerades. När du har laddat ner och öppnat skissen finns det några saker du behöver ändra. De flesta av de viktiga värdena som ska ändras ligger högst upp som #define -uttalanden:

Rad 24: #define NUM_LEDS 89 - ändra detta till det faktiska antalet lysdioder på din LED -remsa

Rad 28: #define SERIAL_DEBUG false - du kommer förmodligen att göra detta sant, så att du kan se utdata på den seriella bildskärmen

Positionsdetekteringskod

Positionsdetektering och de flesta av dina tweaking börjar på rad 742 och går genom 802. Vi får Pitch, Roll och Yaw -data från positionssensorn och använder den för att ställa in värden. Beroende på hur din elektronik är monterad kan du behöva ändra dessa. Om du monterar positionssensorn med chipet mot hattens ovansida och pilen bredvid X tryckt på tavlan pekar mot hattens framsida bör du se följande:

  • Pitch nickar med huvudet
  • Rullen lutar ditt huvud, t.ex. rör örat mot axeln
  • Yaw är vilken riktning. du står inför (norr, väst, etc).

Om din bräda är monterad i en annan orientering måste du byta Pitch/Roll/Yaw för att de ska kunna bete sig som du vill.

För att justera rullningsinställningarna kan du ändra följande #define -värden:

  • ROLLOFFSET: med din hatt stabil och så centrerad som den kan vara, om rullen inte är 0, ändra detta med skillnaden. D.v.s. om du ser Roll vid -20 när din hatt är centrerad, gör den här 20.
  • ROLLMAX: maximivärdet för rullmätning. Lättast att hitta genom att bära hatten och flytta höger öra mot höger axel. Du behöver en lång USB -kabel för att göra detta när du använder den seriella bildskärmen.
  • ROLLMIN: det lägsta värdet att använda för rullmätning, när du lutar huvudet åt vänster

På samma sätt för Pitch:

  • MAXPITCH - maxvärdet när du tittar upp
  • MINPITCH - lägsta värde när du tittar ner
  • PITCHCENTER - pitchvärdet när du tittar rakt fram

Om du ställer in SERIALDEBUG till true högst upp i filen bör du se de aktuella värdena för Roll/Pitch/Yaw -utmatning till den seriella bildskärmen för att hjälpa till att justera dessa värden.

Andra parametrar som du kanske vill ändra

  • MAX_LED_DELAY 35 - det långsammaste som LED -partikeln kan röra sig på. Detta är i millisekunder. Det är fördröjningen från att flytta från en LED till nästa i strängen.
  • MIN_LED_DELAY 10 - fastan som LED -partikeln kan röra sig på. Som ovan är det i millisekunder.

Slutsats

Om du har gått så långt bör du ha en fullt fungerande och rolig LED -hatt! Om du vill göra mer med det, har nästa sida lite avancerad information om hur du ändrar inställningar och gör dina egna saker. samt en förklaring till vad resten av min kod gör.

Steg 5: Avancerat och valfritt: Inuti koden

Impact & spin -upptäckt

Slag-/centrifugeringsdetektering görs med hjälp av hög-G-sensorfunktionerna i BNO055. Du kan justera känsligheten för det med följande rader i initBNO055 ():

  • Rad #316: BNO055_ACC_HG_DURATION - hur länge evenemanget måste pågå
  • Rad #317: BNO055_ACC_HG_THRESH - hur hårt påverkan behöver vara
  • Rad #319: BNO055_GYR_HR_Z_SET - tröskel för rotationshastighet
  • Rad #320: BNO055_GYR_DUR_Z - hur länge rotationen ens måste pågå

Båda värdena är 8 -bitars binära, för närvarande är effekten inställd på B11000000, vilket är 192 av 255.

När en påverkan eller snurr detekteras anger BNO055 ett värde som koden letar efter precis i början av slingan:

// Upptäck eventuella avbrott, dvs. på grund av hög G -byte intStatus = readByte (BNO055_ADDRESS, BNO055_INT_STATUS); if (intStatus> 8) {impact (); } annars if (intStatus> 0) {spin (); }

Leta efter void impact () -raden ovan i koden för att ändra beteendet vid impact, eller void spin () för att ändra spin -beteendet.

Hjälpare

Jag har skapat en enkel hjälpfunktion (void setAllLeds ()) för att snabbt ställa in alla lysdioder till en enda färg. En använder den för att stänga av dem alla:

setAllLeds (CRGB:: Svart);

Eller så kan du välja vilken färg som helst som identifieras av FastLED -biblioteket:

setAllLeds (CRGB:: Röd);

Det finns också en fadeAllLeds () -funktion som dämpar alla lysdioder med 25%.

Partikelklassen

För att förenkla kablarna kraftigt ville jag använda en enda sträng av lysdioder, men få dem att bete sig som flera strängar. Eftersom det här var mitt första försök ville jag hålla det så enkelt som möjligt, så jag behandlar den ena strängen som två, med den eller de mellersta lysdioderna som finns där skulle splittringen vara. Eftersom vi antingen kan ha ett jämnt tal eller ett udda tal måste vi redogöra för det. Jag börjar med några globala variabler:

/ * * Variabel och behållare för lysdioder */ CRGB -lysdioder [NUM_LEDS]; statisk osignerad 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; osignerat långt dirCount; osignerad long hueCount;

Och lite kod i setup ():

om (NUM_LEDS % 2 == 1) {oddLeds = 1; maxLedPos = NUM_LEDS/2; } annat {oddLeds = 0; maxLedPos = NUM_LEDS/2 - 1; }

Om vi har udda tal vill vi använda 1/2 -punkten som mitten, annars vill vi ha 1/2 -punkten - 1. Detta är lätt att se med 10 eller 11 lysdioder:

  • 11 lysdioder: 11/2 med heltal ska utvärderas till 5. och datorer räknas från 0. Så 0 - 4 är ena halvan, 6 - 10 är den andra halvan och 5 är mellan dem. Vi behandlar #5 i det här fallet som om det var en del av båda, det vill säga det är #1 för båda virtuella strängarna av lysdioder
  • 10 lysdioder: 10/2 är 5. Men eftersom datorer räknas från 0 måste vi ta bort en. Sedan har vi 0 - 4 för ena halvan och 5 - 9 för den andra. #1 för den första virtuella strängen kommer att vara 4, och #1 för den andra virtuella strängen kommer att vara #5.

Sedan i vår partikelkod måste vi räkna lite från vår totala position till de faktiska positionerna på LED -strängen:

if (oddLeds) {Pos1 = centerLed + currPos; Pos2 = centerLed - currPos; } annat {Pos1 = centerLed + currPos; Pos2 = (centerLed -1) - currPos; }

Koden har också villkor där partikeln kan ändra riktning, så vi måste också ta hänsyn till det:

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

Så vi använder den avsedda riktningen (particleDir) för att beräkna vilken lysdiod som ska tändas nästa, men vi måste också överväga om vi har nått antingen LED -strängens verkliga ände eller vår mittpunkt, som också fungerar som ett slut för var och en av de virtuella strängarna.

När vi väl kommit fram till allt, tänder vi nästa ljus efter behov:

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

Varför göra detta till en klass överhuvudtaget? Som det är är detta ganska enkelt och behöver inte riktigt gå i en klass. Men jag har framtida planer på att uppdatera koden så att mer än en partikel kan inträffa åt gången, och att vissa fungerar i omvända medan andra går framåt. Jag tror att det finns några riktigt bra möjligheter för spinndetektering med hjälp av flera partiklar.

Rekommenderad: