Inleiding: Geluidsniveaumeter met Arduino
Doorjandb86
Meer van de auteur:
Eerder werden drie verschillende versies van geluidsniveaumetercircuits (vanaf nu SLM genoemd) geïntroduceerd.
Al deze circuits maken hoofdzakelijk gebruik van op-amps (NE5534, TL071) en LM3915 bar/dot display driver IC.
U kunt de details van deze SLM's bekijken in de volgende links.
***
https://www.instructables.com/Sound-Level-Meter/
https://www.instructables.com/Another-Sound-Level-Meter-Circuits/
***
Deze SLM's presteren goed omdat de audio-uitgangsspanningen van het voorversterkercircuit nauw overeenkomen met de LED's die de drempelspanning van het LM3915-circuit aansturen.
Maar omdat deze SLM's puur analoge circuits zijn, is er geen enkele kans om hun functionaliteit aan te passen, aan te passen of te verbeteren.
Bovendien zijn de MIC-, voorversterker- en LM3915-circuits nauw bedraad; elke wijziging van de circuitcomponent heeft directe invloed op de SLM-functionaliteit.
Daarom zou ik het operationele schema van SLM willen veranderen door een Arduino-controllerbord te gebruiken.
Omdat het Arduino-bord het schetsprogramma als belangrijkste besturingsfunctionaliteit ondersteunt, kunt u de SLM-functionaliteiten aanpassen door de besturingslogica van het schetsprogramma te wijzigen.
Bovendien kan de Arduino communiceren met diverse randapparatuur dankzij de analoge poorten (A0~A5) en digitale poorten (D2~D13).
In deze Instructable wordt een nieuw SLM-type apparaat geïntroduceerd door gebruik te maken van Adafruit MAX4466 MIC-amp break-out met Arduino-bord.
Later zal ik laten zien hoe een eerder gemaakt voorversterkercircuit dat NE5534/TL071 gebruikt, kan communiceren met het Arduino-bord.
Laten we meer details over dit nieuwe SLM-apparaat bekijken.
Stap 1: Schema's
Toen je naar de schema's van eerdere SLM-circuits keek, kan de volgende analogie nuttig zijn om nieuwe schema's te begrijpen.
Eigenlijk is het Adafruit MAX4466 MIC-Amp-bord hetzelfde als het voorversterkercircuit.
Het vangt audiosignalen van de MIC op en vergroot de signaalspanning met de MAX4466-versterker-IC-chip.
Bovendien ondersteunt het Arduino Uno-bord LED-displayfunctionaliteit die wordt gedekt door LM3915 IC met de vorige SLM.
Afhankelijk van de vastgelegde audiosignaalspanning worden bepaalde LED's ingeschakeld door het schetsprogramma dat op het Arduino-bord is opgeslagen.
Omdat de verwerking van het ingangssignaal en de knipperende LED-uitgang worden bestuurd door het schetsprogramma, kunnen er meer op maat gemaakte SLM-circuits worden gemaakt.
Ik zal meer details van het schetsprogramma laten zien in de andere stap hieronder.
De functionaliteit van de twee 100K-potentiometers kan worden gewist als u het schetsprogramma later uitlegt.
Stap 2: Onderdelen
Het belangrijkste onderdeel van de SLM is het Adafruit MAX4466 MIC-Amp break-out board.
Ik heb dit bord gebruikt voor het maken van een audioversterker, zoals details worden beschreven in de volgende link.
https://www.instructables.com/Arduino-Audio-Sound-Level-Meter/
Destijds was de MAX4466 MIC-Amp-chip behoorlijk indrukwekkend omdat hij zwakke omringende audiosignalen correct kan opvangen.
Maar voor het maken van SLM is een duidelijkere opname van het audio-ingangssignaal vereist.
Daarom sluit ik dit bord aan op de kleine printplaat en plaats ik het vlak voor de luidspreker.
Hoe dan ook, omdat dit nieuwe SLM-circuit compleet anders is dan de vorige, worden de volgende verschillende onderdelen gebruikt.
***
- Arduino Uno-bord, 5V
- Adafruit MAX4466 MIC-Amp-bord
- 10 LED's (blauw/groen/geel (oranje)/rood) transparant 3 mm hoge helderheid
- 330ohm 1/4W weerstanden
- 100K VR x 2
- Draden, pinhead, universele printplaat
- Acrylplaten, metalen PCB-steunen
- Smartphone 5V-oplader
***
Omdat de SLM-functionaliteit relatief eenvoudig is, heb ik in eerste instantie geprobeerd het kleinste Arduino-bord (pro-mini) te gebruiken, zoals weergegeven in de afbeelding hierboven.
Maar de pro-mini heeft een externe schetsprogrammaschrijver nodig, aangezien dit bord geen USB-chip voor seriële communicatie bevat.
Daarom gebruikte ik het Uno-bord dat de ATmega CPU-chip loskoppelde als programmaschrijver.
Wanneer de CPU-chip wordt verwijderd, fungeert het Uno-bord eenvoudigweg als een USB-apparaat voor seriële communicatie, zoals weergegeven in de bovenstaande afbeelding.
Omdat al deze lastige voorbereidingen nodig zijn voor het gebruik van pro-mini, heb ik later het hoofdbesturingsbord gewijzigd in Arduino Uno.
Voor de stroomvoorziening kan een gewone 5V-smartphone-oplader worden gebruikt, aangezien Uno- en Adafruit MIC-Amp-borden op 5V werken.
Stap 3: Bedrading en solderen
Voor het maken van een prototype op Arduino-gebaseerde SLM wordt alles samen verpakt in (10 cm breed x 15 cm lengte) acrylbord.
Er worden vrouwelijke/mannelijke pin-headers gebruikt voor het monteren van het Adafruit MIC-Amp-bord op acrylbord.
Anders dan eerdere SLM's vereist deze nieuwe een digitale signaalverwerkingsfunctie voor het analoge audiosignaal dat wordt opgevangen door de MAX4466 IC-chip.
Hoewel de in het Adafruit-bord geïntegreerde MIC een krachtige omnidirectionele geluidsopnamefunctie ondersteunt, is een heldere en krachtige audiosignaalinvoer noodzakelijk om de digitale signaalverwerking door het schetsprogramma te ondersteunen.
Daarom moet de MIC zich recht voor de luidspreker bevinden.
Hoewel het vastgelegde spanningsniveau zwak is (minder dan 2V), manipuleert het schetsprogramma de lage ingangsspanningswaarde om het juiste niveau van geluidssterktegegevens te detecteren om LED's aan te sturen.
Totaal 10EA LED's zijn rechtstreeks aangesloten op de digitale poorten van Arduino Uno. (D2~D11)
Omdat elke digitale poort een uitgangsvermogen van 5V levert, wordt er een stroombegrenzende weerstand (330ohm) tussen de LED en de digitale poort van Arduino geplaatst.
Stap 4: Digitale verwerking van audiosignaal met twee 100K VR
Het schetsprogramma converteert het ingangssignaal naar de audiospanningswaarde (0,0 ~ 4,99 V) via de A1 analoge poort van de Arduino.
Omdat de voedingsspanning van het MAX4466-bord 5V bedraagt, kan de uitgangsspanning niet hoger zijn dan 5V.
Omdat het MAX4466-bord een VR met een klein spanningsniveau heeft, heb ik de VR-waarde op het maximale bereik ingesteld. (Na het instellen van de VR-waarde mag deze niet worden gewijzigd om het operationele schema van de MAX4466-kaart te corrigeren)
Wanneer u de MAX4466-kaart vlak voor een luidspreker plaatst, kan het spanningsniveau op smalle schaal (0,0~4,99V) worden vastgelegd.
Vervolgens wordt de kleine ingangsspanning, omgezet in de niveauwaarde van het audiosignaal (vermenigvuldiging met 100 met de ingangsspanning), 32 ~ 499 (0,03 ~ 4,99 V), zoals weergegeven in de bovenstaande grafiek.
Deze audiosignaalniveauwaarden kunnen worden vastgelegd in een tekstbestand door de volgende opdracht uit te voeren in de Windows-opdrachtpromptmodus.
***
C:\ kopieer COM7 audio_input.txt
Bij de bovenstaande opdracht wordt ervan uitgegaan dat het Arduino Uno-bord is aangesloten op de seriële COM7-poort.
Terwijl u de bovenstaande opdracht uitvoert, moet de seriële monitor van Arduino IDE zijn uitgeschakeld. (De seriële Arduino-monitor neemt de COM-poort in beslag en andere processen hebben geen toegang tot de COM-poort)
***
De hierboven vastgelegde audiosignaalspanningen zijn afkomstig van typische inhoud (popcastprogramma's met film en commentaar) die ik regelmatig op YouTube bekijk.
Uit de bovenstaande grafiek blijkt dat het gebied dat wordt omsloten door het rode vak het meest dynamische bereik voor het wijzigen van het audiosignaal is.
Het begon met een basiswaarde van ongeveer 300 (0,3 V) en een bereik (Gap) van 200.
Wanneer u het gap-bereik van 200 in 10 niveaus verdeelt, kunnen alle dynamische audiosignaalveranderingsgebieden (300~499) door 10 LED's worden opgevangen in 10 verschillende signaalniveaus, zoals hieronder.
***
Audiosignaalniveau 300~320 -> LED 1 (groen) ingeschakeld
320~340 -> LED 2 (groen) ingeschakeld
340~360 -> LED 3 (groen) ingeschakeld
360~380 -> LED 4 (groen) ingeschakeld
380~400 -> LED 5 (geel) ingeschakeld
400~420 -> LED 6 (geel) ingeschakeld
420~440 -> LED 7 (geel) ingeschakeld
440~460 -> LED 8 (geel) ingeschakeld
460~480 -> LED 9 (rood) ingeschakeld
480~500 -> LED 10 (rood) ingeschakeld
***
Als u in de bovenstaande grafiek de basis 100 kiest, wordt de opening een bereik van 100~300. (De dynamiek van de verandering van het audiosignaal wordt afgevlakt)
Dan worden alle 10 LED's plotseling tegelijkertijd ingeschakeld of samen uitgeschakeld. (Signaalpatroon wordt minder dynamisch)
Wanneer er meer noise-inhoud wordt gespeeld (zoals hiphopnummers), wordt de basiswaarde met ruim 300 verhoogd.
Dan is het vastleggen van een iets hogere basiswaarde (meer dan 300) noodzakelijk.
Voor het aanpassen van het basiswaardebereik wordt de VR #1-potentiometer gebruikt.
Door de potentiometer aan te passen, wordt de basiswaarde gewijzigd van 50 (zeer stille audio-invoer) naar 500 (zeer luid en bomontploffend geluidsniveau).
Als relatief stille en minder dynamische video-inhoud wordt afgespeeld (zoals nieuwe video's, documentaires, enzovoort), zal het dynamische bereik van het audiosignaal (Gap) minder dan 200 zijn.
Daarom zal het noodzakelijk zijn de kloofverandering te verkleinen van 200 (20 x 10 niveaus) naar 100 (10 x 10 niveaus). (Door VR#2, aanpassing van het afstandsbereik ter ondersteuning van de potentiometer)
Als u het tussenbereik (20->10) niet wijzigt, worden 10 LED's die patronen weergeven minder dynamisch.
Daarom neem ik twee potentiometers op in dit nieuwe SLM-circuit.
Stap 5: Het schetsprogramma
Ter toelichting van de werkingslogica wordt een vereenvoudigd stroomschema getoond.
Het audiosignaalontvangstgedeelte is afkomstig van de Adafruit-referentieprogrammacode.
Het Adafruit-codesegment detecteert weerstandsveranderingen van de analoge A1-poort en zet de piek-tot-piek-ingangswaarde om in ingangsspanning. (0~4,99V)
Afhankelijk van de ingangsspanning wordt de geluidsniveauwaarde (niveau = volt * 100) berekend.
Vervolgens worden de basis- en tussenruimtewaarde gelezen van A2- en A3-poorten om op te tellen tot niveau.
Terwijl Serial.print()-opdrachten in het schetsprogramma worden ingevoegd, worden de waarden van de belangrijke variabelen (niveau, basis en tussenruimte) afgedrukt op het seriële monitorvenster, zoals weergegeven in de afbeelding hierboven.
Volgens de huidige instelling wordt de basis vastgezet op 300 en is de opening 25 door twee potentiometers.
Laten we aannemen dat de gap-waarde 20 is om de algehele uitleg te vereenvoudigen.
De 10 LED's zijn geïndexeerd als 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 volgens de bedrade digitale poort.
Daarom wordt het volgende LED-verlichtingspatroon ondersteund, afhankelijk van het ingangssignaal.
***
Laten we aannemen dat de ingangsspanning 3,1 (3,1V) ~ 4,65 (4,65V) is gedurende 300 ms
Vervolgens worden de niveaus gewijzigd van 310 naar 465.
Laten we aannemen dat VR2 (basis) 300 is en VR1 (tussenruimte) 20 is
Gedurende het tijdsbereik van 0~150 ms wordt het volgende testcommando waar.
Als (niveau > basis(300) && niveau < basis(300) + opening(20)*1) {
pinnen = 2;
Vervolgens wordt alleen LED 1 ingeschakeld volgens de volgende codes
For(int i=2;i digitalWrite(i, HOOG); Wacht vervolgens 50 ms met vertraging (50) om kort het huidige geluidsniveau weer te geven. Schakel vervolgens alle LED's uit. Gedurende het tijdsbereik van 150 ~ 300 ms wordt het volgende testcommando waar. If (niveau > basis(300) + opening(20)*8 && niveau pinnen = 10; Vervolgens worden negen LED's (2,3,4,5,6,7,8,9,10) ingeschakeld volgens de volgende codes For(int i=2;i digitalWrite(i, HOOG); Wacht opnieuw 50 ms (vertraging (50)) en schakel alle LED's uit *** Gedurende ongeveer 1/3 seconde knipperen één tot negen LED's om de geluidsniveaus van de ingangsaudio aan te geven (3,0~4,65V). Op dezelfde manier geeft de SLM continu het geluidsniveau weer met 10 LED's.
Bijlagen
- MAX4466_10LEDs.ino
Downloaden
Stap 6: Bediening
Een soortgelijk SLM-circuit (met MAX4466-bord) was geïntroduceerd in een andere Instructable die toegankelijk is via de volgende link.
https://www.instructables.com/Arduino-Audio-Sound-Level-Meter/
Omdat het controlemechanisme voor de conversie van audiosignaal naar digitale data (zoals twee potentiometers die de basis en de opening regelen) niet werd gebruikt voor het vorige circuit, zijn de geproduceerde LED-knipperpatronen in hoge mate afhankelijk van de locatie van de versterker en luidspreker.
Ook de weergegeven LED-knipperpatronen zijn enigszins ongeëvenaard door de sterkte van het vastgelegde audiosignaal.
Maar bij de herziene nieuwe SLM kan het werkingsschema worden gewijzigd met twee potentiometers.
Eigenlijk ondersteunt VR2 (potentiometer voor basiscontrole) macrocontrole door SLM te selecteren die de basislijn activeert.
Wanneer een audiosignaal zwak is (bij het afspelen van relatief stille video/audio), kan de VR2-waarde worden verlaagd, bijvoorbeeld 250, om LED's op een lager signaalniveau te activeren.
Intussen is de VR1 (gap) het controlemechanisme op microniveau.
Wanneer VR2 (basis) vast is, kan VR1 ervoor zorgen dat meer of minder LED's worden ingeschakeld op hetzelfde niveau van audio-ingangssignalen.
Anders dan het vorige analoge type SLM's (met voorversterker en LM3915), vereist de nieuwe Arduino-basis-SLM manipulatie van het analoge signaal door invoergegevens te digitaliseren.
Daarom kan de werking van de nieuwe, op Arduino gebaseerde SLM een beetje kunstmatig zijn als er onlogische signaaldigitalisering plaatsvindt.
Maar het werkingsresultaat is vrijwel gelijk aan dat van eerdere SLM's, zoals te zien is in de onderstaande video.
https://drive.google.com/file/d/1U6lMbh0tJgu-iCV2AG_76v_c_92J4WHf/view?usp=sharing
Ik zal een andere Arduino-gebaseerde SLM-variant introduceren in de volgende Instructables.
Bedankt voor het lezen van dit verhaal.
FAQs
What is the difference between LM393 and max4466? ›
If you are seeking a good module to measure sound levels, you possibly try a MAX 4466 based module or MAX 9814 based module with an adjustable gain for MAX 4466. LM 393 is a comparator chip, they usually has a potentiometer and no amplifier with VCC pin, a GND pin, an Analog out pin and a digital out pin.
What is the sound level sensor on Arduino? ›The sound detection sensor module for Arduino detects whether the sound has exceeded a threshold value. Sound is detected via a microphone and fed into an LM393 op-amp. The sound level setpoint is adjusted via an onboard potentiometer.
How to use sound sensor with Arduino? ›Wiring a Sound Sensor to an Arduino
Connections are fairly simple. Start by connecting the module's VCC pin to the Arduino's 5V pin and the GND pin to ground. Finally, connect the OUT pin to Arduino digital pin #8. That's it!
The LM358 and LM393 might seem outwardly similar, but the LM358 is an operational amplifier with linear output, and the LM393 is a comparator with a digital output, and they cannot be interchanged. What is the difference between a comparator and an op amp?
What is the difference between LM393 and 2903? ›LM393 and LM2903 are a kind of low offset voltage dual comparators, and their pin arrangement is shown in Figure 7. Their main performance is the same, but the temperature range is different: the former is 0~70℃, and the latter is -40℃~105℃.