Laserharp (Laserharfe)

Eine Laserharp (zu deutsch: Laserharfe) ist ein Musikinstrument, bei dem - im Gegensatz zu einer echten Harfe - keine Saiten vorhanden sind, sondern nur Lichtstrahlen, die in der Luft "angeschlagen" werden.
Hier ein Demonstrationsvideo zur Funktionsweise einer Laserharfe. Zum Einsatz kommt ein RGB-Laserprojektor mit ca. 1 Watt Leistung, eine Minilumax-Ausgabekarte mit Firmware Version 11, daran angeschlossen eine Photodiode mit Auswerteelektronik, und eine kleine Windows-Software zur Steuerung der Harfe. Vielen Dank an Tschosef01 von www.he-laserscan.de für die Entwicklung der Auswerteelektronik, Windowssoftware und das Video.



Ein normaler Laserprojektor erzeugt den Strahlenfächer, der die Saiten der Harfe darstellt. Dabei ist das Aussehen der Harfe Sache der ansteuernden Software - die Laserharp kann viele oder wenige Saiten haben, sich bewegen, beim Anschlagen einer Saite die Farbe ändern etc.
Eine Photodiode registriert, wenn der Laserstrahl einer Saite von der Hand des Spielers reflektiert wird. Für das träge menschliche Auge sieht es zwar so aus als würden die Saiten der Harfe gleichzeitig in der Luft stehen, tatsächlich werden sie aber - bedingt durch das Funktionsprinzip eines Laserprojektors - zeitlich nacheinander gescannt. So lässt sich feststellen, welche Saite gerade gescannt wird, wenn die Photodiode eine Reflektion detektiert. Dabei ist es unerheblich, ob sich die Photodiode an der Hand des Spielers befindet und den direkten Laserstrahl abkriegt, oder ob sie sich am Laserprojektor befindet und durch das von der Hand des Spielers reflektierte Streulicht ausgesteuert wird. Letztere Variante ist eleganter, da der Spieler kabellos agieren kann, dafür aber empfindlicher gegenüber Störungen aus der Umgebung.

Für die Umsetzung der Laserharp ist auf der Minilumax-Karte eine Input-Capture-Funktion (Begriff aus der Mikrocontrollertechnik) implementiert. Sobald ein Flankenwechsel am Input-Capture-Eingang stattfindet, wird der Zeitpunkt dieses Ereignisses festgehalten. In diesem Fall bedeutet Zeitpunkt nicht eine absolute Zeit in Sekunden, sondern die Nummer des gerade ausgegebenen Punktes im aktuellen Laserframe. Die Karte verfügt über einen Puffer, der Platz für 16 Input-Capture-Events bereithält, wobei Event für einen Flankenwechsel (also von LOW nach HIGH oder von HIGH nach LOW) steht.

Die am Input-Capture-Eingang angeschlossenen Elektronik sollte das Signal durch Tiefpassfilter, Schmitt-Trigger, Hysterese etc. so aufbereiten, dass es zu keinem Prellen kommt. Das Prellen eines mechanischen Tasters beispielsweise würde dazu führen, dass bereits ein einziger Schaltvorgang mit seinem Prellen den kompletten Event-Puffer füllt. Wenn das Signal sauber entprellt ist, können mit dem 16 Event großen Puffer maximal 8 gleichzeitig angeschlagene Saiten der Laserharp erkannt werden.

Der Input-Capture-Eingang ist direkt und ohne Schutzbeschaltung mit dem Mikrocontroller verbunden und erwartet ein Signal mit 5 Volt TTL-Logikpegel. Die Auswerteelektronik ist entsprechend anzupassen; auf eine kurze Verbindungsleitung ist zu achten. Idealerweise wird die Elektronik zur Auswertung der Photodiode mit einem Optokoppler direkt am Input-Capture-Pin galvanisch von der Minilumax Karte getrennt.

Beim Abholen des Event-Puffers wird zurückgemeldet, wieviele Events seit dem letzten Abholen aufgetreten sind. Wenn mehr als 16 Events aufgetreten sind, enthält der Puffer nur die letzten (neuesten) 16 Events.

Um gute Ergebnisse mit der Input-Capture Funktion zu erzielen ist es wichtig, die interne Funktionsweise der Minilumax-Karte zu verstehen. Vereinfacht dargestellt gibt es zwei Hauptbestandteile, aus denen die Firmware der Karte besteht:
Mit zunehmender Ausgabegeschwindigkeit steigt die Prozessorlast, die für die Laserausgabe verbraucht wird, sodass entsprechend weniger Rechenzeit für die Hauptschleife übrig bleibt. Diese beiden Programmteile sind jedoch so aufeinander abgestimmt, dass auch bei höchster Ausgabegeschwindigkeit genug Rechenkapazität für die Bearbeitung der USB-Kommandos übrig bleibt.

Die Input-Capture Funktion wurde so umgesetzt, dass sie die eigentliche Hauptaufgabe der Minilumax-Karte - nämlich die Ausgabe von Laserframes - in keinster Weise beeinträchtigt. Dementsprechend erfolgt die Überwachung des Input-Capture Eingangs nur während der ansonsten ungenutzter Wartezeit in der Hauptschleife - also wenn weder ein neuer Punkt ausgegeben wird, noch in der Hauptschleife ein USB-Kommando bearbeitet werden muss. Da die Ausgabe der Frame-Punkte schnell erledigt ist, stellt die Ausgabe von Laserframes bei normaler Geschwindigkeit (<40k) kein Problem dar. Flankenwechsel am Input-Capture-Eingang können trotzdem zuverlässig erkannt werden. Problematisch ist jedoch die Beantwortung längerwieriger USB-Kommandos, wie z.B. das Empfangen eines neuen Laserframes. Dies beansprucht relativ viel Zeit, während der die Flankenwechsel am Input-Capture-Eingang nicht erkannt werden!

Im einfachsten Fall der Laserharp - ein unbewegter Strahlenfächer - ist dies kein Problem. Es wird zu Beginn einmalig der Laserframe gesendet, und dann endlos ausgegeben. Für das Spielen der Laserharp muss nur noch kontinuierlich der Puffer mit den Events des Input-Capture-Eingangs abgefragt werden. Lediglich während der kurzen Zeit des Rücksendens der aufgetretenen Events an den Steuerrechner werden keine neuen Events registriert. Soll die Laserharp animiert werden (z.B. Anschlagen der Saiten simulieren), müssen kontinuierlich Framedaten gesendet werden, was vergleichsweise Zeitaufwendig ist, so dass die Gefahr steigt, das Input-Capture-Events verloren gehen. Wenn sich die gesendeten Frames zudem in der Anzahl ihrer Punkte unterscheiden, wird die Zuordnung eines Event-Zeitpunkts (in Form einer Punkte-Nummer) zu einer Saite der Harfe problematisch. Es empfiehlt sich daher, nur Frames mit gleicher Punktanzahl zu senden, bei denen die Saiten immer an derselben Punktposition beginnen.

Zusammengefasst: die Input-Capture-Ereignisse werden zuverlässig erkannt, solange keine Kommunikation mit der Karte stattfindet.

Der zuverlässige Weg ist also: Sollte die Pause in Schritt 3 unerwünscht sein kann sie auch entfallen, allerdings sollten dann durch Plausibilisierung (z.B. Vergleich mehrerer aufeinanderfolgender Input-Capture-Messungen) Fehler ausgeschlossen werden.


API-Schnittstelle zur Nutzung des Input Capture Eingangs

int __stdcall Lumax_GetInputCapture(int Handle, int *NumOfEvents, unsigned char *Buffer)

Holt die seit dem letzten Aufruf der Funktion gemessenen Input Capture Ereignisse von der Minilumax-Karte ab. Zurückgeliefert wird die Anzahl der aufgetretenen Ereignisse und ein Puffer mit den Zeitpunkten (Punkt im Frame) und den Logikpegel der Ereignisse.
Diese Funktion ist nur bei Minilumax Karten ab Firmware-Version 11 und DLL-Version 2.18 verfügbar.

HandleHandle zur eindeutigen Identifizierung des Geräts
NumOfEventsZeiger auf eine int-Variable, in der zurückgeliefert wird, wieviele Ereignisse seit dem letzten Aufruf der Funktion aufgetreten sind. Die Minilumax-Karte bietet Platz für maximal 16 Ereignisse. Sollten mehr Ereignisse aufgetreten sein, werden im Event-Puffer nur die letzten (neuesten) 16 Ereignisse gespeichert.
BufferZeiger auf einen Puffer, in dem die gemessenen Input-Capture-Events zurückgeliefert werden. Als Ergebnis wird die Nummer des Punktes innerhalb des Frames zurückgeliefert, bei der das Ereignas stattgefunden hat. Zusätzlich wird für jedes Ereignis der Pegel des Input Capture Eingangs zurückgeliefert. Die Nummer des Punktes ist eine 16-Bit-Zahl im Bereich 0-65535 (der erste Punkt im Frame hat die Nummer 0).
Aufbau des Puffers:
Für jedes Event werden 3 Byte benötigt:
Byte 1: HIGH-Byte der Punkt-Nummer
Byte 2: LOW-Byte der Punkt-Nummer
Byte 3: In Bit 0 steht der neue Pegel des Input-Capture-Eingangs

Der Puffer muss also eine Größe von mindestens 16 * 3 = 48 Byte haben. Innerhalb des Puffers steht das neueste (zuletzt aufgetretene) Event an erster Stelle, dann folgen die immer älteren Ereignisse.

Hinweis:
Bei jedem Aufruf der Funktion Lumax_GetInputCapture wird eine Input-Capture-Messung erzwungen. Das heisst, selbst wenn kein Ereignis seit dem letzten Aufruf von Lumax_GetInputCapture stattgefunden hat, ist NumOfEvents = 1. Das erste Ereignis im Puffer ist also immer der Zeitpunkt des Aufrufs von Lumax_GetInputCapture und der momentan anliegende Logikpegel am Eingangspin. Auf diese Weise lässt sich der Pegel abfragen, auch ohne dass Ereignisse aufgetreten sind. Im Anschluss folgen bis zu 15 gemessene Input-Capture-Events.

Beispiel:
Der Aufruf von Lumax_GetInputCapture liefert folgendes Ergebnis:
NumOfEvents: 5
Buffer (zerlegt in einzelne Bytes):
1, 117, 0, 1, 42, 0, 0, 206, 1, 0, 39, 0, 3, 185, 1
Zu jedem Event gehören 3 Byte, im Falle des ersten Events also die Bytes 1, 117 und 0.
1 ist das HIGH-Byte, 117 das LOW-Byte des Punkte-Zählers. 1*256 + 117 = 373
Wie oben beschrieben ist das erste Ereignis immer der Zeitpunkts des Aufrufs von Lumax_GetInputCapture. Das heisst also, die Funktion wurde bei Punkt 373 des aktuell ausgegebenen Frames aufgerufen, und der Pegel des Eingangspins war zu dieser Zeit 0.
Das vorherige Ereignis trat bei Punkt (1*256+42)=298 auf. Hier wechselte der Pegel von 1 auf 0.
Das wiederum vorherige Ereignis trat bei Punkt (0*256+206)=206 auf. Hier wechselte der Pegel von 0 auf 1.
Das wiederum vorherige Ereignis trat bei Punkt (0*256+39)=39 auf. Hier wechselte der Pegel von 1 auf 0.
Das wiederum vorherige Ereignis trat bei Punkt (3*256+185)=953 auf. Hier wechselte der Pegel von 0 auf 1.
Dieses letzte, am weitesten zurückliegende Ereignis gehört nicht mehr zum aktuellen, sondern zum vorherigen Frame, wie an der Folge der Punktnummern zu erkennen ist (373, 298, 206, 39, 953)


Letztes Update: 29.08.2010
Zurück zur Hauptseite