Indholdsfortegnelse:

Arduino Interactive LED sofabord: 6 trin (med billeder)
Arduino Interactive LED sofabord: 6 trin (med billeder)

Video: Arduino Interactive LED sofabord: 6 trin (med billeder)

Video: Arduino Interactive LED sofabord: 6 trin (med billeder)
Video: Я работаю в Страшном музее для Богатых и Знаменитых. Страшные истории. Ужасы. 2024, Juli
Anonim
Image
Image
Arduino interaktivt LED sofabord
Arduino interaktivt LED sofabord

Jeg lavede et interaktivt sofabord, der tænder LED -lys under et objekt, når objektet placeres over bordet. Kun de lysdioder, der er under det objekt, lyser. Det gør det ved effektivt at bruge nærhedssensorer, og når nærhedssensoren fornemmer, at et objekt er tæt nok, vil det tænde en knude under objektet. Det bruger også en Arduino til at sætte animationer op, der ikke har brug for nærhedssensorer, men tilføjer en virkelig sej effekt, som jeg bare elsker.

Nærhedsfølere består af fotodioder og IR -sendere. Emitterne bruger infrarødt lys (som det menneskelige øje ikke kan se) til at skinne lys op fra bordet, og fotodioderne modtager det infrarøde lys, der reflekteres fra et objekt. Jo mere lys der reflekteres (jo tættere objektet er), jo mere svinger spændingen fra fotodioderne. Dette bruges som en indikator til at fortælle, hvilken knude der skal tændes. Knuderne er en samling af ws2812b lysdioder og en nærhedssensor.

Den vedhæftede video går over hele byggeprocessen, mens jeg skitserer flere af detaljerne herunder.

Forbrugsvarer

  1. ws2812b LED -pærer -
  2. 5V strømforsyning -
  3. Enhver Arduino jeg brugte 2560 -
  4. Fotodioder
  5. IR -emittere
  6. 10 Ohm modstande
  7. 1 MOhms modstande
  8. 47 pF kondensatorer
  9. CD4051B Multiplexere
  10. SN74HC595 Skiftregistre
  11. ULN2803A Darlington Arrays
  12. Ethvert underlag, der skal bruges som et stort bræt til lysdioderne, brugte jeg et papirkompositbræt fra hjemmedepot

Trin 1: Opret kortet og indsæt lysdioderne

Opret tavlen og indsæt lysdioderne
Opret tavlen og indsæt lysdioderne
Opret tavlen og indsæt lysdioderne
Opret tavlen og indsæt lysdioderne
Opret tavlen og indsæt lysdioderne
Opret tavlen og indsæt lysdioderne
Opret tavlen og indsæt lysdioderne
Opret tavlen og indsæt lysdioderne

Det første, jeg gjorde, var at oprette tavlen, som vil indeholde lysdioderne, som vi lægger inde i sofabordet. Jeg brugte et stykke papirkompositplade fra hjemmedepot og skar det til de korrekte dimensioner for det sofabord, jeg havde. Efter at have skåret brættet i størrelse, borede jeg alle hullerne ud til, hvor lysdioderne skulle hen. Selve tavlen havde 8 rækker og 12 kolonner med ws2812b -leds adskilt 3 tommer fra hinanden, og de blev fastgjort i et serpentinmønster. Jeg brugte varm lim til at sikre dem på plads.

Jeg var også nødt til at bore huller i midten af det, der bliver noden: 4 ws2812b -ledser, der udgør en firkant, 2 fotodioder og 2 IR -emittere i en mindre firkant i midten af det. Disse 4 huller i midten af knuden ville være pletterne for fotodioderne og ir -emitterne (2 af hver). Jeg skiftede dem for at sikre maksimal eksponering og placerede dem cirka 1 tommer fra hinanden i midten af hver knude. Jeg behøvede ikke at varme dem på plads, jeg bøjede bare ledningerne på den anden side for at sikre, at de ikke kom ud på den anden side. Jeg sørgede også for at bøje de positive og negative ender i bestemte retninger, så de var orienteret korrekt i kredsløbet. Alle positive leads var på venstre side af bagsiden af brættet, mens alle negative leads var på højre side af brættet.

Trin 2: Forstå kredsløbet

Forstå kredsløbet
Forstå kredsløbet
Forstå kredsløbet
Forstå kredsløbet
Forstå kredsløbet
Forstå kredsløbet

Bemærk: Alle animerede tegninger er ikke nøjagtige for implementeringen (nogle arduino -pins er forskellige, og jeg tusindvis kæder et par, mere om det senere). Slutresultatet var lidt anderledes på grund af kredsløbets kompleksitet, men alle animerede kredsløb fungerer som en god base for at forstå, hvordan man prototyper hver del. Det almindelige skematiske og kredsløbsdiagram er som det er på det printkort, der bruges i projektet.

PCB -koden, der indeholder KiCad -projektet og gerber -filer, kan findes her: https://github.com/tmckay1/interactive_coffee_tabl…, hvis du vil bestille PCB'erne selv og oprette et lignende projekt. Jeg brugte NextPCB til at oprette tavlerne.

Der er dybest set tre forskellige kredsløb, der udgør denne tabel. Det første vil vi ikke gå nærmere ind på og er et simpelt kredsløb, der driver ws2812b -lysdioderne. Et PWM -datasignal sendes fra Arduino til ws2812b LED -pærerne og styrer, hvilke farver der vises hvor. Vi bruger ws2812b lysdioder, da de er individuelt adresserbare, så vi vil være i stand til at kontrollere, hvilken af lysdioderne der skal tændes, og hvilke der skal slukkes. Ws2812b lysdioderne drives af en 5V ekstern strømkilde, da arduinoen alene ikke har nok strøm til at tænde alle lysene. I det vedhæftede animerede diagram bruger de en pullup -modstand på 330 Ohm, men jeg bruger det ikke i min build.

Det andet kredsløb tænder IR -emitterne. Dette kredsløb bruger et skiftregister til at styre et darlington -array, der sender strøm til IR -emitterne. Et skiftregister er et integreret kredsløb, der er i stand til at sende HIGH og LOW -signaler til flere ben fra kun en lille mængde stifter. I vores tilfælde bruger vi et SN74HC595 skiftregister, der kan styres fra 3 indgange, men styrer op til 8 udgange. Fordelen ved at bruge dette med arduino er, at du kan daisy kæde op til 8 skiftregistre i træk (arduino kan kun håndtere op til 8 af dem). Det betyder, at du kun har brug for 3 pins fra arduinoen for at tænde og slukke 64 IR -emittere. Darlington -arrayet giver dig mulighed for at forsyne en enhed fra en ekstern kilde, hvis indgangssignalet er HIGH, eller slukke for strømmen til den pågældende enhed, hvis indgangssignalet er LAVT. Så i vores eksempel bruger vi et ULN2803A darlington -array, som tillader en 5V ekstern strømkilde at tænde og slukke op til 8 af IR -emitterne. Vi bruger en 10 Ohm modstand med IR -emitterne i serie for at få maksimal strømstyrke fra IR -emitterne.

Det tredje kredsløb bruger en multiplexer til at modtage flere input fra fotodioderne og sender output i et datasignal. En multiplexer er en enhed, der bruges til at tage flere input, du vil læse fra, og har kun brug for et par ben for at læse fra disse input. Det kan også gøre det modsatte (demultiplex), men vi bruger det ikke til det program her. Så i vores tilfælde bruger vi en CD4051B -multiplexer til at optage op til 8 signaler fra fotodioderne, og vi har kun brug for 3 input for at læse fra disse signaler. Plus vi kan daisy kæde op til 8 multiplexere (arduino kan kun håndtere op til 8 af dem). Det betyder, at arduinoen kan læse fra 64 af fotodiodens signaler fra kun 3 digitale ben. Fotodioderne er orienteret omvendt forudindtaget, hvilket betyder, at vi i stedet for at orientere i normal retning med det positive ledning fastgjort til den positive spændingskilde, tildeler den negative ledning til den positive spændingskilde. Dette gør fotodioderne effektivt til fotomodstande, som ændres i modstand afhængigt af mængden af lys, den modtager. Vi opretter derefter en spændingsdeler for at aflæse en spænding afhængig af fotodiodernes varierende modstand ved at tilføje en meget modstandsdygtig 1 MOhms modstand til jorden. Dette giver os mulighed for at modtage højere og lavere spændinger til arduinoen afhængigt af hvor meget IR -lys fotodioderne modtager.

Jeg fulgte det meste af dette design fra en anden person, der gjorde dette her: https://www.instructables.com/Infrared-Proximity-S… I dette design tilføjede de også en 47pF kondensator, som vi gør, overfor 1 MOhm modstanden bruges til at oprette spændingsdeleren med fotodioderne. Grunden til, at han tilføjede det, var, at han svingede IR -emitterne til og fra med et PWM -signal, og ved at gøre dette trak et lille spændingsfald fra fotodioderne, da IR -emitterne straks blev tændt. Dette fik fotodioderne til at ændre modstand, selv når det ikke modtog mere IR -lys fra et objekt, fordi IR -emitterne delte den samme 5V strømkilde som fotodioderne. Kondensatoren blev brugt til at sikre, at der ikke var et spændingsfald, når IR -emitterne blev tændt og slukket. Jeg planlagde oprindeligt at gøre den samme strategi, men løb tør for tid til at teste den, så i stedet forlod jeg IR -emitterne altid. Jeg vil gerne ændre dette i fremtiden, men indtil jeg redesigner koden og kredsløbet, er PCB'et lige nu designet til altid at have IR -lysene tændt, og jeg beholdt kondensatorerne alligevel. Du skulle ikke have brug for kondensatoren, hvis du bruger dette PCB -design, men jeg vil introducere en anden version af printkortet, der accepterer et ekstra input til skiftregistret, der giver dig mulighed for at modulere IR -emitterne til og fra. Dette vil spare meget på strømforbruget.

Du kan kontrollere de vedhæftede animerede diagrammer til en prototype -opsætning til test på din arduino. Der er også en mere detaljeret farveskema for hvert kredsløb, der skitserer opsætningen og orienteringen af de elektroniske enheder. I den vedlagte PCB -skematik har vi 4 samlede kredsløb, 2 kredsløb, der bruges til at tænde IR -emitterne, og 2 kredsløb til at læse fra fotodioderne. De er orienteret på PCB 2 -grupperne ved siden af hinanden med en gruppe bestående af 1 IR -emitterkredsløb og 1 fotodiodekredsløb, så 2 kolonner med 8 noder kan sættes i et enkelt PCB. Vi kobler også de to kredsløb sammen, så tre ben fra arduinoen kan styre de to skiftregistre, og 3 ekstra ben kan styre de to multiplexere på tavlen. Der er en ekstra output header for at kunne daisy kæde til yderligere PCB'er.

Her er et par ressourcer, som jeg fulgte til prototyper:

  • https://lastminuteengineers.com/74hc595-shift-regi…
  • https://techtutorialsx.com/2016/02/08/using-a-uln2…
  • https://tok.hakynda.com/article/detail/144/cd4051be…

Trin 3: Loddekabler til knuden

Loddekabler til knuden
Loddekabler til knuden
Loddekabler til knuden
Loddekabler til knuden
Loddekabler til knuden
Loddekabler til knuden
Loddekabler til knuden
Loddekabler til knuden

Nu hvor du forstår, hvordan kredsløbet er lavet, skal du gå videre og lodde ledningerne til hver knude. Jeg loddet fotodioderne parallelt (gule og grå ledninger) og ir -emitterne i serie (orange ledning). Jeg lod derefter en længere gul ledning til fotodioderne parallelt, der vil blive tilsluttet 5V strømkilden, og en blå ledning, der vil blive knyttet til fotodiodeindgangen på pcb'et. Jeg loddet en lang rød ledning til IR -emitterkredsløbet, der skal bruges til at forbinde til 5V -strømkilden og en sort ledning, som vil forbinde til IR -emitterindgangen på printkortet. Jeg lavede faktisk ledningerne lidt til korte løb tør for tid, så jeg kunne kun forbinde 5 af noderne i hver kolonne til sidst (i stedet for 7). Jeg planlægger at rette dette senere.

Trin 4: Lodde printkortkomponenterne og fastgør det til brættet

Lodde PCB -komponenterne og fastgør det til tavlen
Lodde PCB -komponenterne og fastgør det til tavlen
Lodde PCB -komponenterne og fastgør det til tavlen
Lodde PCB -komponenterne og fastgør det til tavlen
Lodde printkortkomponenterne og fastgør det til tavlen
Lodde printkortkomponenterne og fastgør det til tavlen

Bemærk: PCB'et på det vedhæftede billede er den første version, jeg lavede, der manglede strømindgange og -udgange og også en daisy chain out for hvert indre kredsløb. Det nye PCB -design retter denne fejl.

Her skal du bare følge PCB -skematikken for at lodde komponenterne til printkortet, og når det er gjort, loddes printkortet til tavlen. Jeg brugte eksterne kredsløbskort til at vedhæfte 5V effektsignalet, som jeg distribuerede til alle de gule og røde ledninger. Set i bakspejlet havde jeg ikke brug for så lange røde og gule ledninger og kunne have forbundet knudepunkterne til hinanden (i stedet for at forbinde dem til et fælles eksternt printkort). Dette vil virkelig have reduceret mængden af rod på bagsiden af brættet.

Da jeg havde 8 rækker ws2812b lysdioder og 12 kolonner, endte jeg med 7 rækker og 11 søjler med noder (i alt 77 noder). Ideen er at bruge den ene side af printkortet til en kolonne af noder og den anden side til den anden kolonne. Så da jeg havde 11 kolonner, havde jeg brug for 6 printkort (den sidste havde kun brug for en gruppe komponenter). Da jeg lavede ledningerne for korte, kunne jeg kun forbinde 55 noder, 11 kolonner og 5 rækker. Du kan se på billedet, jeg begik en fejl og lodde de rå ledninger til brættet, hvilket ville være fint, hvis ledningerne var tynde nok, men i mit tilfælde var de for tykke. Dette betød, at jeg havde flossede trådender meget tæt på hinanden for hver IR -emitterindgang og fotodiodeindgang, så der skete en masse fejlfinding fra al trådkortslutningen. I fremtiden vil jeg bruge stik til at forbinde printkortet til ledningerne på kortet for at undgå shorts og rydde op.

Da Arduino kun kan daisy kæde op til 8 skiftregistre og multiplexere, oprettede jeg to separate kæder, en tager de første 8 kolonner og en anden optager de resterende 3 kolonner. Jeg sluttede derefter hver kæde til en anden pcb, der kun havde 2 multiplexere, så jeg kunne læse hver kæde af multiplexerdatasignaler fra de to multiplexere ind i arduinoen. Disse to multiplexere var også daisy lænket. Det betyder, at der i alt blev brugt 16 udgangssignaler og 2 analoge indgange i arduinoen: 1 udgangssignal til at styre ws2812b -lysdioderne, 3 udgangssignaler til den første kæde af skiftregistre, 3 udgangssignaler til den første kæde af multiplexere, 3 udgangssignaler til den anden kæde af skiftregistre, 3 udgangssignaler til den anden kæde af multiplexere, 3 udgangssignaler til de 2 multiplexere, der aggregerer hvert PCB -datasignal, og endelig 2 analoge indgange for hvert datasignal fra de 2 aggregerede multiplexere.

Trin 5: Gennemgå koden

Bemærk: Ud over den interaktive kode herunder brugte jeg et tredjepartsbibliotek til at producere animationer til ws2812b -leds. Du kan finde det her:

Du kan finde den kode, jeg brugte her:

Øverst definerer jeg de arduino -ben, der vil forbinde til hver del af printkortet. I opsætningsmetoden indstiller jeg outputstifterne til multiplexerne, tænder IR -emitterne, sætter en baseVal -array, der holder styr på aflæsning af omgivende lys for hver fotodiode og initialiserer FastLED, der vil skrive til ws2812b -leds. I loop -metoden nulstiller vi listen over lysdioder, der er tildelt til at være tændt i ws2812b -stripen. Derefter læser vi værdier fra fotodioderne i multiplexorkæderne, og sætter ws2812b -lysdioderne på, der formodes at være tændt, hvis aflæsningen fra fotodioden i knuden er over en bestemt defineret tærskel fra basisværdien af de omgivende lysmålinger. Vi gengiver derefter lysdioderne, hvis der er nogen ændring i noden, der skal være tændt. Ellers bliver det ved med at løkke, indtil noget ændrer sig for at fremskynde tingene.

Koden kan sandsynligvis forbedres, og jeg ser på at gøre dette, men der er cirka en 1-2 sekunders forsinkelse fra, når lysene tændes, efter at en genstand er placeret på bordet. Jeg tror, at det underliggende problem er, at FastLED tager noget tid at gengive de 96 lysdioder på bordet, og koden skal sløjfe igennem og læse 77 input fra tabellen. Jeg forsøgte denne kode med 8 lysdioder og fandt ud af, at den var næsten øjeblikkelig, men jeg kigger på søde stedet for lysdioder, der vil arbejde med denne kode og være næsten øjeblikkelig, samt forbedre koden.

Trin 6: Tænd for Arduino

Tænd for Arduino!
Tænd for Arduino!
Tænd for Arduino!
Tænd for Arduino!
Tænd for Arduino!
Tænd for Arduino!

Det eneste du skal gøre er at tænde for arduinoen og se bordfunktionen! Ved hjælp af det tidligere nævnte animationsbibliotek kan du tage nogle fede ws2812b led -animationer på, eller du kan sætte kaffebordskoden på og se den lyse i hver sektion. Kommenter eventuelle spørgsmål eller meninger, og jeg vil forsøge at vende tilbage til dig rettidigt. Skål!

Anbefalede: