Test af lydsensoren.
Dato: 21/9 2008
Forsøg:
Lydniveauer fra forskellige afstande og forskellige lyde.
Lydniveau målinger.
Vi har konstrueret et program der måler lyden og gemmer målingerne i en datafiler. Vi har så plottet datafilerne. Først har vi målt knips, klap og fløjten i en afstand af 30 cm., dernæst fra 1 m.



Målinger fra 1 meters afstand.



Da der er noget spændende støj på målingen af klappet, har vi lavet en ny måling fra en meter afstand hvor vi kun klapper 2 gange.

På målingen ses at der mellem klappene igen fremkommer støj med en lignende frekvens, for at finde ud af hvad baggrundsstøjen er har vi lavet en måling hvor der ikke blev larmet.

Det er tydeligt at der er en baggrundsstøj med en frekvens på ca. 3,2hz. Det er samme frekvens der er observeret i målingerne for klappene. Derfor skyldes de lydbølger, der er opfanget efter klappet ikke selve klappet, men at der er 3,2hz baggrundsstøj med maks værdi på 4-5.
Med baggrund i denne information kan man se at Jack stortset ikke kan skelne knips fra baggrundsstøjen. Derimod kan han tydeligt høre hvis man fløjter eller klapper. Selvom vi med 1 meter forsøgene var 3 gange længere væk end ved 30cm forsøgene så opfanger Jack stadig meget af lyden. Det vil derfor være svært for Jack at bruge lyden til at bedømme afstand til objekter.
Program der opfanger klap til at styre bilen.
For at vide mere om klaps natur har vi lavet en højopløst graf af et klap.

For at se hvad støjen ved tale er har vi snakket mens Jack lyttede på.

Programmet ser således ud:
public class Clapclass extends Thread
{
private static SoundSensor ss = new SoundSensor(SensorPort.S2);
private static final int BACKGROUND_NOISE = 30;
private static final int CLAP_NOISE = 70;
private static final int CLAP_SPIKE_TIME = 25; //millisecond
private static final int CLAP_SUBSIDE_TIME = 125; //millisecond
private static final int WAITTIME = 5; //millisecond
private boolean running;
private int clapStartTime;
private boolean clapping;
private boolean newClap;
public Clapclass(){
running = true;
clapping = false;
newClap = false;
}
public void run(){
int prevSound = ss.readValue();
while(running){
int sound = ss.readValue();
if (!clapping){
clapStartTime = (int)System.currentTimeMillis();
clapping = true;
}else{
int clapTime = (int)System.currentTimeMillis();
if (clapTime <= (clapStartTime + CLAP_SPIKE_TIME) && sound >= CLAP_NOISE){
// Clap starting
clapTime += WAITTIME;
}else if ((clapStartTime + CLAP_SPIKE_TIME) <>
&& clapTime <= (clapStartTime + CLAP_SPIKE_TIME + CLAP_SUBSIDE_TIME)
&& sound <= prevSound){
// Clap subsiding
clapTime += WAITTIME;
if (sound <>
// Clap over
Sound.playTone(440, 1000);
newClap = true;
clapping = false;
}
}else{
// The clap didn't meet the criteria
clapping = false;
}
}
prevSound = sound;
try { Thread.sleep(WAITTIME); }
catch (InterruptedException _) {}
}
}
public boolean pollClap(){
if(newClap){
newClap = false;
return true;
}
return false;
}
}
Ud fra vores data har vi valgt at sige at et klap kan starte ved enhed 70, i stedet for højere. Vi har også valgt at sætte vores baggrundsstøj til 30, så vi kan tale i baggrunden, jvf tale diagrammet ovenfor. Dette har påvirket den tid det ta'r før klappet er 'ovre', dvs lydstyrken for klappet ikke kan kendes fra baggrundsstøjen, så denne er blevet reduceret.
Som noget fremtidigt skal klassen udvides til at gemme de sidste x antal klap og kunne genkende dobbeltklap, måske også huske en højeste lydstyrke, således at den kan bruges til at styre robotten. :)

