Stap 2: Elektronica-overzicht
Het krijgen van uw microfoon onder controle:
Veel tijd aan dit project werd besteed proberen te krijgen van de microfoon onder controle. We hadden een heleboel problemen krijgen van de ruis in de gegevens tot een niveau dat werkbaar was. De analoge bereik op een poort van de Arduino is 0-1023. Met behulp van de vonk leuke electret breken-bestuur en controle van de analoge waarden wordt gelezen in, werd naar voren gebracht dat de waarden varieerden van 350-650 zelfs in de meest dodelijke stille omgevingen. Bruikbaar om gegevens te krijgen voor het genereren van de LED-gedrag, werd een methode genaamd convolutie gebruikt. Convolutie is in wezen een manier om het gladstrijken van gegevens door het toepassen van een bell curve naar een wachtrij van waarden. In dit geval convolutie werd toegepast op een wachtrij van 7 waarden, het aantal waarden in de wachtrij kan variëren afhankelijk van hoeveel vloeiend maken is gewenst. Elk van de zeven waarden wordt vermenigvuldigd met een coëfficiënt en de som van de zeven coëfficiënten moeten gelijk is aan een. De afgevlakte waarde van belang is de som van de zeven analoge waarden wordt gelezen hun coëfficiënten vermenigvuldigd. Hieronder vindt u een voorbeeld van deze convolutie. Voor nauwkeuriger uitleg over convolutie, Zie het wikipedia-pagina.
Convolutie Arduino C Code voorbeeld:
---------------------------------------------------------------------------------------------------
Voorbeeld van de convolutie
Door Jed Diller
2 april 2012
Convolutie van toepassing op analoge waarden wordt ingelezen vanuit een sensor op poort A0
Als de waarde hoger dan een bepaalde drempel is, wordt iets gedaan. In dit geval
een waarde wordt weggeschreven naar pin 9 op een Adruino Uno
constanten:
Const int sensorPin = A0;
Const int ledPin = 9;
Booleaanse DEBUG = true; voor de seriële monitor print verklaringen worden uitgevoerd en is ingesteld op true
int drempel = 550; deze waarden werd bepaald door gebruik van vallen en opstaan de seriële afdruk debug te
een redelijke drempelwaarde bepalen
zweven a0 = 0,3; coeff voor lopende waarde
zweven a1 = 0,2; coeff voor plus & min 1 van calc
zweven a2 = 0,1; coeff voor plus & min 2 van calc
zweven a3 = 0,05; coeff voor plus & min 3 van calc
variabelen definiëren:
int sensorValue; sensor waarde voor de lezing
int sV_adjusted; opgeslagen aangepaste waarde
int sV_m3; sensor waarde 3 voorafgaand aan calc
int sV_m2; sensor waarde 2 voorafgaand aan calc
int sV_m1; sensor waarde 1 voorafgaand aan calc
int sV_0; sensor waarde wordt berekend, centrum van curve
int sV_p1; sensor waarde 1 na aan calc
int sV_p2; sensor waarde 2 na aan calc
int sV_p3; sensor-waarde 3 na aan calc (wat is actaully wordt gelezen)
VOID Setup
{
Serial.begin(9600);
pinMode (13, OUTPUT);
digitalWrite (13, hoge);
analogWrite (ledPin, 0); Start OPENDE om te voorkomen dat kleine flitser tussen
elke iteratie gedrags lus
delay(2000);
digitalWrite (13, laag);
eerste 6 waarden krijgen (sV_m3 via sV_p2)
sV_m3 = analogRead(sensorPin);
sV_m2 = analogRead(sensorPin);
sV_m1 = analogRead(sensorPin);
sV_0 = analogRead(sensorPin);
sV_p1 = analogRead(sensorPin);
sV_p2 = analogRead(sensorPin);
}
void loop
{
krijgen nieuwe waarde
sV_p3 = analogRead(sensorPin);
aangepaste waarde berekenen
sV_adjusted = (int) (a3 * (float) sV_m3 + a2 (float) sV_m2 + a1 (float) sV_m1 + a0 (float) sV_0 + a1 (float) sV_p1 + a2 (float) sV_p2 + a3*(float)sV_p3);
Shift waarden rond voor de volgende iteratie
sV_m3 = sV_m2;
sV_m2 = sV_m1;
sV_m1 = sV_0;
sV_0 = sV_p1;
sV_p1 = sV_p2;
sV_p2 = sV_p3;
aangepast Testwaarde uit tegen drempel
Als (sV_adjusted > drempel)
{
analogWrite (ledPin, 255);
} else {}
analogWrite (ledPin, 0);
}
Als (DEBUG)
{
Serial.Print ("waarde aangepast:");
Serial.println(sV_adjusted);
}
}
---------------------------------------------------------------------------------------------------
Met behulp van convolutie werd het ruwe analoge geluid van plus of min 150 teruggebracht tot ongeveer 10. Een drempel werd vervolgens verkozen tot ongeveer 15 boven de ingewikkelde gemiddelden. Een hogere drempel vertaalt naar een grotere inbreng die nodig zijn voor het schenden van de drempel. De coëfficiënt van de curve aan te passen en maken de belcurve "platter" en het gebruik van meer waarden in de wachtrij verder maakt de gegevens stabiel maar het zal ook het evenement van belang moeilijker te detecteren. Maken van de belcurve groter in het midden van de weging van de center-waarden van de wachtrij meer zwaar zal het tegenovergestelde effect hebben en zullen de gegevens luidruchtiger maar evenementen van belang zal gemakkelijker worden gedetecteerd.
Verdere geluidsoverlast en de reden voor de twee Arduino:
Er was een ander belangrijk probleem waarmee wij geconfronteerd met behulp van de microfoon die we deden. Als er andere hardware op het bord, zeggen een servo die werd verplaatst afhankelijk van de waarde van de ingewikkelde sensor, het lawaai zou opnieuw de gegevens onbruikbaar maken. Om deze reden werd de Uno gebruikt te controleren van de microfoon en convolutie van de gegevens te doen. Als de waarden toen boven de drempel waren werd een waarde geschreven op een poort die door de Mega werd gecontroleerd. Als de Mega gedetecteerd dat de waarde die het toezicht was voorbij sommige andere drempel was, zou het het gedrag van de LED's dienovereenkomstig wijzigen. De microfoon detectie kan niet worden gedaan op de Mega als gevolg van lawaai van alle de LED being naar geschreven.
Bedrading:
De bedrading van de microfoon is makkelijk genoeg met de gelabelde GND, VCC en AUD headers. Merk op dat de bovenste header in de afbeelding hieronder eenUD zoals audio, niet AVD zoals analoge spanning. AUD is de microfoon-uitgang die kan worden gelezen op een analoge poort van de Arduino.
Bedrading van de LED's is ook eenvoudig genoeg, als niet een beetje tijd in beslag. Voor elke LED soldeer één draad (van een bepaalde kleur, we kozen rood of blauw) naar de langere van de twee pennen van de LED (dat is de spanning in) en soldeer een andere draad (wij kozen voor een andere kleur, zwart) aan op de kortere pin, de grond pin van de LED. Soldeer de korte en lange einden der twee LED's op de zelfde draad respectievelijk voor de oog-paren. We enkele kernpopulatie draad gebruikt om te maken het gemakkelijk om interface met de Arduino board havens. Zorg ervoor dat uw draden zijn lang genoeg om te komen de de Arduino uit waar u de LED's op uw scherm plaatsen kan. Het loont voor postuur zulks uiterlijk, tekening uit wat u dat van het beeldscherm eruit zal zien, denkt zoals in stap 4.