Inhoudsopgave:

Arduino Interactieve LED-salontafel - Ajarnpa
Arduino Interactieve LED-salontafel - Ajarnpa

Video: Arduino Interactieve LED-salontafel - Ajarnpa

Video: Arduino Interactieve LED-salontafel - Ajarnpa
Video: [Arduino] Coffee table with Arduino LED 2024, Juli-
Anonim
Image
Image
Arduino Interactieve LED-salontafel
Arduino Interactieve LED-salontafel

Ik heb een interactieve salontafel gemaakt die led-verlichting aandoet onder een object, wanneer het object boven de tafel wordt geplaatst. Alleen de leds die onder dat object zitten gaan branden. Het doet dit door effectief gebruik te maken van nabijheidssensoren, en wanneer de nabijheidssensor detecteert dat een object dichtbij genoeg is, zal het een knooppunt onder dat object oplichten. Het gebruikt ook een Arduino om animaties op te zetten die de nabijheidssensoren niet nodig hebben, maar een echt cool effect toevoegen waar ik dol op ben.

De naderingssensoren bestaan uit fotodiodes en IR-zenders. De zenders gebruiken infrarood licht (dat het menselijk oog niet kan zien) om licht uit de tafel te laten schijnen, en de fotodiodes ontvangen het infraroodlicht dat door een object wordt gereflecteerd. Hoe meer licht er wordt gereflecteerd (hoe dichterbij het object), hoe meer de spanning van de fotodiodes fluctueert. Dit wordt gebruikt als een indicator om aan te geven welk knooppunt moet oplichten. De knooppunten zijn een verzameling ws2812b-leds en een naderingssensor.

De bijgevoegde video gaat over het hele bouwproces, terwijl ik hieronder meer van de details schets.

Benodigdheden

  1. ws2812b LED-lampen -
  2. 5V-voeding -
  3. Elke Arduino die ik de 2560 heb gebruikt -
  4. Fotodiodes
  5. IR-zenders
  6. 10 Ohm Weerstanden
  7. Weerstanden van 1 MOhm
  8. 47 pF condensatoren
  9. CD4051B-multiplexers
  10. SN74HC595 Schakelregisters
  11. ULN2803A Darlington-arrays
  12. Elk substraat om te gebruiken als een groot bord voor de leds, ik gebruikte een papiercomposietbord van home depot

Stap 1: Maak het bord en plaats de LED's

Maak het bord en plaats de LED's
Maak het bord en plaats de LED's
Maak het bord en plaats de LED's
Maak het bord en plaats de LED's
Maak het bord en plaats de LED's
Maak het bord en plaats de LED's
Maak het bord en plaats de LED's
Maak het bord en plaats de LED's

Het eerste wat ik deed, was het bord maken met de leds die we in de salontafel zullen plaatsen. Ik gebruikte een stuk papier samengesteld bord van home depot en sneed het op de juiste afmetingen voor de salontafel die ik had. Nadat ik het bord op maat had gesneden, boorde ik alle gaten uit voor waar de leds naartoe gingen. Het bord zelf had 8 rijen en 12 kolommen ws2812b-leds die 3 inch van elkaar gescheiden waren, en ze waren bevestigd in een serpentinepatroon. Ik gebruikte hete lijm om ze op hun plaats vast te zetten.

Ik moest ook gaten boren in het midden van wat het knooppunt zal worden: 4 ws2812b-leds die een vierkant vormen, 2 fotodiodes en 2 IR-stralers in een kleiner vierkant in het midden daarvan. Deze 4 gaten in het midden van het knooppunt zouden de plekken zijn voor de fotodiodes en ir-zenders (2 van elk). Ik heb ze afgewisseld om maximale blootstelling te garanderen en plaatste ze ongeveer 1 inch uit elkaar in het midden van elk knooppunt. Ik hoefde deze niet op hun plaats te lijmen, ik heb de draden gewoon aan de andere kant gebogen om ervoor te zorgen dat ze er niet aan de andere kant uit zouden komen. Ik zorgde er ook voor dat de positieve en negatieve uiteinden in bepaalde richtingen werden gebogen, zodat ze correct in het circuit werden georiënteerd. Alle positieve leads bevonden zich aan de linkerkant van de achterkant van het bord, terwijl alle negatieve leads aan de rechterkant van het bord waren.

Stap 2: Begrijp het circuit

Begrijp het circuit
Begrijp het circuit
Begrijp het circuit
Begrijp het circuit
Begrijp het circuit
Begrijp het circuit

Opmerking: alle geanimeerde tekeningen zijn niet exact voor de implementatie (sommige arduino-pinnen zijn anders en ik maak er een paar in serie, daarover later meer). Het eindresultaat was een beetje anders vanwege de complexiteit van het circuit, maar alle geanimeerde circuits dienen als een uitstekende basis om te begrijpen hoe elk onderdeel te prototypen. Het reguliere schema en schakelschema zijn zoals het is op de PCB die in het project wordt gebruikt.

De PCB-code die het KiCad-project en de gerber-bestanden bevat, vindt u hier: https://github.com/tmckay1/interactive_coffee_tabl…, voor het geval u de PCB's zelf wilt bestellen en een soortgelijk project wilt maken. Ik heb NextPCB gebruikt om de borden te maken.

Er zijn in principe drie verschillende circuits die deel uitmaken van deze tabel. De eerste zullen we niet in detail bespreken en is een eenvoudig circuit dat de ws2812b-leds van stroom voorziet. Een PWM-gegevenssignaal wordt van de Arduino naar de ws2812b led-lampen gestuurd en bepaalt welke kleuren waar worden weergegeven. We gebruiken ws2812b-leds omdat ze individueel adresseerbaar zijn, zodat we kunnen bepalen welke leds moeten worden ingeschakeld en welke moeten worden uitgeschakeld. De ws2812b-leds worden gevoed door een externe voedingsbron van 5 V, omdat de arduino alleen niet genoeg stroom heeft om alle lichten aan te doen. In het bijgevoegde geanimeerde diagram gebruiken ze een pullup-weerstand van 330 Ohm, maar die gebruik ik niet in mijn build.

Het tweede circuit schakelt de IR-zenders in. Dit circuit gebruikt een schuifregister om een darlington-array te besturen die stroom naar de IR-zenders stuurt. Een schuifregister is een geïntegreerd circuit dat in staat is om vanuit slechts een klein aantal pinnen HOOG en LAAG signalen naar meerdere pinnen te sturen. In ons geval gebruiken we een SN74HC595 schuifregister dat kan worden aangestuurd vanaf 3 ingangen, maar maximaal 8 uitgangen aanstuurt. Het voordeel van het gebruik hiervan met de arduino is dat je tot 8 schuifregisters op een rij kunt doorlussen (arduino kan er maar tot 8 aan). Dit betekent dat je slechts 3 pinnen van de arduino nodig hebt om 64 IR-zenders in en uit te schakelen. Met de darlington-array kunt u een apparaat van stroom voorzien via een externe bron als het ingangssignaal HOOG is, of het apparaat uitschakelen als het ingangssignaal LAAG is. Dus in ons voorbeeld gebruiken we een ULN2803A darlington-array, waarmee een externe voedingsbron van 5 V tot 8 van de IR-zenders kan in- en uitschakelen. We gebruiken een weerstand van 10 Ohm met de IR-stralers in serie om maximale stroomsterkte van de IR-stralers te krijgen.

Het derde circuit gebruikt een multiplexer om meerdere inputs van de fotodiodes te ontvangen en stuurt de output in een datasignaal. Een multiplexer is een apparaat dat wordt gebruikt om meerdere ingangen te nemen waarvan u wilt lezen, en heeft slechts een paar pinnen nodig om van die ingangen te lezen. Het kan ook het tegenovergestelde doen (demultiplex), maar we gebruiken het hier niet voor die toepassing. Dus in ons geval gebruiken we een CD4051B multiplexer om maximaal 8 signalen van de fotodiodes op te nemen, en we hebben maar 3 ingangen nodig om van die signalen te lezen. Bovendien kunnen we tot 8 multiplexers in serie schakelen (arduino kan er maar tot 8 aan). Dit betekent dat de Arduino 64 van de fotodiodesignalen van slechts 3 digitale pinnen kan lezen. De fotodiodes zijn omgekeerd voorgespannen, wat betekent dat we in plaats van in de normale richting met de positieve draad bevestigd aan de positieve spanningsbron, de negatieve draad toewijzen aan de positieve spanningsbron. Dit verandert de fotodiodes effectief in fotoweerstanden, die in weerstand veranderen afhankelijk van de hoeveelheid licht die het ontvangt. Vervolgens creëren we een spanningsdeler om een spanning te lezen die afhankelijk is van de variërende weerstand van de fotodiodes door een zeer resistente weerstand van 1 MOhms aan aarde toe te voegen. Hierdoor kunnen we hogere en lagere spanningen naar de Arduino ontvangen, afhankelijk van hoeveel IR-licht de fotodiodes ontvangen.

Ik volgde het grootste deel van dit ontwerp van een andere persoon die dit hier deed: https://www.instructables.com/Infrared-Proximity-S… In dat ontwerp hebben ze ook een 47pF-condensator toegevoegd, zoals wij doen, tegenover de 1 MOhm-weerstand gebruikt om de spanningsdeler met de fotodiodes te maken. De reden dat hij het toevoegde was omdat hij de IR-zenders aan en uit fluctueerde met een PWM-signaal en dit veroorzaakte een kleine spanningsval van de fotodiodes toen de IR-zenders onmiddellijk werden ingeschakeld. Dit zorgde ervoor dat de fotodiodes van weerstand veranderden, zelfs als het niet meer IR-licht van een object ontving, omdat de IR-zenders dezelfde 5V-voedingsbron deelden als de fotodiodes. De condensator werd gebruikt om ervoor te zorgen dat er geen spanningsval was wanneer de IR-zenders werden in- en uitgeschakeld. Ik was oorspronkelijk van plan om dezelfde strategie te doen, maar had geen tijd om het te testen, dus in plaats daarvan liet ik de IR-zenders altijd aan. Ik zou dit in de toekomst willen veranderen, maar totdat ik de code en het circuit opnieuw heb ontworpen, is de PCB nu ontworpen om de IR-lampjes altijd aan te hebben, en ik heb de condensatoren toch gehouden. Je zou de condensator niet nodig moeten hebben als je dit PCB-ontwerp gebruikt, maar ik ga een andere versie van de PCB introduceren die een extra invoer naar het schuifregister accepteert waarmee je de IR-emitters aan en uit kunt moduleren. Dit bespaart veel op het stroomverbruik.

U kunt de bijgevoegde geanimeerde diagrammen bekijken voor een prototype-opstelling voor testen op uw Arduino. Er is ook een meer gedetailleerd gekleurd schema voor elk circuit dat de opstelling en oriëntatie van de elektronische apparaten schetst. In het bijgevoegde PCB-schema hebben we 4 totale circuits, 2 circuits die worden gebruikt om de IR-zenders in te schakelen en 2 circuits om van de fotodiodes te lezen. Ze zijn op de print 2 groepen naast elkaar georiënteerd met een groep bestaande uit 1 IR emitter schakeling en 1 fotodiode schakeling, zodat 2 kolommen van 8 nodes in een enkele print gezet kunnen worden. We koppelen de twee circuits ook aan elkaar, zodat drie pinnen van de arduino de twee schuifregisters kunnen besturen, en 3 extra pinnen kunnen de twee multiplexers op het bord besturen. Er is een extra output-header om te kunnen doorlussen naar extra PCB's.

Hier zijn een paar bronnen die ik heb gevolgd voor het maken van prototypen:

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

Stap 3: Soldeer draden naar het knooppunt

Soldeer draden naar het knooppunt
Soldeer draden naar het knooppunt
Soldeer draden naar het knooppunt
Soldeer draden naar het knooppunt
Soldeer draden naar het knooppunt
Soldeer draden naar het knooppunt
Soldeer draden naar het knooppunt
Soldeer draden naar het knooppunt

Nu je begrijpt hoe het circuit is gemaakt, ga je gang en soldeer je de draden aan elk knooppunt. Ik heb de fotodiodes parallel gesoldeerd (gele en grijze draden) en de ir-zenders in serie (oranje draad). Vervolgens heb ik een langere gele draad aan de fotodiodes parallel gesoldeerd die zal worden aangesloten op de 5V-voedingsbron, en een blauwe draad die zal worden aangesloten op de fotodiode-ingang van de printplaat. Ik heb een lange rode draad gesoldeerd aan het IR-emittercircuit dat zal worden gebruikt om verbinding te maken met de 5V-voedingsbron en een zwarte draad die zal worden aangesloten op de IR-emitteringang van de PCB. Ik heb de draden eigenlijk een beetje te kort gemaakt, ze hadden geen tijd meer, dus ik kon uiteindelijk maar 5 van de knooppunten in elke kolom aansluiten (in plaats van 7). Ik ben van plan dit later op te lossen.

Stap 4: Soldeer de PCB-componenten en bevestig deze aan het bord

Soldeer de PCB-componenten en bevestig deze aan het bord
Soldeer de PCB-componenten en bevestig deze aan het bord
Soldeer de PCB-componenten en bevestig deze aan het bord
Soldeer de PCB-componenten en bevestig deze aan het bord
Soldeer de PCB-componenten en bevestig deze aan het bord
Soldeer de PCB-componenten en bevestig deze aan het bord

Opmerking: de PCB in de bijgevoegde afbeelding is de eerste versie die ik heb gemaakt zonder stroomingangen en -uitgangen en ook een serieschakeling voor elk binnencircuit. Het nieuwe PCB-ontwerp corrigeert deze fout.

Hier hoeft u alleen het PCB-schema te volgen om de componenten op de PCB te solderen en als dat eenmaal is gebeurd, soldeert u de PCB op het bord. Ik heb externe printplaten gebruikt om het 5V-voedingssignaal aan te sluiten, dat ik naar alle gele en rode draden heb gedistribueerd. Achteraf gezien had ik zulke lange rode en gele draden niet nodig en had ik de knooppunten met elkaar kunnen verbinden (in plaats van ze te verbinden met een gemeenschappelijke externe printplaat). Dit zal de hoeveelheid rommel aan de achterkant van het bord echt hebben verminderd.

Omdat ik 8 rijen ws2812b-leds en 12 kolommen had, eindigde ik met 7 rijen en 11 kolommen met knooppunten (77 knooppunten in totaal). Het idee is om de ene kant van de PCB te gebruiken voor de ene kolom met knooppunten en de andere kant voor de andere kolom. Dus aangezien ik 11 kolommen had, had ik 6 PCB's nodig (de laatste had slechts één groep componenten nodig). Omdat ik de draden te kort maakte, kon ik maar 55 knooppunten, 11 kolommen en 5 rijen aansluiten. Je kunt op de foto zien dat ik een fout heb gemaakt en de onbewerkte draden aan het bord heb gesoldeerd, wat prima zou zijn als de draden dun genoeg waren, maar in mijn geval waren ze te dik. Dit betekende dat ik gerafelde draaduiteinden heel dicht bij elkaar had voor elke IR-emitteringang en fotodiode-ingang, dus er gebeurde veel foutopsporing door alle draadkortsluitingen. In de toekomst ga ik connectoren gebruiken om de print aan te sluiten op de draden op het bord om kortsluiting te voorkomen en dingen op te ruimen.

Omdat de Arduino maximaal 8 schuifregisters en multiplexers kan doorlussen, heb ik twee afzonderlijke ketens gemaakt, waarvan de ene de eerste 8 kolommen in beslag neemt en de andere de resterende 3 kolommen. Vervolgens heb ik elke keten aan een andere pcb bevestigd die slechts 2 multiplexers had, zodat ik elke keten van multiplexergegevenssignalen van die twee multiplexers in de Arduino kon lezen. Deze twee multiplexers waren ook doorgelust. Dat betekent dat er in totaal 16 uitgangssignalen en 2 analoge ingangen in de Arduino werden gebruikt: 1 uitgangssignaal om de ws2812b leds aan te sturen, 3 uitgangssignalen voor de eerste keten van schuifregisters, 3 uitgangssignalen voor de eerste keten van multiplexers, 3 uitgangssignalen voor de tweede keten van schuifregisters, 3 uitgangssignalen voor de tweede keten van multiplexers, 3 uitgangssignalen voor de 2 multiplexers die elk PCB-gegevenssignaal aggregeren, en ten slotte 2 analoge ingangen voor elk gegevenssignaal van de 2 geaggregeerde multiplexers.

Stap 5: Bekijk de code

Opmerking: naast de onderstaande interactieve code heb ik een bibliotheek van derden gebruikt om de animaties voor de ws2812b-leds te produceren. Je kunt dat hier vinden:

Je kunt de code die ik heb gebruikt hier vinden:

Bovenaan definieer ik de arduino-pinnen die op elk deel van de PCB zullen worden aangesloten. In de installatiemethode stel ik de uitgangspinnen voor de multiplexers in, zet ik de IR-zenders aan, stel ik een baseVal-array in die de omgevingslichtwaarde voor elke fotodiode bijhoudt, en initialiseert FastLED die naar de ws2812b-leds zal schrijven. In de loop-methode resetten we de lijst met leds die zijn toegewezen om in de ws2812b-strip te branden. Vervolgens lezen we waarden van de fotodiodes in de multiplexerketens en zetten de ws2812b-leds aan die verondersteld worden aan te zijn als de uitlezing van de fotodiode in het knooppunt een bepaalde gedefinieerde drempel overschrijdt van de basiswaarde van de omgevingslichtmetingen. We renderen vervolgens de LED's als er een wijziging is in het knooppunt dat moet worden ingeschakeld. Anders blijft het herhalen totdat er iets verandert om de zaken te versnellen.

De code kan waarschijnlijk worden verbeterd en ik ben aan het kijken om dit te doen, maar er is een vertraging van ongeveer 1-2 seconden vanaf het moment dat de lichten aangaan nadat een object op de tafel is geplaatst. Ik geloof dat het onderliggende probleem is dat de FastLED enige tijd nodig heeft om de 96 leds op de tafel weer te geven en dat de code 77 invoer van de tafel moet doorlopen en lezen. Ik heb deze code geprobeerd met 8 leds en vond het bijna onmiddellijk, maar ik ben op zoek naar de goede plek van LED's die met deze code werken en bijna onmiddellijk zijn, en de code verbeteren.

Stap 6: Zet de Arduino aan

Zet de Arduino aan!
Zet de Arduino aan!
Zet de Arduino aan!
Zet de Arduino aan!
Zet de Arduino aan!
Zet de Arduino aan!

Nu hoef je alleen nog maar de Arduino aan te zetten en de tafelfunctie te zien! Met behulp van de eerder genoemde animatiebibliotheek kun je een aantal coole ws2812b led-animaties gebruiken, of je kunt de koffietafelcode gebruiken en deze in elke sectie zien oplichten. Voel je vrij om vragen of meningen te plaatsen, en ik zal proberen zo snel mogelijk contact met je op te nemen. Proost!

Aanbevolen: