Selbstgebautes VU-Meter - AZ-Delivery

Selbstgebautes VU-Mètre

 

Bonjour, et bienvenue à un nouveau et passionnant Blog. Aujourd'hui, nous nous dirigeons vers les basses fréquences Monde et bâtissons-nous une salle de VU-Mètres. Pour tous ceux qui depuis les années 80 connus lecteur de ne plus connaître: Un VU-Mètre (vu est en anglais des Termes de Volume Units, donc à "Lautstärkeneinheiten") est un Aussteuerungsmesser, donc, un Instrument de mesure pour Évaluer l'intensité du Signal Sonore. Ici, la puissance du Signal d'un Signal injecté dans son électrique Équivalent mesuré.

Nous avons besoin du Matériel suivant à partir de la Boutique pour le VU-Mètre de construire:


Pour nous un Signal Audio avec notre Arduino mesurer, nous devons tout d'abord quelques Considérations faire. Le plus important d'abord: Le signal Audio est une arbitraires Ca en KHz, qui est le point d'origine de la carrosserie. Pour la Mesure de ce Signal est donc pas d'Entrée numérique. Aussi, une entrée Analogique de notre Microcontrôleur pour la Mesure de la Musique Niederfrequenzsignals est sans Câblage externe limitée à ce seul point positif de Tension dans la Plage de 0 à 5 Volts avec une Résolution de 10 Bits peut mesurer. Pour cela, visualiser, je vais montrer ci-dessous avec l'Oscilloscope Audio enregistré NF Vibrations, comme il en est aussi un haut-Parleur de papier.

Prise: NF Signal à la Lausprechereingang, non filtrée

Prise: NF Signal à la Lausprechereingang, non filtré,

 

nous Nous préparons donc, dans la première Étape de notre Analogique NF Musique Signal à l'aide d'une petite externes de la Résistance-Condensateur du Circuit de sorte qu'avec un Décalage de 2,5 Volts positifs, la plage de Tension est élevé. Le passage par Zéro dans la Zone négative, est ainsi évité:

 

Prise: il en va de NF Signal avec un Gleichspannungsoffset.Prise: il en va de NF Signal avec un Gleichspannungsoffset.

 

 

Faire cela avec nous dans la Schaltungsplan à voir deux de 10 KOhm Wiederständen et d'un 10uF 63 Volts Condensateur, dont la Cathode à notre Microcontrôleur affiche. Nous construisons maintenant le VU-Mètre comme à la Figure suivante pour voir entièrement sur:

 

VU-Mètre Construction de tableau blanc

 

Important , c'est que le 64 Led Panel son Alimentation par le Module de Puissance MB102 de référence et NON par l'Arduino Nano, car en cas de Fonctionnement jusqu'à 2,5 A par la U64-Panneau LED à la Pointe de consommation. Ce Courant serait, si l'Arduino fourni devrait être, inévitablement, la Tension va s'effondrer, et le Régulateur de tension sur le Nano endommager. Aussi, le Dimensionnement de l'Alimentation électrique doit être choisi en fonction.

 

#include <Adafruit_NeoPixel.h>

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

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

// Declare our NeoPixel strip object:
Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);
// Argument 1 = Number of pixels dans NeoPixel strip
// Argument 2 = Arduino pin number (most are valid)
// Argument 3 = Pixels type d'indicateurs, add together as needed:
// NEO_KHZ800 800 KHz bitstream (most NeoPixel products w/WS2812 Led)
// NEO_KHZ400 400 KHz (classic 'v1' (not v2) de la FLORE pixels, WS2811 drivers)
// NEO_GRB Pixel are wired for GRB bitstream (most NeoPixel products)
// NEO_RGB Pixel are wired for RVB bitstream (v1 FLORE pixels, not v2)
// NEO_RGBW Pixel are wired for RGBW bitstream (NeoPixel RGBW products)

#define analogPinLeft A5 // Left Audio Channel, connected to analog pin A5

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

void setup()
{   strip.begin();           // INITIALIZE NeoPixel strip object (REQUIRED)   strip.show();            // Turn OFF all pixel ASAP   strip.setBrightness(BRIGHTNESS); // Set BRIGHTNESS to about 1/5 (max = 255)   Base_Left = analogRead(analogPinLeft);   Base_Left += analogRead(analogPinLeft);   Base_Left += analogRead(analogPinLeft);   Base_Left += analogRead(analogPinLeft);   Base_Left = Base_Left / 4;   colorWipe(bande de.Couleur(255, 0, 0), 5); // Rouge   colorWipe(bande de.Couleur(255, 255, 0), 5); / jaune/   colorWipe(bande de.Couleur(0, 255, 0), 5); / Vert/   rainbowFade2White(1, 1, 1);
}

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

nulle Left_VU_Meter(octet Level_Max_Pixels, int sensibilité)
{   int val_left = 0;   val_left = analogRead(analogPinLeft);  // lecture de la broche d'entrée   val_left += analogRead(analogPinLeft);  // lecture de la broche d'entrée   val_left += analogRead(analogPinLeft);  // lire la broche d'entrée   val_left += analogRead(analogPinLeft);  // lecture de la broche d'entrée   val_left = val_left / 4;   int Signal_Strength = val_left - Base_Left;   si (Signal_Strength < 0) {     Signal_Strength = - Signal_Strength;   }   octet VU_Led_Level =  carte(Signal_Strength, 0, sensibilité , 0, Level_Max_Pixels);   pour (int i = 0; i < Level_Max_Pixels; je++) {     bande.setPixelColor(j', 0, 0, 0);  // Clear pixel de la couleur (en RAM)   }   pour les (int i = 0; i < VU_Led_Level; j'++) { // Pour chaque pixel dans la bande...     uint32_t teinte = carte(je, Level_Max_Pixels - 1, 0, 0, 21800);     uint32_t directives rgbcolor = bande.ColorHSV(teinte, 255, LUMINOSITÉ); // Teinte RVB Conversation     bande.setPixelColor(je, les directives rgbcolor);         // Ensemble des pixels de la couleur (en RAM)   }   strip.show();   // mise à Jour de la bande de match
}

nul colorWipe(uint32_t couleur, int attendre) {   pour (int i = 0; i < bande.numPixels(); j'++) { // Pour chaque pixel dans la bande de...     bande de.setPixelColor(j', couleur);         // Ensemble des pixels de la couleur (en RAM)     strip.show();                          // mise à Jour de la bande de match     délai(d'attente);                           // Pause pour un moment   }
}

vide rainbowFade2White(int attendre, int rainbowLoops, int whiteLoops) {   int fadeVal = 0, fadeMax = 100;   // Teinte du premier pixel lance un " rainbowLoops complet de boucles à travers la couleur   // la roue. Roue de couleur dispose d'une gamme de 65536 mais c'est OK si on roule plus, de sorte que   // il suffit de compter de 0 à rainbowLoops*65536, en utilisant les étapes de 256 nous avons donc   // l'avance autour de la roue à un rythme décent.   pour (uint32_t firstPixelHue = 0; firstPixelHue < rainbowLoops * 65536;        firstPixelHue += 256) {     pour (int i = 0; i < bande.numPixels(); j'++) { // Pour chaque pixel dans la bande de...       // Décalage de pixel teinte par une somme pour effectuer une révolution complète de la       // de la roue des couleurs (gamme de 65536) le long de la longueur de la bande       // (bande.numPixels() étapes):       uint32_t pixelHue = firstPixelHue + (je * 65536L / bande.numPixels());       // dép.ColorHSV() peut prendre 1 ou 3 arguments: une teinte (de 0 à 65535) ou       // vous pouvez ajouter de la saturation et de la valeur (luminosité) (chacun de 0 à 255).       // Ici, nous utilisons seulement les trois-argument variante, si l'       // deuxième valeur (saturation) est une constante 255.       bande.setPixelColor(je, bande.gamma32(bande.ColorHSV(pixelHue, 255,                                            255 * fadeVal / fadeMax)));     }     bande de.montrer();     délai(d'attente);     si (firstPixelHue < 65536) {                             // Première boucle,       si (fadeVal < fadeMax) fadeVal++;                      // fondu dans     } le reste si (firstPixelHue >= ((rainbowLoops - 1) * 65536)) { // le Dernier tour de boucle,       si (fadeVal > 0) fadeVal--;                            // sortant     } d'autre {       fadeVal = fadeMax; // Intermédiaires boucle, assurez-vous de fondu est au max     }   }   pour (int k = 0; k < whiteLoops; k++) {     pour (int j = 0; j < 256; j++) { // accélération de 0 à 255       // Remplir toute la bande avec le blanc à la correction gamma, niveau de luminosité "j":       bande.de remplissage(de bande de.Couleur de la(0, 0, 0, bande.gamma8(j)));       strip.show();     }     pour (int j = 255; j >= 0; j--) { // Rampe en bas de 255 à 0       bande.de remplissage(de bande de.Couleur de la(0, 0, 0, bande.gamma8(j)));       strip.show();     }   }
}

 

 

Jetzt können wir ein NF Analogsignal eines Lautsprechers un die Audiobuchse anschließen. Niveau d'reichen hierbei NICHT aus, messagerie unifiée unser VU-Mètre zu betreiben. Der Audio Eingang werden daher direkt mit dem Leistungsausgang der Audioquelle (max 30 Watt Crête) verbunden.


Dans den nächsten beiden Teilen dieser Reihe bauen wir einen zweiten Kanal, messagerie unifiée auch Stereosignale mit dem VU-Mètre anzeigen zu können, und de fügen, einige Einstellungsmöglichkeiten, wie zo. Empfindlichkeit und Helligkeit hinzu.
L'écriture de l'eure Fragen oder Wünsche wie immer die Kommentare.

Ich wünsche viel Spaß bei Nachbau des VU-Mètres und bis zum nächsten Mal.

Für arduinoProjekte für fortgeschrittene

8 commentaires

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.

Laisser un commentaire

Tous les commentaires sont modérés avant d'être publiés

Articles de blog recommandés

  1. ESP32 jetzt über den Boardverwalter installieren - AZ-Delivery
  2. Internet-Radio mit dem ESP32 - UPDATE - AZ-Delivery
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1 - AZ-Delivery
  4. ESP32 - das Multitalent - AZ-Delivery