Varighed: 11-16
Deltagere: Daniel, Leni, Martin A og Martin N
1. Formål
Formålet med denne øvelse var at opnå erfaring med lyd sensoren, hvorledes den fungerer samt danne et overblik over dens begrænsninger.
2. Øvelsesgennemgang
Del 1 - Test af lyd sensor
Først blev lyd sensoren monteret på LEGO model 9797 ifølge vejledningen. Hvorefter et test program blev skrevet på baggrund af SonicSensorTest.java som var udleveret ved forrige øvelse.
Billede af LEGO 9797 bilen kan ses herunder:
SoundSensorTest.java instansierer et objekt af klassen SoundSensor, hvorefter amplituden af det opfangede lyd signal vises på LCD displayet.
SoundSensor ss = new SoundSensor(SensorPort.S2, true);
LCD.drawString("Sound Level (dBa): ", 0, 0);
while (! Button.ESCAPE.isPressed()) {
LCD.drawInt(ss.readValue(), 3, 0, 1);
Thread.sleep(300);
}
SoundSensor klassen kræver at der angives hvorvidt der ønskes at måle i dB_A eller dB_B, med henholdsvis true eller false.
Test
For at kunne teste amplitude karakteristikken af lyd sensoren blev der udført to tests:
#1 - Lydsensoren blev placeret i forskellige afstande til en lydkilde, hvis volumen var sat til et fast niveau.
#2 - Lydsensoren blev placeret i en fast afstand til lydkilden, hvorefter volumen af lydkilden blev justeret.
Til test #1 blev en PC benyttet med programmet SineGen installeret. SineGen blev benyttet til at udsende en 1kHz sinus tone med en amplitude på -10dB (i forhold til det maksimale lydniveau på PC’en).
Denne amplitude blev valgt for at undgå at lyden fra PC’ens højtalere blev forvrænget, hvilket var tilfældet ved højere niveauer.
Resultaterne fra disse tests kan ses af nedenstående oversigt:
Variable afstand, fast volumen på -10dB:
- 135 cm : 16 dB
- 120 cm : 51 dB
- 105 cm : 48 dB
- 90 cm : 70 dB
- 75 cm : 47 dB
- 60 cm : 45 dB
- 45 cm : 93 dB
- 30 cm : 91 dB
Variable volumen, fast afstand på 45 cm:
- -10 dB(PC) : 93 dB(lejOS)
- -13 dB(PC) : 73 dB(lejOS)
- -16 dB(PC) : 52 dB(lejOS)
- -19 dB(PC) : 42 dB(lejOS)
- -22 dB(PC) : 27 dB(lejOS)
- -25 dB(PC) : 20 dB(lejOS)
- -28 dB(PC) : 13 dB(lejOS)
- -31 dB(PC) : 9 dB(lejOS)
- -34 dB(PC) : 6 dB(lejOS)
- -37 dB(PC) : 4 dB(lejOS)
- -40 db(PC) : 3 dB(lejOS)
Resultaterne fra test #2 derimod viser en klar sammenhæng mellem opfangede volumen i en fast afstand til lydkilden. Det er svært at konkludere på hvorvidt målingerne der er foretaget reelt er korrekte, da vi ikke var nogen oplysninger om hvilken reference sensoren benytter.
Nedenfor kan ses en graf som viser målingerne fra test #2:
Hvis vi antager at den returnerede værdi fra sensoren er dB(spl) (sound pressure level), med en dB(A) karakteristik (dvs. outputtet er vægtet således at der opnås en approksimation af det menneskelige øres reelle respons), ser vi en klar afvigelse i forhold til det forventede.
Amplituden af baggrundstøjen er blevet målt til 2dB, hvilket er 38dB lavere end hvad man reelt vil kunne forvente i forhold til en dB(spl) måling hvor en måling på 40dB svarer til et meget stille rum, mens 30dB svarer til en måling foretaget i et lyddødt rum.
En forklaring på denne afvigelse, kan være at målingerne som præsenteres er justeret med et fast offset for at opnå et bedre dynamikområde. Dette ville være en logisk forklaring, hvis ikke det var fordi at det maksimale lydniveau der kunne måles var omkring 93dB, hvor 255dB burde have været det maksimalt opnåelige.
Altså kan vi ikke konkludere yderligere fra vores tests hvad angår lydmålingens reference, andet end at der er en tilnærmelsesvis lineær sammenhæng mellem opfanget amplitude i en fast afstand (variabel volumen). Mens der ved tilfældet med en variable afstand (fast volumen) er en ulineær sammenhæng.
Del 2 - Datalogger
Til denne del af øvelsen benyttede vi lyd sensoren som en datalogger for at kunne overføre målinger til evt. senere behandling på en PC.
Koden til dataloggeren var givet ved øvelsens start.
Herunder ses et plot af det opsamlede data fra lyd sensoren:
Det opsamlede data består af en sekvens af henholdsvis 1 og 2 klap. Dette blev valgt for at analysere, hvorledes indhyldningskurven for et klap ser ud, hvilket benyttes til løsning af del 4).
Del 3 - Sound Controlled Car
Lydsensoren udlæser lydniveauer mellem på værdier mellem 2 og 93.
For at kunne kontrollere bilen ved hjælp af høje lyde, aflæser vi lydsensoren som i opgave 1, og sammenligner denne værdi med vores soundThreshold, som er den øvre værdi vi definerer som lydniveauet der skal til at foresage et retningsskift.
Som vist i del opgave 1 i koden læser vi en værdi fra sensoren og sammenligner denne værdi med vores soundThreshold som er den øvre værdi vi definerer som niveauet der skal til et ændrings skift. Altså vil høje lyde være værdier over soundThreshold værdien.
-- TODO Martin Bitte Koden Einsetzen --
Video af, hvordan Sound Controlled Car kørte:
Opgaven her er at anvende ButtonListener interfacet til at gøre det muligt at lukke sound Controlled car programmet i de indre løkker og ikke kun fra main løkken.
For at gøre dette har vi oprettet en klasse som implementerer buttonListener. I klassen kalder vi system.Exit(0) som lukker programmet.
I vores main kalder vi Button.addButtonListener() med vores objekt som parameter, hvilket gør, at vi på et vilkårligt tidspunkt ved tryk på knappen får afviklet vores luknings funktion i listener objektet.
-- TODO more code plz --
Video af hvordan Sound Controlled Car kørte samt stop ved brug af ESCAPE knappen:
Del 4 - Clap Controlled Car
Den sidste del af øvelsen, bestod i at få bilen til at kunne detektere et eller flere klap, og adskille disse lyde fra andre høje lyde, fx en blender der tændes, eller et højt pift.
Derfor skal vi have lavet en model af, hvordan lydsensoren opfatter et klap.
De data der ligger til grund for denne model blev opsamlet i øvelse 2 ovenfor.
Som det ses på grafen, er det karakteristiske ved et klap, at der er en meget kort stigetid i begyndelsen (1-2 samples ved en samplerate på 100 Hz), efterfulgt af et langsomt aftagende forløb.
For at kunne finde de lydsekvenser der har disse egenskaber, gemmer vi løbende samples fra lydsensoren i en cirkulær buffer på 15 samples (TODO er det 15 i den endelige kode?).
For hver ny sample tjekkes det om den ældste sample i bufferen er over vores valgte tærskelværdi (clapPeakThreshold), og hvis det er tilfældet undersøges de resterende samples, for at se om falder ned under vores nedre tærskel værdi (clapQuietThreshold).
Hvis signalet opfylder begge disse betingelser har vi detekteret et klap, og vi starter nu en counter der tæller ned fra 1 sekund, for at se om der kommer flere klap efter hinanden.
Hver gang et nyt klap detekteres nulstilles tælleren.
Når tælleren på et tidspunkt løber ud, returnerer programmet til hovedløkken, som bestemmer hvilken vej bilen skal køre, alt efter hvor mange klap der er blevet detekteret.
Et klap får bilen til at køre fremad, mens 2 eller flere klap får den til at køre baglæns.
Video af hvordan Clap Controlled Car kørte:
Kildekoden der implementerer klap detektionen kan findes her: (TODO indsæt link til sunrise)
Konklusion
Vi fik undersøgt NXT lydsensorens virkemåde, og konstateret at den er meget upålidelig til at detektere afstand fra en lydgiver.
Det lykkedes at få optaget en indhyldningskurve for hhv 1 og 2 klap, få overført disse data til en PC, og plottet kurven.
Derefter lykkedes det at detektere om en lyd var over en vis styrke, og ændre bilens omdrejningsretning på hver gang denne værdi overskrides.
Endeligt lykkedes det for projektgruppen at få modelleret et klap, baseret på opsamlede data, og implementere en detektering af dette klap på NXT platformen, hvor efter LEGO bilen kunne styres ved at klappe et bestemt antal gange inden for 1 sekund af hinanden.
Referencer
http://www.tau.ac.il/~stoledo/lego/ClapCounter/
No comments:
Post a Comment