Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Sound Spectrum Visualizer met Arduino Nano 33 BLE

Componenten en benodigdheden

Arduino Nano 33 BLE
× 1
Electret microfoonversterker Max9814
× 1
0,91 inch OLED I2C-scherm 128 x 32 pixels
× 1
Condensator 4.7 nF
Afhankelijk van uw RC-laagdoorlaatfilter en uw geselecteerde grensfrequentie
× 1
Condensator 470 µF
× 1
Weerstand 2K
Afhankelijk van uw RC-laagdoorlaatfilter en uw geselecteerde grensfrequentie
× 1

Apps en online services

Arduino IDE

Over dit project

Inleiding

Zie hoe een staafdiagram reageert op muziek en geluid in een klein OLED-scherm. Laagste frequenties aan de linkerkant van de grafiek, hoogste frequenties aan de rechterkant.

Bouw

Verbindingen

  • Sluit Mic GAIN aan, afhankelijk van de gevoeligheid die beter bij uw systeem past:VCC naar microfoon GAIN voor 40dB, lage gevoeligheid, GND naar microfoon GAIN voor 50dB, gemiddelde gevoeligheid of laat de microfoon zweven GAIN voor 60dB, hoge gevoeligheid.
  • Verbind analoge pin 0 A0 naar microfoonversterker OUT
  • Verbind 3,3V , GND , SDA (of analoog 4 A4 ) en SCL (analoog 5 A5 ) naar I2C SSD1306
  • sluit een condensator van 470 uF aan tussen VCC en GND in de voedingsbus

Krijg je ruis met een lage frequentie?

Het geluid komt van alle elektrische apparaten in de buurt van uw meetsysteem die werken. Alle elektronische apparaten werken met een vaste frequentie en spanning van wisselstroom (AC) met de frequentie van 50 Hz of 60 Hz is de frequentie van het elektriciteitsnet in uw land. U kunt een kooi van Faraday gebruiken om het geluid gemakkelijk te elimineren. Plaats uw circuit in een doos en sluit de doos aan op aarde. Aard het circuit goed.

Pinout van Arduino Nano 33 BLE

Met behulp van arduino core AnalogRead en de Arduino Nano 33 BLE kunnen we slechts ongeveer 35.000 samples per seconde krijgen, dus we kunnen FFT niet gebruiken voor frequenties boven 17,5 Khz, omdat we de klok moeten lezen en verschillende vergelijkingen moeten maken in een drukke wachtlus die we zijn zal voorzichtig zijn en een bovengrens van 8 kHz nemen. We kunnen dus een eenvoudig RC-laagdoorlaatfilter gebruiken om vervelende oplossingen buiten die frequentie te vermijden.

R =180Ω C =0.1uF voor een afsnijfrequentie fc =8842 [Hz]

Hier met een weerstand van 2K Ohm en een condensator van 4,7 nF voor een afsnijfrequentie fc =17000[Hz]

Ruwe berekening van maximale samplefrequentie

Het gebruik van de normale Arduino analogRead()-functie is te traag voor het samplen van audio, dus laten we de maximale samplefrequentie berekenen.

We gaan schatten hoeveel samples we kunnen krijgen met arduino core AnalogRead en de Arduino Nano 33 BLE.

Laten we dit kleine programma draaien om een ​​schatting te krijgen.

/*
* Ruwe berekening van maximale samplefrequentie met AnalogRead
*/

#define ANALOG_PIN A0

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

Serial.begin(9600);
Serial.println("Sampling. .. even geduld a.u.b. ");
}

void loop() {
// plaats hier je hoofdcode, om herhaaldelijk uit te voeren:
newTime =micros ();

// 1 miljoen samples
voor (int i =0; i <(int)SAMPLES; i++){
analogValue =analogRead(ANALOG_PIN);
}
float elapsedTimePerSampleUs =(micros()- newTime) / SAMPLES;
Serial.print("Tijd per monster (us):");
Serial.println(elapsedTimePerSampleUs);
Serial.print("Max sampling freq(hz):");
Serial.println(pow(10,6) /elapsedTimePerSampleUs);
}

Met behulp van arduino core AnalogRead en de Arduino Nano 33 BLE kunnen we slechts ongeveer 35.000 samples per seconde krijgen. De eis van ongeveer dubbele snelheid, gevolg van de stelling van Nyquist, zal onze spectrumvisualizer beperken tot frequenties onder 17 kHz. We kunnen een laagdoorlaatfilter gebruiken om frequenties boven die limiet over te slaan.

We moeten de klok lezen en verschillende vergelijkingen maken in een drukke wachtlus, we gaan voorzichtig zijn en een bovengrens van 8 kHz nemen.

// neem voorbeelden
for (int i =0; i unsigned long newTime =micros();
int value =analogRead(ANALOG_PIN );
vReal[i] =waarde;
vImag[i] =0;
while (micros() <(newTime + sampling_period_us)) {
opbrengst();
}
}

De gebruikersinterface

Het scherm is verdeeld in elf frequentiezones en u heeft een logaritmische schaal die frequenties groepeert die vergelijkbaar zijn met hoe het menselijk oor ze waarneemt.

Mensen kunnen geluiden detecteren in een frequentiebereik van ongeveer 20 Hz tot 20 kHz. (Menselijke baby's kunnen frequenties horen die iets hoger zijn dan 20 kHz, maar verliezen wat gevoeligheid voor hoge frequenties naarmate ze ouder worden; de bovengrens bij gemiddelde volwassenen ligt vaak dichter bij 15-17 kHz.)

Zal zones 3 tot 13 (11 zones) gebruiken voor onze representatie.

Elke balk vertegenwoordigt de maximale waarde in de band met gespreide lijnen en de gemiddelde waarde in de band met een gevulde rechthoek.

Waarden worden weergegeven in decibel met een vooraf geselecteerde referentie die op een heuristische manier is verkregen.

Hoe het werkt?

De audiosamples worden omgezet in een frequentiespectrum met behulp van een snelle Fourier-transformatie of FFT.

Vervolgens wordt het spectrum verdeeld en gegroepeerd in 14 zones en worden slechts 11 zones weergegeven in dB.

Over de microfoonmodule

Electret-microfoon

Electret is een quasi-permanent geladen diëlektricum. Het wordt gemaakt door een keramisch materiaal te verwarmen, het in een magnetisch veld te plaatsen en het vervolgens te laten afkoelen terwijl het zich nog in het magnetische veld bevindt. Het is het elektrostatische equivalent van een permanente magneet. In een elektreetmicrofoon wordt een plakje van dit materiaal gebruikt als onderdeel van het diëlektricum van een condensator waarin het diafragma van de microfoon één plaat vormt. Geluidsdruk beweegt het membraan. De beweging van de plaat varieert de capaciteit volgens de geluidsdruk. Gezien de ingebouwde vaste lading van het diëlektricum, zal ook de spanning over de condensator variëren. De elektreetcondensator is aangesloten op de ingang van een ingebouwde FET-versterker. Electretmicrofoons zijn klein, hebben een uitstekende gevoeligheid, een brede frequentierespons en over het algemeen zeer lage kosten.

MAX9814 Microfoonversterker

De MAX9814 is een microfoonversterker met automatische versterkingsregeling (AGC) en geluidsarme microfoonbias en heeft een aantal opties die u kunt configureren met de breakout.

De MAX9814-module heeft drie versterkerinstellingen (40dB, 50dB, 60dB). De standaardwaarde is 60dB, maar kan worden ingesteld op 40dB of 50dB door de versterkingspin naar VCC of aarde te jumpen.

Interne ruisarme microfoonbias 1,25 V, 2 Vpp. Het uitgangsvermogen van de versterker is ongeveer 2 Vpp max bij een voorspanning van 1,25 V DC, dus het kan gemakkelijk worden gebruikt met elke analoog/digitaal-omzetter met een ingangsvermogen tot 3,3 V.

De Attack/Release-verhouding kan ook worden aangepast, van de standaard 1:4000 tot 1:2000 of 1:500.

Voor directe aansluiting op een lijningang heeft u een blokkeercondensator / koppelcondensator nodig om de DC-component te blokkeren. U kunt een blokkeercondensator in serie boven 1uF gebruiken, afhankelijk van uw systeem, probeer bij twijfel van 33 uF tot 100uF. Een koppelcircuit zorgt ervoor dat wisselstroomsignalen van het ene onderdeel naar het andere kunnen stromen terwijl de gelijkstroomcomponenten worden geblokkeerd. In audiocircuits wordt dit gedaan om te voorkomen dat DC-componenten de audio-uitvoer vervormen. De effectiviteit van een koppelcondensator hangt af van een breed scala aan frequentieafhankelijke parameters, waaronder invoegverlies, equivalente serieweerstand en serieresonantiefrequentie.

Voeding:2,7V tot 5,5V

Gevoeligheid

Gevoeligheid , de verhouding van de analoge uitgangsspanning of digitale uitgangswaarde tot de ingangsdruk, is een belangrijke specificatie van elke microfoon. Door eenheden in het akoestische domein toe te wijzen aan eenheden in het elektrische domein, wordt de grootte van het microfoonuitgangssignaal bepaald, gegeven een bekende invoer.

De gevoeligheid van een microfoon is de elektrische respons aan de uitgang op een bepaalde standaard akoestische ingang. Het standaard referentie-ingangssignaal voor microfoongevoeligheidsmetingen is een sinusgolf van 1 kHz bij 94 dB geluidsdrukniveau (SPL), of 1 pascal (Pa, een drukmeting). Een microfoon met een hogere gevoeligheidswaarde heeft een hoger uitgangsniveau voor een vaste akoestische input dan een microfoon met een lagere gevoeligheidswaarde. Microfoongevoeligheid in decibel (dB) is meestal een negatief getal; daarom is een hogere gevoeligheid een kleinere absolute waarde.

Voor analoge microfoons wordt de gevoeligheid doorgaans gespecificeerd in dBV-eenheden, dat wil zeggen decibel met verwijzing naar 1,0 V rms.

Referentieniveau en frequentierespons

De frequentierespons van een microfoon beschrijft het uitgangsniveau over het frequentiespectrum. De hoge en lage frequentiegrenzen worden beschreven als de punten waarop de microfoonrespons 3 dB onder het referentie-uitgangsniveau bij 1 kHz ligt. Het referentieniveau bij 1 kHz wordt gewoonlijk genormaliseerd naar 0 dB.

0,91 inch OLED I2C-scherm 128 x 32 pixels

Dit is een klein scherm, slechts ongeveer 1 "diagonaal. Het is gemaakt van 128x32 afzonderlijke witte OLED-pixels, elk wordt in- of uitgeschakeld door de controllerchip. Er is geen achtergrondverlichting nodig. Dit vermindert de stroom die nodig is om de OLED te laten werken.

Het model dat we hier gebruiken, heeft slechts vier pinnen en communiceert met de Arduino via het I2C-communicatieprotocol. Dit model heeft geen RESET-pin. U hoeft alleen maar verbinding te maken met de Arduino Uno I2C-pinnen:

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

Om het OLED-scherm te bedienen heb je de adafruit_SSD1306.h en de adafruit_GFX.h bibliotheken nodig. Volg de volgende instructies om die bibliotheken te installeren.

We gebruiken Adafruit-bibliotheken. Onthoud dat je iets van Adafruit kunt kopen om hen te steunen.

Volgende stappen

Arduino Nano 33 BLE maakt gebruik van een kan beter zijn om analogen te lezen. Volgende versie zal ik FFT en analoge input gebruiken die is geoptimaliseerd voor de nrf52840.

Code

  • Sound Spectrum Visualizer voor Arduino Nano 33 BLE
Sound Spectrum Visualizer voor Arduino Nano 33 BLEArduino
Sound Spectrum Visualizer voor Arduino Nano 33 BLE
gebruikt arduinoFFT https://github.com/kosme/arduinoFFT
gebruikt Adafruit_GFX https://github.com/adafruit/Adafruit-GFX-Library
gebruikt Adafruit_SSD1306 https://github.com/adafruit/Adafruit_SSD1306
/* Sound Spectrum Visualizer voor Arduino Nano 33 BLE Arduino-based sound visualizer @author Enrique Albertos Hardwarevereisten:- Arduino of Arduino-compatibele boards. - ssd1306 oled I2C 128x32 display - Electret microfoonversterker met max9814 - Optioneel:batterij voor draagbaar gebruik (anders voeding via USB) Softwarevereisten:- arduinoFFT https://github.com/kosme/arduinoFFT - Adafruit_GFX https://github.com /adafruit/Adafruit-GFX-Library - Adafruit_SSD1306 https://github.com/adafruit/Adafruit_SSD1306 Aansluitingen:- Mic GAIN:* VCC naar mic GAIN voor 40dB * GND naar mic GAIN voor 50dB * floating mic GAIN voor 60dB - Analoge pin 0 naar microfoonversterkeruitgang - +3,3 V, GND, SDA (of analoog 4) en SCL (analoog 5) naar I2C SSD1306 @gebruikt arduinoFFT https://github.com/kosme/arduinoFFT @gebruikt Adafruit_GFX https://github. com/adafruit/Adafruit-GFX-Library @uses Adafruit_SSD1306 https://github.com/adafruit/Adafruit_SSD1306 Dit programma is gratis software:u kunt het herdistribueren en/of wijzigen onder de voorwaarden van de GNU General Public License zoals gepubliceerd door de Free Software Foundation, ofwel versie 3 van de Licentie, of (naar uw keuze) een latere versie. Dit programma wordt verspreid in de hoop dat het nuttig zal zijn, maar ZONDER ENIGE GARANTIE; zonder zelfs de impliciete garantie van VERKOOPBAARHEID of GESCHIKTHEID VOOR EEN BEPAALD DOEL. Zie de GNU General Public License voor meer details.*/#include "arduinoFFT.h"#include #include #define SAMPLES 1024 // power of 2#define SAMPLING_FREQ 24000 // 12 kHz Fmax =sampleF /2 #define AMPLITUDE 100 // gevoeligheid#define FREQUENCY_BANDS 14#define SCREEN_WIDTH 128 // OLED-schermbreedte, in pixels#define SCREEN_HEIGHT 32 // OLED-displayhoogte, in pixels#define BARWIDTH 11#define BARS 11#define ANALOG_PIN A0// Verklaring voor een SSD1306-display aangesloten op I2C (SDA, SCL-pinnen) #define OLED_RESET -1 // Reset-pin # (of -1 als Arduino-resetpin wordt gedeeld) Adafruit_SSD1306-display (SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); dubbele vImag[SAMPLES];dubbele vReal[SAMPLES];unsigned long sampling_period_us;arduinoFFT fft =arduinoFFT(vReal, vImag, SAMPLES, SAMPLING_FREQ);// pas referentie aan om achtergrondruis te verwijderen noisefloat reference =log10(50.0);double coutoffFrequencies[ FREQUENCY_BANDS]; ongeldige setup () {// SSD1306_SWITCHCAPVCC =weergave genereren v oltage van 3.3V intern als (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {// Adres 0x3C voor 128x32 voor (;;); // Ga niet verder, loop voor altijd } // Setup display display.clearDisplay(); weergave.weergave(); display.setRotatie (0); display.invertDisplay (false); sampling_period_us =(1.0 / SAMPLING_FREQ ) * pow (10.0, 6); // Bereken afsnijfrequenties, maak een logaritmische schaalbasis basePOt dubbele 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]) { mediaan [index] =som / aantal; som =0,0; aantal =0; index++; max [index] =0; mediaan[index] =0; } hz +=hzPerSample; } // bereken mediaan en maximum per frequentieband als ( sum> 0.0) { mediaan[index] =sum / count; if (mediaan[index]> maxinband) { maxinband =mediaan[index]; } } int-balk =0; for (int i =FREQUENCY_BANDS - 1; i>=3; i--) { int newHeight =0; int nieuwMax =0; // bereken werkelijke decibel als (mediaan[i]> 0 &&max[i]> 0) { newHeight =20.0 * (log10(mediaan[i]) - referentie); newMax =20.0 * (log10(max[i] ) - referentie); } // pas minimum- en maximumniveaus aan if (newHeight <0 || newMax <0) { newHeight =1; nieuwMax =1; } if (newHeight>=SCREEN_HEIGHT - 2) { newHeight =SCREEN_HEIGHT - 3; } if (newMax>=SCREEN_HEIGHT - 2) { newMax =SCREEN_HEIGHT - 3; } int barX =bar * BARWIDTH + 5; // verwijder de mediaan van het oude niveau als (oldHeight [i]> newHeight) { display.fillRect (barX, newHeight + 1, 7, oldHeight [i], SSD1306_BLACK); } // verwijder oud max niveau if ( oldMax [i]> newHeight) { for (int j =oldMax [i]; j> newHeight; j -=2) { display.drawFastHLine (barX , j, 7, SSD1306_BLACK); } } // verf nieuw max niveau voor (int j =newMax; j> newHeight; j -=2) { display.drawFastHLin(barX, j, 7, SSD1306_WHITE); } // verf nieuw niveau mediaan display.fillRect(barX, 1, 7, newHeight, SSD1306_WHITE); oldMax[i] =nieuweMax; oldHeight[i] =newHeight; staaf++; } display.drawFastHLin(0, SCREEN_HEIGHT - 1, SCREEN_WIDTH, SSD1306_WHITE); display.display();}

Schema's

soundspectrumvisualizer_qLzRsVPVlc.fzz

Productieproces

  1. Arduino Pong Game - OLED-scherm
  2. CO2-monitoring met K30-sensor
  3. Doofblinde communicatie met 1Sheeld/Arduino
  4. Bedien muntvangers met Arduino
  5. Arduino met Bluetooth om een ​​LED te bedienen!
  6. Arduino Nano:bedien 2 stappenmotoren met joystick
  7. Gegevens verzenden met geluid
  8. Handheld geigerteller met Arduino Nano
  9. Zonnestraling meten met Arduino
  10. Maak een eetrobot met Arduino Nano | Gouden schroef
  11. Arduino OLED-temperatuurweergave met realtime klok