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 sonore avec Arduino Nano 33 BLE

Composants et fournitures

Arduino Nano 33 BLE
× 1
Amplificateur de microphone à électret Max9814
× 1
Écran OLED I2C 0,91 pouce 128 x 32 pixels
× 1
Condensateur 4.7 nF
Selon votre filtre passe-bas RC et la fréquence de coupure sélectionnée
× 1
Condensateur 470 µF
× 1
Résistance 2K
Selon votre filtre passe-bas RC et la fréquence de coupure sélectionnée
× 1

Applications et services en ligne

Arduino IDE

À propos de ce projet

Présentation

Découvrez comment un graphique à barres réagit à la musique et au son sur un petit écran OLED. Fréquences les plus basses vers l'extrémité gauche du graphique, fréquences les plus élevées vers la droite.

Bâtiment

Connexions

  • Connectez Mic GAIN en fonction de la sensibilité qui convient le mieux à votre système :VCC au micro GAIN pour 40dB, faible sensibilité, GND au micro GAIN pour 50dB, sensibilité moyenne ou laisser flotter le micro GAIN pour 60dB, haute sensibilité.
  • Connectez la broche analogique 0 A0 vers l'ampli micro OUT
  • Connectez 3,3 V , GND , SDA (ou analogique 4 A4 ) et SCL (analogique 5 A5 ) à I2C SSD1306
  • connectez un condensateur de 470 uF entre VCC et GND dans le bus d'alimentation

Vous obtenez un bruit basse fréquence ?

Le bruit provient de tous les appareils électriques à proximité de votre système de mesure qui fonctionnent. Tous les appareils électroniques fonctionnent avec une fréquence fixe et une tension de courant alternatif (AC) avec la fréquence de 50 Hz ou 60 Hz est la fréquence de la ligne électrique dans votre pays. Vous pouvez utiliser une cage de Faraday pour éliminer facilement le bruit. Mettez votre circuit à l'intérieur d'une boîte et connectez la boîte à la terre. Reliez bien le circuit.

Brochage de l'Arduino Nano 33 BLE

En utilisant le noyau arduino AnalogRead et l'Arduino Nano 33 BLE, nous ne pouvons obtenir qu'environ 35 000 échantillons par seconde, nous ne pouvons donc pas utiliser la FFT pour les fréquences supérieures à 17,5 kHz, car nous devons lire l'horloge et faire plusieurs comparaisons dans une boucle d'attente occupée. va être prudent et prendre une limite supérieure de 8 kHz. Nous pouvons donc utiliser un simple filtre passe-bas RC pour éviter des solutions gênantes au-delà de cette fréquence.

R =180Ω C =0.1uF pour une fréquence de coupure fc =8842 [Hz]

Ici en utilisant une résistance de 2K Ohm et un condensateur de 4,7 nF pour une Fréquence de coupure fc =17000[Hz]

Calcul approximatif de la fréquence d'échantillonnage maximale

L'utilisation de la fonction Arduino analogRead() normale est trop lente pour l'échantillonnage audio, calculons donc la fréquence d'échantillonnage maximale.

Nous allons estimer le nombre d'échantillons que nous pouvons obtenir en utilisant le noyau arduino AnalogRead et l'Arduino Nano 33 BLE.

Exécutons ce petit programme pour avoir un devis.

/*
* Calcul approximatif de la fréquence d'échantillonnage maximale avec AnalogRead
*/

#define ANALOG_PIN A0

#define SAMPLES 1000000.0
int newTime;
int analogValue;
void setup() {

Serial.begin(9600);
Serial.println("Sampling. .. s'il vous plaît, attendez. ");
}

void loop() {
// mettez votre code principal ici, pour l'exécuter à plusieurs reprises :
newTime =micros ();

// 1 million d'échantillons
pour (int i =0; i <(int)SAMPLES; i++){
analogValue =analogRead(ANALOG_PIN);
}
float elapsedTimePerSampleUs =(micros()- newTime) / SAMPLES;
Serial.print("Time per sample (us):");
Serial.println(elapsedTimePerSampleUs);
Serial.print("Max sampling freq(hz):");
Serial.println(pow(10,6) /elapsedTimePerSampleUs );
}

En utilisant le noyau arduino AnalogRead et l'Arduino Nano 33 BLE, nous ne pouvons obtenir qu'environ 35 000 échantillons par seconde. L'exigence de débit approximativement double, conséquence du théorème de Nyquist, limitera notre visualiseur de spectre aux fréquences inférieures à 17 kHz. Nous pouvons utiliser un filtre passe-bas pour sauter les fréquences au-dessus de cette limite.

Nous devons lire l'horloge et faire plusieurs comparaisons dans une boucle d'attente chargée, nous allons être prudents et prendre une limite supérieure de 8 kHz.

// prendre des échantillons
pour (int i =0; i long newTime non signé =micros();
int value =analogRead(ANALOG_PIN );
vReal[i] =value;
vImag[i] =0;
while (micros() <(newTime + sampling_period_us)) {
yield();
}
}

L'interface utilisateur

L'écran est divisé en onze zones de fréquence et vous une échelle logarithmique regroupant des fréquences similaires à la façon dont l'oreille humaine les perçoit.

Les humains peuvent détecter des sons dans une gamme de fréquences d'environ 20 Hz à 20 kHz. (Les nourrissons humains peuvent en fait entendre des fréquences légèrement supérieures à 20 kHz, mais perdent une certaine sensibilité aux hautes fréquences à mesure qu'ils grandissent ; la limite supérieure chez les adultes moyens est souvent plus proche de 15-17 kHz.)

Utilisera les zones 3 à 13 (11 zones) pour notre représentation.

Chaque barre représente la valeur maximale dans la bande avec des lignes espacées et la valeur moyenne dans la bande avec un rectangle rempli.

Les valeurs sont affichées en décibels avec une référence présélectionnée obtenue de manière heuristique.

Comment ça marche ?

Les échantillons audio sont convertis en un spectre de fréquences à l'aide d'une transformée de Fourier rapide ou FFT.

Ensuite le spectre est divisé et regroupé en 14 zones et seules 11 zones sont représentées en dB.

À propos du module microphone

Microphone à électret

L'électret est un diélectrique chargé quasi-permanemment. Il est fabriqué en chauffant un matériau céramique, en le plaçant dans un champ magnétique puis en le laissant refroidir tout en restant dans le champ magnétique. C'est l'équivalent électrostatique d'un aimant permanent. Dans un microphone à électret, une tranche de ce matériau est utilisée comme partie du diélectrique d'un condensateur dans lequel le diaphragme du microphone forme une plaque. La pression acoustique déplace le diaphragme. Le mouvement de la plaque fait varier la capacité en fonction de la pression acoustique. Compte tenu de la charge fixe intégrée du diélectrique, la tension aux bornes du condensateur variera également. Le condensateur à électret est connecté à l'entrée d'un amplificateur FET intégré. Les microphones à électret sont petits, ont une excellente sensibilité, une large réponse en fréquence et généralement un coût très bas.

Amplificateur de microphone MAX9814

Le MAX9814 est un amplificateur de microphone avec contrôle automatique de gain (AGC) et polarisation de microphone à faible bruit et dispose de quelques options que vous pouvez configurer avec le breakout.

Le module MAX9814 dispose de trois réglages d'amplificateur (40dB, 50dB, 60dB). La valeur par défaut est de 60 dB, mais peut être réglée sur 40 dB ou 50 dB en connectant la broche Gain à VCC ou à la masse.

Biais interne du microphone à faible bruit 1.25V, 2Vpp. La sortie de l'ampli est d'environ 2 Vpp max sur une polarisation CC de 1,25 V, il peut donc être facilement utilisé avec n'importe quel convertisseur analogique/numérique d'une entrée jusqu'à 3,3 V.

Le rapport Attaque/Release peut également être modifié, de 1:4000 par défaut à 1:2000 ou 1:500.

Pour vous connecter directement à une entrée de ligne, vous avez besoin d'un condensateur de blocage/condensateur de couplage pour bloquer la composante CC. Vous pouvez utiliser un condensateur de blocage en série au-dessus de 1 uF, cela dépend de votre système, en cas de doute essayez de 33 uF à 100 uF. Un circuit de couplage permet aux signaux alternatifs de circuler d'une partie à l'autre tout en bloquant les composantes continues. Dans les circuits audio, cela est fait pour empêcher les composants CC de déformer la sortie audio. L'efficacité d'un condensateur de couplage dépend d'un large éventail de paramètres dépendant de la fréquence, notamment la perte d'insertion, la résistance série équivalente et la fréquence de résonance série.

Alimentation :2,7 V à 5,5 V

Sensibilité

Sensibilité , le rapport de la tension de sortie analogique ou de la valeur de sortie numérique à la pression d'entrée, est une spécification clé de tout microphone. La mise en correspondance des unités du domaine acoustique avec les unités du domaine électrique détermine l'amplitude du signal de sortie du microphone, compte tenu d'une entrée connue.

La sensibilité d'un microphone est la réponse électrique à sa sortie à une entrée acoustique standard donnée. Le signal d'entrée de référence standard pour les mesures de sensibilité du microphone est une onde sinusoïdale de 1 kHz à un niveau de pression acoustique (SPL) de 94 dB ou 1 pascal (Pa, une mesure de pression). Un microphone avec une valeur de sensibilité plus élevée a un niveau de sortie plus élevé pour une entrée acoustique fixe qu'un microphone avec une valeur de sensibilité plus faible. La sensibilité du microphone en décibels (dB) est généralement un nombre négatif ; par conséquent, une sensibilité plus élevée est une valeur absolue plus petite.

Pour les microphones analogiques, la sensibilité est généralement spécifiée en unités de dBV, c'est-à-dire en décibels par rapport à 1,0 V rms.

Niveau de référence et réponse en fréquence

La réponse en fréquence d'un microphone décrit son niveau de sortie à travers le spectre de fréquences. Les limites de fréquence haute et basse sont décrites comme les points auxquels la réponse du microphone est de 3 dB en dessous du niveau de sortie de référence à 1 kHz. Le niveau de référence à 1 kHz est habituellement normalisé à 0 dB.

Écran OLED I2C de 0,91 pouce 128 x 32 pixels

Il s'agit d'un petit écran d'environ 1" de diagonale. Il est composé de 128 x 32 pixels OLED blancs individuels, chacun étant allumé ou éteint par la puce du contrôleur. Aucun rétroéclairage n'est requis. Cela réduit la puissance requise pour faire fonctionner l'OLED.

Le modèle que nous utilisons ici n'a que quatre broches et communique avec l'Arduino en utilisant le protocole de communication I2C. Ce modèle n'a pas de broche RESET. Il vous suffit de vous connecter aux broches Arduino Uno I2C :

  • Arduino Nano : SDA (A4) ; SCL (A5) ;

Pour contrôler l'écran OLED, vous avez besoin des bibliothèques adafruit_SSD1306.h et adafruit_GFX.h. Suivez les instructions suivantes pour installer ces bibliothèques.

Nous utilisons les bibliothèques Adafruit. N'oubliez pas que vous pouvez acheter quelque chose chez Adafruit pour les soutenir.

Prochaines étapes

Arduino Nano 33 BLE utilise un peut être mieux pour obtenir des lectures analogiques. La prochaine version j'utiliserai FFT et entrée analogique optimisée pour le nrf52840.

Code

  • Visualiseur de spectre sonore pour Arduino Nano 33 BLE
Visualiseur de spectre sonore pour Arduino Nano 33 BLEArduino
Visualiseur de spectre sonore pour Arduino Nano 33 BLE
utilise arduinoFFT https://github.com/kosme/arduinoFFT
utilise Adafruit_GFX https://github.com/adafruit/Adafruit-GFX-Library
utilise Adafruit_SSD1306 https://github.com/adafruit/Adafruit_SSD1306
/* Visualiseur de spectre sonore pour Arduino Nano 33 BLE Visualiseur sonore basé sur Arduino @author Enrique Albertos Configuration matérielle requise :- Cartes Arduino ou compatibles Arduino. - Écran ssd1306 oled I2C 128x32 - Amplificateur de microphone à électret avec max9814 - En option :batterie pour une utilisation portable (autre alimentation via USB) Configuration logicielle requise :- arduinoFFT https://github.com/kosme/arduinoFFT - Adafruit_GFX https://github.com /adafruit/Adafruit-GFX-Library - Adafruit_SSD1306 https://github.com/adafruit/Adafruit_SSD1306 Connexions :- Mic GAIN :* VCC vers mic GAIN pour 40dB * GND vers mic GAIN pour 50dB * micro flottant GAIN pour 60dB - Broche analogique 0 vers sortie ampli micro - +3,3 V, GND, SDA (ou analogique 4) et SCL (analogique 5) vers I2C SSD1306 @uses arduinoFFT https://github.com/kosme/arduinoFFT @uses Adafruit_GFX https://github. com/adafruit/Adafruit-GFX-Library @uses Adafruit_SSD1306 https://github.com/adafruit/Adafruit_SSD1306 Ce programme est un logiciel libre :vous pouvez le redistribuer et/ou le modifier selon les termes de la licence publique générale GNU publiée par la Free Software Foundation, soit la version 3 de la Licence, soit (à votre choix) toute version ultérieure. Ce programme est distribué dans l'espoir qu'il sera utile, mais SANS AUCUNE GARANTIE; sans même la garantie implicite de QUALITÉ MARCHANDE ou D'ADAPTATION À UN USAGE PARTICULIER. Voir la licence publique générale GNU pour plus de détails.*/#include "arduinoFFT.h"#include #include #define SAMPLES 1024 // puissance de 2#define SAMPLING_FREQ 24000 // 12 kHz Fmax =sampleF /2 #define AMPLITUDE 100 // sensibilité#define FREQUENCY_BANDS 14#define SCREEN_WIDTH 128 // Largeur d'affichage OLED, en pixels#define SCREEN_HEIGHT 32 // Hauteur d'affichage OLED, en pixels#define BARWIDTH 11#define BARS 11#define ANALOG_PIN A0// Déclaration pour un écran SSD1306 connecté à I2C (broches SDA, SCL)#define OLED_RESET -1 // Réinitialiser la broche # (ou -1 si partage la broche de réinitialisation Arduino) Affichage Adafruit_SSD1306 (SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); double vImag[SAMPLES];double vReal[SAMPLES];unsigned long sampling_period_us;arduinoFFT fft =arduinoFFT(vReal, vImag, SAMPLES, SAMPLING_FREQ);// ajuster la référence pour supprimer le bruit de fond float reference =log10 (50.0);double coutoffFrequencies[ FREQUENCY_BANDS];void setup() { // SSD1306_SWITCHCAPVCC =générer l'affichage v tension de 3,3 V en interne si (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Adresse 0x3C pour 128x32 pour (;;); // Ne pas continuer, boucler indéfiniment } // Configurer l'affichage display.clearDisplay(); display.display(); display.setRotation(0); display.invertDisplay(false); sampling_period_us =(1.0 / SAMPLING_FREQ ) * pow(10.0, 6); // Calculez les fréquences de coupure, faites une base d'échelle logarithmique basePOt double basePot =pow(SAMPLING_FREQ / 2.0, 1.0 / FREQUENCY_BANDS); coutoffFréquences[0] =basePot; for (int i =1; i  max[index] ) { max[index] =vReal[i]; } if (hz> coutoffFrequencies[index]) { median[index] =sum / count; somme =0,0 ; compte =0 ; indice++ ; max[indice] =0 ; médiane[index] =0 ; } hz +=hzParÉchantillon ; } // calcule la médiane et le maximum par bande de fréquence if ( sum> 0.0) { median[index] =sum / count; if (median[index]> maxinband) { maxinband =median[index]; } } barre int =0; for (int i =FREQUENCY_BANDS - 1; i>=3; i--) { int newHeight =0; int newMax =0 ; // calcule les décibels réels if (median[i]> 0 &&max[i]> 0 ) { newHeight =20.0 * (log10(median[i] ) - reference); newMax =20,0 * (log10(max[i] ) - référence); } // ajuste les niveaux minimum et maximum if (newHeight <0 || newMax <0) { newHeight =1; nouveauMax =1 ; } if (newHeight>=SCREEN_HEIGHT - 2) { newHeight =SCREEN_HEIGHT - 3; } if (newMax>=SCREEN_HEIGHT - 2) { newMax =SCREEN_HEIGHT - 3; } int barX =bar * BARWIDTH + 5; // supprime l'ancien niveau médian if (oldHeight[i]> newHeight) { display.fillRect(barX, newHeight + 1, 7, oldHeight[i], SSD1306_BLACK); } // supprimer l'ancien niveau max if ( oldMax[i]> newHeight) { for (int j =oldMax[i]; j> newHeight; j -=2) { display.drawFastHLine(barX , j, 7, SSD1306_BLACK); } } // peindre le nouveau niveau max pour (int j =newMax; j> newHeight; j -=2) { display.drawFastHLine(barX , j, 7, SSD1306_WHITE); } // peindre le nouveau niveau médian display.fillRect(barX , 1, 7, newHeight, SSD1306_WHITE); ancienMax[i] =nouveauMax ; ancienneHauteur[i] =nouvelleHauteur; barre++ ; } display.drawFastHLine(0 , SCREEN_HEIGHT - 1, SCREEN_WIDTH, SSD1306_WHITE); display.display();}

Schémas

soundspectrumvisualizer_qLzRsVPVlc.fzz

Processus de fabrication

  1. Jeu Arduino Pong - Écran OLED
  2. Surveillance du CO2 avec le capteur K30
  3. Communication sourds-aveugles avec 1Sheeld/Arduino
  4. Contrôler l'accepteur de pièces avec Arduino
  5. Arduino avec Bluetooth pour contrôler une LED !
  6. Arduino Nano :contrôler 2 moteurs pas à pas avec joystick
  7. Envoyer des données avec le son
  8. Compteur Geiger portable avec Arduino Nano
  9. Mesure du rayonnement solaire avec Arduino