Stereo VU Meter

Hallo en welkom bij een nieuw deel van de serie VU-Meter.

De grote resonantie van het eerste deel van de serie is overweldigend!Natuurlijk accepteren we de uitdaging en verlengen onze VU meter met een ander kanaal in de volgende stap.Het tweede kanaal wordt negatief weergegeven op het U64 paneel.We hebben al een geweldige stereo VU meter met een indrukwekkend tegenwicht effect!

Natuurlijk zijn er ook enkele hardware uitbreidingen en optimalisaties aan boord.Zoals ik in het eerste deel schreef, heeft het U64 paneel een enorme honger.Daarom is onze eerste hardware verandering een uitwisseling van de Breadboard bevoorradingsmodule voor een stabiele 5Volt/2,6 A voeding.Hierdoor kunnen we de helderheid van het leer van het paneel vergroten van 39% tot 100% zonder stroomproblemen.De advertentie zal een beetje meer maken.De code beperkt deze helderheid tot 60% helderheid.Deze beperking zal dan vallen in het volgende deel van de serie zonder het veranderen van de voeding.

De Bordboard Supply Module is natuurlijk geen afval, maar kan worden gebruikt voor alle verdere constructies van Tracking even opwindende projecten die moeten worden voortgezet.De extra onderdelen, waaronder de twee 680 Ohm Verzet en de twee 5,1 Volt Zener diodes vervullen schakelfuncties voor de Arduino.Voor het huidige deel van de serie verschijnt dus de volgende sublijst:

 

  • 1x Arduino Nano (met FTDI)
  • 1x U64 LED-paneel
  • 2x 10 KOhm Verzet 1%
  • 2x 680 Ohm Verzet 5%
  • 1x 5 Volt, min 2.6 Ampelstroomvoorziening
  • 1x 10 uF 64 Volt Elektrolyt condensator
  • 1x Stereo Klinken connector 3.5 mm socket
  • 2x 5,1 Volt Zener Diode

 

We hebben de onderdelen als volgt aangesloten:

Plannen voor Fritzing

 

Nadat we het circuit hebben voltooid, ofwe kunnen nu de bijgewerkte en uitgebreide code uploaden naar onze Arduino:

 

"35; omvat <NeoPixel Adafruit.H>

Welke pin op de Arduino is verbonden met de NeoPixels?
Op een Trinket of Gemma stellen we voor om dit te veranderen in 1:
35; definieer LED PIN     13
Hoeveel NeoPixels zijn er aan de Arduino gehecht?
35; definieer LED COUNT  64

Verklaar ons NeoPixel strip object:
NeoPixel Adafruit strip(LED COUNT, LED PIN, NIEUWE GROEP + NIEUW KHZ800);
// Argument 1 = Aantal pixels in NeoPixel strip
// Argument 2 = Arduino pinnummer (de meeste zijn geldig)
// Argument 3 = Pixel type vlaggen, zo nodig toevoegen:
// NEO KHZ800 KHz bitstream (NeoPixel products bridge w/WS2812 LED's)
// NEO KHZ400 KHz (klassieke'v1'(niet v2) FLORA pixels, WS2811 drivers)
// NEO/GRB Pixels zijn verbonden met GRB bitstream (de meeste NeoPixel producten)
// NEO/RGB Pixels zijn verbonden met RGB-bitstream (v1 FLORA pixels, niet v2)
// NEO/RGBW Pixels zijn verbonden met RGBW-bitstream (NeoPixel RGBW-producten)

35; definieer analogPinLeft A5 // Links Audio Channel, verbonden met analoge pin A5
35; definieer analogPinRight A4 // Rechts Audio Channel, verbonden met analoge pin A4
35; definieer Afwijking van links kanaal  5
35; definieer Afwijking van het rechterkanaal 5

int Waarde links = 0;  // variabele om de waarde te slaan die wordt gelezen vanaf kanaal links
int Basis links = 0;   // 0 Basis
int Recht van waarde = 0;  // variabele om de waarde te slaan die wordt gelezen vanaf kanaal links
int Basis rechts = 0;   // 0 Basis

int LeftDropTime, rechts DropTime;
int DropVertraging = 4;                                        Houd tijd voordat de leds vallen
// helderheid van NeoPixel, 0 (min) tot 255 (max)
uitwisseling VROUWEN = 153;  // 60% helderheid

drijven dropFactor = .98;

Leeg setup()
{   strip.start();           NeoPixel strip object (VEREIST)   strip.tonen();            Schakel uit naar ASAP pixels   strip.Seth-helderheid(VROUWEN); // Druk BRIGHNESS op ongeveer 1/5 (max = 255)   Basis links = analoog(analogPinLeft);   Basis links += analoog(analogPinLeft);   Basis links += analoog(analogPinLeft);   Basis links += analoog(analogPinLeft);   Basis links = Basis links / 4;   Basis rechts = analoog(analogPinRight);   Basis rechts += analoog(analogPinRight);   Basis rechts += analoog(analogPinRight);   Basis rechts += analoog(analogPinRight);   Basis rechts = Basis rechts / 4;   Serie.start(9600);   colorWipGenericName(strip.Kleur(255, 0, 0), 5); // Rood   colorWipGenericName(strip.Kleur(255, 255, 0), 5); // geel   colorWipGenericName(strip.Kleur(0, 255, 0), 5); // Groen   regenbowFade2White(1, 1, 1);
}

Leeg ren()
{   Linkse U U U U meter(LED COUNT / 2, 512);   Rechts U U meter(LED COUNT / 2, 511);   strip.tonen();   Nieuwe strip aanpassen
}





Leeg Linkse U U U U meter(uitwisseling Maximale Pixels Niveau, int gevoeligheid)
{   int Waarde links = 0;   Bool. Overlading = Vals;   uint32 rgbcolor;   uint32 Whoo!;   int Sterkte signaal = 0;   uitwisseling Ijsniveau VU = 0;   Waarde links = analoog(analogPinLeft);  // lees de invoerpin   Waarde links += analoog(analogPinLeft);  // lees de invoerpin   Waarde links += analoog(analogPinLeft);  // lees de invoerpin   Waarde links += analoog(analogPinLeft);  // lees de invoerpin   Waarde links = Waarde links / 4;   indien (!(Abs.(Waarde links - Waarde links) > Afwijking van links kanaal)) {     Waarde links = Waarde links;   }   indien (Waarde links < Waarde links)   {     LeftDropTime++;     indien (LeftDropTime > DropVertraging)     {       Waarde links = Waarde links * dropFactor;       LeftDropTime = 0;     }     sm     {       Waarde links = Waarde links;     }   }   Waarde links = Waarde links;   Sterkte signaal = Waarde links - Basis links;   indien (Sterkte signaal < 0) {     Sterkte signaal = - Sterkte signaal;   }   Ijsniveau VU =  Map(Sterkte signaal, 0, gevoeligheid , 0, Maximale Pixels Niveau);   indien (Ijsniveau VU > Maximale Pixels Niveau)   {     Overlading = waar;     Ijsniveau VU = Maximale Pixels Niveau;   } sm {     Overlading = Vals;   }   voor (int i = 0; i < Maximale Pixels Niveau; i++) {     strip.setPixel(i, 0, 0, 0);  Kleur van pixel s wissen (in RAM)   }   voor (int i = 0; i < Ijsniveau VU; i++) { Voor elke pixel in strip...     Whoo! = Map(i, Maximale Pixels Niveau - 1, 0, 0, 21800);     indien (Overlading) {       rgbcolor = strip.Kleur(255, 0, 0);   Hue naar RGB conversie     } sm {       rgbcolor = strip.Kleur(Whoo!, 255, VROUWEN);     }     strip.setPixel(i, rgbcolor);         // Kleur van pixel s instellen (in RAM)   }   // strip.show();// Update strip om te passen
}

Leeg colorWipGenericName(uint32 kleur, int Wacht.) {   voor (int i = 0; i < strip.Nupixels(); i++) { Voor elke pixel in strip...     strip.setPixel(i, kleur);         // Kleur van pixel s instellen (in RAM)     strip.tonen();                          Nieuwe strip aanpassen     vertraging(Wacht.);                           Pauzeer voor een moment   }
}

Leeg Rechts U U meter(uitwisseling Maximale Pixels Niveau, int gevoeligheid)
{   int juiste keuze = 0;   Bool. Overlading = Vals;   uint32 rgbcolor;   uint32 Whoo!;   int Sterkte signaal = 0;   uitwisseling Ijsniveau VU = 0;   juiste keuze  = analoog(analogPinRight);  // lees de invoerpin   juiste keuze  += analoog(analogPinRight);  // lees de invoerpin   juiste keuze  += analoog(analogPinRight);  // lees de invoerpin   juiste keuze  += analoog(analogPinRight);  // lees de invoerpin   juiste keuze  = juiste keuze / 4;   indien (!(Abs.(juiste keuze - Recht van waarde) > Afwijking van het rechterkanaal)) {     juiste keuze = Recht van waarde;   }   indien (juiste keuze < Recht van waarde)   {     rechts DropTime++;     indien (rechts DropTime > DropVertraging)     {       juiste keuze = Recht van waarde * dropFactor;       rechts DropTime = 0;     }     sm     {       juiste keuze = Recht van waarde;     }   }   Recht van waarde = juiste keuze;   Sterkte signaal = juiste keuze - Basis rechts;   indien (Sterkte signaal < 0) {     Sterkte signaal = - Sterkte signaal;   }   Ijsniveau VU =  Map(Sterkte signaal, 0, gevoeligheid , 0, Maximale Pixels Niveau);   indien (Ijsniveau VU > Maximale Pixels Niveau)   {     Overlading = waar;     Ijsniveau VU = Maximale Pixels Niveau;   } sm {     Overlading = Vals;   }   int ColorVector = 0;   voor (int i = LED COUNT - Maximale Pixels Niveau; i < LED COUNT; i++) {     strip.setPixel(i, 0, 0, 0);  Kleur van pixel s wissen (in RAM)   }   int StartVector = LED COUNT - Ijsniveau VU;   voor (int i = LED COUNT - Maximale Pixels Niveau; i < LED COUNT; i++) { Voor elke pixel in strip...     Whoo! = Map(ColorVector, Maximale Pixels Niveau - 1, 0, 21800, 0);     ColorVector++;     indien ( i >= StartVector)     {       indien (Overlading) {         rgbcolor = strip.Kleur(255, 0, 0);   Hue naar RGB conversie       } sm {         rgbcolor = strip.Kleur(Whoo!, 255, VROUWEN);       }       strip.setPixel(i, rgbcolor);         // Kleur van pixel s instellen (in RAM)     }   }
}

Leeg regenbowFade2White(int Wacht., int RainbowLoops., int witLoops) {   int vervagen = 0, fadeMax = 100;   Hue van de eerste pixel rent'RainbowLoops's complete lussen door de kleur   Wiel.Color wheel heeft een bereik van 65536 maar het is OK als we omrollen, dus   // gewoon tellen van 0 tot RainbowLoops*655536, met behulp van stappen van 256 dus we   Ga rond het stuur voor een goede clip.   voor (uint32 eerste PixelHue = 0; eerste PixelHue < RainbowLoops. * 65536;        eerste PixelHue += 256) {     voor (int i = 0; i < strip.Nupixels(); i++) { Voor elke pixel in strip...       Offset pixeltint met een hoeveelheid om een volledige revolutie van de       // kleurenwiel (bereik van 65536) langs de lengte van de strip       / (strip.numPixels() stappen):       uint32 pixelHue = eerste PixelHue + (i * 655536L / strip.Nupixels());       //strip.ColorHSV() kan 1 of 3 argumenten aannemen: een hue (0 tot 65535) of       //optioneel verzadiging en waarde toevoegen (helderheid) (elke 0 tot 255).       Hier gebruiken we slechts de drie-argument variant, hoewel de       // tweede waarde (verzadiging) is een constante 255.       strip.setPixel(i, strip.gamma32(strip.Kleur(pixelHue, 255,                                            255 * vervagen / fadeMax)));     }     strip.tonen();     vertraging(Wacht.);     indien (eerste PixelHue < 65536) {                             Eerste lus,       indien (vervagen < fadeMax) vervagen++;                      /vervagen in     } sm indien (eerste PixelHue >= ((RainbowLoops. - 1) * 65536)) { Laatste lus       indien (vervagen > 0) vervagen--;                            /vervagen uit     } sm {       vervagen = fadeMax; Voorlopige lus, zorg ervoor dat de fade op max is     }   }   voor (int c = 0; c < witLoops; c++) {     voor (int j = 0; j < 256; j++) { Ramp van 0 tot 255       // volledige strook vullen met wit op gammastralingsniveau j':       strip.vullen(strip.Kleur(0, 0, 0, strip.Game8(j)));       strip.tonen();     }     voor (int j = 255; j >= 0; j--) { Rampen van 255 tot 0       strip.vullen(strip.Kleur(0, 0, 0, strip.Game8(j)));       strip.tonen();     }   }
}

 

Merk op dat de virtuele nulregel wordt gelezen tijdens het schakelen op de VU meter en het afspelen van de intro.Om deze kalibratie goed te laten werken, is het belangrijk om tijdens de schakelfase geen audiosignaal in te stellen.Alleen wanneer de start animaties zijn voltooid kan een analoge signaal worden aangemaakt.

Ik wens je veel plezier tijdens het herbouwen tot de volgende keer

 

 

Für arduinoProjekte für fortgeschrittene

2 Kommentare

Tobias

Tobias

Hallo Niko,
Die Polung der Elkos bei Wechselspannung ist immer so eine Sache der Perspektive ;)
Dennoch ist die Polung hier Richtig, da der Bezug zur Masse des Audiosignals !über den 10 KOhm Wiederstand hergestellt wird.
Viele Grüße

Niko

Niko

Hallo Tobias,

ich will ja nicht lästig sein, aber bitte noch einmal die Polung der Elkos prüfen. Ich denke, die sollten andersrum gesteckt werden. Minus in Richtung Audiobuchse.

Schöne Grüße
und vielen Dank für die vielen Ideen und Vorschläge in deinem Blog!

Einen Kommentar hinterlassen

Alle Kommentare werden vor der Veröffentlichung moderiert

Aanbevolen blog berichten

  1. Installeer ESP32 nu van de raad van bestuur
  2. Lüftersteuerung Raspberry Pi
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1
  4. ESP32 - das Multitalent
  5. OTA - Over the Air - ESP Programmeren via Wi-Fi