Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Visualiseur de spectre audio RVB 32 bandes

Composants et fournitures

Arduino Nano R3
× 1
WS2812B 8x32 RGB LED MATRIX
× 1
Résistance 4.75k ohm
× 3
Résistance 100k ohm
× 2
Résistance 10k ohm
× 1
Résistance à trou traversant, 390 ohm
× 1
Condensateur 100 nF
× 2
Condensateur 1000 µF
× 1
Interrupteur à bouton-poussoir SparkFun 12mm
× 1
Carte prototype multitrous 4x6 cm
× 1

Outils et machines nécessaires

Fer à souder (générique)
Câble répartiteur Jack 3,5 mm

À propos de ce projet

Le projet

Ce projet vise à créer un visualiseur de spectre de fréquences audio (musique) RVB 32 bandes à l'aide d'Arduino Nano et d'une matrice de LED RVB 8x32 WS2812B.

Le projet original qui a inspiré ceci

Un grand merci à Shajeeb auteur du projet original basé sur la matrice led MAX72xx. J'ai uniquement modifié la partie pilote de la matrice de leds pour l'adapter à la matrice de leds RGB WS2812B.

Lien vers le projet d'origine :analyseur de visualisation de spectre audio 32 bandes

La matrice de LED RVB WS2812B

En utilisant une matrice LED RVB basée sur des LED haute luminosité 5050 SMD, il est nécessaire d'utiliser une alimentation externe car la matrice RVB peut absorber plus de 10mA par LED, donc avec toutes les LED allumées à la luminosité maximale pourrait absorber plus de 2,5 Ampères.

Pour cette raison j'ai inséré une diode en série à +5V afin de pouvoir alimenter Arduino en mode stand alone, lorsque le câble USB n'est pas connecté, et pour éviter qu'Arduino soit la source d'alimentation de la matrice RGB, donc vous évitez surchargeant les circuits internes de la carte avec un courant qu'elle ne pourrait pas fournir.

Au projet d'origine, en plus de la diode d'entrée, pour protéger l'entrée de la matrice LED contre d'éventuels pics de tension, j'ai également ajouté une résistance de 390 ohms en série entre la broche Arduino D6 et l'entrée de données, et un condensateur de 1000 µF 12V pour améliorer la stabilité de la tension d'alimentation Arduino.

Assemblage du matériel

Comme visible sur la photo principale j'ai réalisé le premier prototype sur une carte multi-trous 4x6 cm à l'aide de deux prises audio RCA (soudées directement sur la carte) qui peuvent également être remplacées par une prise Jack 3,5 mm femelle. L'important pour éviter le ronflement est de faire les connexions entre la source et l'entrée audio de la carte avec un câble blindé. Une autre astuce consiste à garder la connexion entre l'Arduino et la matrice LED aussi courte que possible.

Le code

Au final, tout le logiciel est basé sur le grand travail effectué par l'auteur de la procédure d'échantillonnage à travers la librairie FFT et la réalisation définitive de Shajeeb.

J'ai ajouté deux fonctions :

Le premier est GetLedFromMatrix(...) pour mapper la matrice en lignes et en colonnes et pour pouvoir adresser chacune des 256 LED via les coordonnées de ligne et de colonne.

Le second est celui - que j'ai arbitrairement appelé SetColumn(...) - qui allume les leds de chaque colonne en fonction de la valeur crête obtenue par numérisation audio (valeurs comprises entre 0 et 7 ) et sur la base des couleurs prédéfinies dans un tableau à deux dimensions. Vous pouvez vous amuser à changer les valeurs et donc les couleurs à votre guise. Pour simplifier le code, j'ai utilisé une sobroutine appelée Wheel() (tirée d'une démo attachée à la bibliothèque Neopixel d'Adafruit) qui, à partir d'une valeur comprise entre 0 et 255, renvoie une valeur longue de 32 bits non signée à transmettre directement à la fonction setPixelColor. Sur ce, vous pouvez jouer à volonté, en gardant à l'esprit les limitations de mémoire d'Arduino en évitant autant que possible l'utilisation de variables 32 bits pour stocker les valeurs de couleurs RVB.

Audio égalisation

De plus, depuis que j'ai fait les tests avec l'audio provenant de la carte son intégrée à la carte mère du PC, afin d'améliorer la réponse en fréquence, j'ai ajouté un tableau d'octets de 32 valeurs qui constituent en fait une courbe d'égalisation pour atténuer les basses et rehausser les aigus. Si vous n'en avez pas besoin, définissez simplement la variable EQ_ON sur false ou modifier le niveau d'atténuation en modifiant les 32 valeurs de l'eq[32] tableau, une valeur de 100 laisse l'amplitude inchangée, un inférieur à 100 atténue et un supérieur à 100 accentue la bande de fréquence.

Conduite luminosité

La luminosité de la matrice est préréglée dans le code à 32 (BRIGHTNESS const). La valeur de luminosité maximale de la matrice WS2812B (sur papier) est de 255 mais déjà avec des valeurs supérieures à 100, la lumière LED passe malheureusement du blanc au jaune pâle, il faut probablement alimenter la matrice via les deux fils central rouge et noir à la place du connecteur latéral droit.

J'essaye toujours...

Enfin, si vous utilisez une luminosité maximale de 64, une alimentation 1A est probablement suffisante, sinon 2A est indispensable.

Mise à jour future

Je travaille sur une nouvelle version qui utilise le OpenMusicLabs FHT bibliothèque qui s'avère être plusieurs fois plus rapide que l'Arduino FFT.

Restez à l'écoute. :)

S'il vous plaît pardonnez mon mauvais anglais, j'ai utilisé le traducteur google.

Code

  • Spectrum_Analyzer_WS2812B.ino
Spectrum_Analyzer_WS2812B.inoArduino
/* Copyright (c) 2019 Shajeeb TM L'autorisation est par la présente accordée, gratuitement, à toute personne obtenant une copie de ce logiciel et des fichiers de documentation associés (le « Logiciel »), de traiter le Logiciel sans restriction, y compris sans limitation les droits d'utilisation, de copie, de modification, de fusion, de publication, de distribution, de sous-licence et/ou de vente de copies du Logiciel, et de permettre aux personnes auxquelles le Logiciel est fourni de le faire, sous réserve des conditions suivantes :l'avis de droit d'auteur et cet avis d'autorisation doivent être inclus dans toutes les copies ou parties substantielles du logiciel. LE LOGICIEL EST FOURNI « EN L'ÉTAT », SANS GARANTIE D'AUCUNE SORTE, EXPRESSE OU IMPLICITE, Y COMPRIS, MAIS SANS S'Y LIMITER, LES GARANTIES DE QUALITÉ MARCHANDE, D'ADAPTATION À UN USAGE PARTICULIER ET D'ABSENCE DE CONTREFAÇON. EN AUCUN CAS LES AUTEURS OU TITULAIRES DE DROITS D'AUTEUR NE SERONT RESPONSABLES DE TOUTE RÉCLAMATION, DOMMAGES OU AUTRE RESPONSABILITÉ, QU'IL SOIT DANS UNE ACTION DE CONTRAT, DÉLIT OU AUTRE, DÉCOULANT DE, OU EN RELATION AVEC LE LOGICIEL OU L'UTILISATION OU D'AUTRES TRANSACTIONS DANS LE LOGICIEL. WS2812B Led Matrix vesion par Janux*/#include #include #include #define SAMPLES 64 //Doit être une puissance de 2#define xres 32 // Nombre total de colonnes dans l'affichage, doit être <=SAMPLES/2#define yres 8 // Nombre total de lignes dans l'affichage#define ledPIN 6 // pinte pour contrôler Led Matrix#define NUM_LEDS (xres * yres)#define BRIGHTNESS 32#define buttonPin 5 // le numéro de la broche du bouton-poussoir pour changer displaycolorbyte yvalue;byte displaycolumn, displayvalue;int peaks[xres];byte state =HIGH; // la lecture actuelle du pinbyte d'entrée previousState =LOW; // la lecture précédente du pinbyte d'entrée displaycolor =0; // Tableaux pour sampligdouble vReal[SAMPLES];double vImag[SAMPLES];byte data_avgs[xres];arduinoFFT FFT =arduinoFFT(); // Objet FFT non signé long lastDebounceTime =0; // la dernière fois que la broche de sortie a été basculée unsigned long debounceDelay =100; // le temps de rebond ; augmenter si la sortie clignote// Paramètre 1 =nombre de leds dans la matrice// Paramètre 2 =numéro de broche (la plupart sont valides)// Paramètre 3 =drapeaux de type de pixel, additionner au besoin:// NEO_KHZ800 800 KHz bitstream (la plupart des NeoPixel produits avec LED WS2812)// NEO_KHZ400 400 KHz (pixels FLORA classiques 'v1' (pas v2), pilotes WS2811)// Les pixels NEO_GRB sont câblés pour le flux binaire GRB (la plupart des produits NeoPixel)// Les pixels NEO_RGB sont câblés pour le flux binaire RVB ( pixels v1 FLORA, pas v2)Adafruit_NeoPixel pixel =Adafruit_NeoPixel(NUM_LEDS, ledPIN, NEO_GRB + NEO_KHZ800); // Filtre EQ pour atténuer les basses et améliorer les aigus // Utile sur la carte son PC qui a généralement beaucoup de basses et une mauvaise haute fréquence bool EQ_ON =true; // défini sur false pour désactiver 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 } ;//Définir la couleur pour une seule LED, utilisé dans la fonction setColumn, 0 pour la couleur personnalisée//Les couleurs sont calculé par la fonction Wheel, voir ci-dessous les couleurs des octets[][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.setBrightness(LUMINOSITÉ); // Commencer les opérations FFT ADCSRA =0b11100101; // définit l'ADC en mode d'exécution libre et définit le pré-scalaire sur 32 (0xe5) ADMUX =0b00000000 ; // utilise la broche A0 et la référence de tension externe}boucle vide() { // ++ Échantillonnage pour (int i =0; i  peaks[i]) peaks[i] =yvalue; //enregistrer le pic si> pic précédent yvalue =pics[i]; colonne d'affichage =i; valeur d'affichage =valeur y ; setColumn(displaycolumn, displayvalue); // dessine des buckets } pixel.show(); // afficher les buckets displaycolorChange(); // vérifier si le bouton est enfoncé pour changer le mode couleur}//-------------------------------------- ----------------------------// Leds lumineuses de la colonne x selon la valeur yvoid setColumn(byte x, byte y) { byte led , je; pour (i =0; i  i) { switch (displaycolor) { case 4 ://mettre zéro 0 sur la valeur du tableau pour personnaliser la couleur des pics if (colors[displaycolor][i]> 0) { //couleur normale définie sur le tableau de couleurs pixel.setPixelColor(led, Wheel(colors[displaycolor][i])); } else { //couleur personnalisée pour les pics uniquement avec 0 sur la valeur du tableau pixel.setPixelColor(led, 255, 255, 255); //Led nombre, valeurs R, G, B } break; case 5://changer la couleur par colonne pixel.setPixelColor(led, Wheel(x * 16)); Pause; cas 6 ://changer la couleur par ligne pixel.setPixelColor(led, Wheel(i * 36)); Pause; par défaut ://display color set -> displaycolor de 0 à 3 //les couleurs sont définies sur le tableau de couleurs pixel.setPixelColor(led, Wheel(colors[displaycolor][i])); } // END SWITCH } else { pixel.setPixelColor(led, 0); } }}//=======================================================================// Calculer un nombre led par les coordonnées x,y// valable pour WS2812B avec une disposition en serpentin placée à l'horizontale// et zéro led en bas à droite (connecteur d'entrée sur le côté droit) // valeur d'entrée :x=0-31, y=0-7, renvoie un numéro de led de 0 à 255//========================================================================octet GetLedFromMatrix (octet x, octet y) { x =xres - x - 1; if (x &0x01) { // Les colonnes impaires augmentent en arrière return ((x + 1) * yres - y - 1); } else { // Les colonnes paires augmentent normalement return ((x + 1) * yres - yres + y); }}//========================================================================void displaycolorChange() { int lecture =digitalRead(buttonPin); if (lecture ==HIGH &&previousState ==LOW &&millis() - lastDebounceTime> debounceDelay) // ne fonctionne que lorsque vous appuyez sur { displaycolor++; if (displaycolor> 6) displaycolor =0; lastDebounceTime =millis(); } previousState =read;}/* Utilitaire d'Adafruit Neopixel demo sketch Entrez une valeur de 0 à 255 pour obtenir une valeur de couleur. Les couleurs sont une transition R - G - B - retour à 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); } RouePos -=170 ; return pixel.Color(WheelPos * 3, 255 - WheelPos * 3, 0);}

Pièces et boîtiers personnalisés

arduino_rgb_audio_analyzer_lX4Dv4Pta2.zip

Schémas


Processus de fabrication

  1. 32 (Linier) / 11 (Pseudo Log)
  2. Alarme de soif d'usine
  3. Horloge de mots italienne
  4. Compteur kWh Sigfox
  5. Moniteur de température Bluetooth
  6. Serrure à commande gestuelle
  7. Le compagnon IC
  8. Une entrée analogique isolée pour Arduino
  9. Mesurez votre temps de réaction