søndag den 21. september 2008

Legolab week 4.

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å.

Ud fra graferne har vi valgt at implementere en klasse som kan kører i sin egen tråd og lytte efter klap, så vi kan styre Jack med klap for fremtiden.

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. :)

Ingen kommentarer: