VU meter autocostruito

Metro di VU autoautosufficiente

 

Salve e benvenuti a un blog nuovo ed emozionante. Oggi stiamo entrando nel mondo a bassa frequenza, e stiamo costruendo un metro di VU. Per tutti quelli che non conoscono più gli strumenti di misura noti agli anni ' 80: un metro di VU (vu) per i termini inglesi "Volume Units", ovvero "unità di controllo del volume", è un misuratore di controllo, ossia uno strumento di misura per la valutazione dell'intensità del segnale nella tecnologia tontotecnica. In questo modo, l'intensità di segnale di un segnale audio peopico è misurata nel suo equivalente elettrico.

Ci servono le seguenti parti hardware del negozio per costruire il metro di Valla metri:


Per poter misurare un segnale audio con il nostro Arduino, dobbiamo prima fare alcune considerazioni preliminari. La prima è la prima: l'audio è una corrente alternata in KHz, che gialla intorno al punto zero. Pertanto, non è adatto per la misurazione di questo segnale una digitazione digitale. Anche un'entrata analogica nostro Microcontroller per la misurazione della musica a bassa frequenza non può essere utilizzato senza un rivestimento esterno, in quanto può misurare solo i valori di tensione positivi nell'intervallo da 0 a 5 volt a una risoluzione di 10 bit. Per visualizzare questo aspetto, in seguito mostrerò l'audio NF registrato con l'oscilloscopio, proprio come questi si trovano anche in un altoparlante.

Bind: segnale NF nella ricezione dell'altoparlante, non filtrato

Bind: segnale NF nella ricezione dell'altoparlante, non filtrato

 

Per questo motivo, nel primo passo prepariamo il nostro analogo NF analogico alla musica con un piccolo condensatore del condensatore esterno, in modo da far scavare con un offset di 2,5 volt nella gamma di tensione positiva. La portata dello zero nell'area negativa è pertanto evitata:

 

Bind: il segnale NF continua con un offset di tensione.Bind: il segnale NF continua con un offset di tensione.

 

 

Questo è ciò che si può fare con i due 10 KOhm di rimpianti nel piano di commutazione e un condensatore elettrolitico 10uF 63, il cui catodo mostra il nostro microcontrollore. Vediamo di vedere il metro di VU, come mostrato nella seguente illustrazione:

 

VU metro carrozzeria

 

Importante è che il 64 Led Panel fa riferimento alla sua alimentazione attraverso il modulo di alimentazione MB102 e NON con l'Arduino Nano, dal momento che nell'azienda fino a 2,5 A viene consumato in cima dal LED U64. Se fosse stata messa a disposizione dall'arduino, questa intensità di corrente potrebbe essere inevitabilmente ricondotto alla tensione, o danneggiando il regolatore di voltaggio su nano. Anche il dimensionamento della quota di rete dovrebbe essere adeguato di conseguenza.

 

" #include " <Adafruit_NeoPixel.h>

// Which pin on the Arduino is connected to the NeoPixels?
// On a Trinket or Gemma we suggest changing this to 1:
" #define " LED_PINA     13
// How many NeoPixels are attached to the Arduino?
" #define " LED_COUNT  64

// NeoPixel brightness, 0 (min) to 255 (max)
" #define " BRIGHTNESS 100

// Declare our NeoPixel strip object:
Adafruit_NeoPixel strip(LED_COUNT, LED_PINA, NEO_GRB + NEO_KHZ800);
// Argomento 1 = Numero di inversione in NeoPixel strip
// argomento 2 = Arduino pin number (most are valid)
// Argomento 3 = Pixel type flags, add together as needed:
// NEO_KHZ800 800 KHz bitstream (most NeoPixel products w/WS2812 LED)
// NEO_KHZ400 400 KHz (classic 'v1' (non v2) FLORA), WS2811 drivers)
// NEO_GRB Pixels are wired for GRB bitstream (most NeoPixel products)
// NEO_RGB Pixels are wired for RGB bitstream (v1 FLORA, not v2, not v2)
// NEO_RGBW Pixels are wired for RGBW bitstream (NeoPixel RGBW products)

" #define " analogico PinLeft A5 // Left Audio Channel, connected to analog pin A5

int val_left_old = 0;  // variable to store the value read from Channel Left
int Base_Left = 0;   // 0 base

void Impostazione()
{   strip.begin();           // INITIALIZE NeoPixel strip object (REQUIRED)   strip.show();            // Turn OFF per tutti i pixel di ASAP   strip.setBrightness(BRIGHTNESS); // Set BRIGHTNESS to about 1/5 (max = 255)   Base_Left = Read analogico(analogico PinLeft);   Base_Left += Read analogico(analogico PinLeft);   Base_Left += Read analogico(analogico PinLeft);   Base_Left += Read analogico(analogico PinLeft);   Base_Left = Base_Left / 4;   colorWipe(strip.Color(255, 0, 0), 5); // Red   colorWipe(strip.Color(255, 255, 0), 5); // yellow   colorWipe(strip.Color(0, 255, 0), 5); // Green   rainbowFade2White(1, 1, 1);
}

void loop()
{   Left_VU_Meter(64, 100);   delay(40);
}

void Left_VU_Meter(byte Level_Max_Pixels, int sensitivity)
{   int val_left = 0;   val_left = Read analogico(analogico PinLeft);  // read the input pin   val_left += Read analogico(analogico PinLeft);  // read the input pin   val_left += Read analogico(analogico PinLeft);  // read the input pin   val_left += Read analogico(analogico PinLeft);  // read the input pin   val_left = val_left / 4;   int Signal_Strength = val_left - Base_Left;   if (Signal_Strength < 0) {     Signal_Strength = - Signal_Strength;   }   byte Livello VU_Led_Level =  mappa(Signal_Strength, 0, sensitivity , 0, Level_Max_Pixels);   per (int i = 0; i < Level_Max_Pixels; i++) {     strip.setPixelColor(i, 0, 0, 0);  // Clear pixel's color (in RAM)   }   per (int i = 0; i < Livello VU_Led_Level; i++) { // For each pixel in strip ...     uint32_t hue = mappa(i, Level_Max_Pixels - 1, 0, 0, 21800);     uint32_t rgbcolor = strip.ColorHSV(hue, 255, BRIGHTNESS); // Hue to RGB Conversation     strip.setPixelColor(i, rgbcolor);         // Set pixel del colore (in RAM)   }   strip.show();   // Aggiornare strip to match
}

void colorWipe(uint32_t color, int wait) {   per (int i = 0; i < strip.numPixels(); i++) { // For each pixel in strip ...     strip.setPixelColor(i, color);         // Set pixel del colore (in RAM)     strip.show();                          // Aggiornare strip to match     delay(wait);                           // Pause for a moment   }
}

void rainbowFade2White(int wait, int rainbowLoops, int whiteLoops) {   int fadeVal = 0, fadeMax = 100;   // Hue of first pixel rci 'rainbowLoops' complete loops through the color   // wheel. Color wheel has a range of 65536 but it's OK if we roll over, so   // esattamente count da 0 to rainbowLoops * 65536, using steps of 256, we   // advance around the wheel at a decent clip.   per (uint32_t firstPixelHue = 0; firstPixelHue < rainbowLoops * 65536;        firstPixelHue += 256) {     per (int i = 0; i < strip.numPixels(); i++) { // For each pixel in strip ...       // offset pixel hue by a amount to make one full revolution of the       // color wheel (range of 65536) along the length of the strip       // (strip numPixels () steps):       uint32_t fedeltà = firstPixelHue + (i * 65536L / strip.numPixels());       // strip ColorHSV () can take 1 or 3 arguments: a hue (0 to 65535) or       // optionally add saturation and value (brightness) (each 0 to 255).       // Here we gusing using just the three - argument variant, though the       // second value (saturation) is a constant 255.       strip.setPixelColor(i, strip.gamma32(strip.ColorHSV(fedeltà, 255,                                            255 * fadeVal / fadeMax)));     }     strip.show();     delay(wait);     if (firstPixelHue < 65536) {                             // first loop,       if (fadeVal < fadeMax) fadeVal++;                      // fade in     } else if (firstPixelHue >= ((rainbowLoops - 1) * 65536)) { // carico loop,       if (fadeVal > 0) fadeVal--;                            // fade out     } else {       fadeVal = fadeMax; // Interim loop, make sure fade is at max     }   }   per (int k = 0; k < whiteLoops; k++) {     per (int j = 0; j < 256; j++) { // Ramp da 0 a 255       // Fill entire strip with white at gamma - corrected brightness level 'j':       strip.fill(strip.Color(0, 0, 0, strip.gamma8(j)));       strip.show();     }     per (int j = 255; j >= 0; j--) { // rampa da 255 a 0       strip.fill(strip.Color(0, 0, 0, strip.gamma8(j)));       strip.show();     }   }
}

 

 

Ora possiamo collegare un NF ad un altoparlante di un altoparlante alla touchf. Line - I livelli non sono sufficienti per gestire il nostro metro di VU. L'accesso audio viene quindi collegato direttamente all'uscita di potenza della sorgente audio (max 30 Watt Peak).


Nelle prossime due parti della fila, stiamo costruendo un secondo canale per poter visualizzare gli stereofoni con il metro di VU e aggiungere alcune possibilità di assunzione, come la zB. Sensibilità e luminosità.
Scrive le vostre domande o i vostri desideri come sempre nei commenti.

Auguro molto divertimento alla costruzione della VU Meters e fino alla prossima volta.

Per arduinoProjekte für fortgeschrittene

8 Kommentare

Tobias

Tobias

Hallo Nils,
Du liegst richtig, die virtuelle Nullinie wird zum Startzeitpunkt des Arduinos eingelesen. Zu diesem Zeitpunkt sollte demnach noch kein Signal anliegen, da diese sonst ggf. verfälscht werden könnte. Dies ist nötig, da die Toleranzen der Bauteile selbst bei nur 1% Abweichung dazu führen könnten, das nach dem Start die eine oder andere VU Led dauerhaft leuchtet. Dies sieht sehr unschön aus. Daher diese Lösung der virtuellen Nullinie. Man könnte aber auch alternativ einmalig die Nullinie beim ersten Start einlesen, und ins EEPRom schreiben, wenn einen das stört.

Tobias

Tobias

Hallo Heiko,

Eine berechtigter Punkt. Jedoch steckt bei der Wahl der MB102 Breadboard Spannungsversorgung die Überlegung dahinter, das das VU Meter zunächst als auf dem Breadboard als TEST aufgebaut wird und später im festen Dauerbetrieb noch mal neu dauerhaft auf eine Platine gelötet wird. Für den festen und gelöteten Einsatz als Modul sollte dann passend dimensioniertes externes 5 Volt-Netzteil verwendet werden. Die MB102 Breadboard Spannungsversorgung ist, wie der Name schon vermuten lässt für den Breadboardeinsatz konzipiert.
Dennoch reicht die MB102 Breadboard Spannungsversorgung für den ersten Aufbau und Test der hier vorgestellten Schaltung aus, denn die 2,5 Ampere beziehen sich auf eine Helligkeitsaussteuerung von 100 % und eine Aussteuerung der LED’s von 100%. Bei dem og. Aufbau ist jedoch die Helligkeit der LED’s auf 39% der maximalen Helligkeit beschränkt, was den Stromverbrauch entsprechend reduziert. 39% von 2,5 A = 0,97 A bei Vollaussteuerung. Im mittleren Betrieb sollen darüber hinaus nur 50% der LED’s aktiv sein, d.h 0,97 A / 2 = 0,48 A. Somit unter den 0,7 Ampere des Moduls.
Zum testen der Schaltung also ausreichend. Im Festbetrieb sollte das Modul, wie du schon schreibst, durch ein normales Netzteil ersetzt werden.
Viele Grüße
Tobias

niko_at

niko_at

Meiner Meinung nach ist der Elko falsch gepolt, d.h. Kathode (Minus) muss an die Lautsprecherbuchse. And der LS-Buchse haben wir im Mittel 0V und am Mikrocontroller (Widerstandsteiler 2x 10kOhm) haben wir U/2 => +2,5V

Zudem fehlen Schutzdioden, dass am Mikrocontroller Eingang nicht Spannungen weit über Ub (5V) und nicht weit unter 0V gehen können!
Z.B: Mikrocontrollereingang über 10 kOhm (ggf. auch kleiner) und 2 Dioden (1N4148) jeweils in Sperrichtung gegen V und 0V. So kann die SPannung max. 0,7V üver V+ und 0,7V unter 0V gehen.

Nils

Nils

Moin,
cooles Projekt! Verstehe ich das richtig, dass im Setup der Base_Left eingelesen wird, um das virtuelle Null-Niveau (Nulllinie) zu ermitteln. Das funktioniert aber nur richtig, wenn beim Einschalten noch kein Audio Signal am Analog-Pin anliegt. Alternativ könnte man 2 1% Widerstände zum Teilen der Spannung nehmen und dann die Nullinie einfach mit 2.5V (also 512) definieren.
Eingangsspannungen kleiner 0V oder größer 5V am analogen Pin werden nicht richtig gemessen, können eventuell den Arduino sogar beschädigen? Vielleicht mit 2 Dioden das Signal auf GND und +5V klemmen?

Dirk

Dirk

Hi, cooles Projekt, da ich im Moment ein VU Meter suche.
Kann man die LED Module hintereinanderschalten? Ich stelle mir vor, 3 Module zu nehmen.
Oder gleich eine komplette LED Matrix 64×32.
Ein Modul mit den 8 LED’s sind zu wenig Auflösung.
Und natürlich muss das mit den Line IN/OUT Signalen funktionieren.
Mann sollte das VU Meter auch kalibrieren können.
Am Lautsprecherausgang macht es für mich keinen Sinn, da sich da die Laustärke ständig ändert.
Danke und Grüße

Heiko Schütz

Heiko Schütz

Frage: Im Beitrag steht, dass “im Betrieb bis zu 2,5 A durch den U64-LED Panel in der Spitze verbraucht werden”. Laut Datenblatt ist die MB102-Spannungsversorgung bis 700 mA ausgelegt. Hält die Spannungsversorgung diese Spitzen von 2,5 A ohne Schaden zu nehmen aus – das ist ja keine Dauerbelastung? Oder wäre es nicht besser (sicherer), gleich ein passend dimensioniertes externes 5 Volt-Netzteil zu verwenden (wie man es z.B. auch zum Betrieb von längeren Neopixel-Streifen benötigt)?

(Datenblatt: https://cdn.shopify.com/s/files/1/1509/1638/files/MB102_Breadboard_Kit_Datenblatt.pdf)

Gerrit

Gerrit

Es wäre schön das VU-Meter einmal in einem kurzen Video im Betrieb zu sehen, um entscheiden zu können ob sich der Nachbau für einen persönlich lohnt.

Gerhard Langner

Gerhard Langner

Hallo. Nicht neu aber cooles projekt. Ich denke eine leicht abgeänderte Vorschaltung wäre auch für die leute wie mich interesant die sowas lieber im linepegel haben möchten.

Einen Kommentar hinterlassen

Alle Kommentare werden vor der Veröffentlichung moderiert

Post di blog consigliati

  1. Installa ESP32 ora dal gestore del consiglio di amministrazione
  2. Lüftersteuerung Raspberry Pi
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1
  4. ESP32 - das Multitalent
  5. OTA - Over the Air - Programmazione ESP tramite WLAN