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 FHT

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
× 2
Résistance à trou traversant, 390 ohm
× 1
1N4007 – Diode haute tension et courant nominal élevé
Même un 1N4004 fera l'affaire
× 1
Condensateur 100 nF
× 2
Condensateur 1000 µF
× 1
Interrupteur à bouton-poussoir SparkFun 12mm
Ou deux boutons du panneau si vous prévoyez d'insérer le circuit dans une boîte
× 2
Carte prototype générique 4x6 cm
× 1
Prise femelle RCA stéréo PCB
× 1

Outils et machines nécessaires

Fer à souder (générique)
Câble jack audio 3,5 mm vers connecteur RCA stéréo

À propos de ce projet

La bibliothèque Arduino FHT

FHT fait exactement le même travail que le FFT plus connu, mais contrairement à celui-ci, il n'utilise que des données réelles, tandis que FFT fonctionne sur des données complexes, donc FHT utilise la moitié de la puissance de traitement et la moitié de la mémoire système.

Cette bibliothèque utilise un seul tableau pour l'échantillonnage des données au lieu de deux, un pour les valeurs réelles et un pour les valeurs imaginaires, utilisé par FFT lib, il simplifie également les calculs mathématiques complexes en évitant les boucles avec des calculs logarithmiques complexes à virgule flottante et utilise à la place des tableaux numériques .

L'inconvénient est qu'il renvoie toujours la moitié des valeurs de la taille du tableau utilisé pour effectuer l'échantillonnage, cela entraîne une certaine perte de résolution et de précision aux deux extrémités de la plage audio. Cependant, dans le cas précis on n'a pas à développer un instrument de mesure mais un simple gadget, on n'a pas besoin d'une précision extrême, il suffit d'allumer une poignée de leds en rythme musical.

Bien entendu ce n'est pas le bon endroit pour discuter de la modalité de fonctionnement de la bibliothèque FHT, toute personne souhaitant en savoir plus peut se référer au site d'Open Music Lab où elle trouvera toute la documentation nécessaire pour comprendre les astuces utilisées, l'explication détaillée du diverses fonctions et quelques exemples génériques déjà écrits pour Arduino.

La librairie FFT est rapide, si rapide qu'il a fallu insérer un délai dans le code pour réduire le scintillement. Vous remarquerez immédiatement le résultat final, l'affichage est beaucoup plus rapide et réactif que la version qui utilise la librairie FFT qui semblait souvent être à la traîne de la musique. Une utilisation moindre des ressources système nous a permis d'ajouter quelques lignes de code pour gérer des fonctions supplémentaires.

La nouvelle version

Le projet est identique à la version précédente, donc ceux qui ont déjà fait la précédente n'ont qu'à ajouter un bouton et une résistance de 10K et mettre à jour le code.

En plus de l'implémentation de la bibliothèque FHT, cette version dispose des fonctions supplémentaires suivantes :

  • a un bouton supplémentaire pour le réglage de la luminosité ;
  • permet d'enregistrer les paramètres de couleur et de luminosité dans l'EEPROM afin de les recharger la prochaine fois qu'il est allumé ;
  • affiche le niveau des paramètres de couleur et de luminosité lorsque les boutons sont enfoncés et lorsqu'ils sont allumés (peut être désactivé).

Code

  • Version du code FHT
Version du code FHTArduino
/* Copyright (c) 2020 Janux 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 des 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 :Le droit d'auteur ci-dessus avis et cet avis d'autorisation doit ê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. Basé sur un projet original pour la matrice LED MAX72xx et la bibliothèque FFT fabriqués à partir de Shajeeb. Section des paramètres de configuration basée sur le travail de Ragnar Ranøyen Homb de Norvegian Creation.*/#define LIN_OUT 1 //Magnitude de sortie linéaire FHT#define FHT_N 128 //définir les ÉCHANTILLONS pour FHT, doit être une puissance de 2#include  #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 //out pint to control Leds#define NUM_LEDS (xres * yres) //total des leds dans Matrix#include #define colorPIN 5 //pin pour changer la couleur de led#define lightingPIN 10 //pin pour changer la luminosité displaycolor =0; //valeur de couleur par défaut luminosité de l'octet =1 ; //niveau de luminosité par défaut#include #define CONFIG_START 32 //Emplacement de démarrage de la mémoire#define CONFIG_VERSION "VER01" //Config version configurationtypedef struct { char version[6]; octet displaycolor; octet luminosité;} type_configuration;type_configuration CONFIGURATION ={ CONFIG_VERSION, couleur d'affichage, luminosité};octet yvalue;int pics[xres];octet état =HAUT ; // la lecture actuelle du pinbyte d'entrée previousState =LOW; // la lecture précédente de l'entrée pinunsigned 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 flickersbyte data_avgs[xres] ; //Tableau pour l'échantillonnage// Paramètre 1 =nombre de LED dans la matrice// Paramètre 2 =numéro de broche// Paramètre 3 =drapeaux de type de pixel, additionnez si nécessaire:// NEO_KHZ800 800 KHz Bitstream (la plupart des produits NeoPixel 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 FLORA v1, non v2)Adafruit_NeoPixel pixel =Adafruit_NeoPixel(NUM_LEDS, ledPIN, NEO_GRB + NEO_KHZ800); // EQ filterbyte eq[32] ={ 60, 65, 70, 75, 80, 85, 90, 95, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 115, 125, 140, 160, 185, 200, 200, 200} ;bool EQ_ON =vrai ; // défini sur false pour désactiver l'eq//définit 5 jeux de couleurs pour les LED, 0 pour les couleurs colorbyte personnalisées uniques[][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, 110, 0}} ;//Définir les caractères pour les paramètres d'affichagebyte charBitmap[] ={ 0x1C, 0x10, 0x10, 0x10, 0x10, 0x1C, 0x08, 0x18, 0x08, 0x08, 0x08, 0x1C, 0x0C, 0x12, 0x04, 0x08, 0x10, 0x1E, 0x0C, 0x12, 0x02, 0x06, 0x12, 0x0C, 0x10, 0x10, 0x10, 0x14, 0x1E, 0x0x0, 0x1 0x02, 0x12, 0x0C, 0x1E, 0x10, 0x10, 0x1E, 0x12, 0x1E, 0x1E, 0x02, 0x04, 0x08, 0x08, 0x08, 0x0C, 0x12, 0x0C, 0x12, 0x12, 0x0C, 012,1C 0x12, 0x1C};void setup() { pixel.begin(); //initialiser la matrice Led //Commencer les opérations FFT ADCSRA =0b11100101; // définissez l'ADC sur le mode d'exécution libre et définissez le pré-scaler sur 32 (0xe5) ADMUX =0b00000000 ; // utiliser la broche A0 et la référence de tension externe // Lire les données de configuration de l'EEPROM if (loadConfig()) { displaycolor =CONFIGURATION.displaycolor; luminosité =CONFIGURATION.luminosité; } //Définir la luminosité chargée à partir de l'EEPROM pixel.setBrightness(luminosité * 24 + 8); //Afficher la configuration actuelle au démarrage //changer true en false si vous ne voulez pas ce showSettings(3, true);}void loop() { while (1) { // réduit la gigue Sampling(); // La bibliothèque FHT n'utilise qu'un seul tableau de données RearrangeFHT(); // réorganise le résultat FHT pour qu'il corresponde à no. des colonnes d'affichage SendToDisplay(); // envoyer à l'affichage en fonction de la valeur mesurée colorChange(); // vérifie si le bouton est enfoncé pour changer la couleur brightChange(); // vérifie si le bouton est enfoncé pour modifier le délai de luminosité (10) ; // retard pour réduire le scintillement (FHT est trop rapide :D) }} void Sampling() { for (int i =0; i  peaks[i]) peaks[i] =yvalue; // enregistrer le pic if> previuos pic yvalue =pics[i]; // sélectionne le pic pour afficher setColumn(i, yvalue); // dessine des colonnes } pixel.show(); // show column}// Allume les leds de la colonne x en fonction de la valeur yvoid setColumn(byte x, byte y) { int led, i; pour (i =0; i  i) { switch (displaycolor) { case 4:if (colors[displaycolor][i] ==0) { // affiche la couleur personnalisée avec une valeur zéro dans le tableau pixel.setPixelColor(led, 255, 255, 255); //avec } else { // couleur standard définie dans le tableau de couleurs pixel.setPixelColor(led, Wheel(colors[displaycolor][i])); } Pause; 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 * y * 3)); Pause; cas 7 ://changer la couleur par... pays :D //Italie flagh //if (x <11) pixel.setPixelColor(led, 0, 255, 0); //if (x> 10 &&x <21) pixel.setPixelColor(led, 255, 255, 255); //si (x> 20) pixel.setPixelColor(led, 255, 0, 0); //étoiles et rayures if (i  debounceDelay) { displaycolor++; if (displaycolor> 7) displaycolor =0; showSettings(1, vrai); //mettre à false si vous ne voulez pas ce saveConfig(); lastDebounceTime =millis(); } previousState =read;}void lightingChange() { int reading =digitalRead(brightnessPIN); if (lecture ==HAUT &&previousState ==BAS &&millis() - lastDebounceTime> debounceDelay) { luminosité++; si (luminosité> 7) luminosité =0 ; pixel.setBrightness(luminosité * 24 + 8); showSettings(2, true); //mettre à false si vous ne voulez pas ce saveConfig(); 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);}// charge le contenu de l'EEPROM dans la CONFIGURATION locale s'il s'agit d'un paramètre valideint loadConfig() { if (EEPROM.read(CONFIG_START + 0) ==CONFIG_VERSION[0] &&EEPROM.read(CONFIG_START + 1) ==CONFIG_VERSION[1] &&EEPROM.read(CONFIG_START + 2) ==CONFIG_VERSION[2] &&EEPROM.read(CONFIG_START + 3) ==CONFIG_VERSION[3 ] &&EEPROM.read(CONFIG_START + 4) ==CONFIG_VERSION[4]) { // charge (écrase) la structure de configuration locale pour (unsigned int i =0; i =0; x--) { for (int y =5; y>=0; y--) { if ((charBitmap[val * 6 + 5 - y]>> x) &0x01) { pixel.setPixelColor(GetLedFromMatrix(4 - x + pos, y + 1), Wheel((pos> 10) * 170)); pixel.show(); } } }}//par Janux®, Dernière version le 28/06/2020.

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