versuch_3_schallsensor

12
Projekt der Elektrotechnik und Informationstechnik 3. Projektversuch – Schallsensor – 13. Oktober 2009 I

Upload: marko-jurisevic

Post on 11-Oct-2015

22 views

Category:

Documents


0 download

DESCRIPTION

sensors lego robotics nxt

TRANSCRIPT

  • Projekt der Elektrotechnik undInformationstechnik

    3. Projektversuch

    Schallsensor

    13. Oktober 2009

    I

  • Inhaltsverzeichnis

    Inhaltsverzeichnis

    1 Einleitung 1

    2 Grundlagen 22.1 Mindstorms NXT Schallsensor . . . . . . . . . . . . . . . . . . . . . . . . . 22.2 LEGO Lampe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32.3 MATLAB-Grundlagen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

    2.3.1 for-Schleife . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42.3.2 MATLAB-Funktionen . . . . . . . . . . . . . . . . . . . . . . . . . 42.3.3 Debugger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

    3 Durchfuhrung 63.1 Sensor testen (ca. 30 min) . . . . . . . . . . . . . . . . . . . . . . . . . . . 63.2 Sensor auslesen (ca. 90 min) . . . . . . . . . . . . . . . . . . . . . . . . . . 73.3 Klatschsensor (ca. 60 min) . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

    II

  • 1 Einleitung

    1 Einleitung

    Mit dem im LEGO Mindstorms NXT Education Set enthaltenen Schallsensor ist esmoglich, Gerausche zu detektieren und gegebenenfalls darauf zu reagieren. In diesemVersuch sollen Sie den Sensor naher kennenlernen.

    Ein wichtiges Hilfsmittel bei der Programmierung von Robotern sind auerdem Schlei-fen, da die selben Arbeitsschritte oft immer wieder ausgefuhrt mussen, bis ein Ereigniseintritt. Ziel des Versuches ist daher auch, die Programmierung der for-Schleife von MAT-LAB zu vertiefen.

    1

  • 2 Grundlagen

    2 Grundlagen

    Im Folgenden wird der Schallsensor und die Funktionen beschrieben, mit denen der Sensoraus MATLAB angesteuert werden kann.

    2.1 Mindstorms NXT Schallsensor

    Abbildung 1: Schallsensor ( c LEGO)

    Der Schallsensor im Mindstorms-Kit (siehe Abbildung 1) misst den Schalldruck in seinerUmgebung. Im Gegensatz zu einem einfachen Mikrofon ist der Sensor nicht dazu geeig-net, Gerausche oder Sprache aufzunehmen, die spater wieder abgespielt werden konnen.Der Messwert, den der Sensor an den NXT-Brick liefert, ist eher zu vergleichen mit dermittleren

    Lautstarke, die zum Messzeitpunkt am Sensor vorliegt. Es wird also im Sen-

    sor bereits ein Teil der Daten durch eine elektrische Schaltung vorverarbeitet. Dadurchgeht ein groer Teil der Information daruber, um welches Gerausch es sich tatsachlichgehandelt hat, verloren.

    Der Schallsensor hat zwei Betriebsmodi. Im ersten misst der Sensor den Schalldruckin dB. Die dB-Skala ist logarithmisch aufgebaut, d.h. verdoppelt sich der Schalldruck, soerhoht sich der Messwert um 3 dB. Der Messbereich des Schallsensors reicht bis 90 dBund umfasst einen Frequenzbereich von 20 Hz bis 18 kHz.

    Die Empfindlichkeit des menschlichen Gehors fur Tone unterschiedlicher Frequenzen istunterschiedlich gro. Tone im Bereich um 3 kHz werden z.B. besonders gut wahrgenom-men. Der zweite Betriebsmodus des Sensors ist gedacht, um diesen Effekt zu kompen-sieren. Er gibt die Messwerte in dBA zuruck, einer Variante der logarithmischen Skala,die in der Technischen Akustik eingesetzt wird, beispielsweise bei der Beurteilung vonLarmbelastigungen.

    Um Werte des Sensors auslesen zu konnen, muss naturlich zuerst eine Bluetooth- oderUSB-Verbindung mit dem NXT-Brick aufgebaut werden, wie Sie es auch schon aus demvorangegangenen Versuch kennen. Die dafur benotigten Funktionen sind COM OpenNXT,COM SetDefaultNXT und COM CloseNXT.

    2

  • 2 Grundlagen

    OpenSound Initialisierung des Schallsensors.

    OpenSound(SENSORPORT, MODE);

    SENSORPORT Anschluss, an dem der Sensor angeschlossen ist. Mogliche Werte:SENSOR_1, SENSOR_2, SENSOR_3, SENSOR_4 (entsprechen den Ports 1, 2, 3, 4).

    MODE String, der den Modus angibt, in dem der Sensor aktiviert werden soll.Mogliche Werte: DB, DBA

    GetSound Auslesen des Sensors.

    SOUNDVALUE = GetSound(SENSORPORT);

    SENSORPORT Anschluss, an dem der Sensor angeschlossen ist. Mogliche Werte:SENSOR_1, SENSOR_2, SENSOR_3, SENSOR_4 (entsprechen den Ports 1, 2, 3, 4).

    SOUNDVALUE Ein Wert zwischen 0 und 1023 (10 Bit), der den gemessenen Schall-druck auf einer logarithmischen Skala reprasentiert.

    CloseSensor Sensorport abschalten.

    CloseSensor(SENSORPORT);

    SENSORPORT Anschluss, an dem der Sensor angeschlossen ist. Mogliche Werte:SENSOR_1, SENSOR_2, SENSOR_3, SENSOR_4 (entsprechen den Ports 1, 2, 3, 4).

    2.2 LEGO Lampe

    Die im Mindstorms-Kit enthaltenen Gluhbirnchen werden uber den Adapter zur alterenGeneration von LEGO Technik / LEGO Mindstorms mit dem NXT-Brick verbunden.Wie Motoren werden sie an die Ports A/B/C angeschlossen.

    SwitchLamp Lampe ein-/ausschalten.

    SwitchLamp(MOTORPORT, VALUE);

    MOTORPORT Anschluss, an dem die Lampe angeschlossen ist. Mogliche Werte:MOTOR_A, MOTOR_B, MOTOR_C (entsprechen den Ports A, B, C).

    VALUE Entweder on oder off.

    2.3 MATLAB-Grundlagen

    Die wichtigsten Programmstrukturen, die wir in diesem Versuch benotigen, sind die for-Schleife und die Funktionsdeklaration.

    3

  • 2 Grundlagen

    2.3.1 for-Schleife

    Eine for-Schleife in MATLAB hat beispielsweise folgende Form:

    for x = 1:10x

    end

    Der Schleifenkopf (erste Zeile) bestimmt dabei die Start- und Stoppbedingungen derSchleife. In diesem Beispiel ist x die Schleifenvariable. 1:10 ist in MATLAB-Syntax einArray mit 10 Elementen, namlich genau den Zahlen 1 bis 10. Wenn die Schleife ausgefuhrtwird, erhalt x je genau einmal hintereinander den Wert eines der Elemente.

    Der Schleifenkorper (der Teil zwischen dem Kopf und der letzten Zeile) wird dann furjeden Wert einmal ausgefuhrt. D.h. im ersten Durchlauf hat x den Wert 1, dann 2, usw.bis 10. Danach ist die Abarbeitung der Schleife beendet und das Programm fahrt mitden Befehlen nach der Schleife fort. Da der Schleifenkorper auch aus mehreren Befehlenbestehen kann, wird das Ende der Schleife mit end gekennzeichnet.

    Um das Programm fur den Mensch, der es programmiert, besser lesbar zu machen, rucktman den Schleifenkorper um einen Tabulator nach rechts ein. Dies ist fur die korrekteAbarbeitung der Schleife jedoch nicht erforderlich.

    In diesem Beispiel ist der Befehl x der Schleifenkorper. Es wird also in jedem Durchlaufder Wert der Variable x ausgegeben. Da dieser sich mit jedem Durchlauf andert, gibt dasBeispiel nacheinander die Werte 1 bis 10 aus.

    2.3.2 MATLAB-Funktionen

    Wenn man in MATLAB eine eigene Funktion deklarieren mochte, muss man dies stets ineiner eigenen Datei tun. Die Datei sollte dabei genau so heien wie die Funktion selbst.Zusatzlich muss im Kopf der Datei spezifiziert werden, welche Argumente die Funktionentgegennimmt und welche Ruckgabewerte sie hat:

    function [a, b, c] = meinefunktion(d, e, f);

    ...

    Hierbei sind d bis f Argumente, die der Aufrufer an die Funktion ubergibt. a bis c sindRuckgabewerte der Funktion, die dem Aufrufer ubergeben werden, wenn die Funktionabgearbeitet ist. In diesem Beispiel konnte der Aufrufer den Befehl

    [x, y, z] = meinefunktion(1, 2, 3);

    geben. Dadurch wird meinefunktion mit den Werten d = 1, e = 2 und f = 3 abge-arbeitet. Das Ergebnis der Berechnung wird funktionsintern zwar in den Variablen a bisc gespeichert, jedoch bestimmt der Aufrufer der Funktion, dass die Ergebnisse in denVariablen x bis z abgelegt werden, sobald die Funktion fertig ist. Fur den Aufrufer derFunktion sind die Variablen a bis c nicht sichtbar.

    4

  • 2 Grundlagen

    Abbildung 2: Debugger-Menuleiste Abbildung 3: Gesetzter Breakpoint in Zeile 9

    2.3.3 Debugger

    Als Computer noch mit mechanischen Bauelementen arbeiteten, konnte es passieren, dasssich tatsachlich ein Insekt in die Eingeweide einer solchen Rechenmaschine verirrte unddort z.B. einen Schalter zur Fehlfunktion brachte. Daher stammt der Ausdruck

    Bug

    (engl.: Kafer, Insekt) fur Programmfehler. In heutigen Zeiten handelt es sich jedoch meis-tens nicht um einen Fehler der Hardware (wie z.B. defekter Hauptspeicher), sondernmeistens um Fehler, die der Programmierer selbst gemacht hat. Da man zunachst dieCodezeile finden muss, in der die Ursache fur das Fehlverhalten des Programms steckt,dauert die Suche nach solchen Fehlern meistens langer als die Behebung (und meist auchlanger als erwartet).

    Wie in vielen anderen Entwicklungsumgebungen auch gibt es in MATLAB einen Debug-ger. Mit diesem Werkzeug kann man ein Programm wahrend der Abarbeitung anhalten,den Inhalt aller Variablen inspizieren, dann schrittweise mit der Abarbeitung fortfahren,etc. Damit lassen sich Bugs wesentlich schneller finden als durch Betrachten des fehler-haften Programmverhaltens.

    Zum Benutzen des Debuggers muss man lediglich in einer Zeile des Programms einenBreakpoint, also den Punkt, an dem die Abarbeitung des Programms anhalten soll, set-zen. Dies geschieht in MATLAB, indem man im Editor auf den Strich rechts neben derZeilennummer klickt. Es erscheint dann ein roter Kreis (Abb. 3). Startet man dann dasProgramm, wird es vorlaufig an dieser Stelle unterbrochen, und die in Abb. 2 gezeigtenSymbole in der Menuleiste werden aktiv. Man kann dann das Programm schrittweise undinteraktiv abarbeiten lassen (Step), weiter ausfuhren lassen bis zum nachsten Breakpointoder Programmende (Continue) oder auch den Debugmodus verlassen (Exit). Im Debug-modus erscheint vor dem Prompt im Befehlsfenster ein

    K. Dies bedeutet, dass man die

    Variablen, die in der aktuellen Funktion gultig sind, im Workspace betrachten und sogarverandern kann, bevor das Programm weiterlauft. Im Befehlsfenster kann man Variablenplotten lassen und im Prinzip auch beliebige andere Befehle ausfuhren.

    5

  • 3 Durchfuhrung

    3 Durchfuhrung

    Dauer: ca. 180 Minuten

    3.1 Sensor testen (ca. 30 min)

    1. Schlieen Sie den Brick per USB an den Rechner an, offnen Sie eine USB-Verbindungund setzen Sie die Verbindung als Default.

    2. Schlieen Sie den Schallsensor an den ersten Sensorport des Bricks an, und initiali-sieren Sie den Schallsensor mit Hilfe des Befehls OpenSound. Die Ausgabe der Wertesoll in dB erfolgen.

    3. Lesen Sie einen einzelnen Messwert mit Hilfe des Befehls GetSound aus. VergewissernSie sich, dass der Sensor Daten liefert, die den Erwartungen entsprechen (z.B. indemSie einmal ein lautes Gerausch erzeugen, wahrend Sie den Sensor auslesen). BeachtenSie, dass die Ausgabe des Befehls nicht angezeigt wird, wenn Sie ein Semikolon ansEnde stellen!

    4. Schlieen Sie die Verbindung wieder mit COM CloseNXT.

    6

  • 3 Durchfuhrung

    3.2 Sensor auslesen (ca. 90 min)

    Wir wollen nun uber einen langeren Zeitraum Messwerte auslesen. Dazu bedienen wiruns der for-Schleife von MATLAB. Da die Programmierung von Schleifen auf der Kom-mandozeile umstandlich werden kann, erstellen wir eine eigene Funktion, die man immerwieder aufrufen kann.

    1. Legen Sie mit Hilfe des MATLAB-Editors eine neue Datei mit dem Namensoundsensor.m an. Benutzen Sie dafur den Befehl edit oder das MATLAB-Menu.

    2. Legen Sie den Funktionskopf an. Unsere Funktion soundsensor benotigt keine Ar-gumente und gibt auch keinen Wert zuruck.

    3. Zu Beginn der Funktion soll wie in Aufgabe 3.1 die USB-Verbindung geoffnetund der Schallsensor initialisiert werden. Geben Sie also die entsprechenden Befehlein den Editor ein.

    4. Der Hauptteil der Funktion soll aus einer for-Schleife bestehen, die die Laufvariablei von 1 bis 1000 durchzahlt. Platzieren Sie innerhalb der Schleife einen GetSound-Befehl, so dass dieser 1000 mal ausgefuhrt wird.

    5. Am Ende der Funktion soll die USB-Verbindung wieder abgebaut werden. FugenSie also hinter der for-Schleife einen Befehl zum Schlieen der Verbindung an.Die Funktion besteht jetzt aus drei Teilen: Initialisieren der Verbindung und desSensors, Lesen der Daten in einer Schleife, Schlieen der Verbindung. Speichern Siedie Funktion.

    6. Gehen Sie zuruck ins MATLAB-Hauptfenster und fuhren Sie die Funktion mit demBefehl soundsensor aus. In der Ausgabe sollten jetzt nacheinander 1000 Messwerteerscheinen, wie Sie vom Sensor gemessen werden. Falls keine Ausgabe erscheint, stel-len Sie sicher, dass hinter dem GetSound-Befehl kein Semikolon steht, was die Aus-gabe unterdruckt. Korrigieren Sie die Funktion und wiederholen Sie diesen Schrittfalls notig.

    Wir wollen nun die Messdaten speichern, damit wir die Daten auf einfache Art undWeise auswerten konnen. Dazu andern wir die Funktion so, dass Sie die gemessenen Datenin einem MATLAB-Array zuruckgibt.

    7. Gehen Sie zuruck in den Editor. Andern Sie den Funktionskopf so, dass die Funktioneine Variable namens values an den Aufrufer der Funktion zuruckgibt.

    8. Im ersten Teil der Funktion (vor der Schleife) mussen wir das Array values initia-lisieren. Es soll zunachst keine Daten enthalten. Fugen Sie daher den Befehl

    values = [];

    vor der Schleife in die Funktion ein.

    7

  • 3 Durchfuhrung

    9. Die Messwerte sollen nun anstatt direkt ausgegeben zu werden in jedem Schlei-fendurchlauf an das Array values angehangt werden. Realisieren Sie dies, indemSie dem Element von values mit dem Index i in der Schleife den gemessenen Wertzuweisen.

    10. Speichern Sie die Funktion, gehen Sie wieder zuruck in das MATLAB-Hauptfensterund lesen Sie 1000 Messwerte ein, indem Sie den Befehl

    v = soundsensor;

    eingeben. Der Befehl sollte ohne Ausgabe verlaufen. Nach einigen Sekunden solltev ein Array mit 1000 Werten sein.

    11. Da die Messdaten nun im Array v gespeichert sind, konnen wir sie auch nach dereigentlichen Messung verarbeiten. Stellen Sie sie als Beispiel mit dem Befehl plotgrafisch dar. Stimmt der Verlauf des Schalldrucks mit dem uberein, was Sie erwartethaben? Wiederholen Sie die Messung und die Darstellung ein paar mal, um das zuuberprufen. Hinweis: Da die Anzahl der Messpunkte pro Sekunde davon abhangt,wie leistungsfahig der PC ist, mussen Sie die Anzahl der Messwerte ggf. erhohen,um uber einen langeren Zeitraum messen zu konnen.

    8

  • 3 Durchfuhrung

    3.3 Klatschsensor (ca. 60 min)

    In diesem Teil des Versuchs wollen wir ein Programm schreiben, das nicht nur Messdateneinliest, sondern auch auf Ereignisse reagiert. Dazu verknupfen wir die Messungen vomSchallsensor mit der Schaltung einer Lampe. Wenn der Schalldruck einen gewissen Wertuberschreitet, wird die Lampe ein- bzw. ausgeschaltet. Dadurch bekommen wir eineneinfachen Klatschsensor.

    1. Offnen Sie die Datei clapsensor.m. Darin befindet sich bereits folgendes Gerust:

    function clapsensor()

    % close all handles and open a new oneCOM_CloseNXT(all);h = COM_OpenNXT;COM_SetDefaultNXT(h);

    % open sound sensor on sensor port 1OpenSound(SENSOR_1, DB);

    % initialize sample array and state of lampvalues = zeros(15, 1);state = 0;

    % initially, turn lamp offSwitchLamp(MOTOR_A, off);

    for i = 1:500

    % get a new sample from the sensors = GetSound(SENSOR_1);

    % throw away oldest sample and add the new one at the endvalues = [values(2:end); s];

    % ...

    % wait 10ms between samplespause(0.01);

    end

    % close handleCOM_CloseNXT(h);

    end

    Die Funktion in dieser Form liest Messwerte vom Sensor ein, halt aber immer nurdie 15 neuesten Messwerte in der Variable values vor. In der Schleife fehlen nochdie Befehle, die die Messwerte verarbeiten.

    9

  • 3 Durchfuhrung

    Nach jedem Messwert wartet das Programm 10 Millisekunden, um nicht unnotigviele Messwerte verarbeiten zu mussen. Da die Verarbeitung des Messwerts durchden PC aber unterschiedlich lange dauern kann (z.B. wenn andere Prozesse CPU-Ressourcen verbrauchen), ist diese Vorgehensweise relativ ungenau. Um Messwertein gleichmaigen Intervallen zu nehmen, kann man in Matlab auch Timer-Objekteverwenden. Diese werden in Versuch 5 (Lichtsensor) genauer beschrieben.

    Die Lampe wird zu Beginn der Funktion ausgeschaltet. Die zusatzliche Variablestate dient dazu, den Status der Lampe, d.h. ob sie momentan an- (1) oder ausge-schaltet (0) ist, zu speichern, und wird daher zu Beginn auf 0 gesetzt.

    2. Fugen Sie an der Stelle, die mit den drei Punkten gekennzeichnet ist, einen Befehlein, der die Messwerte grafisch darstellt (z.B. plot oder stem). Speichern Sie, wech-seln Sie zum MATLAB-Hauptfenster und fuhren Sie die Funktion aus. Sie solltensehen, wie die jeweils 15 letzten Messwerte in einem MATLAB-Fenster durchlaufen.

    3. Ersetzen Sie jetzt den plot-Befehl durch eine if-Anweisung, die pruft, ob der aktu-ellste Messwert einen bestimmten Schwellwert uberschreitet. Welcher Wert sinnvollist, mussen sie experimentell bestimmen. Falls der Schwellwert uberschritten ist (al-so ein Klatschen gemessen wurde), soll wiederum gepruft werden, welchen Zustanddie Lampe aktuell hat, und dann in den jeweils anderen Zustand geschaltet werden.Hinweis: Sie mussen dazu zwei if-Anweisungen ineinander verschachteln!

    Setzen sie innerhalb der aueren if-Anweisung einen Breakpoint, so dass das Pro-gramm jedesmal angehalten wird, wenn der Schwellwert uberschritten ist. So konnenSie schrittweise (mit

    Step) uberprufen, ob der Inhalt der if-Anweisung richtig aus-

    gefuhrt wird und dann (mitContinue) das Programm fortsetzen.

    4. Um das Verhalten des Klatschsensors zu verbessern, kann man anstelle von groenSchalldruckwerten auch groe Anderungen des Schalldrucks als Kriterium verwen-den. Dies entspricht einer Flankendetektion: Die Lampe schaltet nur dann um, wennder Schalldruck um ein gewisses Ma ansteigt. Bestimmen Sie dazu mit Hilfe desdiff-Befehls die Anderung des Schalldrucks in den letzten 15 Messwerten. SpeichernSie das Ergebnis in einer eigenen Variable. Modifizieren Sie dann die if-Anweisungso, dass sie das letzte Element dieses Arrays mit einem Schwellwert testet. Verwen-den Sie auch hier wieder den Debugger, um das Programm zu beobachten.

    5. (Zusatzaufgabe) Schlieen Sie noch zwei zusatzliche Lampen an den NXT-Brick anund verandern Sie die Funktion so, dass sie auf einen, zwei bzw. drei Klatscherreagiert. Je nach Anzahl der Klatscher soll immer nur eine der drei Lampen an-bzw. ausgeschaltet werden. Hinweis: Bis jetzt haben Sie immer nur den aktuellstenMesswert bzw. die aktuellste Messwertdifferenz als Schaltkriterium verwendet. Jetztbenotigen Sie auch die restlichen der 15 Messwerte.

    10

    EinleitungGrundlagenMindstorms NXT SchallsensorLEGO LampeMATLAB-Grundlagenfor-SchleifeMATLAB-FunktionenDebugger

    DurchfhrungSensor testen (ca. 30 min)Sensor auslesen (ca. 90 min)Klatschsensor (ca. 60 min)