Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

RGB 32-bands audiospectrumvisualizer

Componenten en benodigdheden

Arduino Nano R3
× 1
WS2812B 8x32 RGB LED MATRIX
× 1
Weerstand 4.75k ohm
× 3
Weerstand 100k ohm
× 2
Weerstand 10k ohm
× 1
Through Hole Resistor, 390 ohm
× 1
Condensator 100 nF
× 2
Condensator 1000 µF
× 1
SparkFun Drukknopschakelaar 12 mm
× 1
Protototypebord van 4x6 cm met meerdere gaten
× 1

Benodigde gereedschappen en machines

Soldeerbout (algemeen)
3,5 mm jack-splitterkabel

Over dit project

Het project

Dit project is bedoeld voor het maken van een RGB 32-bands audio (muziek) frequentiespectrumvisualizer met behulp van Arduino Nano en een 8x32 WS2812B RGB Led Matrix.

Het originele project dat dit inspireerde

Een grote dank gaat uit naar Shajeeb auteur van het originele project op basis van de MAX72xx led-matrix. Ik heb alleen het pilootgedeelte van de led-matrix aangepast om het aan te passen aan de RGB WS2812B Led Matrix.

Link naar origineel project:32-Band Audio Spectrum Visualizer Analyzer

De WS2812B RGB Led Matrix

Bij gebruik van een RGB LED-matrix op basis van 5050 SMD-LED's met hoge helderheid, is het noodzakelijk om een ​​externe voeding te gebruiken omdat de RGB-matrix meer dan 10 mA per LED kan absorberen, dus als alle LED's op maximale helderheid branden, kan dit meer dan 2,5 Ampère absorberen.

Om deze reden heb ik een diode in serie op +5V geplaatst om Arduino in stand-alone modus van stroom te kunnen voorzien, wanneer de USB-kabel niet is aangesloten, en om te voorkomen dat Arduino de stroombron van de RGB-matrix wordt, zodat u vermijdt de interne circuits van het bord overbelasten met een stroom die het niet kon leveren.

Aan het oorspronkelijke project heb ik, naast de ingangsdiode, om de LED-matrixingang te beschermen tegen mogelijke spanningspieken, ook een weerstand van 390 ohm in serie toegevoegd tussen de Arduino pind D6 en de gegevensingang, en een 1000 µF 12V-condensator om te verbeteren de Arduino voedingsspanning stabiliteit.

Hardwaremontage

Zoals te zien is op de hoofdfoto heb ik het eerste prototype gemaakt op een 4x6 cm multi-hole board met twee RCA audio sockets (direct op het board gesoldeerd) die ook vervangen kunnen worden door een 3.5 mm female Jack socket. Het belangrijkste om brom te voorkomen, is om de verbindingen tussen de bron en de audio-ingang van de kaart te maken met een afgeschermde kabel. Een andere tip is om de verbinding tussen de Arduino en de led-matrix zo kort mogelijk te houden.

De code

Uiteindelijk is alle software gebaseerd op het geweldige werk van de auteur van de bemonsteringsprocedure via de FFT-bibliotheek en de definitieve realisatie van Shajeeb.

Ik heb twee functies toegevoegd:

De eerste is GetLedFromMatrix(...) om de matrix in rijen en kolommen in kaart te brengen en om elk van de 256 LED's te kunnen aanspreken via rij- en kolomcoördinaten.

De tweede is die - die ik willekeurig heb genoemd SetColumn(...) - die de LED's van elke kolom inschakelt op basis van de piekwaarde verkregen door audiodigitalisering (waarden tussen 0 en 7 ) en op basis van de vooraf ingestelde kleuren in een tweedimensionale array. U kunt veel plezier beleven aan het wijzigen van de waarden en dus de kleuren zoals u dat wilt. Om de code te vereenvoudigen, gebruikte ik een sobroutine genaamd Wheel() (overgenomen van een demo die is gekoppeld aan de Neopixel-bibliotheek van Adafruit) die beginnend met een waarde tussen 0 en 255 een niet-ondertekende 32-bits lange waarde retourneert die rechtstreeks aan de setPixelColor-functie moet worden doorgegeven. Hierop kun je naar believen spelen, rekening houdend met de geheugenbeperkingen van Arduino, waarbij waar mogelijk het gebruik van 32-bits variabelen wordt vermeden om RGB-kleurwaarden op te slaan.

Audio gelijkmaking

Bovendien heb ik, aangezien ik de tests heb uitgevoerd met de audio afkomstig van de geluidskaart die in het pc-moederbord is geïntegreerd, om de frequentierespons te verbeteren, een bytearray van 32 waarden toegevoegd die in feite een egalisatiecurve vormen om de bas te verzwakken en de hoge tonen versterken. Als je het niet nodig hebt, stel dan de EQ_ON variabele in op false of verander het dempingsniveau door de 32 waarden van de eq[32] . te veranderen array, een waarde van 100 laat de amplitude ongewijzigd, één minder dan 100 verzwakt en één groter dan 100 accentueert de frequentieband.

Led helderheid

De helderheid van de matrix is ​​in de code vooraf ingesteld op 32 (BRIGHTNESS const). De maximale helderheidswaarde van de WS2812B-matrix (op papier) is 255, maar al met waarden groter dan 100, verandert het LED-licht helaas van wit naar lichtgeel, het is waarschijnlijk nodig om de matrix te voeden via de twee centrale rode en zwarte draden van de connector aan de rechterkant.

Ik probeer nog steeds ...

Ten slotte, als je een maximale helderheid van 64 gebruikt, is een 1A-voeding waarschijnlijk voldoende, anders is 2A essentieel.

Toekomstige update

Ik werk aan een nieuwe versie die gebruikmaakt van de OpenMusicLabs FHT bibliotheek die vele malen sneller blijkt te zijn dan de Arduino FFT.

Blijf kijken. :)

Alsjeblieft vergeef me mijn slechte Engels, ik heb de google vertaler gebruikt.

Code

  • Spectrum_Analyzer_WS2812B.ino
Spectrum_Analyzer_WS2812B.inoArduino
/* Copyright (c) 2019 Shajeeb TM Toestemming wordt hierbij gratis verleend aan elke persoon die een kopie van deze software en bijbehorende documentatiebestanden (de "Software") verkrijgt, om zonder beperking in de Software te handelen, inclusief zonder beperking de rechten om kopieën van de Software te gebruiken, kopiëren, wijzigen, samenvoegen, publiceren, distribueren, in sublicentie geven en/of verkopen, en om personen aan wie de Software wordt geleverd toe te staan ​​dit te doen, met inachtneming van de volgende voorwaarden:Het bovenstaande copyright-kennisgeving en deze toestemmingskennisgeving worden opgenomen in alle kopieën of substantiële delen van de software. DE SOFTWARE WORDT GELEVERD "AS IS", ZONDER ENIGE GARANTIE, EXPLICIET OF IMPLICIET, INCLUSIEF MAAR NIET BEPERKT TOT DE GARANTIES VAN VERKOOPBAARHEID, GESCHIKTHEID VOOR EEN BEPAALD DOEL EN NIET-INBREUK. IN GEEN GEVAL ZULLEN DE AUTEURS OF HOUDERS VAN HET AUTEURSRECHT AANSPRAKELIJK ZIJN VOOR ENIGE CLAIM, SCHADE OF ANDERE AANSPRAKELIJKHEID, HETZIJ IN EEN OVEREENKOMST, ONRECHTMATIGE OF ANDERE, VOORTVLOEIENDE UIT, UIT OF IN VERBAND MET DE SOFTWARE OF HET GEBRUIK IN OF DE ANDERE HANDELINGEN SOFTWARE. WS2812B Led Matrix-versie van Janux*/#include #include #include #define SAMPLES 64 //Moet een macht van 2 zijn#define xres 32 // Totaal aantal kolommen in het display, moeten <=SAMPLES/2#define yres 8 // Totaal aantal rijen in het display#define ledPIN 6 // pint to control Led Matrix#define NUM_LEDS (xres * yres)#define BRIGHTNESS 32#define buttonPin 5 // het nummer van de drukknoppin om de displaycolorbyte yvalue te veranderen;byte displaycolumn, displayvalue;int peaks[xres];byte state =HIGH; // de huidige lezing van de invoer pinbyte previousState =LAAG; // de vorige lezing van de invoer pinbyte displaycolor =0;//Arrays voor sampligdouble vReal[SAMPLES];double vImag[SAMPLES];byte data_avgs[xres];arduinoFFT FFT =arduinoFFT(); // FFT objectunsigned lange lastDebounceTime =0; // de laatste keer dat de uitvoerpin werd toggledunsigned lange debounceDelay =100; // de debouncetijd; verhogen als de uitgang flikkert// Parameter 1 =aantal leds in matrix// Parameter 2 =pinnummer (de meeste zijn geldig)// Parameter 3 =pixeltype vlaggen, optellen indien nodig:// NEO_KHZ800 800 KHz bitstream (meeste NeoPixel producten met WS2812 LED's)// NEO_KHZ400 400 KHz (klassieke 'v1' (niet v2) FLORA-pixels, WS2811-stuurprogramma's)// NEO_GRB Pixels zijn bedraad voor GRB-bitstream (de meeste NeoPixel-producten)// NEO_RGB Pixels zijn bedraad voor RGB-bitstream ( v1 FLORA pixels, niet v2)Adafruit_NeoPixel pixel =Adafruit_NeoPixel(NUM_LEDS, ledPIN, NEO_GRB + NEO_KHZ800);// EQ-filter om bas te dempen en hoge tonen te verbeteren// Nuttig op pc-geluidskaart die meestal veel bas en een slechte hoge frequentie heeft truebool EQ_ON =; // ingesteld op false om eqbyte eq [32] ={50, 55, 60, 70, 75, 80, 85, 95, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, uit te schakelen 100, 100, 100, 100, 100, 100, 115, 125, 140, 160, 185, 200, 225, 255 };//Definieer kleur voor enkele led, gebruikt in setColumn-functie, 0 voor aangepaste kleur//Kleur zijn berekend door wielfunctie, zie hieronder bytekleuren[][8] ={ {170, 160, 150, 140, 130, 120, 1, 1}, {1, 5, 10, 15, 20, 25, 90, 90} , {90, 85, 80, 75, 70, 65, 1, 1}, {90, 90, 90, 30, 30, 30, 1, 1}, {170, 160, 150, 140, 130, 120, 0, 0}, {170, 160, 150, 140, 130, 120, 1, 1}, {170, 160, 150, 140, 130, 120, 1, 1}}; ongeldige setup() { pixel.begin (); pixel.setHelderheid (HELDERHEID); // Begin FFT-bewerkingen ADCSRA =0b11100101; // stel ADC in op vrijloopmodus en stel pre-scalar in op 32 (0xe5) ADMUX =0b00000000; // gebruik pin A0 en externe spanningsreferentie}void loop() {// ++ Sampling for (int i =0; i  pieken [i]) pieken [i] =y-waarde; //piek opslaan als> vorige piek y-waarde =pieken [i]; weergavekolom =ik; weergavewaarde =ywaarde; setColumn(displaykolom, displaywaarde); // teken emmers} pixel.show(); // toon emmers displaycolorChange(); // controleer of de knop is ingedrukt om de kleurmodus te wijzigen}//------------------------------------- ----------------------------// Licht leds van x kolom volgens y waarde ongeldig setColumn (byte x, byte y) { byte led , I; for (i =0; i  i) {switch (displaycolor) {geval 4:// zet nul 0 op arraywaarde om piekenkleur aan te passen als (kleuren [displaycolor][i]> 0) { // normale kleur gedefinieerd op kleurenarray pixel.setPixelColor (led, Wheel (kleuren [displaycolor] [i])); } else { // aangepaste kleur voor pieken alleen met 0 op arraywaarde pixel.setPixelColor (led, 255, 255, 255); // Led-nummer, R-, G-, B-waarden} pauze; geval 5:// verander de kleur per kolom pixel.setPixelColor (led, Wheel (x * 16)); pauze; geval 6:// verander de kleur per rij pixel.setPixelColor (led, Wheel (i * 36)); pauze; default://display color set -> displaycolor van 0 tot 3 //color wordt gedefinieerd op de kleurenarray pixel.setPixelColor(led, Wheel(colors[displaycolor][i])); }//END SWITCH } else { pixel.setPixelColor(led, 0); } }}//======================================================================// Bereken een led-nummer met x,y-coördinaten// geldig voor WS2812B met kronkelige lay-out geplaatst in horizontale// en nul led rechtsonder (ingang connector aan de rechterkant)// ingangswaarde:x=0-31, y=0-7, retourneer een led-nummer van 0 tot 255//========================================================================byte GetLedFromMatrix(byte x, byte y) { x =xres - x - 1; if (x &0x01) { // Oneven kolommen verhogen achterwaartse return ((x + 1) * yres - y - 1); } else { // Zelfs kolommen verhogen normaal gesproken retour ((x + 1) * yres - yres + y); }}//========================================================================void displaycolorChange () {int lezen =digitalRead (buttonPin); if (lezing ==HOOG &&previousState ==LAAG &&millis() - lastDebounceTime> debounceDelay) // werkt alleen wanneer ingedrukt { displaycolor++; als (displaykleur> 6) displaykleur =0; lastDebounceTime =millis(); } previousState =reading;}/* Utility van Adafruit Neopixel demo sketch Voer een waarde van 0 tot 255 in om een ​​kleurwaarde te krijgen. De kleuren zijn een overgang R - G - B - terug naar R.*/unsigned long Wheel(byte WheelPos) { WheelPos =255 - WheelPos; if (WheelPos <85) { return pixel.Color (255 - WheelPos * 3, 0, WheelPos * 3); } if (WheelPos <170) { WheelPos -=85; return pixel.Color (0, WheelPos * 3, 255 - WheelPos * 3); } WielPos -=170; return pixel.Color (WheelPos * 3, 255 - WheelPos * 3, 0);}

Aangepaste onderdelen en behuizingen

arduino_rgb_audio_analyzer_lX4Dv4Pta2.zip

Schema's


Productieproces

  1. 32 (Linier)/11 (Pseudo Log) band Audio Spectrum Analyzer
  2. Dorstalarm plantalarm
  3. Italiaanse Word Clock
  4. Sigfox kWh-meter
  5. Bluetooth-temperatuurmeter
  6. Gebarengestuurd slot
  7. The Companion IC
  8. USB MIDI-adapter
  9. Een geïsoleerde analoge ingang voor Arduino
  10. Arduino TV out-kabel
  11. Meet je reactietijd