Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

RGB 32-Band Audio Spectrum Visualizer

Komponenten und Verbrauchsmaterialien

Arduino Nano R3
× 1
WS2812B 8x32 RGB LED MATRIX
× 1
Widerstand 4,75 kOhm
× 3
Widerstand 100k Ohm
× 2
Widerstand 10k Ohm
× 1
Durchgangslochwiderstand, 390 Ohm
× 1
Kondensator 100 nF
× 2
Kondensator 1000 µF
× 1
SparkFun Drucktastenschalter 12 mm
× 1
4x6 cm Multihole Prototypenplatine
× 1

Notwendige Werkzeuge und Maschinen

Lötkolben (generisch)
3,5-mm-Klinken-Splitterkabel

Über dieses Projekt

Das Projekt

Dieses Projekt dient der Erstellung eines RGB 32-Band Audio (Musik) Frequenzspektrum-Visualisierung mit Arduino Nano und einer 8x32 WS2812B RGB Led Matrix.

Das ursprüngliche Projekt, das dies inspiriert hat

Ein großer Dank geht an Shajeeb Autor des ursprünglichen Projekts basierend auf der MAX72xx LED-Matrix. Ich habe nur den Pilotteil der LED-Matrix modifiziert, um ihn an die RGB WS2812B LED-Matrix anzupassen.

Link zum Originalprojekt:32-Band Audio Spectrum Visualizer Analyzer

Die WS2812B RGB-LED-Matrix

Bei Verwendung einer RGB-LED-Matrix auf Basis von 5050 SMD-High-Brightness-LEDs ist es erforderlich, eine externe Stromversorgung zu verwenden, da die RGB-Matrix mehr als 10 mA pro LED absorbieren kann, daher können alle LEDs mit maximaler Helligkeit mehr als 2,5 Ampere aufnehmen.

Aus diesem Grund habe ich eine Diode mit +5V in Reihe geschaltet, um Arduino im Stand-Alone-Modus mit Strom versorgen zu können, wenn das USB-Kabel nicht angeschlossen ist, und um zu vermeiden, dass Arduino die Stromquelle der RGB-Matrix ist, also vermeiden Sie Überlastung der internen Schaltkreise der Platine mit einem Strom, den sie nicht liefern konnte.

Zum ursprünglichen Projekt habe ich zusätzlich zur Eingangsdiode, um den LED-Matrix-Eingang vor möglichen Spannungsspitzen zu schützen, auch einen 390-Ohm-Widerstand in Reihe zwischen dem Arduino-Pind D6 und dem Dateneingang und einen 1000-µF-12-V-Kondensator zur Verbesserung hinzugefügt die Stabilität der Arduino-Versorgungsspannung.

Hardware-Montage

Wie auf dem Hauptfoto zu sehen, habe ich den ersten Prototypen auf einer 4x6 cm Multihole-Platine mit zwei Cinch-Audiobuchsen (direkt auf die Platine gelötet) hergestellt, die auch durch eine 3,5-mm-Klinkenbuchse ersetzt werden können. Um Brummen zu vermeiden, ist es wichtig, die Verbindungen zwischen der Quelle und dem Audioeingang der Karte mit einem abgeschirmten Kabel herzustellen. Ein weiterer Tipp ist, die Verbindung zwischen dem Arduino und der LED-Matrix so kurz wie möglich zu halten.

Der Code

Letztendlich basiert die gesamte Software auf der großartigen Arbeit des Autors des Sampling-Verfahrens durch die FFT-Bibliothek und der endgültigen Umsetzung von Shajeeb.

Ich habe zwei Funktionen hinzugefügt:

Die erste ist GetLedFromMatrix(...) um die Matrix in Zeilen und Spalten abzubilden und jede der 256 LEDs über Zeilen- und Spaltenkoordinaten ansprechen zu können.

Der zweite ist der, den ich willkürlich SetColumn(...) genannt habe - die die LEDs jeder Spalte basierend auf dem Spitzenwert einschaltet, der durch die Audiodigitalisierung erhalten wurde (Werte zwischen 0 und 7 ) und auf Basis der voreingestellten Farben in einem zweidimensionalen Array. Sie können die Werte und damit die Farben nach Belieben ändern. Um den Code zu vereinfachen, habe ich eine Sobroutine namens Wheel() verwendet (aus einer Demo, die an die Neopixel-Bibliothek von Adafruit angehängt ist), die ausgehend von einem Wert zwischen 0 und 255 einen vorzeichenlosen 32-Bit-langen Wert zurückgibt, der direkt an die setPixelColor-Funktion übergeben wird. Auf diesem können Sie nach Belieben spielen, wobei Sie die Speicherbeschränkungen von Arduino berücksichtigen und nach Möglichkeit die Verwendung von 32-Bit-Variablen zum Speichern von RGB-Farbwerten vermeiden.

Audio Ausgleich

Da ich die Tests mit dem Audio von der im PC-Motherboard integrierten Soundkarte durchgeführt habe, habe ich außerdem zur Verbesserung des Frequenzgangs ein Byte-Array mit 32 Werten hinzugefügt, die praktisch eine Entzerrungskurve bilden, um den Bass zu dämpfen und die Höhen verstärken. Wenn Sie es nicht benötigen, setzen Sie einfach die Variable EQ_ON auf false oder ändern Sie den Dämpfungspegel, indem Sie die 32 Werte von eq[32] . ändern Array lässt ein Wert von 100 die Amplitude unverändert, ein Wert unter 100 dämpft und ein Wert über 100 akzentuiert das Frequenzband.

Led Helligkeit

Die Helligkeit der Matrix ist im Code auf 32 voreingestellt (BRIGHTNESS const). Der maximale Helligkeitswert der WS2812B Matrix (auf Papier) beträgt 255 aber schon bei Werten größer 100 wechselt das LED Licht leider von weiß auf blassgelb, es ist wohl notwendig die Matrix stattdessen über die beiden mittleren roten und schwarzen Drähte zu versorgen am rechten Stecker.

Ich versuche es immer noch ...

Schließlich, wenn Sie eine maximale Helligkeit von 64 verwenden, reicht wahrscheinlich ein 1A-Netzteil aus, ansonsten sind 2A unerlässlich.

Zukünftiges Update

Ich arbeite an einer neuen Version, die die OpenMusicLabs FHT verwendet Bibliothek, die um ein Vielfaches schneller ist als die Arduino FFT.

Bleiben Sie dran. :)

Bitte verzeihen Sie mein schlechtes Englisch, ich habe den Google-Übersetzer verwendet.

Code

  • Spectrum_Analyzer_WS2812B.ino
Spectrum_Analyzer_WS2812B.inoArduino
/* Copyright (c) 2019 Shajeeb TM Hiermit wird jeder Person, die eine Kopie dieser Software und der zugehörigen Dokumentationsdateien (die "Software") erhält, kostenlos die Erlaubnis erteilt, mit der Software ohne Einschränkung zu handeln, einschließlich uneingeschränkt die Rechte, Kopien der Software zu verwenden, zu kopieren, zu modifizieren, zusammenzuführen, zu veröffentlichen, zu verteilen, zu unterlizenzieren und/oder zu verkaufen und Personen, denen die Software zur Verfügung gestellt wird, dies zu gestatten, vorbehaltlich der folgenden Bedingungen:Copyright-Hinweis und dieser Erlaubnishinweis müssen in allen Kopien oder wesentlichen Teilen der Software enthalten sein. DIE SOFTWARE WIRD "WIE BESEHEN" BEREITGESTELLT, OHNE JEGLICHE AUSDRÜCKLICHE ODER STILLSCHWEIGENDE GEWÄHRLEISTUNG, EINSCHLIESSLICH, ABER NICHT BESCHRÄNKT AUF DIE GEWÄHRLEISTUNGEN DER MARKTFÄHIGKEIT, EIGNUNG FÜR EINEN BESTIMMTEN ZWECK UND NICHTVERLETZUNGSVERLETZUNG. IN KEINEM FALL HAFTEN DIE AUTOREN ODER URHEBERRECHTSINHABER FÜR ANSPRÜCHE, SCHÄDEN ODER SONSTIGE HAFTUNG, OB AUS VERTRAGLICHEM, unerlaubter Handlung oder anderweitig, DIE AUS, AUS ODER IN VERBINDUNG MIT DER SOFTWARE ODER DER NUTZUNG ODER ANDEREN HANDELN IN DER SOFTWARE. WS2812B Led Matrix Version von Janux*/#include #include #include #define SAMPLES 64 //Muss eine Potenz von 2 sein#define xres 32 // Gesamtanzahl von Spalten im Display, müssen <=SAMPLES/2#define yres 8 // Gesamtzahl der Zeilen im Display#define ledPIN 6 // Pint zur Steuerung der Led Matrix#define NUM_LEDS (xres * yres)#define BRIGHTNESS 32#define buttonPin 5 // die Nummer des Druckknopf-Pins zum Ändern von displaycolorbyte yvalue;byte displaycolumn, displayvalue;int peaks[xres];byte state =HIGH; // der aktuelle Messwert vom Eingang Pinbyte previousState =LOW; // das vorherige Lesen vom Eingang pinbyte displaycolor =0; // Arrays für sampligdouble vReal[SAMPLES];double vImag[SAMPLES];byte data_avgs[xres];arduinoFFT FFT =arduinoFFT(); // FFT-Objektunsigned long lastDebounceTime =0; // das letzte Mal, als der Ausgangspin toggledunsigned war long debounceDelay =100; // die Entprellzeit; erhöhen, wenn der Ausgang flackert // Parameter 1 =Anzahl der LEDs in der Matrix // Parameter 2 =Pin-Nummer (die meisten sind gültig) // Parameter 3 =Pixeltyp-Flags, addieren Sie nach Bedarf:// NEO_KHZ800 800 KHz Bitstream (die meisten NeoPixel Produkte mit WS2812 LEDs)// NEO_KHZ400 400 KHz (klassisch 'v1' (nicht v2) FLORA Pixel, WS2811 Treiber)// NEO_GRB Pixel sind für GRB-Bitstream verdrahtet (die meisten NeoPixel-Produkte)// NEO_RGB Pixel sind verdrahtet für RGB-Bitstream ( v1 FLORA-Pixel, nicht v2) Adafruit_NeoPixel Pixel =Adafruit_NeoPixel(NUM_LEDS, ledPIN, NEO_GRB + NEO_KHZ800); // EQ-Filter zur Abschwächung der Bässe und Verbesserung der Höhen // Nützlich auf PC-Soundkarten, die normalerweise viele Bässe und schlechte Hochfrequenzen haben bool EQ_ON =true; // auf false setzen um eqbyte eq[32] ={50, 55, 60, 70, 75, 80, 85, 95, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 115, 125, 140, 160, 185, 200, 225, 255 }; // Farbe für einzelne LED definieren, verwendet in setColumn-Funktion, 0 für benutzerdefinierte Farbe // Farbbereiche berechnet durch Radfunktion, siehe untenbyte colors[][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}};void setup() { pixel.begin (); pixel.setHelligkeit (HELLIGKEIT); // FFT-Operationen beginnen ADCSRA =0b11100101; // ADC in den Freilaufmodus setzen und Pre-Scalar auf 32 (0xe5) setzen ADMUX =0b00000000; // Pin A0 und externe Spannungsreferenz verwenden}void loop () { // ++ Sampling for (int i =0; i  peaks[i]) peaks[i] =yvalue; //Spitze speichern, wenn> vorheriger Peak yvalue =Peaks[i]; Anzeigespalte =i; Anzeigewert =yWert; setColumn (Anzeigespalte, Anzeigewert); // Eimer zeichnen } pixel.show(); // Eimer anzeigen displaycolorChange(); // Überprüfen Sie, ob die Taste gedrückt wurde, um den Farbmodus zu ändern} //------------------------------------- ---------------------------------------- // Leuchtdioden der x-Spalte gemäß y-Wertvoid setColumn(byte x, byte y) { byte led , ich; für (i =0; i  i) { switch (displaycolor) { case 4:// setze null 0 auf den Array-Wert, um die Peak-Farbe anzupassen if (colors[displaycolor][i]> 0) {//normale Farbe definiert im Farbarray pixel.setPixelColor(led, Wheel(colors[displaycolor][i])); aufrechtzuerhalten. Sonst { // benutzerdefinierte Farbe für Spitzen nur mit 0 auf dem Array-Wert pixel.setPixelColor (led, 255, 255, 255); // LED-Nummer, R-, G-, B-Werte} Pause; Fall 5:// Farbe nach Spalte ändern pixel.setPixelColor (led, Wheel (x * 16)); brechen; Fall 6:// Farbe pro Zeile ändern pixel.setPixelColor (led, Wheel (i * 36)); brechen; default://display color set -> displaycolor von 0 bis 3 //Farben werden im Farbarray definiert pixel.setPixelColor(led, Wheel(colors[displaycolor][i])); } // ENDE SCHALTER} Else {pixel.setPixelColor (led, 0); } }} //=====================================================================// Berechne eine LED-Nummer anhand der x,y-Koordinaten// gültig für WS2812B mit horizontalem Serpentinen-Layout// und Null-LED unten rechts (Eingangsanschluss auf der rechten Seite) // Eingabewert:x=0-31, y=0-7, Rückgabe einer LED-Nummer von 0 bis 255//======================================================================Byte GetLedFromMatrix (Byte x, Byte y) { x =xres - x - 1; if (x &0x01) { // Ungerade Spalten erhöhen sich rückwärts Return ((x + 1) * yres - y - 1); } else { //Gerade Spalten erhöhen sich normalerweise return ((x + 1) * yres - yres + y); }}//=======================================================================void displaycolorChange () {int Reading =digitalRead (buttonPin); if (lesen ==HIGH &&previousState ==LOW &&millis() - lastDebounceTime> debounceDelay) // funktioniert nur, wenn { displaycolor++; if (displaycolor> 6) displaycolor =0; lastDebounceTime =millis(); } previousState =Reading;}/* Dienstprogramm von Adafruit Neopixel-Demoskizze Geben Sie einen Wert von 0 bis 255 ein, um einen Farbwert zu erhalten. Die Farben sind ein Übergang R - G - B - zurück zu 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; Rückgabe Pixel.Color(0, WheelPos * 3, 255 - WheelPos * 3); } WheelPos -=170; return pixel.Color(WheelPos * 3, 255 - WheelPos * 3, 0);}

Kundenspezifische Teile und Gehäuse

arduino_rgb_audio_analyzer_lX4Dv4Pta2.zip

Schaltpläne


Herstellungsprozess

  1. 32 (Linier) / 11 (Pseudolog)-Band-Audiospektrumanalysator
  2. Pflanzenalarm bei Durstalarm
  3. italienische Wordclock
  4. Sigfox-kWh-Zähler
  5. Bluetooth-Temperaturüberwachung
  6. Gestengesteuerte Sperre
  7. Der Companion-IC
  8. USB-MIDI-Adapter
  9. Ein isolierter Analogeingang für Arduino
  10. Messen Sie Ihre Reaktionszeit