Arduino Audio Reactive Desk Light
Componenten en benodigdheden
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
Benodigde gereedschappen en machines
|
Apps en online services
|
Over dit project
HALLO WERELD!!
Hoi! In deze build zullen we een goed uitziende lamp maken die danst op alle geluiden en muziek, met behulp van eenvoudige componenten en wat basis Arduino programmeren. Het maakt een geweldig effect terwijl je op het bureau staat tijdens het gamen, muziek afspelen en al het andere dat echt geluid maakt. Laten we beginnen!
Dit is een project dat ik volg op basis van de "Natural Nerd" van de youtuber die ze hebben gedaan. Dit is mijn versie van het project. Alle eer gaat naar hen en een grote schreeuw naar hen om me de details te geven over hoe ik het project moet doen.
Youtube-link
STAP 1:BELANGRIJKSTE TOEPASSINGEN
Allereerst:wat voor benodigdheden hebben we nodig en wat kosten ze? Welnu, ze zijn grotendeels optioneel en kunnen met veel improvisatie worden gemaakt. Toch zijn er enkele belangrijke items nodig als u deze handleiding wilt volgen:
- Arduino Nano (of een even klein Arduino-type) (RM 12,50 kooplink)
- Geluidsdetectormodule (RM 5,90 kooplink)
- 5 volt voeding (of 12 volt met Stepdown Module)
- Individueel Adresbare LED strips 60 leds per. meter (koop link)
Afhankelijk van de look die je wilt, wil je misschien de stroken anders rangschikken of het licht op een andere manier verspreiden. Hier kun je creatief zijn. Als je mijn aanpak leuk vindt, heb ik de volgende items gebruikt:
- De hoogste IKEA Droppar-pot (IKEA-link)
- Een kleine lengte van PVC-buis.
- Schuimbord
- Hot lijmpistool
Alles bij elkaar genomen heb ik ongeveer RM 83,30 uitgegeven, afhankelijk van de winkel waar je de artikelen gaat kopen, waar de LED-strips verreweg het duurste onderdeel waren dat me RM 40 kostte voor slechts 1 meter.
STAP 2:VOEDING VAN DE COMPONENTEN
Het aandrijven van het onderdeel zal een ongecompliceerde methode zijn. Ik gebruik gewoon de USB-kabel van de Arduino Nano en sluit deze rechtstreeks aan op de pc. Als u de externe voeding gebruikt, zoals een AC naar DC-stroombron, hebt u een step-down-module nodig om u te helpen de hoeveelheid stroom naar uw circuit te verminderen. Anders, als u het niet gebruikt, heeft u een zeer grote kans om de Arduino te verbranden, inclusief de aangesloten componenten.
De ster van de show is de geluidsdetectormodule. Dit geeft een analoog signaal aan de Arduino, waarmee we (hopelijk) slim de RGB-lampjes kunnen aansteken. Om dit te kunnen doen, moeten we beide apparaten van stroom voorzien. Gelukkig hebben ze allebei een ingang van 5 volt nodig. Ik gebruik een step-down-module om van 12 volt naar 5 volt te gaan, maar het zou gemakkelijker zijn om rechtstreeks een stroombron van 5 volt te gebruiken. Sluit de VIN op de Arduino en op het geluidsdetectorbord aan op de positieve ingang. Verbind vervolgens de GND op de Arduino en de detector met de negatieve. Kijk naar de zwarte en de rode draden op het bijgevoegde schema. Ook moeten we de positieve en negatieve ingang op de LED-strip aansluiten op de stroombron.
STAP 3:DETECTOR &STRIPS
Nadat we alle drie de onderdelen op de stroom hebben aangesloten, moeten we ze met elkaar verbinden.
De geluidsdetectormodule communiceert met de Arduino via de analoge ingangspinnen. In dit geval gebruik ik pincode 0.
De ledstrips hebben een digitale puls nodig om te kunnen begrijpen welke led we willen aanspreken. Daarom moeten we een digitale uitgangspin aansluiten op de Arduino nano. Ik gebruik pincode 6.
Gebruik de krimpkous op het gekozen gebied zodat de kabel later in een krappe ruimte niet met elkaar in botsing komt.
Volg gewoon het schematische diagram dat ik hier heb verstrekt en het komt goed!
Geweldig, nu zijn we grotendeels klaar met de elektronica!
STAP 4:DE CODE UPLOADEN
Het belangrijkste onderdeel van deze build zal misschien wel de code zijn. Het kan deze build veranderen van behoorlijk cool tot waanzinnig geweldig. U kunt de code gebruiken die ik samen met dit project heb verstrekt. Het belangrijkste principe is om de analoge waarde die we van de sensor krijgen, toe te wijzen aan een aantal LED's om te laten zien.
STAP 5:DE BEHUIZING VOORBEREIDEN
Eerst dacht ik dat het deksel van acryl was gemaakt, nadat ik de pot had gekocht en besefte dat het geen acryl was maar een glas. Dus ik moet mijn plan opnieuw aanpassen door een hoes te maken die gemakkelijk te porren is en de Arduino en de led te monteren. Dus ik kies de foamboard.
Eerste stap , ik moet het foamboard precies rond snijden en dezelfde diameter hebben als het glazen deksel van de pot. Ik heb niet de juiste instrumenten voor het meten van de diameter, dus ik improviseer de methode door een natte stift te gebruiken en de diameter van het glas te markeren en op een stuk papier te stempelen. Daarna plak ik het papier op het foamboard en maar het bord door de rand van de cirkel op het papier te volgen. Het is niet perfect, maar het zou goed genoeg moeten zijn om alle Arduino- en led-componenten te bevatten.
Tweede stap , ik moet het glas op het deksel van de pot breken. LET OP! dek de pot af met een dikke plastic zak om te voorkomen dat het glas door de kamer verspreidt en doe het in de open ruimte. Bewust met je omgeving. Nadat u het glas hebt gebroken, moet u ervoor zorgen dat al het glas dat aan de zijkant van het deksel van de pot vastzit, moet worden verwijderd. Dit is om te voorkomen dat u of iemand anders letsel oploopt door zichzelf aan het vastzittende glas te snijden.
Derde stap , plaats de cirkelvormige schuimplaat in het midden van het deksel van de pot. Zorg ervoor dat het schuim strak en niet te los zit, zodat het gewoon mooi bij de pot past.
Vierde stap, ik realiseer me gewoon dat ik de lay-out van dit project moet veranderen. ik wil ervoor zorgen dat de gebruiker gemakkelijk toegang heeft tot de Arduino-componenten in geval van defect. Dus besloot ik de mini-broodplank te gebruiken en deze in het midden van het deksel te plaatsen. Niet alleen dat, ik heb twee gaten gesneden voor de kabel van de geluidsmodule die ik aan de onderkant van het deksel van de pot zal plaatsen om in de pot en op het breadboard te gaan en nog een gat voor de Arduino om verbinding te maken met de USB-kabel om te handelen als voeding voor het circuit.
Vijfde stap , Ik markeer de pvc-buis met plakband en trek de lijn in het midden van de tape. Dan plak ik het op de pvc-buis. De markering is de indicator dat ik de pvc-buis gelijkmatig moet afsnijden en probeer een zuivere snede te krijgen.
Na het meten van de lengte van pvc die ik moet gebruiken, heb ik het zorgvuldig gesneden door het merkteken te volgen dat ik heb verstrekt. De lengte van de pvc-buis is afhankelijk van de hoogte van uw pot. U kunt elke gewenste lengte gebruiken.
Zesde stap , ik vervorm de PVC-buis die ik heb gesneden met de LED-strip eromheen en maak deze iets schuin en spiraalvormig naar de bovenkant van de PVC. Ik zorg ervoor dat ik een klein gaatje maak om de overtollige kabellengte in de PVC-pot te verbergen voor kabelbeheer. Ik moet dan een manier vinden om de PVC op het breadboard te plaatsen. Met behulp van een heet lijmpistool of de dubbelzijdige tape, kan ik de PVC-buis op het extra schuimbord plakken en vervolgens op het ongebruikte gebied op het breadboard plakken. Tijdens deze stap kan ik een deel van de component op het breadboard aansluiten.
Gebruik het meegeleverde schematische diagram om alle componenten aan te sluiten.
(Het linkergedeelte van het breadboard is het positieve en het rechtergedeelte van het breadboard is het negatieve. `
Zevende stap, ik plaatste de geluidsmodule aan de buitenkant van het deksel van de pot. Dit is met opzet gedaan om het de module gemakkelijker te maken om het geluid later buiten de pot te kiezen. Sluit de module na het plaatsen van de module aan met kabel en pas deze aan zoals aangegeven in het gegeven schematische diagram. Verbind vervolgens alle kabels met de sensor en Arduino met breadboard. De Arduino wordt verticaal opgesteld, zodat de kabel voor het inschakelen van de stroomvoorziening eenvoudig via het schuimbord verbinding kan maken met het Arduino-bord.
En zo rond ik het project af. Het duurt een tijdje plus met de try-and-error, maar het is me gelukt om het te voltooien.
Code
- Coderen voor de Arduino
Coding voor de ArduinoArduino
Met deze code kan de LED reageren op het geluid dat wordt gedetecteerd door de geluidsmodule.#include/** BASISCONFIGURATIE **///Het aantal LED's in de setup#define NUM_LEDS 60 //De pin die de LED's aanstuurt#define LED_PIN 6//De pin die we sensorwaarden lezen vorm#define ANALOG_READ 0//Bevestigde microfoon lage waarde en maximale waarde#define MIC_LOW 0.0#define MIC_HIGH 200,0/** Andere macro's * ///Hoeveel eerdere sensorwaarden hebben invloed op het bedrijfsgemiddelde?#define AVGLEN 5//Hoeveel eerdere sensorwaarden bepalen of we op een piek/HIGH zitten (bijv. in een nummer)#define LONG_SECTOR 20//Mneumonics#define HIGH 3 #define NORMAL 2//Hoe lang houden we het "huidige gemiddelde" geluid vast voordat we opnieuw beginnen met meten#define MSECS 30 * 1000#define CYCLES MSECS / DELAY/*Soms zijn de metingen verkeerd of vreemd. Hoeveel mag een meetwaarde afwijken van het gemiddelde om niet te worden weggegooid? **/#define DEV_THRESH 0.8//Arduino loop delay#define DELAY 1float fscale( float originalMin, float originalMax, float newBegin, float newEnd, float inputValue, float curve);void insert(int val, int *avgs, int len);int compute_average(int *avgs, int len);void visualize_music();//Hoeveel LED's moeten we weergevenint curshow =NUM_LEDS;/*Nog niet echt gebruikt. Dacht te kunnen schakelen tussen geluidsreactieve modus en algemene gradiënt pulserend/statische kleur*/int-modus =0;//Verschillende kleuren tonen op basis van de modus.int songmode =NORMAL;//Gemiddelde geluidsmeting de laatste CYCLESunsigned lange song_avg; //Het aantal iteraties sinds de song_avg is gereset in iter =0;//De snelheid waarmee de LED's naar zwart vervagen, zo niet relitfloat fade_scale =1,2;//Led arrayCRGB leds [NUM_LEDS];/*Korte geluidsgemiddelde gebruikt om te "normaliseren" de invoerwaarden. We gebruiken het korte gemiddelde in plaats van de sensorinvoer direct te gebruiken */int avgs[AVGLEN] ={-1};//Langer geluid avgint long_avg[LONG_SECTOR] ={-1};//Bijhouden hoe vaak , en hoe lang we een bepaalde modestruct halen time_keeping { unsigned long times_start; korte tijden;};//Hoeveel moet elke kleur worden verhoogd of verlaagd elke cyclestruct color { int r; intg; int b;};struct time_keeping high;struct kleur Kleur; void setup() { Serial.begin(9600); //Stel alle lichten in om er zeker van te zijn dat ze allemaal werken zoals verwacht FastLED.addLeds (leds, NUM_LEDS); voor (int i =0; i (song_avg/iter * 1.1)) { if (high.times !=0) { if (millis() - high.times_start> 200,0) { high.times =0; songmode =NORMAAL; } else { high.times_start =millis(); hoge.tijden++; } } else { high.times++; high.times_start =millis(); } } if (high.times> 30 &&millis() - high.times_start <50.0) songmode =HIGH; else if (millis() - high.times_start> 200) { high.times =0; songmode =NORMAAL; }}//Hoofdfunctie voor het visualiseren van de geluiden in de lampvoid visualize_music() { int sensor_value, mapped, avg, longavg; // Werkelijke sensorwaarde sensor_value =analogRead (ANALOG_READ); //Indien 0, onmiddellijk weggooien. Waarschijnlijk niet goed en bespaar CPU. if (sensor_value ==0) terugkeer; // Gooi metingen weg die te veel afwijken van het verleden gem. toegewezen =(float)fscale(MIC_LOW, MIC_HIGH, MIC_LOW, (float)MIC_HIGH, (float)sensor_value, 2.0); avg =compute_average(avgs, AVGLEN); if (((avg - toegewezen)> avg*DEV_THRESH)) //|| ((avg - toegewezen) <-avg*DEV_THRESH)) return; //Voeg nieuwe gem. waarden invoegen (in kaart gebracht, avgs, AVGLEN); invoegen (gem, lange_avg, LONG_SECTOR); // Bereken de "nummergemiddelde" sensorwaarde song_avg +=avg; iter++; if (iter> CYCLI) { song_avg =song_avg / iter; iter =1; } longavg =compute_average(long_avg, LONG_SECTOR); //Controleer of we naar de HIGH-modus gaan check_high (longavg); if (songmode ==HOOG) {fade_scale =3; Kleur.r =5; Kleur.g =3; Kleur.b =-1; } else if (songmode ==NORMAL) { fade_scale =2; Kleur.r =-1; Kleur.b =2; Kleur.g =1; } // Bepaalt hoeveel van de LED's zullen branden curshow =fscale (MIC_LOW, MIC_HIGH, 0.0, (float)NUM_LEDS, (float)avg, -1); /*Stel de verschillende leds in. Controle op te hoge en te lage waarden. Leuk om te proberen:houd geen rekening met overloop in één richting, er verschijnen enkele interessante lichteffecten! */ for (int i =0; i 255) leds[i]. r =255; anders als (leds[i].r + Kleur.r <0) leds[i].r =0; anders leds[i].r =leds[i].r + Kleur.r; if (leds[i].g + Kleur.g> 255) leds[i].g =255; anders als (leds[i].g + Kleur.g <0) leds[i].g =0; anders leds[i].g =leds[i].g + Kleur.g; if (leds[i].b + Kleur.b> 255) leds[i].b =255; anders als (leds[i].b + Kleur.b <0) leds[i].b =0; anders leds[i].b =leds[i].b + Kleur.b; //Alle andere LED's beginnen hun vervagende reis naar uiteindelijke totale duisternis} else { leds[i] =CRGB(leds[i].r/fade_scale, leds[i].g/fade_scale, leds[i].b/fade_scale ); } FastLED.show(); }//Bereken het gemiddelde van een int-array, gegeven de startaanwijzer en de lengthint compute_average(int *avgs, int len) { int sum =0; voor (int i =0; i 10) curve =10; als (kromme <-10) kromme =-10; kromme =(kromme * -.1); // - omkeren en schalen - dit lijkt intuïtiever - positieve getallen geven meer gewicht aan high-end op outputcurve =pow(10, curve); // converteer lineaire schaal naar lograthimische exponent voor andere pow-functie // Controleer of invoerwaarden buiten bereik zijn if (inputValue originalMax) { inputValue =originalMax; } // Nul Verwijs naar de waarden OriginalRange =originalMax - originalMin; if (newEnd> newBegin){ NewRange =newEnd - newBegin; } else { NewRange =newBegin - newEnd; invVlag =1; } zeroRefCurVal =inputValue - originalMin; normalizedCurVal =zeroRefCurVal / OriginalRange; // normaliseren naar 0 - 1 float // Controleer op originalMin> originalMax - de wiskunde voor alle andere gevallen, d.w.z. negatieve getallen lijken goed te werken als (originalMin> originalMax) { return 0; } if (invFlag ==0){ rangedValue =(pow(normalizedCurVal, curve) * NewRange) + newBegin; } else // keer de bereiken om { rangedValue =newBegin - (pow (normalizedCurVal, curve) * NewRange); } return rangedValue;}
Schema's
Productieproces
- TinyML-taaldetector-gebaseerd op Edge Impulse &Arduino
- Arduino-gyroscoopspel met MPU-6050
- Arduino digitale dobbelstenen
- Iron Man
- Vind mij
- Audio afspelen in Arduino
- Arduino-luchtbevochtigerbediening
- Sonar met arduino en weergave op verwerkings-IDE
- MobBob:doe-het-zelf Arduino-robot bestuurd door Android-smartphone
- NeoMatrix Arduino Pong
- Arduino-joystick