DJ-Handschuh

Fortgeschrittenen-Praktikum SS2014

Hardware

Dieser Abschnitt beschäftigt sich mit der Konstruktion und Elektronik des Handschuhs selbst. Anforderungen an den gesamten Aufbau waren in erster Linie Stabilität und Verlässlichkeit aber auch ein Design, das den Benutzer bei der Ausübung anderweitiger Aktivitäten möglichst nicht behindert.

Komponenten - Überblick

Arduino-Nano Mikrocontroller-Plattform

Die Arduino-Nano Plattform (oder einfach nur "Arduino-Nano") stellt das Herzstück des Handschuhs dar. Sie ist mit einem Atmega328 Mikrocontroller bestückt, der Sensorik und Anzeigen ansteuert, ausliest, die Daten aufbereitet und an das Bluetooth-Modul zur Übertragung an den Computer weitergibt. Weitere ICs auf der Plattform sind ein UART-Chip mit Mini-USB-Anschluss zur Programmierung und Kommunikation mit Computer oder Bluetooth-Modul, sowie ein 5V-Linearregler, der sich aber für unsere Absichten als zu leistungsschwach herausstellte und daher umgangen wurde. Die wichtigsten Spezifikationen sind in der folgenden Tabelle aufgelistet. Mehr Informationen können der Arduino-Website entnommen werden.

Mikrocontroller: Atmega328
Arbeitsspannung: 5V
Digital I/O-Pins: 14
Analog I/O-Pins (12Bit): 8
FLASH-Speicher: 32KB
Takt: 16Mhz
Abmessungen: 18,5mm x 43mm

Die zahlreichen I/O-Pins bieten ausreichend Möglichkeit zur Kommunikation mit analogen und digitalen Peripheriegeräten. Für die Programmierung von Arduinos gibt es eine eigene IDE und eine große Anzahl an bewährten Libraries, wie beisepielsweise für I2C- oder serielle USB-Kommunikation, die den Umgang erleichtern.

Handschuh-Platine

Um einen Großteil der Peripherie möglichst platzsparend, robust und ohne viel Kabel mit dem Arduino zu verbinden, haben wir für den Handschuh eine eigene Platine entworfen und herstellen lassen. Der Arduino und einige weitere Komponenten wurden direkt auf dieser Platine platziert, für andere Bauteile existieren passende Stecker oder Lötpads.

Links: Ein Screenshot des finalen Platinen-Layouts in Eagle. Mitte: Die unbestückte Platine mit 1-Cent-Münze zum Größenvergleich. Rechts: Die bestückte Platine, wie sie auf den Handschuh aufgenäht wurde.

Unter den folgenden Links können detailiertere Ansichten und die EAGLE-Files heruntergeladen werden:

Sensoren, Drehregler und Buttons

Zeigefinger-Buttons

Bei den Zeigefinger-Buttons handelt es sich um gewöhnliche Druckknöpfe, durch deren Aktivierung die Versorgungsspannung an einem digitalen Eingangs-Pin des Arduino angelegt wird, der sonst von einem 10k-Pull-Down-Widerstand auf GND gezogen würde.Speziell ist hier der Knopf zwischen Zeige- und Mittelfinger, da er dem Mikrocontroller mitteilt, ob die Finger der Hand gespreizt oder geschlossen sind. Ursrpünglich sollten hier deutlich flachere kapazitive Berührungssensoren zum Einsatz kommen. Dabei entstanden allerdings Probleme die rein zeittechnisch nicht mehr lösbar waren. Die Buttons werden softwareseitig entprellt. Das Signal wird entweder direkt an die DAW weitergeleitet und ist dort frei belegbar oder es wird je nach aktuell gewähltem Serversoftware-Programm mit einem Sensor verknüpft.

Platinen-Buttons

Für sie gilt im Wesentlichen das Gleiche wie für die Zeigefinger-Buttons. Die zwei Buttons unter der 7-Segment-Anzeige haben allerdings festgelegte Funktionen: Der Linke dient zur Wahl des Server-Software-Programms, während sich durch den Rechten der MIDI-Kanal einstellen lässt.

Drehregler

Bei den Drehreglern auf der Platine handelt es sich um 50k-Potentiometer, deren Schleiferkontakte über die 12-Bit-Analogeingänge des Arduino ausgelesen werden. Ein Außenkontakt liegt auf Erde, der andere wird an demselben 1V-Spannungsregler angeschlossen, der auch die Referenzspannung für die Arduino-ADCs liefert. Letzteres garantiert ein stabiles Signal und die Nutzung des gesamten Aussteuerbereichs der ADCs. Die Wahl der 1V-Referenzspannung wird im Abschnitt über den Flex-Sensor begründet. Wie auch bei den Buttons werden die Poti-Signale je nach gewähltem Serverprogramm direkt an die DAW weitergeleitet oder mit Sensoren Verknüpft (beispielsweise zur Regelung der Sensitivität des Beschleunigungssensors)

Kippschalter

Bis auf die mechanischen Unterschiede arbeitet der Kippschalter wie die Buttons. In den meisten Serverprogramm-Implementierungen findet er als Sensor-Bypass-Schalter Verwendung.

Beschleunigungssensor

Der digitale Beschleunigungssensor (MMA8451QR1 von Freescale-Semiconductor) dient in erster Linie zur Registrierung von Schlagbewegungen und der Bestimmung ihrer Schlagstärke. Die Ansteuerung der zahlreichen Einstellmöglichkeiten und Auslesung der bereits digitalisierten Werte erfolgt über einen 400kHz-I2C-Bus. Das Breakoutboard wurde zusammen mit der Handrückenplatine gelayoutet und bietet Platz für Entstörkondensatoren.

Bei der Modulierung von Klängen ist eine Verzögerung ("Latenz") von 50ms zwischen Benutzereingabe und tatsächlicher Klangveränderung kein großes Problem. Geht es allerdings darum einen Klang - wie hier durch eine Schlagbewegung - möglichst exakt auf einen vorgegebenen Rhythmus zu spielen, ist die menschliche Wahrnehmung bezüglich Verzögerungen verblüffend empfindlich. Der Beschleunigungssensor ist folglich von allen Signalerzeugenden Komponenten die zeitkritischste. In der folgenden Tabelle ist aufgelistet, wie der Mensch Verzögerungszeiten wahrnimmt:

0ms - 10ms: Kaum wahrnehmbar, ideal
ab 10ms: Der Musiker selbst spürt eine gewisse "Indirektheit", kann aber noch keine eindeutige Verzögerung feststellen.
ab 20ms: Zwei impulsive Klänge mit diesem Zeitabstand können von einem Zuhörer tatsächlich als zwei "Noten" differenziert werden.
ab 50ms: Der Musiker spielt deutlich "untight", also leicht neben dem Beat.
90ms: Der kürzeste Abstand zweier aufeinander folgender Noten, den wir mit dem Handschuh erreichen konnten.

Da bereits Bluetooth-Übertragung, Weitergabe der Daten an die DAW und andere Prozeduren Latenzen im Millisekundenbereich verursachen, wurde die Hardware so entworfen, dass immerhin ein fast verzögerungsfreies Absenden der Daten durch den Handschuh möglich ist. Der Sensorchips selbst bietet zwei Interruptausgänge mit einer Vielzahl interner Routing-Optionen (Data-Ready, Schwellwertüberschreitung, Erkennung von freiem Fall, etc...). Einer der Ausgänge wurde mit einem interruptfähigen Digitalpin des Arduino verbunden. Nach diversen Experimenten wurde allerdings eine Lösung ohne Interrupt realisiert.

Im folgenden Diagramm sind die Ausgabedaten des Beschleunigungssensors für drei Schläge ansteigender Stärke gegen die Zeit aufgetragen. Die Beschleunigung ist in vielfachen der Erdbeschleunigung angegeben. Die Datenrate des Sensors betrug 400Hz, als maximale Aussteuerung wurden die größtmöglichen Werte gewählt( -8g bis 8g). Diese Einstellungen fanden auch im finalen Setup Verwendung. Es stellte sich heraus, dass die Steigung, bzw. der vertikale Abstand der Datenwerte (durch rote Klammern kenntlich gemacht) auf der ersten Aufwärtsflanke eines Schlages ein sehr verlässliches Maß für die Schlagstärke darstellt.

Ausgabewerte des Beschleunigungssensors bei drei Schlagbewegungen verschiedener Stärke. Rot gestrichelt ist die maximale Aussteuerung des Sensors, grün der Schwellenwert zur Schlagregistrierung und rote Klammern verdeutlichen den vertikalen Abstand von jeweils 4 aufeinander folgenden Flanken-Datenpunkten.

Schlussendlich wurde für die Auslesung des Sensors folgende Prozedur implementiert.

  1. Das Data-Ready-Flag des Sensors wurde auf den Interrupt-Ausgang des Sensors geroutet. Dies ist von Vorteil, da die Auslesung eines Digitalpin-Zustandes am Arduino deutlich schneller von statten geht (<4us) als die I2C-Kommunikation mit dem Sensor-Statusregister (ca. 300us).
  2. Der Arduino polled das Data-Ready-Flag in kurzen Abständen (<2,5ms) und liest gegebenenfalls neue Daten aus, sodass bei einer Datenrate von 400Hz kein Datenpunkt verpasst wird. Jeweils die letzten vier ausgelesenen Werte werden in einem Ring-Buffer (siehe "Software") abgespeichert.
  3. Bei Eingang eines Wertes wird überprüft, ob er einen gewissen Schwellwert (in Diagramm "SW") überschreitet. Ist dies der Fall, liegt eine Schlagbewegung vor und es kann instantan aus den vier Werten im Ring-Buffer eine aktuelle mittlere Steigung der Flanke (damit auch die Schlagstärke) ermittelt und an das Bluetooth-Modul weitergeleitet werden.
  4. Um weitere Notenanschläge durch Überschwinger zu vermeiden wird die Schlagregistrierung erst 75ms nach dem letzten Schlagereignis wieder reaktiviert. In Tests kamen wir zu dem Ergbenis, dass ein Abstand zwischen zwei Schlägen kleiner als 90ms mit dem Handschuh so gut wie unmöglich zu erreichen ist.

Auf diese Weise konnte die handschuhinterne Latenz trotz der niedrigen Datenrate (alle 2,5ms) auf maximal 3ms reduziert werden.

In Zukunft sollte auch noch am Spielgefühl gearbeitet werden. Die derzeitig lineare Schlagstärke-Pegel-Kennlinie könnte in Zukunft durch eine exponientielle Kurve mit optimiertem Offset ersetzt werden, um dem Benutzer ein intuitiveres Spielgefühl zu vermitteln.

Biegesensor

Der Biegesensor (FS-L-0055-253-ST von Spectra-Symbol) dient dazu Schließ- und Öffnungsbewegungen der Hand zu messen.

Im Prinzp ist er ein 30k-Widerstand, dessen Wert sich bei Verbiegung erhöht. Um den Biegewinkel zu maximieren und eine unnötige Behinderung des Benutzers durch den Sensor zu vermeiden wurde er an der Unterseite des kleinen Fingers angebracht. Wird er zusammen mit einem Festwiderstand zu einem Spannungsteiler verschaltet, lässt sich einfach ein analoges Signal abgreifen, das der aktuellen Biegung (mit Offset) des Sensors entspricht. Nun stellte sich heraus, dass sich der Widerstand des Sensors selbst bei starken Biegungen, entgegen der Angaben im Datenblatt, nur um ca. 7 Prozent ändert. Um trotzdem ein gut aufgelöstes und stabiles Signal zu erhalten musste die Referenzspannung der Arduino-ADCs auf 1V verringert sowie durch Mittelung über mehrere Auslesungen Oversampling erreicht und elektronisches Rauschen minimiert werden. Da der Sensor sehr empfindlich auf Berührungen mit leicht bekleideter oder nackter Haut reagiert, musste er außerdem mit einem Schrumpfschlauch isoliert werden.

 

Gyrosensor

Der Gyrosensor (L3G4200D) befindet sich unter dem Arduino auf der Rückseite der Handschuh-Platine. Er misst Winkelgeschwindigkeiten des Handrückens und wird ebenfalls über I2C angesteuert. Durch kontinuierliche Integration über die Winkelgeschwindigkeiten lässt sich grob auf die aktuelle Position der Hand schließen. Um allerdings eine verlässliche Lagebestimmung über einen längeren Zeitraum zu gewährleisten, müssen alle Driftverursachenden Faktoren wie Offsets oder mangelhafte Auflösung der Winkelgeschwindigkeit bestmöglichst beseitigt werden. Hierfür besitzt der Gyrosensor interne Bandpassfilter die über I2C konfiguriert werden können. Offsets konnten später noch durch lange Mittelung bei ruhender Platine auf PPM-Genauigkeit verlässlich bestimmt werden. Bisher wurde nur eine Lagebestimmung durch Integration über eine Achse realisiert, was aufgrund der Abhängigkeiten der Drehachsen voneinander zu keinem besonders zufriedenstellenden Ergbenis führte. Es zeigte sich aber, dass bei alleiniger Drehung um die integrierte Achse die Stabilität über Zeiträume von mehreren Minuten gegeben ist. Eine Lagebestimmung dieser Art mit drei Achsen, die vom Benutzer direkt vor Anwendung kalibriert werden kann wäre also denkbar. Dennoch sollte in Zukunft ein weiterer Beschleunigungssensor auf der Platine platziert und komplexere Lagebestimmungsalgorithmen - wie beispielsweise Kalman-Filter - verwendet werden.

Ultraschall-Entfernungssenor

Der Ultraschall-Sensor (SRF02) kann durch Aussenden eines Unltraschallsignals und Registrierung dessen Echos Entfernungen zwischen 15cm und 600cm messen. Beim Handschuh wurde er an der Handkante befestigt und dient in erster Linie dazu den Abstand zwischen Hand und Boden zu messen. Das heißt, dass für uns Distanzen zwischen 20cm und 200cm von besonderem Interesse sind. Aufgrund der vergleichsweise langsamen Schallgeschwindigkeit benötigt der Sensor für eine Messung bis zu 65ms, weßhalb er etwas träger reagiert als andere Sensoren. Da er aber fließende Übergänge statt impulsive Klänge erzeugt, ist hier eine Latenz von bis zu 80ms kein großes Problem. Tatsächlich kann man wohl durch einen Trick eine Art Data-Ready-Flag abfragen, was aber zeitlich nicht mehr realisiert werden konnte. Am Handshuh kann er insbesondere bei der Simulation eines Theremin Verwendung finden.

Kommunikation

Arduino USB-Port

Der Arduino-USB-Port dient zur Programmierung des Arduinos und als serielle Schnittstelle für die Kommunikation mit einem Rechner. Alle Daten, die an das Bluetooth-Modul gesendet werden, können auch an diesem Port abgegriffen werden.

Bluetooth-Modul

Das Bluetooth-Modul dient der Übertragung der Daten zum Rechner. Es verwendet praktischerweise dasselbe serielle Protokoll wie die Arduino-USB-Schnittstelle und kann daher auch über den UART angesteuert werden. Die Baud-Rate wurde auf den maximal kompatiblen Wert gesetzt (115200). Das Modul kann nach der Installation der entsprechenden Treiber (bei Windows automatisch) wie ein gewöhnlicher COM-Port verwendet werden.

 

 

Energieversorgung

Die Energie-Versorgung besteht im Wesentlichen aus zwei Komponenten:

  1. Einem einzelligen Lithium-Polymer-Akku mit 3,7V Nennspannung und einer Kapazität von 2000mAh
  2. Dem LiPo-Rider-Pro Shield von Seeed-Studio mit folgenden Funktionen: Es regelt...
    • ... die Akkuspannung auf 5V, die bis zu einer Stromentnahme von 1A stabil gewährleistet wird.
    • ... den Ladevorgang des Lipo-Akkus bei Anschluss eines USB-Kabels an die Ladebuchse.
Das bereits präparierte Ladeshield und der verwendete LiPo-Akku

Der Handschuh benötigt durchschnittlich etwa 200mA, was einer Leistungsaufnahme von ca. 1W entspricht. Damit ergibt sich eine ungefähre Akkulaufzeit von 7 Stunden. Der Ladestrom beträgt je nach Qualität der USB-Ladequelle ca. 500mA, demnach dauert der Ladevorgang eines vollständig entleerten Akkus etwa 5 Stunden. Die Stabilität der 5V-Ausgangsspannung wurde von uns getestet. Bei einer Stromentnahme von 250mA brach die Spannung um ca. 5‰ ein. Auch bei starken Belastungsschwankungen konnten keine größeren kurzzeitigen Einbrüche festgestellt werden.

Akku und Ladeshield wurden gemeinsam mit dem Bluetooth-Modul in einer Kunstoffbox untergebracht, die passgenau mithilfe eines 3D-Druckers hergestellt wurde und sich mit einem Klettband auf den Unterarm schnallen lässt. Die Druckdatei für die Box kann hier heruntergeladen werden.

Die gedruckte Akkubox. Links: Box ohne Deckel. Rechts: Die versiegelte Box mit Klettband für den Unterarm.

Anzeigen

Programm und MIDI-Kanal

Die zwei 7-Segment-Anzeigen neben dem Arduino dienen zur Information über derzeit eingestellten MIDI-Kanal und Server-Programm. Sie werden über eine Stromsenke mit integriertem 16-Bit-Schieberegister mit Energie versorgt und angesteuert. Um alle 16 LEDs unabhängig voneinander schalten zu können, benötigt man so nur zwei Digital-Out Pins des Arduinos (Clock und Data) für die Kommunikation mit dem Schieberegister.

Ladestatus

Die Ladestatus-Anzeige leuchtet rot, wenn der Akku geladen wird. Ist der Akku voll, leuchtet sie grün.

Akku-Zustand

Der Akku-Ladezustand kann durch drücken des kleinen Buttons an der unteren Stirnseite der Akkubox überprüft werden. Je nach Zustand leuchten hinter dem Anzeigefenster bis zu vier kleine LEDs auf.

Textilien

Die gesamte Elektronik wurde auf einem handelsüblichen Fahrradhandschuh platziert. Obwohl der fertige DJ-Handschuh rechtshändig ist, wurde ein linker Fahrradhandschuh verwendet, um die Lederfläche - die beim Fahrradhandschuh normalerweise die Handfläche schützen soll - auf dem Handrücken zu haben und als reißfeste Montage-Unterlage verwenden zu können. An Zeige- und kleinem Finger wurde der Fingerschaft mit dem Stoff eines alten Socken verlängert. Außerdem kamen jede Menge Klettband, verschiedene Textilkleber, Gummibänder und natürlich Bindfaden und Nähmaschine zum Einsatz.