Den skygga Nightscape - Jed Diller och Ken Hoff (2 / 6 steg)
Steg 2: Elektronik översikt
Att få din mikrofon Under kontroll:
Mycket tid på detta projekt spenderades försöker få mikrofonen under kontroll. Vi hade en hel del problem att få buller i data till en nivå som var genomförbart. Analoga utbudet på en Arduino port är 0-1023. Med hjälp av gnistan roliga Elektret bryter ut styrelsen och övervaka analoga värden att läsa i, konstaterades att värdena varierade från 350-650 även i de mest odödlig tysta miljöerna. För att få användbara data för att utlösa beteendet LED, användes en metod som kallas faltning. Faltning är i grunden ett sätt att jämna ut data genom att tillämpa en klockformad kurva till en kö av värden. I det här fallet faltning kopplades till en kö av 7 värden, antalet värden i kön kan variera beroende på hur mycket utjämning önskas. De sju värden multipliceras med en koefficient och summan av de sju koefficienterna bör vara lika med ett. Utjämnade värdet av intresse är summan av de sju analoga värden som läses i multiplicerat med deras koefficienter. Ett exempel på denna faltning ges nedan. För mer exakt förklaring om faltning, se Wikipedias sida.
Faltning Arduino C kod exempel:
---------------------------------------------------------------------------------------------------
Faltning exempel
Av Jed Diller
April 2 2012
Gäller faltning för analoga värden som läses i från en sensor på port A0
Om värdet är över vissa tröskelvärdet, görs något. I detta fall
ett värde skrivs till stift 9 på en Adruino Uno
konstanter:
CONST int sensorPin = A0;
CONST int ledPin = 9;
booleska DEBUG = sant; för print uttalanden köra seriell övervaka och satt till true
int tröskel = 550; den här värden bestämdes genom försök och misstag användning seriell utskriften debug till
fastställa ett rimligt tröskelvärde
flyta a0 = 0,3; coeff för innevarande värde
flyta a1 = 0,2; coeff för plus & minus 1 från calc
flyta a2 = 0,1; coeff för plus & minus 2 från calc
flyta a3 = 0,05; coeff för plus & minus 3 från calc
definiera variabler:
int sensorValue; sensor värde för läsning
int sV_adjusted; lagrade justerade värde
int sV_m3; sensor värdet 3 före calc
int sV_m2; sensor värdet 2 före calc
int sV_m1; sensor värdet 1 före calc
int sV_0; sensor värde beräkning centrerar av kurva
int sV_p1; sensor värdet 1 efter att calc
int sV_p2; sensor värdet 2 efter att calc
int sV_p3; sensor värdet 3 efter att calc (vad är actaully att läsa)
void setup()
{
Serial.BEGIN(9600);
pinMode (13, OUTPUT);
digitalWrite 13, hög.
analogWrite (ledPin, 0); Start ledde i bort att undvika små flash mellan
varje beteende loopen upprepas
Delay(2000);
digitalWrite 13, låg.
få första 6 värden (sV_m3 genom 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()
{
få nytt värde
sV_p3 = analogRead(sensorPin);
beräkna justerat värde
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);
Skift-värden runt för nästa iteration
sV_m3 = sV_m2;
sV_m2 = sV_m1;
sV_m1 = sV_0;
sV_0 = sV_p1;
sV_p1 = sV_p2;
sV_p2 = sV_p3;
testa justerade värde ut mot tröskel
om (sV_adjusted > tröskel)
{
analogWrite (ledPin, 255);
} annat {
analogWrite (ledPin, 0);
}
om (DEBUG)
{
Serial.Print ("justerat värde:");
Serial.println(sV_adjusted);
}
}
---------------------------------------------------------------------------------------------------
Med hjälp av faltning sänktes raw analoga ljudet på plus eller minus 150 till runt 10. En tröskel valdes sedan till ca 15 ovan invecklade medelvärdena. En högre tröskel kan översättas till en större insats behövs för att bryta mot tröskeln. Justering av kurvan och att göra den klockformade kurvan "plattare" och använda fler värden i kön kommer att ytterligare göra data stabilt men det kommer också att göra i händelse av intresse svårare att upptäcka. Att göra den klockformade kurvan större i mitten genom att vikta center värdena för kön mer kraftigt kommer att få motsatt effekt och data blir bullrigare men händelser av intresse kommer att upptäckas lättare.
Ytterligare bullerproblem och anledningen till två Arduino:
Det fanns ett annat stort problem som vi står inför med mikrofonen vi gjorde. Om det fanns någon annan hårdvara i styrelsen, säger en servo som flyttades beroende på värdet som invecklade sensor, buller som skulle återigen bli obrukbar. Därför användes Uno att övervaka mikrofonen och göra faltning på data. Om värdena sedan över tröskeln skrevs ett värde till en port som Mega var övervakning. Om Mega upptäckt att det värdet det var övervakning var över några andra tröskel, skulle det följaktligen ändra beteendet för lysdioder. Mikrofon upptäckt kunde inte göras på Mega på grund av buller från alla LED skulle skrivas till.
Ledningar:
Ledningarna av mikrofonen är lätt nog med dess märkt VCC, GND och AUD huvuden. Observera att toppen sidhuvudet i bilden nedan är ettUD som i ljud, inte AVD som i analog spänning. AUD är mikrofon utdata som läses in i en analog port på Arduino.
Wiring lysdioder var också lätt nog, om inte lite tidskrävande. För varje LED löda en kabel (för en viss färg, vi valde rött eller blått) till den längre två LED stift (som är spänningen i) och löda en annan tråd (av en annan färg, vi valde svart) till kortare stift, marken pin i lysdioden. För öga paren, löda i korta och långa ändarna av två LED till samma tråd respektive. Vi brukade enda kabel gör det enkelt att gränssnittet med Arduino styrelsen portar. Vara säker på dina ledningar är tillräckligt lång för att nå den Arduino från överallt där du kan placera Lamporna på din bildskärm. För att räkna ut det här, är det värt att dra fram vad du tycker din display kommer att se ut, vilket kan ses i steg 4.