Coinurl2

Thursday, 16 February 2012

NXT Programmering, Lesson 3

NXT Programmering, Lesson 3

Tid: 5 timer, Deltagere: Kenneth, Mikkel, Rawad.

Siden sidst
Vi har siden sidst fået lavet en bluetooth log klasse som vi fremover vil bruge til at logge information på NXT’en og se den på vores pc. Klassen skal initieres og herefter kan der logges i klassen asynkront, hvis der er et bluetooth device forbundet modtager denne log beskederne. På PC siden har vi gjort brug af programmet Tera Term til at modtage log beskeder.
Vores vision medlog filen er at udvide den til også at logge beskeder lokalt så det ikke er nødvendigt at have et bluetooth device forbundet. Filen kan hentes her: File

Formål
I denne lab session skal vi undersøge NXT lydsensor og anvende den til at bygge og programmer en robot der kan kontrolleres gennem lyd.

Plan





Resultat

1. Konstruktion af robot


For at teste lydsensoren anvendes en konstruktion der kan ses på NXT base set 9797 på side 26 til 28.



2. Test af lydssensor

For at teste hvordan lydsensoren reagere på den samme lyd, afspillet ved samme lydniveau fra flere afstande, har vi optaget en reference lyd på en bærbar pc. Lydsensoreren testes så ved at placere den bærbare i en kendt afstand og vinkel fra lydsensoren, og afspille reference lyden ved en kendt volumen (eller i hvert fald kendt lydtrin på den pågældende pc).

Reference lyden blev genereret i det gratis lydredigerens program audacity. Lyden består af 5 sekunders hvid støj. Filen kan hentes her [1].




Resultatet af målingerne:


Vi aflæste de rå sensorværdier, som er “omvendte”. 1024 vil i lydsensorens tilfælde angive total stilhed, og 0 vil være... højt. Grafen viser, at jo længere væk fra lydkilden vores sensor placeres, jo lavere bliver lyden. Da lydniveauet falder kvadratisk som funktion af afstanden til lydkilden, havde vi egentligt forventet at det kunne ses af grafen, hvilket ikke helt er tilfældet. Det kan måske tilskrives et dårligt valg af lydlokale, da der er meget rumklang i legolab køkkenet.

3. Data logging

For at kunne indhente store mængder oplysninger fra sensor data på NXT’en, har vi kigget på at implementerer og afprøve en datalogger. Vi vil også anvende denne datalogger til at finde lyd karakteristikken af et klap.

Datalogger testen er baseret på DataLogger.java skrevet af Ole Caprani. Til indsamling af data har vi anvendet en simpel klasse der måler rå sensor data. Det samlede kode er arkiveret i en rar fil.[2]

For at teste dataloggeren har vi optaget lyden af fire klap med NXTen med ovenstående kode. Dette er udført ved et bord i legolab med lav baggrundsstøj. Målinger er rå sensor data målinger taget på følgende måde:

dl.writeSample(1024 - SensorPort.S3.readRawValue());

Vi har valgt at aflæse værdierne “omvendt” så vi har stigende værdier ved stigende lyd niveau og omvendt. I testen optages målinger hvert 10. sekund.

Efter de fire klap har vi anvendt nxjbrowse til at overføre txt filen med data, til en bærbar computer over bluetooth.

Efter overførslen vil vi importer data fra sensoren til et excel dokument for at generer grafer der viser et klaps karakteristik. Vi oplevede problemer med at importer data da dataen blev skrevet ind i filen med 20 items pr. line. For at få excel til at accepterer dataen ændrede vi dette til 1 item pr. line i dataloggeren.


Ovenstående graf viser fire toppunkter der hver repræsenterer et klap.

Ovenstående graf er en forstørrelse af klap nr. 2 i serien ovenover. Vi har anvendt denne data til at adskille et klap fra andre lyde. Vi anvender bl.a. klappets længde samt klappets volume.

4. lydkontrolleret bil

Formålet med denne test er at opnå erfaring med kontrollering af robot ved hjælp af lyd, til senere brug i en klapkontrolleret bil. I denne test anvendes et program skrevet af Ole Caprani [3]. Testen udføres på et fladt gulv med lavt baggrunds støj. Det observeres at robotten, venter på en “høj lyd” før den udfør nogen handling. Ved et klap opfanger robotten en lyd der er høj nok til at få den til at bevæge sig fremad. Ved andet klap drejer robotten til højre, derefter venstre og så stopper den ved fjerde klap.
Ydermere observeres det at escape knappen ikke virker mens robotten kører eg. mens den er i et af de fire indre kontrol loops, da programmet kun poller escape knappen i det ydre loop.

Efter testen analyserwe vi programmet for at finde ud af hvad robotten mener er en “høj lyd”.

   private static int soundThreshold = 90;
   private static SoundSensor sound = new SoundSensor(SensorPort.S1);

   private static  void waitForLoudSound() throws Exception
   {
       int soundLevel;

       Thread.sleep(500);
       do
       {
           soundLevel = sound.readValue();
           LCD.drawInt(soundLevel,4,10,0);
       }
       while ( soundLevel < soundThreshold );
   }

Ovenover er et udsnit af funktionen waitForLoudSound(), der anvendes i programmet. Det kan ses at en høj lyd er en sensormåling over 90 db.

For at løse problemet med escape knappen har vi kigget på buttonListener mekanismen. Ved brug af denne mekanisme kan vi overvåge buttonListener events selvom vi er midt i et af de indre kontrol loops. Et udsnit af implementationen af buttonListener event ses herunder
   
       Button.ESCAPE.addButtonListener(new ButtonListener(){  
       public void buttonReleased( Button button) {
       }
@Override
public void buttonPressed(Button arg0) {
// TODO Auto-generated method stub
Sound.beep();
System.exit(0);
}});

Det fulde lydKontrolV2 program kan findes her[4].

5. Klapkontrolleret bil

Denne test gik ud på at undersøge mulighederne for at dedektere klap med NXT lyd sensor. Første del af øvelsen bestod i at forsøge at dedektere klap vha. en beskrivelse af karakteristikken for et klap, fremsat af Sivan Toledo:

“A clap is a pattern that starts with a low-amplitude sample (say below 50), followed by a       very-high amplitude sample (say above 85) within 25 milliseconds, and then returns back to low (below 50) within another 250 milliseconds.”

Udfra målingerne foretaget af klap i afsnit 3 Data Logger, estimerede vi at starten på et klap ville bestå af en vilkårlig målig efterfulgt (10 milisekunder efter) af en måling 400 højere end den første. Herefter ville efterfølgende målinger være over 300 i mere end 50 milisekunder og mindre end 150 milisekunder.

Vi programmerede dennne karakteristik, men fandt dog ud af gennem tests at programmet ikke detekterede særlig mange typer klap. Derfor ændrede vi tidsgrænsen for at målingerne faldt igen fra 150 milisekunder til 260 milisekunder, hvorved meget hårdere/længere klap blev dedekteret.

Koden kan findes her[5]

Anden del af testen gik ud på at sammenligne vores klap dedektion med den brugt af SoundCtrCar.java[6]. Dette nåede vi desværre ikke.

Referencer

[1] http://dl.dropbox.com/u/27325565/white_noise.wav
[2] http://dl.dropbox.com/u/2779683/Datalogger.rar
[3] http://dl.dropbox.com/u/2779683/LydKontrolV1.rar
[4] http://dl.dropbox.com/u/2779683/LydKontrolV2.rar
[6] SoundCtrCar: http://legolab.cs.au.dk/DigitalControl.dir/NXT/Lesson3.dir/SoundSampling.java
[5] ClapDetector: http://dl.dropbox.com/u/4447110/ClapDetector.rar

No comments:

Post a Comment