Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Sound Spectrum Visualizer mit Arduino Nano 33 BLE

Komponenten und Verbrauchsmaterialien

Arduino Nano 33 BLE
× 1
Elektret-Mikrofonverstärker Max9814
× 1
0,91-Zoll-OLED-I2C-Display 128 x 32 Pixel
× 1
Kondensator 4,7 nF
Abhängig von Ihrem RC-Tiefpassfilter und Ihrer gewählten Grenzfrequenz
× 1
Kondensator 470 µF
× 1
Widerstand 2K
Abhängig von Ihrem RC-Tiefpassfilter und Ihrer gewählten Grenzfrequenz
× 1

Apps und Onlinedienste

Arduino-IDE

Über dieses Projekt

Einführung

Sehen Sie auf einem kleinen OLED-Display, wie ein Balkendiagramm auf Musik und Ton reagiert. Niedrigste Frequenzen am linken Ende des Diagramms, höchste Frequenzen am rechten Ende.

Bau

Verbindungen

  • Verbinden Sie Mic GAIN je nach Empfindlichkeit, die besser zu Ihrem System passt:VCC GAIN mikrofonieren für 40dB, geringe Empfindlichkeit, GND GAIN mikrofonieren für 50 dB, mittlere Empfindlichkeit oder lassen Sie das Mikrofon schweben GAIN für 60dB, hohe Empfindlichkeit.
  • Anschließen des analogen Pins 0 A0 zum Mikrofonverstärker OUT
  • Anschließen von 3,3 V , GND , SDA (oder analog 4 A4 ) und SCL (analog 5 A5 ) zu I2C SSD1306
  • verbinden Sie einen 470-uF-Kondensator zwischen VCC und GND im Strombus

Bekommst du niederfrequentes Rauschen?

Das Rauschen kommt von allen elektrischen Geräten in der Nähe Ihres Messsystems, die funktionieren. Alle elektronischen Geräte arbeiten mit einer festen Frequenz und Wechselstromspannung (AC) mit einer Frequenz von 50 Hz oder 60 Hz ist die Netzfrequenz in Ihrem Land. Sie können einen Faraday-Käfig verwenden, um das Rauschen leicht zu eliminieren. Legen Sie Ihre Schaltung in eine Box und verbinden Sie die Box mit Masse. Erden Sie den Stromkreis gut.

Pinbelegung von Arduino Nano 33 BLE

Mit Arduino Core AnalogRead und dem Arduino Nano 33 BLE können wir nur etwa 35.000 Samples pro Sekunde erhalten, daher können wir FFT nicht für Frequenzen über 17,5 Khz verwenden, da wir die Uhr lesen und in einer geschäftigen Warteschleife mehrere Vergleiche anstellen müssen Seien Sie vorsichtig und nehmen Sie eine Obergrenze von 8 kHz. Wir können also einen einfachen RC-Tiefpassfilter verwenden, um störende Lösungen jenseits dieser Frequenz zu vermeiden.

R =180Ω C =0.1uF für eine Grenzfrequenz fc =8842 [Hz]

Hier mit einem 2K Ohm Widerstand und einem 4,7 nF Kondensator für eine Grenzfrequenz fc =17000[Hz]

Grobe Berechnung der maximalen Abtastrate

Die Verwendung der normalen Arduino-Funktion analogRead() ist für das Abtasten von Audio zu langsam, also berechnen wir die maximale Abtastrate.

Wir werden schätzen, wie viele Samples wir mit Arduino Core AnalogRead und Arduino Nano 33 BLE erhalten können.

Lassen Sie uns dieses kleine Programm ausführen, um eine Schätzung zu erhalten.

/*
* Grobberechnung der maximalen Abtastrate mit AnalogRead
*/

#define ANALOG_PIN A0

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

Serial.begin(9600);
Serial.println("Sampling. .. bitte, warten Sie. ");
}

void loop() {
// Geben Sie Ihren Hauptcode hier ein, um ihn wiederholt auszuführen:
newTime =micros ();

// 1 Million Samples
for (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);
}

Mit Arduino Core AnalogRead und dem Arduino Nano 33 BLE können wir nur etwa 35.000 Samples pro Sekunde erhalten. Das Erfordernis einer ungefähr doppelten Rate, eine Folge des Nyquist-Theorems, wird unseren Spektrum-Visualisierer auf Frequenzen unter 17 kHz beschränken. Wir können einen Tiefpassfilter verwenden, um Frequenzen oberhalb dieser Grenze zu überspringen.

Wir müssen die Uhr lesen und in einer geschäftigen Warteschleife mehrere Vergleiche anstellen, wir werden vorsichtig sein und eine Obergrenze von 8 kHz nehmen.

// Proben nehmen
for (int i =0; i unsigned long newTime =micros();
int value =analogRead(ANALOG_PIN );
vReal[i] =Wert;
vImag[i] =0;
while (micros() <(newTime + sample_period_us)) {
yield();
}
}

Die Benutzeroberfläche

Der Bildschirm ist in elf Frequenzzonen unterteilt und Sie haben eine logarithmische Skala, die Frequenzen gruppiert, ähnlich wie das menschliche Ohr sie wahrnimmt.

Der Mensch kann Geräusche in einem Frequenzbereich von etwa 20 Hz bis 20 kHz wahrnehmen. (Menschliche Säuglinge können tatsächlich Frequenzen über 20 kHz hören, verlieren jedoch mit zunehmendem Alter etwas an Hochfrequenzempfindlichkeit; die Obergrenze bei durchschnittlichen Erwachsenen liegt oft näher bei 15–17 kHz.)

Wird die Zonen 3 bis 13 (11 Zonen) für unsere Vertretung verwenden.

Jeder Balken stellt den Maximalwert im Band mit Abstandslinien und den Mittelwert im Band mit einem ausgefüllten Rechteck dar.

Die Werte werden in Dezibel mit einer vorgewählten Referenz angezeigt, die auf heuristische Weise erhalten wurde.

Wie funktioniert es?

Die Audiosamples werden mit einer schnellen Fourier-Transformation oder FFT in ein Frequenzspektrum umgewandelt.

Dann wird das Spektrum unterteilt und in 14 Zonen gruppiert und nur 11 Zonen werden in dB dargestellt.

Über das Mikrofonmodul

Elektret-Mikrofon

Elektret ist ein quasi-permanent geladenes Dielektrikum. Es wird hergestellt, indem ein keramisches Material erhitzt wird, es in ein Magnetfeld gelegt und dann abkühlen lässt, während es sich noch im Magnetfeld befindet. Es ist das elektrostatische Äquivalent eines Permanentmagneten. In einem Elektretmikrofon wird eine Scheibe dieses Materials als Teil des Dielektrikums eines Kondensators verwendet, bei dem die Membran des Mikrofons eine Platte bildet. Schalldruck bewegt die Membran. Die Bewegung der Platte verändert die Kapazität entsprechend dem Schalldruck. Aufgrund der eingebauten festen Ladung des Dielektrikums variiert auch die Spannung am Kondensator. Der Elektretkondensator ist mit dem Eingang eines eingebauten FET-Verstärkers verbunden. Elektretmikrofone sind klein, haben eine ausgezeichnete Empfindlichkeit, einen breiten Frequenzgang und im Allgemeinen sehr niedrige Kosten.

MAX9814 Mikrofonverstärker

Der MAX9814 ist ein Mikrofonverstärker mit automatischer Verstärkungsregelung (AGC) und rauscharmer Mikrofonvorspannung und verfügt über einige Optionen, die Sie mit dem Breakout konfigurieren können.

Das Modul MAX9814 verfügt über drei Verstärkereinstellungen (40dB, 50dB, 60dB). Der Standardwert ist 60 dB, kann aber auf 40 dB oder 50 dB eingestellt werden, indem der Gain-Pin auf VCC oder Masse gelegt wird.

Interne rauscharme Mikrofonvorspannung 1,25 V, 2 Vpp. Der Ausgang des Verstärkers beträgt ca. 2 Vpp max bei einer Vorspannung von 1,25 V DC, sodass er problemlos mit jedem Analog/Digital-Wandler mit einem Eingang von bis zu 3,3 V verwendet werden kann.

Das Attack/Release-Verhältnis kann ebenfalls von der Standardeinstellung 1:4000 auf 1:2000 oder 1:500 geändert werden.

Für den direkten Anschluss an einen Line-Eingang benötigen Sie einen Sperrkondensator / Koppelkondensator zur Sperrung des Gleichstromanteils. Sie können einen Sperrkondensator in Reihe über 1uF verwenden, abhängig von Ihrem System, im Zweifelsfall von 33uF bis 100uF versuchen. Eine Kopplungsschaltung ermöglicht den Fluss von Wechselstromsignalen von einem Teil zum anderen, während die Gleichstromkomponenten blockiert werden. In Audioschaltungen geschieht dies, um zu verhindern, dass DC-Komponenten die Audioausgabe verzerren. Die Wirksamkeit eines Koppelkondensators hängt von einer breiten Palette frequenzabhängiger Parameter ab, einschließlich Einfügungsdämpfung, äquivalentem Serienwiderstand und Serienresonanzfrequenz.

Stromversorgung:2,7V bis 5,5V

Empfindlichkeit

Empfindlichkeit , das Verhältnis der analogen Ausgangsspannung oder des digitalen Ausgangswertes zum Eingangsdruck, ist eine wichtige Spezifikation jedes Mikrofons. Die Zuordnung von Einheiten im akustischen Bereich zu Einheiten im elektrischen Bereich bestimmt die Größe des Mikrofonausgangssignals bei einem bekannten Eingang.

Die Empfindlichkeit eines Mikrofons ist die elektrische Reaktion an seinem Ausgang auf einen gegebenen akustischen Standardeingang. Das Standard-Referenzeingangssignal für Mikrofonempfindlichkeitsmessungen ist eine 1-kHz-Sinuswelle bei 94 dB Schalldruckpegel (SPL) oder 1 Pascal (Pa, eine Druckmessung). Ein Mikrofon mit einem höheren Empfindlichkeitswert hat einen höheren Pegelausgang für einen festen akustischen Eingang als ein Mikrofon mit einem niedrigeren Empfindlichkeitswert. Die Mikrofonempfindlichkeit in Dezibel (dB) ist normalerweise eine negative Zahl; daher ist eine höhere Empfindlichkeit ein kleinerer absoluter Wert.

Bei analogen Mikrofonen wird die Empfindlichkeit typischerweise in dBV-Einheiten angegeben, d. h. Dezibel bezogen auf 1,0 V rms.

Referenzpegel und Frequenzgang

Der Frequenzgang eines Mikrofons beschreibt seinen Ausgangspegel über das Frequenzspektrum. Die oberen und unteren Frequenzgrenzen werden als die Punkte beschrieben, an denen die Mikrofonantwort 3 dB unter dem Referenzausgangspegel bei 1 kHz liegt. Der Referenzpegel bei 1 kHz wird üblicherweise auf 0 dB normiert.

0,91 Zoll OLED I2C Display 128 x 32 Pixel

Dies ist ein kleines Display mit einer Diagonale von nur ca. 1 Zoll. Es besteht aus 128 x 32 einzelnen weißen OLED-Pixeln, die jeweils vom Controller-Chip ein- oder ausgeschaltet werden. Es ist keine Hintergrundbeleuchtung erforderlich. Dadurch wird der zum Betrieb der OLED erforderliche Strom reduziert.

Das hier verwendete Modell hat nur vier Pins und kommuniziert mit dem Arduino über das I2C-Kommunikationsprotokoll. Dieses Modell hat keinen RESET-Pin. Sie müssen nur eine Verbindung zu den Arduino Uno I2C-Pins herstellen:

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

Zur Steuerung des OLED-Displays benötigen Sie die Bibliotheken adafruit_SSD1306.h und adafruit_GFX.h. Befolgen Sie die nächsten Anweisungen, um diese Bibliotheken zu installieren.

Wir verwenden Adafruit-Bibliotheken. Denken Sie daran, dass Sie bei Adafruit etwas kaufen können, um sie zu unterstützen.

Nächste Schritte

Arduino Nano 33 BLE verwendet eine bessere Möglichkeit, analoge Lesevorgänge zu erhalten. In der nächsten Version werde ich FFT und Analogeingang verwenden, die für den nrf52840 optimiert sind.

Code

  • Sound Spectrum Visualizer für Arduino Nano 33 BLE
Sound Spectrum Visualizer für Arduino Nano 33 BLEArduino
Sound Spectrum Visualizer für Arduino Nano 33 BLE
verwendet arduinoFFT https://github.com/kosme/arduinoFFT
verwendet Adafruit_GFX https://github.com/adafruit/Adafruit-GFX-Library
verwendet Adafruit_SSD1306 https://github.com/adafruit/Adafruit_SSD1306
/* Sound Spectrum Visualizer für Arduino Nano 33 BLE Arduino-basierter Sound Visualizer @author Enrique Albertos Hardwareanforderungen:- Arduino- oder Arduino-kompatible Boards. - ssd1306 oled I2C 128x32 Display - Elektret Mikrofonverstärker mit max9814 - Optional:Akku für den portablen Einsatz (sonst Stromversorgung über USB) Softwarevoraussetzungen:- arduinoFFT https://github.com/kosme/arduinoFFT - Adafruit_GFX https://github.com /adafruit/Adafruit-GFX-Library - Adafruit_SSD1306 https://github.com/adafruit/Adafruit_SSD1306 Anschlüsse:- Mic GAIN:* VCC zu Mic GAIN für 40dB * GND zu Mic GAIN für 50dB * Floating Mic GAIN für 60dB - Analog Pin 0 zum Mikrofonverstärkerausgang - +3,3 V, GND, SDA (oder analog 4) und SCL (analog 5) zu I2C SSD1306 @ verwendet arduinoFFT https://github.com/kosme/arduinoFFT @ verwendet Adafruit_GFX https://github. com/adafruit/Adafruit-GFX-Library @uses Adafruit_SSD1306 https://github.com/adafruit/Adafruit_SSD1306 Dieses Programm ist freie Software:Sie können es unter den Bedingungen der GNU General Public License wie veröffentlicht von . weitergeben und/oder modifizieren die Free Software Foundation, entweder Version 3 der Lizenz oder (nach Ihrer Wahl) eine spätere Version. Dieses Programm wird in der Hoffnung verteilt, dass es nützlich ist, jedoch OHNE JEGLICHE GEWÄHRLEISTUNG; auch ohne die stillschweigende Garantie der MARKTFÄHIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK. Weitere Informationen finden Sie in der GNU General Public License.*/#include "arduinoFFT.h"#include #include #define SAMPLES 1024 // Power of 2#define SAMPLING_FREQ 24000 // 12 kHz Fmax =sampleF /2 #define AMPLITUDE 100 // Empfindlichkeit#define FREQUENCY_BANDS 14#define SCREEN_WIDTH 128 // OLED-Anzeigebreite, in Pixel#define SCREEN_HEIGHT 32 // OLED-Anzeigehöhe, in Pixel#define BARWIDTH 11#define BARS 11#define ANALOG_PIN A0 // Deklaration für ein SSD1306-Display, das an I2C angeschlossen ist (SDA, SCL-Pins) #define OLED_RESET -1 // Reset-Pin # (oder -1 wenn Arduino-Reset-Pin geteilt) Adafruit_SSD1306-Display (SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); double vImag[SAMPLES];double vReal[SAMPLES];unsigned long sample_period_us;arduinoFFT fft =arduinoFFT(vReal, vImag, SAMPLES, SAMPLING_FREQ); // Referenz anpassen, um Hintergrundrauschen zu entfernenfloat reference =log10 (50.0);double coutoffFrequencies[ FREQUENCY_BANDS];void setup() {//SSD1306_SWITCHCAPVCC =Anzeige erzeugen v Spannung von 3.3V intern if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Adresse 0x3C für 128x32 für (;;); // Nicht fortfahren, Endlosschleife } // Anzeige einrichten display.clearDisplay(); display.display(); display.setRotation(0); display.invertDisplay (falsch); sample_period_us =(1.0 / SAMPLING_FREQ ) * pow(10.0, 6); // Berechnen Sie Grenzfrequenzen, erstellen Sie eine logarithmische Skala base basePOt double basePot =pow(SAMPLING_FREQ / 2.0, 1.0 / FREQUENCY_BANDS); coutoffFrequencies[0] =basePot; for (int i =1; i  max[index]) { max[index] =vReal[i]; } if (hz> coutoffFrequencies[index]) { median[index] =Summe / Anzahl; Summe =0,0; zählen =0; index++; max[index] =0; Median[index] =0; } Hz +=hzPerSample; } // Berechnen Sie Median und Maximum pro Frequenzband if (Sum> 0.0) { Median[index] =Summe / Anzahl; if (median[index]> maxinband) { maxinband =median[index]; } } int bar =0; for (int i =FREQUENCY_BANDS - 1; i>=3; i--) {int newHeight =0; int newMax =0; // tatsächliche Dezibel berechnen if (median[i]> 0 &&max[i]> 0 ) { newHeight =20.0 * (log10(median[i]) - reference); newMax =20,0 * (log10(max[i]) - Referenz); } // Minimal- und Maximalpegel anpassen if (newHeight <0 || newMax <0) { newHeight =1; neuMax =1; } if (newHeight>=SCREEN_HEIGHT - 2) { newHeight =SCREEN_HEIGHT - 3; } if (newMax>=SCREEN_HEIGHT - 2) { newMax =SCREEN_HEIGHT - 3; } int barX =bar * BARWIDTH + 5; // alten Median entfernen if (oldHeight[i]> newHeight) { display.fillRect(barX, newHeight + 1, 7, oldHeight[i], SSD1306_BLACK); } // altes maximales Level entfernen if (oldMax[i]> newHeight) { for (int j =oldMax[i]; j> newHeight; j -=2) { display.drawFastHLine(barX, j, 7, SSD1306_BLACK); } } // neues maximales Level für (int j =newMax; j> newHeight; j -=2) zeichnen { display.drawFastHLine(barX , j, 7, SSD1306_WHITE); } // Malen Sie den Median der neuen Ebene display.fillRect(barX , 1, 7, newHeight, SSD1306_WHITE); oldMax[i] =newMax; oldHeight[i] =newHeight; Balken++; } display.drawFastHLine(0, SCREEN_HEIGHT - 1, SCREEN_WIDTH, SSD1306_WHITE); display.display();}

Schaltpläne

soundspectrumvisualizer_qLzRsVPVlc.fzz

Herstellungsprozess

  1. Arduino Pong-Spiel - OLED-Display
  2. CO2-Überwachung mit K30-Sensor
  3. taubblinde Kommunikation mit 1Sheeld/Arduino
  4. Münzprüfer mit Arduino steuern
  5. Arduino mit Bluetooth zur Steuerung einer LED!
  6. Arduino Nano:Steuerung von 2 Schrittmotoren mit Joystick
  7. Daten mit Ton senden
  8. Handheld-Geigerzähler mit Arduino Nano
  9. Messung der Sonneneinstrahlung mit Arduino
  10. Essensroboter mit Arduino Nano herstellen | Goldschraube