Kristan Andersen, Simon Lykke, Jacob Styrup Bang

torsdag den 20. september 2007

Lesson 3

Dagens mål er at undersøge lydsensoren og lave en lyd kontrolleret lego bil.

Vi startede med at eksperimentere med et program, der aflæser værdien fra lydsensoren. Vi fandt ud af den læste værdi er lavere jo længere væk lyden er og lyden kan aflæses hele vejen rundt. Dvs. at et klap bagfra også registeres, dog aflæses en lavere værdi end ved klap forfra, ved den samme afstand.

Ved kørsel af SoundCtrCar.java skulle man klappe rimeligt højt for at få bilen til at skifte tilstand. Der er 4 tilstande, kør fremad, venstre, højre og stop. Et klap registreres som en lyd, der giver en readValue() > 90. Dvs. at sensoren ikke kan genkende om det er et klap, et råb eller eller en anden høj lyd. Programmet kan kun stoppes med Escape knappen, når den holdes inde imellem tilstand 3 og 4.

Vi brugte ButtonListener mekanismen til at få programmet til at reagere på Escape knappen ligeså snart den blev holdt inde. Det eneste vi behøvede var at tilføje:

Button.ESCAPE.addButtonListener(new lejos.nxt.ButtonListener() {
public void buttonPressed(Button b){
running = false;
}

public void buttonReleased(Button b){
}
}

og ellers bare lave et tjek på den boolske værdi running, hvis falsk break ud af den ydre løkke. I de indre løkker har vi et tjek på om running == true, hvis falsk springes de over.

Vi implementerede Sivan Toledo's (ST) metode til at detecte klap. Metoden virker, men nogle gange opfatter den ikke et klap. Dog kan vi se at fløjt og andre længerevarende høje lyde ikke har nogen effekt. Den anden implementation SoundCtrCar.java, reagerer på alle høje lyde (over 90), mens vores bedre adskiller lyde. Vi har implementeret det på følgende måde:
while (running){
display(sound.readValue());
if (sound.readValue() < lowSoundThreshold && running){
time = (int)System.currentTimeMillis();
while(time + 25 > (int)System.currentTimeMillis() && running){
if(sound.readValue()>highSoundThreshold){
time = (int)System.currentTimeMillis();
while(time + 250 > (int)System.currentTimeMillis() && running){
if(sound.readValue() mode++;
if(mode==5){
mode=1;
}
setMode(mode);
break;
}
}
break;
}

}
}
}
}

hvor running stadig er vores boolske sat til sand så længe escape ikke trykket ned. lowsoundthreshold="50" og highsoundthreshold="85". Sådan som klap beskrives af ST skal der være stilhed, derefter en høj lyd og så stilhed. Dvs. at har et tjek på om der er stilhed, hvis det er tilfældet tjekker vi om der indenfor 25 ms kommer en lydmåling > highSoundThreshold. Er det tilfældet tjekker vi om der er stilhed indenfor 250 ms efter den høje lyd og vi har et klap.

Bilen detekterer kortvarige høje lyde, fx en hård plastik bold der rammer et bord, et tramp i gulvet eller lignende. En mulig forbedring kunne at analysere et klap bedre. Altså få robotten til at gemme samplings data og lave en graf over et klap. Derved kunne vi bedre finjustere thresholds (tid og lydstyrke) samt tilføje flere thresholds.

Ingen kommentarer: