14. Sound abspielen

Der EV3-Roboter verfügt über ein Soundsystem und kann nicht nur einzelne Töne sondern auch ganze Songs abspielen. Die Songs müssen im wav-Format auf den EV3 gespeichert sein. Alle Beispiele können sowohl im direkten als auch im autonomen Modus ausgeführt werden, das erste Beispiel auch im Simulationsmodus.

Beispiel 1: Töne mit einer bestimmten Frequenz abspielen

Mit dem Befehle playTone(f, t) spielt der EV3 einen Ton mit der Frequenz f Hz, während t Millisekunden ab. Wenn man von einem Grundton (z.Bsp. c' mit f = 264 Hz) ausgeht, erhält man den nächsten ganzen Ton mit dem Faktor 1.122 und den nächsten Halbton mit dem Faktor 1.059. In unserem Beispiel werden die Frequenzen der c-dur Tonleiter in einer Liste zusammengefasst und dann der Reihe nach abgespielt.

# Ro14a.py

from ev3robot import *
# from simrobot import *

                                 
robot = LegoRobot()
frequency = [264,297,330,352,396,440,495,528]
for f in frequency:
    robot.playTone(f, 200)  
for f in reversed(frequency):
    robot.playTone(f, 200)  
robot.exit()
Programmcode markieren (Ctrl+C kopieren)

Erklärungen zum Programmcode:

for f in frequency: die for-Schleife geht alle Elemente der Liste frequency durch
robot.playTone(264, 200): spielt den Ton mit der Frequenz 264 Hz, während 200 Millisekunden

Achtung: Die Lautstärke, mit welcher der Sound anbespielt wird, ist von der Sound-Einstellung auf dem EV3 abhängig. Wenn die Lautstärke auf 0 gesetzt ist, werden keine Töne abgespielt.


Beispiel 2: Songs auf den EV3 kopieren

Da der EV3 im Vergleich zu einem Computer über eingeschränkte Ressourcen verfügt, müssen die Audio-Dateien im WAV-Format, mono, mit Samplingrate 11025 Hz gespeichert sein.

Songs im MP3-Format können mit einem Audio-Converter-Programm, zum Beispiel Format Factory aufbereitet werden.

 

 

Die Audio-Dateien müssen sich auf dem EV3 im Verzeichnis home/root/music/ befinden und den Dateinamen songxxx.wav haben, wobei xxx ein positiver Integer ist. Um die Datei vom Computer auf den EV3 zu kopieren, kann man ein beliebiges File-Transfer-Tool z.B. WinSCP verwenden. Die Verbindung erfolgt über Bluetooth (IP: 10.0.1.1) oder WLAN (zugeteilte IP-Adresse) mit dem Benutzernamen root und leerem Passwort (oder Passwort 1234). Man kann sich xxx als eine Identifikationsnummer oder als Tag für den Song vorstellen.

Noch einfacher geht es mit folgendem Python-Programm, welches im direkten Modus ausgeführt wird. Der Song ist hier auf dem Computer im Verzeichnis c:/scratch unter dem Namen test.wav gespeichert und wird über die Bluetooth-Verbindung auf den EV3 in das Unterverzeichnis home/root/music/ kopiert und dort als song1003.wav gespeichert.

# Ro14b.py

from ev3robot import *

print "starting"
EV3Copy.copyFile("10.0.1.1", "c:\\scratch\\test.wav", "/home/root/music/song1003.wav")
print "done"
Programmcode markieren (Ctrl+C kopieren)

Erklärungen zum Programmcode:

EV3Copy.copyFile(): kopiert eine Datei vom Computer auf den EV3. Die Bluetooth- oder WLAN-Verbindung muss vorher aufgebaut werden.

song1003.wav: die Audio-Dateien auf dem EV3 müssen den Name songxxx.wav haben, damit sie beim Abspielen mit dem Parameter xxx aufgerufen werden können. Falls die Datei bereits auf dem EV3 vorhanden ist, wird sie überschrieben.

Beispiel 3: Audio-Datei mit dem EV3 abspielen

Mit der Funktion playSample(<tag>, volume) wird eine Musikdatei, die auf dem EV3 im Verzeichnis /home/root/music/ unter dem Namen song<tag>.wav gespeichert ist mit der Lautstärke volume abgespielt.

Auf dem neuesten SD-Karte-Image ev3sdcard.zip sind bereits zwei Musikdateien (song1001.wav und song1002.wav) gespeichert. Diese können sofort abspielt werden.

# Ro14c.py

from ev3robot import *

robot = LegoRobot()
robot.drawString("Start playing", 0, 1)
robot.playSample(1003, 100)

while not robot.isEscapeHit():
    Tools.delay(100)
robot.exit()
Programmcode markieren (Ctrl+C kopieren)

Erklärungen zum Programmcode:

playSample(1003, 100): Die Musikdatei mit dem Name song1003.wav wird mit der Lautstärke 100 abgespielt

while not robot.isEscapeHit(): Der Song wird so lange abgespielt, bis das Programm mit der Esc-Taste beendet wird


Beispiel 4: Musik spielen und fahren (nicht blockierende Funktion playSample())

Die Funktion playSample() ist nicht blockierend, d.h. während des Abspielens eines Musikstücks kann der Roboter etwas anderes tun, z. B. vorwärts- und rückwärts fahren..

# Ro14d.py

from ev3robot import *

robot = LegoRobot()
gear = Gear()
robot.addPart(gear)
robot.drawString("Start playing", 0, 1)
robot.playSample(1003, 100)
Tools.delay(4000)

while not robot.isEscapeHit():
    gear.forward(2000)
    gear.backward(2000)
    gear.left(600)
    Tools.delay(3000)
robot.exit()
Programmcode markieren (Ctrl+C kopieren)

Erklärungen zum Programmcode:

playSample(1003, 100): Die Musikdatei mit dem Name song1003.wav wird mit der Lautstärke 100 abgespielt.


Beispiel 5: Blockierende play-Funktion

Im Unterschied zu playSample() ist die Funktion playSampleWait() blockierend, d.h. nachfolgende Anweisungen werden erst ausgeführt, wenn die Audio-Datei vollständig abgespielt ist. Im Beispiel werden 4 kleine Audio-Dateien verwendet, in welchen die Ansagen "ich fahre vorwärts", "ich fahre rückwärts", "ich fahre links" und "ich fahre rechts" gespeichert sind. Da hier die blockierende Funktion playSampleWait() verwendet wird, muss der Roboter mit der Ausführung der Befehle forward(), backward() und right() jeweils warten, bis die Ansage abgespielt ist.

# Ro14e.py

from ev3robot import *

robot = LegoRobot()
gear = Gear()
robot.addPart(gear)
robot.playSampleWait(1005, 100)
gear.forward(2000)
robot.playSampleWait(1006, 100)
gear.backward(2000)
robot.playSampleWait(1008, 100)
gear.right(550)
gear.forward(2000)
robot.exit()
Programmcode markieren (Ctrl+C kopieren)

Erklärungen zum Programmcode:

playSampleWait(1005, 100): Blockierende Funktion zum Abspielen von Audio-Dateien. Die wav-Dateien, die in diesem Beispiel verwendet werden, kann man herunterladen unter robo-wav.zip. Mit einem Audiorecorder (z.B. Audacity) kann man selbstverständlich eigene Audio-Dateien erstellen.

 


Aufgaben: Serie 14

1)

Der Roboter soll die Töne mit der Frequenzen 264, 297, 330, 352, 396 abspielen und dabei nacht jedem Ton eine kurze Strecke vorwärts fahren. Dann spielt er die Töne in umgekehrten Reihenfolge ab und fährt jeweils eine kurze Strecke rückwärts.

2)

Kopieren Sie zwei weitere Songs auf den EV3 und spielen Sie diese ab

3)

EV3 mit einem Ultraschallsensor fährt gegen eine Wand. Wenn er zu nahe ist, sagt er "Achtung Wand" und fährt zurück...