kann ihre komplette Projektarbeit im PDF

Werbung
Hochschule Karlsruhe - Technik und Wirtschaft
Fakultät für Elektro- und Informationstechnik
Projektarbeit
Entwicklung eines Lichtschwertes
Dennis Waschik, 41246
Bastian Weiÿ, 46734
07.03.2016
Betreuer
Prof. Dr. Alfons Klönne
Fakultät für Elektro- und Informationstechnik
Hochschule Karlsruhe
Abstract
In der vorliegenden Arbeit wird die Entwicklung eines voll funktionsfähigen Lichtschwertes beschrieben, welches seine Farbe abhängig seiner Bewegungsrichtung
ändert. Dazu sind Komponenten zur Erfassung der Position und Beschleunigung,
Auswertung der Daten sowie Ansteuerung der lichtemittierenden Halbleiter-Bauelementen notwendig. Im Rahmen dieser Arbeit wird die Entwicklung des gesamten Aufbaus beschrieben, der notwendig ist um Software und Hardware miteinander zu kombinieren. Durch den Einbau in einem speziell angefertigten Gehäuse
wird es zu einem Lichtschwert, angelehnt an die Star-Wars-Saga.
I
Danksagung
An dieser Stelle möchten wir uns für die zahlreichen Unterstützungen bedanken.
Unserem Projektbetreuer Prof. Dr.-Ing. Alfons Klönne gilt unser besonderer Dank
für seine wissenschaftliche Unterstützung und wohlwollende Förderung unseres
Projektes.
Ein besonderer Dank geht auch an Herrn Felix Wöhrle, der die mechanische
Planung insbesondere des Gries übernommen hat, und das gesamte Team der
Elektronikwerkstatt. Sie haben uns während unserer Projektarbeit fachkräftig
unterstützt und waren für uns wertvolle Gesprächspartner.
Wir bedanken uns auch bei Herrn Thomas Eckhardt, der uns bei der Platinenentwicklung tatkräftig zur Seite gestanden hat.
Nicht zuletzt gilt unser besonderer Dank unseren Familien und Freunden, die
uns die Weiterbildung und die Realisierung des Projektes ermöglicht haben. Sie
haben uns mit viel Geduld und zeitlicher Entbehrung stets unterstützt.
II
Inhaltsverzeichnis
1
Technisches Konzept
2
2
Entwicklung
5
2.1
2.2
Hardware
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
2.1.1
Energieversorgung
. . . . . . . . . . . . . . . . . . . . . .
5
2.1.2
Steuereinheit
. . . . . . . . . . . . . . . . . . . . . . . . .
6
2.1.3
Bewegungserfassung
. . . . . . . . . . . . . . . . . . . . .
7
2.1.4
Mikrocontroller-Board Arduino Nano . . . . . . . . . . . .
9
2.1.5
Verstärkerschaltung . . . . . . . . . . . . . . . . . . . . . .
9
2.1.6
Lichtausgabe
. . . . . . . . . . . . . . . . . . . . . . . . .
10
2.1.7
Soundausgabe . . . . . . . . . . . . . . . . . . . . . . . . .
12
Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
14
2.2.1
3-Achsen-Beschleunigungssensor . . . . . . . . . . . . . . .
15
2.2.2
RGB-LED . . . . . . . . . . . . . . . . . . . . . . . . . . .
17
2.2.3
Soundmodul . . . . . . . . . . . . . . . . . . . . . . . . . .
20
3
Mechanischer Aufbau
21
4
Test und Inbetriebnahme
25
5
Fazit
29
6
Anhang
32
A Schaltplan
32
B Programmcode
33
C Platinen-Layout
50
III
Einleitung
Die Aufgabe dieser Projektarbeit besteht darin, ein voll funktionsfähiges Lichtschwert zu entwickeln, welches die Farbe abhängig seiner Bewegungsrichtung ändert und je nach Intesität der Richtungsänderung die Helligkeit dimmt. Hintergrund dieser Projektarbeit ist die Verwendung als Vorzeigeobjekt auf diversen
Veranstaltungen der Fakultät EIT zur Weckung des Interesses an einem elektrotechnischem Studiengang. Es muss eine Schaltung entworfen werden, die die Lage
sowie die Beschleunigung des Lichtschwertes im Raum auswertet, LEDs ansteuert
und diese programmtechnisch verknüpft. Weiterhin ist ein grundlegender Aufbau
der Schaltung inklsuive Akku zu überlegen, welcher den Maÿen eines Lichtschwertes, angelehnt an die Star-Wars-Saga, gerecht wird. Hierbei ist der mechanische
Aufbau selbst anzufertigen sowie die elektrische Schaltung zu integrieren.
1
1
Technisches Konzept
Der Aufbau des Lichtschwertes besteht aus einem Aluminiumgri, der mit einer
Plexiglasröhre verbunden ist. Die Plexiglasröhre wird mittels eines lichtemittierenden Halbleiter-Bauelements beleuchtet. Es gibt eine Steuereinheit mit der sich
die Funktionen des Lichtschwertes steuern lassen.
In Abbildung 1.1 ist der technologische Aufbau des Gerätes dargestellt. Dabei
gilt das folgende Farbschema: In Grün sind alle digitalen Signale dargestellt, in
Rot sind analoge Signale und Steuereinheiten und in blau sind Elemente der
Spannungsversorgung dargestellt.
Die Spannungsversorgung ist mit einem 9V Batterieblock bestehend aus insgesamt 6
·
1,5 V AA-Batterien realisiert. Der 3-Achsen-Beschleunigungssensor ist
via I²C-Bus mit dem Mikrocontroller verbunden. Als Mikrocontroller kommt ein
Arduino Nano V3.0-Board zum Einsatz, da dieses einen integrierten Mikropozessor verbunden mit Eingängen und Ausgängen (digital und analog) liefert. Diese
Ein-und Ausgänge können über die kompatible Arduino IDE-Software deniert
werden. Der Mikrocontroller wertet die vom Beschleunigungssensor gelieferten
Signale aus, verknüpft sie mit dem entsprechnenden intern denierten Farbraum
und steuert dann mittels Pulsweitenmodulation die interne Verstärkerschaltung
der Konstantstromquelle. Es wird eine Highpower-LED-Platine verwendet, auf
welcher die drei LEDs mit den Grundfarben Rot, Grün und Blau einzeln angesteuert werden können. Für die Energieversorgung der LEDs werden StepUp-Converter und Konstantstromquellen verwendet. Zur Ausgabe des typischen
Lichtschwert-Sounds ist ein Lautsprecher über ein Soundmodul mit dem Arduino
Nano-Board verbunden. Die Funktionswahl ist über Schalter und Potentiometer realisiert. Diese schalten das Lichtschwert ein, ändern den Modus zwischen
Automatik- und Manuell-Betrieb und dimmen die Lichtintensität.
2
Abbildung 1.1: Technologieschema
Um einen Überblick über die Funktionen des Lichtschwertes zu bekommen, werden diese im Folgenden kurz beschrieben. Beim Einschalten des On/O-Schalters
soll das Lichtschwert noch nicht eingeschaltet werden. Erst bei Betätigung des
Start/Stopp-Schalters wird der spezielle Sound für das Einschalten abgespielt
und das Licht an der LED ausgegeben. Es wird direkt in denjenigen Modus gegangen, der am Modus-Schalter zuvor eingestellt war. Hier gibt es den manuellen
Modus, bei dem man die Farbe und Helligkeit per Potentiometer einstellen kann,
und den Automatik-Modus bei dem die Farbe über den Beschleunigungssensor
eingestellt wird. Im laufenden Betrieb ist jederzeit ein ändern der Modi über
den Modus-Schalter möglich. Sobald der Taster der Eingabeperipherie gedrückt
ist, wird ein spezieller Laserschwert-Sound abespielt und im Automatik-Modus
der komplette Farbkreis durchlaufen. Zum Ausschalten kann entweder direkt der
On/O-Schalter betätigt werden oder der Start/Stopp-Schalter. Bei Betätigung
des Start/Stopp-Schalters wird der Lichtschwert Aus-Sound abgespielt und im
nachhinein das Licht ausgeschaltet. Wird nun wieder der Start/Stopp-Schalter
gedrückt so wird daraufhin der Lichtschwert Ein-Sound abgespielt und das Licht
3
wieder eingeschaltet. Im weiteren Bericht wird auf die einzelnen Bauelemente im
Detail eingegangen. Dabei wird sowohl die Hardware- als auch Softwareentwicklung beschrieben.
4
2
Entwicklung
2.1
Hardware
In diesem Kapitel wird der Entwurf der Hardware dargestellt. Dabei wird auf
die einzelnen Komponenten und den Schaltplan, siehe Anhang A, eingegangen.
Der mechanische Aufbau des Gehäuses wird im Kapitel 3, Mechanischer Aufbau,
näher beschrieben.
Folgende Komponenten wurden im nalen Entwicklungsprozess verwendet:
ˆ
3-Achsen-Beschleunigungssensor MMA8451
ˆ
Arduino NANO 3.0-Mikrocontroller-Board, inklusive ATMEGA328-Mikroprozessor
ˆ
Batteriehalter für 6
ˆ
Lautsprecher
ˆ
LED Highpower Chip 10 W RGB
ˆ
LDD-350L Konstantstromquelle
ˆ
LM2577 DC-DC Step-Up Converter
ˆ
Potentiometer 10 kOhm
ˆ
Schalter
ˆ
Taster
ˆ
Widerstand 10 kOhm
ˆ
WT588D-U Soundmodul
2.1.1
·
1,5 V Mignon (AA), inklusive Druckknopfanschluss
Energieversorgung
Zur Energieversorgung kommen grundsätzlich zwei Varianten in Frage. Auf der
einen Seite wiederauadbare Akkumulatoren oder andererseits handelsübliche
5
Batterien. Da für wiederauadbare Akkumulatoren jedoch unter Umständen spezielle Ladegeräte neu beschat hätten werden müssen, el die Entscheidung aufgrund des Kosten-Nutzen-Faktors auf eine Spannungsversorgung mittels handelsüblicher AA-Batterien. Eine netzgebundene Spannungsversorgung kam aufgrund
der Anforderungen an die Mobilität des Lichtschwertes nicht in Frage. Die Spannungsversorgung wird durch 6 in Reihe geschaltete 1,5 V-AA-Batterien realisiert.
IN
Es ergibt sich somit eine Gesamtspannung von U
= 6
·
(+1,5 V) = +9 V.
Durch die in Punkt 2.1.3 näher beschriebene Spannungsversorgungsstruktur des
Mikrocontroller-Boards Arduino Nano, kann dieses direkt mit der vom Batteriehalter gelieferten 9 V-Betriebsspannung arbeiten. Um eine perfekte Lichtausgabe
zu erhalten, müssen die einzelnen LEDs der RGB-Highpower-LED-Platine je-
F
doch mit einem Konststrom von I = 350 mA bei unterschiedlichen Spannungen
betrieben werden. Da sich bei der roten LED im Optimalfall bei einem Konstant-
F
strom von I = 350 mA eine Spannung von U
R
F Rot = 7 V einstellt und über
= U
der Konstantstromquelle LDD-350L eine Spannung von 3 V abfällt, wird die Konstantstromquelle für die rote LED über einen LM2577 DC-DC Step-Up-Converter
mit einer Spannung U = 10 V versorgt. Da sich bei der grünen sowie blauen LED
F
G
im Optimalfall bei einem Konstantstrom von I = 350 mA eine Spannung von U
= U
B = UF GrünBlau = 10 V einstellt und über der Konstantstromquelle LDD-350L
ein Spannung von 3 V abfällt, werden die Konstantstromquellen für die grüne und
blaue LED über einen LM2577 DC-DC Step-Up-Converter mit einer Spannung
U = 13 V versorgt.
Die Potentiometer sind direkt und die Schalter sowie Taster über 10 kOhmWiderstände mit der vom Arduino Nano bereitgestellten 5 V-Spannungsversorgung verbunden. Der Beschleunigungssensor MMA8451 sowie das Soundmodul
WT588D-U erhalten ihre Spannungsversorgung ebenfalls direkt über das Mikrocontroller-Board Arduino Nano.
2.1.2
Steuereinheit
Zur Auswahl und Steuerung der verschiedenen Betriebsmodi des Lichtschwertes
werden zwei Stufenschalter, ein Taster und zwei 10 kOhm-Potentiometer verwendet. Die Schalter und Taster sind, wie in Abbildung 2.1 dargestellt, als Parallelschaltung mit dem entsprechenden Analog-Eingang des Arduino Nano auf der
Eingangsseite über einen 10 kOhm-Widerstand mit der 5 V-Spannungsversorgung
6
des Arduino Nano verbunden. Auf der Ausgangsseite liegt Ground-Potential an.
Ist der Schalter geönet, so liegt am Analog-Eingang des Mikrocontrollers die
5 V-Spannung an. Wenn sich der Schaltkontakt schlieÿt, wird das Potential auf
Ground gezogen und es liegen 0 V am Analog-Eingang an. Bei den Potentiometern ist jeweils der rechte Auÿenkontakt mit der 5 V Versorgungsspannung, der
Schleiferkontakt mit dem entsprechenden Analog-Eingang und der linke Auÿenkontakt mit dem Ground-Potential verbunden.
Abbildung 2.1: Anschluss eines Schalter oder Taster an den Arduino Nano [BC13]
2.1.3
Bewegungserfassung
Im Entwicklungsprozess wurden zwei verschiedene 3-Achsen-Beschleunigungssensormodelle getestet und implementiert. Verschiedene Erfahrungen wurden hierbei
gewonnen und für das Endprodukt verwendet.
BMA020
Zunächst wurde ein Sensor-Modul mit einem digitalen 3-Achsen-MEMS-Beschleunigungssensor BMA020 von Bosch Sensortec verwendet. Dieser Beschleunigungssensor erzeugt zwischen 25 und 1500 Mal pro Sekunde Messdaten in einem wählbaren Bereich von
±2
g,
±4
g oder
±8
g. Eine Anbindung an den Mikrocon-
2
troller erfolgte via I C-Bus. In der nachfolgenden Abbildung 2.2 ist ein BMA020Sensorboard mit einem Arduino Nano auf einem Steckbrett verbunden. Die Kommunikation erfolgt auch hier via I²C-Bus. Hier ist auch zu erkennen, dass die Pins
A4 und A5 des Arduino Nano, welche für eine I²C-Kommunikation benötigt werden, mit den Datenleitungen des Beschleunigungssensor-Moduls verbunden sind.
7
Abbildung 2.2: Bosch Sensortec BMA020-Sensorboard mit Arduino Nano [Lan12]
MMA8451
Im Anschluss an die Testphase des Sensor-Modul BMA020 wurde unter Einbeziehung der gewonnen Erfahrungen und Anforderungen nach einem neuen, den
Ansprüchen des Projektes gerechtwerdenden, 3-Achsen-Beschleunigungssensormodell gesucht. Die Tests werden nachfolgend in Kapitel 4 beschrieben. Die Entscheidung el nach ausführlicher Recherche auf das Sensor-Modul MMA8451 von
Adafruit, welches mit einem digitalen 3-Achsen-Beschleunigungssensor MMA8451
von Freescale Semiconductor, Inc. arbeitet. Dieser 14-bit-Sensor erzeugt ebenfalls
Messdaten im Bereich von
±2
g,
±4
g oder
±8
g und kann via I²C-Bus mit dem
Mikrocontroller kommunizieren. Bei diesem Sensor-Moduls liegt unabhängig von
der Lage im Einschaltmoment für jede Bewegungsrichtung ein festdenierter Wertebreich vor. Die nachfolgende Abbildung 2.3 ist eine Darstellung des MMA8451
Sensormoduls.
Abbildung 2.3: Adafruit MMA8451 Accelerometer [rob16]
8
2.1.4
Mikrocontroller-Board Arduino Nano
Zur Signalverarbeitung kommt ein Arduino Nano-Board zum Einsatz. Dieses
Board wurde aufgrund seiner kompakten Gröÿe dem leicht höherwertig ausgestatten Arduino UNO und einem Raspberry Pi vorgezogen. Dank dem leistungsstarken ATmega382-Mikrocontroller stehen ausreichend Ressourcen für die benötigte
Signalverarbeitung zur Verfügung. Der Mikroprozessor verfügt über eine Taktrate
von 16 MHz, einen Flash-Speicher von 32 kB, einen SRAM von 2 kB und einen
EEPROM von 1 kB. Weiterhin stellt der Arduino Nano 14 I/O-Ports, davon 6 mit
2
8-Bit-PWM-Output, und eine I C-Schnittstelle bereit. Jeder der digitalten Pins
kann als Input oder Output verwendet werden. Sie arbeiten mit einer Spannung
von 5 Volt und können jeweils einen Strom von maximal 40 mA bereitstellen.
Zudem verfügt der Nano über 8 Analog-Inputs mit einer Auösung von 10 Bit
(1024 Abstufungen). Diese analoge Eingänge sind wichtig für die Auswertung
der Schalteinheiten wie Schalter, Taster und Potentiometer. Ein weiterer groÿer
Vorteil des Arduino-Boards ist die Möglichkeit der Spannungsversorgung per 5,0
V-Feststpannung auf Pin 27 oder im Spannungsbereich von 6 V bis 20 V auf Pin
30. Dies ermöglicht den direkten Anschluss an die 9 V Spannungsversorgung des
Lichtschwertes durch die Reihenschaltung der Batterien. [Ard]
2.1.5
Verstärkerschaltung
F
Da der von der Highpower-LED benötigte Konstantstrom mit I = 350 mA gröÿer ist als der vom Ausgang des Arduino-Boards bereitgestellte Strom I
OUT =
40 mA, wird eine Verstärkerschaltung benötigt. Hierzu werden HochleistungsKonstantstromquellen (KSQ-Module) vom Typ LDD-350L verwendet. Wie schon
im Abschnitt 2.1.1 beschrieben, ist die Spannungsversorgung der Konstantstromquellen durch die Hochsetzsteller so dimensioniert, dass sich der für die verschiedenen LEDs spezische Spannungswert am Ausgang der KSQ einstellen
kann. Die LDD-350L-KSQ verfügt weiterhin über einen PWM-Eingang, sodass
eine vom Mikrocontroller regulierte Farbgestaltung per PWM ermöglicht werden kann. Hierfür werden die entsprechenden PWM-Ausgäng des Arduino NanoMikrocontroller-Board mit den PWM-Eingängen der Konstantstromquellen verbunden. Ein hoher Wirkungsgrad und die dadurch geringe Wärmeentwicklung
ermöglicht den Betrieb der Module ohne Kühlkörper. In nachfolgender Abbildung
9
2.4 ist die Verstärkerschaltung dargestellt. Die zwei Step-Up-Converter transformieren die Eingangsspannung in eine höhere Ausgangsspannung um für die LEDs
die Arbeitsspannung bereitzustellen. Über den Konstantstromquellen LDD-350L
fallen wie bereits beschrieben 3 V ab. Der mittlere Pin der LDD-350L ist der
PWM Input Pin. Dieser ist direkt mit den PWM Output Pins des Arduino Nano
verbunden, welche je nach Farbeinstellung den Duty Cycle variieren.
Abbildung 2.4: Verstärkerschaltung
2.1.6
Lichtausgabe
Zur Lichtausgabe wurden zwei Konzepte verfolgt. Die Ansteuerung eines RGBLED-Stripes sowie die Ansteuerung einer RGB-Highpower-LED-Platine.
LED-Stripe
Ursprünglich war eine Ausleuchtung der satinierten Plexiglasröhre durch die Ansteuerung eines handelsüblichen RGB-LED-Stripe geplant. Realisiert und getestet wurde dieses Konzept mit einem 5 Meter langen 24 W-LED-Stripe der
Marke Müller-Licht. Der Stripe verfügt pro Farbe über 150 LEDs. Die 12 VSpannungsversorgung wird direkt über einen LM2577 DC-DC Step-Up Converter an der 9 V-Ausgangsspannung des Batterieblocks realisiert. Die Farbsteuerung wird vom Arduino Nano über eine Pulsweitenmodulation gesteuert, welche die LEDs der Farben Rot, Grün und Blau über N-Kanal-MOSFETS vom
Typ STP16NF06L schaltet. Die Ausgänge des Mikrocontroller-Boards sind über
220 Ohm-Widerstände mit den Gate-Anschlüssen der MOSFETs verbunden. Die
Drain-Anschlüsse sind, wie in Abbildung 2.5 dargestellt ist, mit den Kathoden
der LED-Stripes und die Source-Anschlüsse sind mit Ground verbunden.
10
Vorteile dieser Technologie sind die einfache Schaltungsentwicklung und Montage
sowie die sehr geringe Wärmeentwicklung. Nachteilig ist jedoch die unnatürliche Ausleuchtung der Röhre. Trotz Verwendung einer extra für diesen Einsatzfall
konzipierten satinierten Plexiglasröhre, sind aufgrund der geringen Entfernung
zur Rohrwand deutlich die Lichtpunkte der einzelnen LEDs zu sehen. Ein wesentlich gröÿerer Rohrdurchmesser, um eine zufriedenstellende Lichtwiedergabe
zu erhalten, ist aufgrund des optischen Gesamtbildes des Lichtschwertes nicht zu
empfehlen. Hierauf wird in Kapitel 4 nochmals eingegangen.
Abbildung 2.5: Ansteuerung des LED-Stripes
Highpower-LED
Aufgrund der oben genannten Problematik durch die unnatürliche Ausleuchtung
der Röhre, wurde sich für die Lichtausgabe durch eine RGB-Highpower-LEDPlatine entschieden. Die 10 W-LED-Platine besteht aus 3 LED-Reihen, für jede Farbe eine Reihe, mit je 3 in Reihe geschalteten Einzel-LEDs. Wie schon in
Abschnitt 2.1.1 näher beschrieben, benötigen die einzelnen LED-Reihen einen
F
Konstantstrom von I = 350 mA. Bei diesem Strom stellt sich farbspezisch ein
Spannugswert ein. Bei der roten LED liegt diese Spannung im Bereich von V
= 6 V bis V
F
F
= 7 V. Bei der grünen und ebenso bei der blauen LED liegt diese
F
Spannung im Bereich von V
F = 11 V. Die Anodenanschlüsse der
VOUT+ -Anschlüssen und die Kathodenan-
= 9 V bis V
LED-Reihenschaltungen sind mit den
OUT- -Anschlüssen
schlüsse sind mit den V
der Konstantstromquellen verbunden.
Die Helligkeit- sowie Farbsteuerung wird, wie in Abschnitt 2.1.5 beschrieben,
durch die KSQ realisiert.
11
2.1.7
Soundausgabe
Für den typischen Laserschwert-Sound, angelehnt an die Star-Wars-Saga, wird ein
Soundmodul benötigt, auf welchem Audiodateien gespeichert und abgespielt werden können. Die Audiodateien sollen dann abgespielt werden, wenn im ArduinoProgrammablauf der Befehl dafür erteilt wird. Es muss eine Kommunikation zwischen Soundmodul und Arduino Nano hergestellt werden. Mit dem Soundmodul
WT588D-U ist diese Kommunikation möglich. Dieses Soundmodul spielt Sound
ab, der auf dem EEPROM gespeichert ist, und ist auch in der Lage einen 8 Ohm
Lautsprecher mit 0,5 Watt zu steuern. Das Modul untersützt mehr als 200 SoundDateien im WAV Format. Das WT599D-U hat einen USB-Anschluss um die Audiodateien vom PC auf das Modul zu laden. Für das Laden der WAV-Dateien auf
das Soundmodul gibt es eine kostenlose Software von Waytronic. Diese ist steht
frei zugänglich im Internet zum Download zur Verfügung und heisst
WT588D
VoiceChip V1.8 [Way]. Die Sounds gibt es ebenfalls frei zugänglich zum Download und lassen sich mit der vorher vorgestellten Software auf das Soundmodul
laden [TF.].
Die Audiowiedergabe hat eine gute Qualität und erfolgt über eine 12-Bit PWM.
Dafür gibt es spezielle PWM-Pins auf dem Soundmodul. Das WT588D-U unterstützt verschiedene Modi, dazu gehören Key Control Modus, One-Wire Serial
Control Modus und Three-Wire Serial Control Modus. Diese Modi lassen sich via
Software einstellen und lassen so zahlreiche Möglichkeiten zur Nutzung des Moduls zu. Für dieses Projekt wird der Three-Wire Serial Control Modus genutzt. In
nachfolgender Abbildung 2.6 ist eine Schaltung dargestellt um in diesem Modus
arbeiten zu können.
12
Abbildung 2.6: Typische Anwendung im Three-Wire Serial Control Modus [ele16]
13
2.2
Software
In diesem Kapitel wird die Software-Entwicklung dargestellt. Dabei wird auf die
Auswertung der Beschleunigungssensor-Daten, Verknüpfung dieser Daten mit der
LED-Ansteuerung, sowie auf die Soundausgabe eingegangen.
Arduino bringt eine eigene Entwicklungsumgebung mit dem Namen IDE mit.
Die Programmierung erfolgt in C bzw. C++. Umfangreiche Libraries und Beispiele vereinfachen die Programmierung für den Anwender. So lassen sich mit
einfachen Funktionen zum Beispiel die digitalen und analogen Ports lesen und
schreiben. Jeder der 14 digitalen Pins des Arduino kann entweder als Input oder
Output genutzt werden. Dafür stehen die Funktionen
pinMode, digitalRead und
digitalWrite zur Verfügung. Sie arbeiten mit einer Spannung von 5 Volt. Der maximale Strom, den jeder Pin bereitstellen kann, beträgt 40 mA. Zusätzlich gibt
es Pins für spezielle Funktionen. Dazu gehören Pulsweitenmodulation und I²CKommunikation zwischen Arduino und verschiedenen Geräten. Die PWM-Pins
verfügen über einen 8-Bit PWM Output, welcher über die Funktion
analogWrite
gesteuert werden kann. Die I²C-Pins unterstützen die I²C-Kommunikation unter
Verwendung der
Wire Library. Der Arduino Nano verfügt über 8 Analog Inputs.
Sie besitzen jeweils eine Auösung von 10 Bit, umgerechnet sind das 1024 Abstufungen. In der nachfolgenden Abbildung 2.7 ist die Pinbelegung des Arduino
Nano dargestellt.
14
Abbildung 2.7: Pinout des Arduino Nano [Ard13]
Nachfolgend wird auf die einzelnen Komponenten und die Programmierung dafür
eingegangen.
2.2.1
3-Achsen-Beschleunigungssensor
BMA020
Die Kommunikation mit dem Arduino Nano erfolgt über den I²C Bus. Das I²CProtokoll umfasst zwei Leitungen um Daten zu senden und zu empfangen. Eine
Leitung ist eine serielle Taktleitung und die andere eine serielle Datenleitung,
über die Daten zwischen zwei Geräten gesendet wird. Sobald die Taktleitung
von low zu high ändert, wird ein einzelnes Bit Informationen über die Datenleitung transferriert. Für das Auslesen, braucht man den Pin A4 und Pin A5
auf dem Arduino Nano zum Herstellen der I²C Verbindung zum Sensor Modul.
Pin A4 ist die Datenleitung und Pin A5 die Taktleitung. Diese beiden werden
zur I²C-Kommunikation benötigt. Zum Auslesen der Sensordaten muss dann die
I²C-Verbindung via Software eingerichtet werden. Mit dem Befehl
die Library
#include kann
wire.h eingebunden werden, die für die I²C-Verbindung erforderlich
ist. Die Wire-Bibliothek ermöglicht dem Arduino Nano, mit Geräten zu kommunizieren die auch das I²C-Protokoll verwenden. Dann müssen noch die Adressen
15
für das Auslesen des Sensors deniert werden. Jedes am Bus angeschlossene Gerät
erhält eine eigene Adresse. Es können bis zu 112 Geräte am I²C-Bus angeschlossen werden, da die Adresse 7 Bit breit ist. 16 der 128 möglichen Adressen sind
für andere Zwecke reserviert vergleiche[Sza16] . Mit einem Befehl und der Übergabe der Adresse zum Sensor wird eine Verbindung hergestellt. Mit der Methode
readAcceleration können die Sensordaten in einer Schleife ausgelesen werden. Als
Ausgangsdaten erhält man die Beschleunigung in g sowie die Daten der x-, yund z-Achse.
MMA8451
Der Beschleunigungssensor hat eine eingebaute Neigungs- und Lageerkennung,
ist also fähig zu sagen, ob in Hoch- oder Querformat gehalten wird, und ob nach
vorne oder zurück geneigt wird. Die Eigenschaft des MMA8451, die Lage und
Neigung zu erkennen, wird in diesem Projekt genutzt. Der Sensor kommuniziert
via I²C-Bus mit dem Arduino. Wie schon zuvor beschrieben brauchen wir hierfür
die Takt- und Datenleitung zwischen Arduino und Sensor.
Im Folgenden wird das Programm zur Auslesung der Sensordaten erklärt. Der
vollständige Programmcode bendet sich im Anhang B. In Zeile 2 und 3 werden
die Bibliotheken von Adafruit eingebunden, die eine einfache Kommunikation mit
dem MMA8451 ermöglichen. Adafruit ist ein Unternehmen, das den MMA8451
auf einem Sensorboard, für die Verbindung mit dem Arduino, herstellt. Adafruit
liefert eine Library für den MMA8451 zur Kommunikation mit dem Arduino. In
Zeile 17 wird zuerst ein Objekt erstellt. Es müssen keine Pins gesetzt werden, da
man den I²C-Bus nutzt. Danach wird in Zeile 89 der Sensor initialisiert. Diese
Funktion sendet ein True wenn der Sensor gefunden wurde und richtig reagiert,
und ein False wenn der Sensor nicht gefunden wird. In Zeile 95 wird der maximale
Bereich des Beschleunigungssensors zu
± 2 g, ± 4 g oder ± 8 g gesetzt. Für dieses
Projekt wird der Beschleunigungssektor auf 2 g eingestellt. Der Sensor hat eine
eingebaute Neigungs- und Lageerkennung. Es ist deshalb möglich die aktuelle
Ausrichtung des Sensors zu lesen. Als Ausgangsdaten erhält man die aktuelle
Lage und Neigung des Sensors, sowie die x-, y- und z-Koordinaten. In Zeile 115
bendet sich die Funktion, die im Wertebereich von 0 bis 7 die aktuelle Lage
anzeigt. Diesen 8 Werten wird eine Farbe im RGB-Format zugeordnet, um so je
nach Ausrichtung des Sensors eine reproduzierbare Farbe des Lichtschwertes zu
16
bekommen.
2.2.2
RGB-LED
Die RGB-LED besteht aus drei LEDs, eine rote, eine grüne und eine blaue. Durch
die Steuerung der Helligkeit von jeder einzelnen Farbe ist es möglich so ziemlich
jede Farbe zu mischen. Arduino hat dafür die analogWrite Funktion, die an den
PWM Pins einen 8-bit PWM output liefert. Nach einem Aufruf von
analogWrite,
generiert der Pin eine stetige Rechteckwelle des angegebenen duty cycles. Die
Frequenz des pulsweiten-modulierten Signal beträgt circa 490 Hz. Da es eine 8bit Auösung hat, liegen die möglichen Werte für den duty cycle zwischen 0 und
255. Dabei ist 0 immer aus, und 255 durchgängig an. Die verschiedenen Farben
können demnach gemischt werden, indem man für die drei LEDs unterschiedliche
duty cycles einstellt. Werden alle drei LEDs auf die gleiche Helligkeit gestellt,
dann wird weiÿes Licht sichtbar. Die Syntax für die Funktion zur PWM Ausgabe
ist
analogWrite(pin, duty cycle).
Im automatischen Modus des Programms werden die Daten des Beschleunigungssensors mit der RGB-Ansteuerung verknüpft. Hier gibt es für jede Lage beziehungsweise Neigung des Sensors einen eigenen Case. Insgesamt sind es 8 verschiedene Cases für die verschiedenen Lagen des Sensors. Dazu gehören Bewegungen
nach oben und unten sowie auch Bewegungen des Sensors zur Seite. Diesen 8
Portrait
Up Front : analogWrite(REDPIN, 0); analogWrite(GREENPIN, 0); analogWrite(BLUEPIN, 255). Die Lage des Sensors mit dem Name Potrait Up Front, ist
Cases werden 8 unterschiedliche Farben zugewiesen. Ein Beispiel für
eine Bewegung des Sensors nach oben. In dem Case für diese Bewegung werden
die drei verschiedenen
analogWrite -Funktionen für jeden LED-Pin kombiniert.
Diese Kombination der RGB-Farben ergibt die Farbe Blau bei einer Bewegung
nach oben.
Im manuellen Modus werden die RGB-Farben mit dem Potentiometer verknüpft.
Der variable Widerstand des Potentiometer kann man als Analogwert einlesen.
Für dieses Projekt werden zwei Potentiometer benötigt, ein Potentiometer steuert die Farbe der LED und das andere dimmt die Helligkeit. Die Verdrahtung des
Potentiometers wurde bereits in der Hardware-Entwicklung beschrieben deswegen wird hier nur auf die Software-Auswertung eingegangen. Wenn zum linken
Anschlag des Potentiometers gedreht wird, liegen 0 V am Pin an und man liest
17
eine 0. Wenn das Potentiometer zum anderen Anschlag gedreht wird, liegen 5
Volt am Pin an und man liest 1023. Diese Zahlen entstehen durch die Funktion
analogRead, die Zahlen zwischen 0 und 1023, proportional zur Höhe der Spannung
am Pin, ausgibt.
Bei der RGB Ansteuerung im manuellen Modus wird das Modell des HSBFarbraums genutzt und dieses Modell in den RGB-Bereich transformiert. Die
Funktion
HSBToRGB für die Transformation ist im Programmcode ab Zeile 426
formuliert. Im weiteren Verlauf des Berichts wird nun diese Transformation erklärt. Der HSB-Farbraum ist der Farbraum bei man die Farbe mit Hilfe des
Farbwerts (englisch hue), der Farbsättigung (saturation) und der absolteun Helligkeit (brightness) deniert. Für die Beschreibung des Farbortes in diesem Modell
werden folgende Parameter benutzt. Der Farbwert ist ein Farbwinkel H auf dem
Farbkreis von 0° bis 360°. 0° für Rot, 120° für Grün und 240° für Blau. Die Sättigung S in einem Intervall von Null bis Eins und die Helligkeit B auch in einem
Intervall von Null bis Eins. Dabei ist 0 keine Helligkeit und 1 volle Helligkeit. Man
kann bei diesem Modell unmittelbar die Farbmischung für den Farbton wählen
und dann entscheiden wie gesättigt und wie hell dieser sein soll. RGB ist eine Methode die an den vorhanden Grundfarben gebunden ist. Das HSB-Farbmmodell
trennt demnach die Farbe von der Helligkeit. Nun zur Transformation des HSBFarbmodells in RGB. RGB steht für die drei Farbkanäle Rot, Grün und Blau. Die
drei Kanäle steuern mit einer 8 Bit PWM eine RGB LED an. Bei 8 Bit entspricht
das den Wertebereich von 0 bis 255. Bei dem HSB-Farbmodell kann h einen Wert
von 0 bis 359 annehmen, und wie schon vorher beschrieben ist darin der Bereich
0 für Rot, 120 für Grün sowie 240 für Blau. Im Internet ndet man die Berechnungsmatrix für die Transformation, siehe nachfolgende Abbildung 2.8. H steht
für den Farbwert und f für das Grundfarbeninterfall.
18
Abbildung 2.8: HSB zu RGB Transformation [Wik16]
Die Eingabeparameter der Funktion HSBToRGB sind Farbe, Sättigung, Helligkeit, r, g, b. Hier erfolgt die Auswertung des Farbwinkels. Dies ergibt die RGBWerte zu der entsprechenden Farbsättigung und Helligkeit. Bei dem Modell des
Projekts wird der Farbton und die Helligkeit über zwei Potentiometer eingestellt
und danach die Transfomation mit der Funktion
HSBToRGB gemacht. Die Sätti-
gung des Farbwertes wird nicht im Modell beachtet. Nachfolgend ist eine BeispielRechnung zur Umrechnung vom HSB-Raum in den RGB-Raum aufgeführt. Die
Fragestellung lautet wie folgt: Wie lauten die RGB-Werte für den Farbwert 100°
bei 75% Sättigung und 50% Helligkeit. Der Farbton Grün hat 120° auf dem Farbkreis und in RGB-Werten = (0,1,0). Gelb hat 60° auf dem Farbkreis und die
RGB-Werte = (1,1,0). Deswegen muss der gesuchte Farbton zwischen Grün und
Gelb liegen.
R
G
B
Farbton h
1 - f
1
0
Sättigung s
1 - s· f
1
1 - s
Helligkeit b
v· (1 - s· f )
v
v· (1 - s)
Zur Berechnung der RGB-Werte wird die Helligkeit b benötigt.
R
G
B
1
0
1
b
1
3
1
2
1
4
1
2
1
4
1
8
Lösung: b· 255
64
128
32
h
s
19
2.2.3
Soundmodul
In diesem Projekt wird, wie im Kapitel 2.1.7 beschrieben, der Three-Wire Serial
Control Modus genutzt.
Für diesen Steuermodus werden drei Leitungen beziehungsweise Pins benötigt.
Diese sind CS, DATA und CLK. Sie benden sich auf dem Soundmodul an P01,
P02 und P03. P01 ist der Three-Wire Data Input Pin, P02 ist der Three-Wire
Chip Input Pin und P03 der Three-Wire Clock Pin. In diesem Modus ist es
nun möglich, im Programmablauf einen Befehl zu erteilen, der die Adresse der
Audio-Datei auf dem Soundmodul enthält und dann diese Audiodatei an den
PWM Output Pins des Soundmoduls wiedergegeben wird. Im Programm zum
Abspeichern von Audiodateien auf dem Soundmodul, ist es möglich die Dateien
01 Hex.
Die Funktion zum Abspielen der Audiodateien hat den Namen WT588D_Send_Command und wird im Programmcode in Zeile 473 deklariert. Sobald man die
an einer vom Nutzer bestimmten Adresse abzulegen, zum Beispiel
Funktion im Programm, mit der Adresse der Audiodatei in der Klammer aufruft,
wird die Audiodatei unmittelbar abgespielt. Das heiÿt der Arduino Nano sendet
ein Signal zum Soundmodul, welches dann unmittelbar darauf den Sound über
die PWM Pins auf den Lautsprechern abspielt. Zum Beispiel wird der Sound für
01 Hex abgelegt. Dann muss
die Funktion zum Abspielen des Sounds WT588D_Send_Command(1) heiÿen.
das Einschalten des Lichtschwertes bei der Adresse
Solange die Audiodatei abgespielt wird, bleibt der Programmzyklus an genau dieser Stelle stehen, und fährt erst fort wenn der Sound endet. Um dies zu umgehen
hilft eine Schleife mit
while(digitalRead(WT588D_BUSY) == 0) {}. Solange der
Sound abgespielt wird, gibt uns das Soundmodul am BUSY-Pin gleich FALSE.
Deswegen benden wir uns solange in der While-Schleife bis der Sound endet. So
ist es möglich Code abzuarbeiten, wenn der Sound abgespielt wird, indem man
den Code in die geschweiften Klammern setzt. Ein Beispiel für den Nutzen dieser
While-Schleife wäre, dass auch während der Soundausgabe die Farbe geändert
werden kann. Ein Beispiel hierfür ndet sich im Programmcode ab Zeile 243.
Im Projekt wurde der Sound für folgende Funktionen eingerichtet: Beim Ein- und
Ausschalten des Lichtschwertes werden Sounds abgespielt, die das Ein- und Ausschalten eines Laserschwertes wiedergeben sollen. Zusätzlich gibt es einen Taster
der einen speziellen Laserschwert-Sound abspielt. Die Soundfunktion wurde aus
eigenem Interesse implementiert.
20
3
Mechanischer Aufbau
Um die elektrische Schaltung platzsparend auf engstem Raum zu realisieren und
dem Design eines Lichtschwertes gerecht zu werden, ist ein spezieller mechanischer
Aufbau nötig. Dieser mechanische Aufbau ist somit ein wichtiger Meilenstein des
Projektes. Die mechanischen Komponenten wurden in enger Absprache mit der
elektrischen Werkstatt geplant und anschlieÿend von dieser oder der mechanischen Werkstatt gefertigt. Der mechanische Aufbau besteht aus folgenden, extra
für das Projekt entworfenen Komponenten:
ˆ
2 Gristücke mit Gewinde, Aluminium
ˆ
Passstutzen zur Montage der High-Power-LED in der satinierten Röhre,
PVC
ˆ
Satinierte Plexiglasröhre
ˆ
Abschlussstopfen, Aluminium
Der Gri des Lichtschwertes beinhaltet die komplette Hardware der elektrischen
Schaltung, die Eingabeperipherie sowie die Komponenten zur Lichtausgabe.
Die ursprüngliche Planung zu Beginn des Projektes sah einen gebastelten Gri
aus einem M40-Stangenrohr vor. In diesem Rohr hätten sich der Batteriehalter,
die Platine, die Hochsetzsteller, der Lautsprecher sowie die gesamte Eingabeperipherie inklusive On/0-Schalter befunden. Die Schalter, Taster und Potentiometer wären auf einer kleinen Platine auÿen auf dem Rohr platziert worden. Als
die mechanische Planung im letzten Drittel der Bearbeitungszeit immer mehr an
Bedeutung gewann wurde jedoch klar, dass ein solider Gri notwendig ist um
das optische Gesamtbild perfekt zu gestalten und einen langfristigen Einsatz zu
gewährleisten.
Die zweite Planung sah daher zwei halbkugelförmige Grischalen aus Aluminium
vor. Diese Auftrennung des Gris wurde gewählt, um im späteren Betrieb den
Austausch der Batterien auf eine einfache Weise zu ermöglichen. Zudem hätte
man hierdurch auch zu einem späteren Zeitpunkt die Möglichkeit gehabt, Änderungen, zum Beispiel am Programm, vornehmen zu können. Im unteren und
mittleren Drittel der ersten Grischale waren der On/O-Schalter, der Batteriehalter, der Lautsprecher und die Schalter geplant. Im unteren und mittleren
21
Drittel der zweiten Grischale hätten sich die Platine, die Hochsetzsteller sowie die Potentiometer befunden. Im oberen Abschnitt beider Grischalen wäre
der Übergang zur Plexiglasröhre gelegen. Diese wäre beim Zusammenschrauben
zwischen den beiden Grischalen fest verklemmt worden.
Da die mechanische Werkstatt mit ihren vorhandenen Werkzeugen jedoch kein
Material mit der resultierenden Gesamtlänge bearbeiten kann, musste kurz vor
Ende des Projektes noch einmal ein neuer Gri entwickelt werden.
Dieser nale Entwurf sieht nun eine Aufteilung des Gries in zwei Aluminiumrohre vor, welche nach der Fertigung zusammengeschraubt werden können und
so den Gesamtgri darstellen. Im ersten, unteren Rohrstück benden sich der
Batteriehalter, die Platine, die Hochsetzsteller, der Lautsprecher sowie die gesamte Eingabeperipherie inklusive On/0-Schalter. Alle Komponenten sind miteinander verbunden und werden als Baugruppe mittels einer starken Klettverbindung in dem Rohrstück platziert. Im zweiten, oberen Rohrstück bendet sich
der Übergang zur Plexiglasröhre. Hierbei wird diese in das Aluminiumrohrstück
geschoben und anschlieÿend durch extra dafür vorgesehene Schlitze, welche durch
Schrauben zusammengezogen werden, xiert. Um die High-Power-LED im Rohr
zu platzieren, wird ein Passstutzen aus Polyvinylchlorid verwendet. Dieser Passstutzen wird von unten, bis zum Anliegen der Endkappe, in das Rohr geschoben.
In einem eingedrehten Hohlraum im Stutzen benden sich der mittels Wärmeleitkleber mit der RGB-LED-Platine verbundene Kühlkörper und die Linse. Per
Belüftungsbohrungen ist eine Wärmeabfuhr an die Auÿenluft ermöglicht. Durch
eine groÿe Bohrung zur Leitungsdurchführung ist der Innenraum des Passstutzens mit den Innenräumen der beiden Rohrstücke verbunden. Die verwendete,
ursprünglich durchsichtige Plexiglasröhre wurde mit Hilfe von Schmirgelpapier
satiniert. Am Ende dieser Röhre ist ein aus Aluminium gefertigter Abschlussstopfen angebracht, um die aus dem Ende des Rohres austretenden Lichtstrahlen
zu reektieren. Hierzu hat dieser Abschlussstopfen eine innere, halbkugelförmige
Ausfräsung.
In Abbildung 3.1 sind die Grikomponenten zusammen mit dem Passstutzen dargestellt, Abbildung 3.2 zeigt den zusammengeschraubten Gri. Im Gri bendet
sich die komplette Elektronik und der Batteriehalter, im Passstutzen bendet sich
die High-Power-LED zusammen mit der Linse und dem Kühlkörper. Abbildung
3.3 zeigt das funktionsfähige Lichtschwert im eingeschalteten Zustand.
22
Abbildung 3.1: Grikomponenten und Passstutzen
Abbildung 3.2: Zusammengeschraubter Gri
23
Abbildung 3.3: Funktionsfähiges Lichtschwert
24
4
Test und Inbetriebnahme
In diesem Kapitel werden die Tests und Entscheidungen aufgeführt die nötig waren um das Endprodukt zu erreichen. Zuerst wurde der Aufbau auf einem Steckbrett gemacht, da es so möglich ist die Schaltung schnell wieder umzubauen. Der
erste Aufbau enthielt den Arduino Nano, ein BMA020-Beschleunigungssensorboard, Mosfets als LED-Treiber und einen LED-Stripe. Nach kurzer Zeit war es
möglich den Beschleunigungssensor in Betrieb zu nehmen und eine Kommunikation über den I²C-Bus mit dem Arduino Nano herzustellen. Über den seriellen
Monitor in der Entwicklungsumgebung Arduino IDE wurden die Koordinaten der
x-, y- und z-Achse angezeigt sowie die Beschleunigung in
g. Der nächste Schritt
war, den LED-Stripe über einen PWM-Output anzusteuern. Wie das möglich ist
wurde bereits in der Software-Entwicklung beschrieben. Nach erfolgreicher Inbetriebnahme des LED-Stripes war dann die Aufgabe die Daten des Sensors mit
der LED-Ansteuerung zu verknüpfen, also die Farben über den Beschleunigungssensor einzustellen. Dabei war die erste Überlegung die Koordinaten-Bereiche
zu unterteilen und jeweils einen Bereich einer Farbe zuzuordnen. Nachfolgend
wird erklärt warum diese Methode nicht zum Ziel geführt hat und das BMA020Sensorboard durch ein MMA8451-Sensorboard getauscht wurde.
BMA020 und MMA8451
Der Grund, weswegen der BMA020 doch durch
einen anderen Beschleunigungssensor, den MMA8451, ersetzt wurde, war der,
dass die Sensordaten nicht konsistent waren. Es ergeben sich auf Grund der Anfangsposition ständig andere Wertebereiche, die eine eindeutige Zuordnung der
Position mit dem Farbraum nicht ermöglichen. Problematisch bei diesem Sensormodell ist, dass der gelieferte und bereitgestellte Wertebereich je nach Sensorlage
im Einschaltmoment stark variiert. Ist der Sensor im Einschaltmoment horizontal in Ruhelage, so liegt der Wertebereich zwischen - 10000 und + 10000. Ist der
Sensor im Einschaltmoment jedoch leicht nach oben geneigt, so liegt der neue
Wertebereich beispielsweise zwischen 0 und +20000. Nach mehrwöchiger Testphase wurde entschieden, dass sich der 3-Achsen-MEMS-Beschleinigungssensor
BMA020 nicht für den Einsatz zur Bewegungserfassung in diesem Projekt eignet. Die Farbbereiche die auf die jeweiligen Positionen gemappt werden, können nicht reproduzierbar aufgerufen werden, da sich die Positionen bei jedem
Neustart des Moduls resetten. Die Wertebereiche der x-, y- und z-Koordinaten
25
ändern sich demnach bei jedem Reset, so ist es nicht möglich reproduzierbare Farbbereiche für bestimmte Positionen festzulegen. Die Ausgangsdaten des
MMA8451 sind konsistent und werden auch nach einem Reset, im Vergleich zum
BMA020, richtig gelesen. Es sind eindeutige Farbbereiche mit dem MMA8451 denierbar aus dem Grund, dass das MMA8451-Sensorboard die Lage und Neigung
des Sensors in Zahlen zwischen 0 und 7 ausgibt. Eine rekonstruierbare und nachvollziehbare Farbwiedergabe kann somit realisiert werden. Der neue MMA8451Beschleunigungssensor wurde somit erfolgreich in das Projekt integriert und erfüllt die Aufgabe der Farbsteuerung. Die nächse Aufgabe war dann die Helligkeit
der LED mit den Beschleunigungsdaten des Sensors zu dimmen.
Helligkeitssteuerung mit Sensordaten
Die Helligkeitssteuerung basierend
auf den Beschleunigungswerten konnte nicht erreicht werden, da das menschliche Auge logarithmisch sieht und die Beschleunigungswerte zu sehr schwanken.
Wenn man eine 8-Bit PWM linear zwischen 0 und 255 laufen lässt, dann scheint
die LED nicht linear gedimmt zu werden. Sie wird relativ schnell hell und bleibt
lange hell. Die Lösung dafür liegt in der Kennlinie des menschlichen Auges, da
diese nichtlinear und nahezu logarithmisch ist. Das ermöglicht die Wahrnehmung
eines sehr groÿen Helligkeitsbereichs. Praktisch bedeutet dies, dass wir dem Auge groÿe physikalische Helligkeitsunterschiede präsentieren müssen. Werden die
Beschleunigungswerte nun auf den Helligkeitsbereich der LED gemappt ist dies
zwar möglich, jedoch lässt dies die LED schnell ganz hell leuchten und somit
kann man den Helligkeitsbereich nicht linear mit den Beschleunigungswerten unterteilen. Zudem wurde dies erschwert durch die stark schwankenden Beschleunigungswerte des Sensors, was dazu geführt hat, dass die LED bei Bewegung des
Sensors ackert und nicht wie gewünscht gedimmt wird. Nach dieser Erkenntnis wurde ein manueller Modus implementiert, in dem es möglich ist, mit einem
Potentiometer die Helligkeit zu dimmen. Da hier die Werte konsistent und linear dargestellt werden können, ist es möglich die Helligkeit über den gesamten
Potentiometer-Wertebereich zu dimmen.
LED-Stripe und High-Power-LED
Die Entscheidung ob für das Lichtschwert
ein LED-Stripe oder eine High-Power-LED verwendet wird, wurde aus optischen
Gründen gefällt. Die Ansteuerung dieser beiden LED-Varianten ist ähnlich und
26
erfolgt über eine PWM an den Digitalen Output-Pins des Arduino Nano verbunden mit einer LED-Treiberschaltung. Wird ein LED-Stripe zur Lichtausgabe
benutzt, dann sind die einzelnen RGB-LEDs über die Länge des Rohres verteilt
sichtbar. Auch bei einer Milchglas-Röhre sind die LEDs im Abstand von wenigen
Zentimetern sichtbar. Wird eine High-Power-LED zur Lichtausgabe verwendet,
so verteilt sich ab dem oberen Teil des Gris das Licht in die Röhre. Dabei nimmt
die Intensität des Lichts bei zunehmender Entfernung zur High-Power-LED ab.
Trotzdem sieht dieses Licht natürlicher aus im Vergleich zum LED-Stripe. Natürlicher steht hier in Bezug zu den Lichtschwertern der Star-Wars-Saga.
Die LED-Treiberschaltung bestand zunächst aus drei n-Kanal-Mosfets. Das Gate war über einen 1 kOhm Widerstand mit dem PWM-Outputpin des Arduino
Nano verbunden. Bei einer PWM-Ausgabe an den drei Pins, dienten nun die Mosfets als Schalter um die LEDs zu dimmen. Jedoch wurde mit dieser Schaltung
die High-Power-LED sehr heiÿ, da gemessene 5 A durch die LED ossen. Die
LEDs brauchen aber einen Betriebsstrom von 350 mA. Aus diesem Grund el
die Entscheidung die Mosfet-Treiberschaltung durch LDD-350L Konstantstromquellen auszutauschen. Diese speisen einen konstanten Ausgangsstrom von 350
mA in den Stromkreis und schonen so die High-Power-LED, da diese nicht mehr
überhitzt. Zusätzlich hat die Konstantstromquelle einen PWM-Eingang, der direkt mit den Arduino PWM-Pins verbunden werden kann. Deswegen wurden die
MOSFETs mit ihrer Schalterfunktion nicht mehr gebraucht, sondern die Konstantstromquelle übernimmt diese Funktion.
Sobald der komplette Aufbau feststand, wurde eine Platine gelötet. Dies wurde
zuerst auf einer Lochrasterplatine realisiert, jedoch wurde diese Platine nicht
den Maÿen des Gris gerecht. Um eine langfristige und platzsparende Funktion
der Platine gewährleisten zu können, wurde ein Platinenlayout mit Eagle CAD
erstellt. Danach wurde mit Hilfe der Elektrowerkstatt die geplante Platine gefräst.
Weiterhin ist bei den vielen Tests aufgefallen, dass die Klemmenspannung der 6
AA-Alkaline-Batterien sehr schnell sinkt. Dies lässt sich durch folgende StromSpannungs-Kennlinie für Batterien, Abbildung 4.1, an der Kennlinie für AlkalineBatterien erklären.
27
Abbildung 4.1: Entladekurve für verschiedene Batterietypen [Zin45]
Die Klemmenspannung der Alkaline-Batterien sinkt stark fallend, binnen einer
Stunde auf 1,1 V bei einer Konstantstrom-Entladung von 600 mA. Lithium Batterien halten die Klemmenspannung über Stunden auf dem selben Niveau und sind
deshalb besser als Spannungsversorgung für dieses Projekt geeignet als AlkalineBatterien.
28
5
Fazit
Ziel dieser Projektarbeit war es, ein Lichtschwert zu entwickeln, dessen Farbe
sich je nach Bewegungsrichtung ändert sowie die Helligkeit dimmt. Dazu zählten
Hardware- und Softwareentwicklung sowie der mechanische Aufbau des Lichtschwertes.
Zu diesem Zwecke wurde zuerst ein Messaufbau entwickelt und funkionstüchtig
aufgebaut, mit dem die Funktionalität des Lichtschwertes getestet werden kann.
Dabei ergab sich, dass die Bewegungsrichtung von einem Sensor gemessen und via
I²C-Kommunkation einem Mikrocontroller übermittelt wird. Als Mikrocontroller
wird ein Arduino Nano v3.0 verwendet, da dieser analoge als auch digitale Eingänge und Ausgänge hat, sowie auch Pins für Sonderzwecke. Zu diesen Sonderzwecken
zählen unter anderem Pulsweitenmodulation und I²C-Protokoll. Die Lichtausgabe
wird mit einer Pulsweitenmodulation an den Mikrocontrolleroutputs, verbunden
mit einer Treiberschaltung und lichtemittierenden Halbleiter-Bauelementen, realisiert. Für die Lichtausgabe wird eine 10 W RGB High-Power LED verwendet,
da diese optimal den Anforderungen eines Lichtschwertes entspricht.
Die Software wurde mit Arduino IDE entwickelt, einer leistungsfähigen und einfach anwendbaren Programmierumgebung für Arduino Mikrocontroller. Sie übernimmt das Auslesen der Sensordaten verknüpft diese mit der Lichtausgabe und
steuert das Soundmodul.
Es wurden verschiedene Schaltungsarten und Hardwareanordnungen analysiert
und deren Nutzbarkeit untersucht. Dazu zählen diverse LED-Treiberschaltungen,
darunter MOSFET-Treiber und Konstantstromquellen. Was die Lichtausgabe betrit, so konnte gezeigt werden, dass das Lichtschwert mit LED-Stripes und HighPower LEDs realisiert werden kann. Dabei wurde festgestellt, dass die Verwendung einer High-Power LED mit spezieller Linse und Kühlkörper optimal für den
Aufbau der Lichtausgabeeinheit sind. Bezüglich der Bewegungsdetektierung wurden verschiedene Bewegungssensoren getestet und die Messergebnisse verglichen.
Schlieÿlich wurde der MMA8451 in die nale Schaltung integriert.
Die Abbildungen in Kapitel 3 und 4 zeigen anhand von Fotos anschaulich die
Leistungsfähigkeit des entwickelten Lichtschwertes.
29
Literatur
[Ard]
Arduino Nano.
Arduino:
ArduinoBoardNano.
[Ard13] Arduino:
https://www.arduino.cc/en/Main/
Abrufdatum: Februar 2016
Arduino NANO Pinout Diagram.
cc/index.php?topic=147582.0.
http://forum.arduino.
Version: Februar 2013. Abrufdatum:
Februar 2016
[BC13]
Berdahl, Edgar ; Carlson, Wendy Ju. C.:
re.
Sensing buttons in softwa-
https://ccrma.stanford.edu/wiki/Sensor_Arduino_Lab_2013.
Version: 2013. Abrufdatum: Februar 2016
[ele16]
elechouse:
The Instructions of WT588D-U Voice Module.
elechouse.com.
www.
Version: 2016. Abrufdatum:Februar 2016
[Lan12] Langner, Johannes P.:
Beschleunigungssensor.
Arduino Nano 3.0 und Modul mit einem
www./meineweltinmeinemkopf.blogspot.de.
Version: Juni 2012. Abrufdatum: Februar 2016
[rob16]
robotshop:
Adafruit Triple Axis Accelerometer Breakout Board
MMA8451. www.robotshop.com. Version: 2016. Abrufdatum: Februar
2016
[Sza16]
Szaktilla,
Gergely:
arduino/6.html.
[TF.]
Wire.h I2C.
http://html.szaktilla.de/
Version: 2016. Abrufdatum: Februar 2016
Lightsaber Sound F/X.
http://theforce.net/fanfilms/
postproduction/soundfx/saberfx_fergo.asp. Abrufdatum: Januar
TF.N:
2016
[Way]
Waytronic:
WT588D VoiceChip Beta 1.6 Setup.
http://www.waytronic.com/download.asp,
.
Abrufdatum:
Janu-
ar 2016
[Wik16] Wikipedia:
Farbraum.
HSV-Farbraum.
https://de.wikipedia.org/wiki/HSV-
Version: Februar 2016. Abrufdatum: Februar 2016
30
[Zin45]
Zinniker, Dr.Rolf:
Die ideale Batterie.
ch/~rolfz/batak/ideal/.
http://www2.ife.ee.ethz.
Version: 2003/4/5. Abrufdatum: Februar
2016
31
6
A
Anhang
Schaltplan
32
B
1
Programmcode
/*
======================================================
2
3
4
5
6
7
8
9
10
11
* Projekt : Entwicklung eines Lichtschwerts
* Projektteam : Bastian Weiss (46734) , Dennis Waschik
(41246)
* Betreuer : Prof . Dr . - Ing . Alfons Kloenne
* Wintersemester 2015/16
*
* In diesem Programm wird das Auslesen des
Beschleunigungssensors ,
* die Auswertung der Sensordaten , sowie der manuelle
Betrieb mit
* Potentiometern und Schaltern , zur Einstellung der
Farbe an einem
* Lichtschwert beschrieben . Zudem wird das Soundmodul
eingebunden .
*======================================================
*/
12
13
14
15
# include < Wire .h > // Wire Bibliothek fuer I2C
Kommunikation
# include < Adafruit_MMA8451 .h > // MMA8451 Bibliothek von
Adafruit
# include < Adafruit_Sensor .h > // Sensor Bibliothek von
Adafruit
16
17
Adafruit_MMA8451 mma = Adafruit_MMA8451 () ; // Sensor
Modul Objekt erstellen
18
19
20
# define WT588D_RST 2 // Sound Modul pin " REST "
# define WT588D_CS 3 // Sound Modul pin " P02 "
33
21
22
23
# define WT588D_SCL 4 // Sound Modul pin " P03 "
# define WT588D_SDA 5 // Sound Modul pin " P01 "
# define WT588D_BUSY 6 // Sound Modul pin " LED / BUSY "
24
25
26
27
28
// LEDs
# define
Rote
# define
# define
REDPIN 11 // An Pin 11 des Arduino Boards ist
LED
GREENPIN 9
BLUEPIN 10
29
30
31
32
33
34
35
// Analog Input fuer Schalter / Poti
const int analogInPin0 = A0 ;
const int analogInPin1 = A1 ; // Poti Farbe
const int analogInPin3 = A3 ; // Modus
const int analogInPin6 = A6 ; // Ein - Schalter
const int analogInPin7 = A7 ;
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
// Fuer Poti Farbeinstellung
int PotiValue_1 = 0; // Poti
const int PotiPinFarbe = 0; // Poti
const int FarbeRotLow = 0;
const int FarbeRotHigh = 255;
const int FarbeBlau = 170;
const int WinkelMin = 0;
const int WinkelBereich = 60;
const int WinkelMax = 360;
const int HelligkeitMin = 0;
const int HelligkeitMax = 255;
int PotiWertFarbton ;
int Farbe , Helligkeit ;
const int Saettigung = 255;
51
52
// Sonstige Konstanten
34
53
54
55
56
57
58
59
60
int Modus = 0; // Modus Schalter -> Fuer Auswahl
Automatik / Manuell
float faktor ; // Faktor fuer das Dimmen des Lichts
unsigned int r , g , b ; // Konstanten fuer RGB - Ansteuerung
der LED
boolean firstLoop = true ; // Schleifen
boolean firstLoop2 = true ;
boolean firstLoop3 = true ;
int LaserschwertEin = 0;
int Taster ;
61
62
63
void setup ( void ) {
64
65
Serial . begin (9600) ; // Fuer Serielle Kommunikation
Arduino / Computer USB ( Baud - Rate )
66
67
68
69
70
71
72
// Sound
pinMode ( WT588D_RST , OUTPUT ) ; // WT588D_RST Pin 2 auf
Arduino Nano ist Output Pin
pinMode ( WT588D_CS , OUTPUT ) ;
pinMode ( WT588D_SCL , OUTPUT ) ;
pinMode ( WT588D_SDA , OUTPUT ) ;
pinMode ( WT588D_BUSY , INPUT ) ;
73
74
75
76
digitalWrite ( WT588D_CS , HIGH ) ; // WT588D_CS Pin ist
HIGH per Voreinstellung
digitalWrite ( WT588D_RST , HIGH ) ;
digitalWrite ( WT588D_SCL , HIGH ) ;
77
78
79
80
81
// LEDs
pinMode ( REDPIN , OUTPUT ) ; // REDPIN als Output Pin
pinMode ( GREENPIN , OUTPUT );
pinMode ( BLUEPIN , OUTPUT ) ;
35
pinMode ( PotiPinFarbe , INPUT ) ;
pinMode ( analogInPin3 , INPUT ) ;
pinMode ( analogInPin6 , INPUT ) ;
pinMode ( analogInPin7 , INPUT ) ;
Serial . println ( " Adafruit MMA8451 test ! ") ;
82
83
84
85
86
87
88
if (! mma . begin () ) {
Serial . println ( " Couldnt start " ) ;
while (1) ;
}
Serial . println ( " MMA8451 found ! " ) ;
89
90
91
92
93
94
mma . setRange ( MMA8451_RANGE_2_G ) ; //
Beschleunigungssektor auf 2 G eingestellt
95
96
97
}
98
99
void loop () {
100
101
102
Modus = analogRead ( analogInPin3 ) ; // Modus wird ueber
Schalter eingestellt , Analogwert
LaserschwertEin = analogRead ( analogInPin6 ) ;
103
104
if ( firstLoop ) {
105
106
if (( LaserschwertEin > 500) && ( Modus > 500) ) {
107
108
// Automatik - Modus
109
110
mma . read () ; // Lesen der Daten in 14 - bit Schritten
111
112
113
sensors_event_t event ; // Neues Sensor - Event
mma . getEvent (& event ) ;
36
114
115
uint8_t o = mma . getOrientation () ; // Lage des Sensors
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
/* switch case mit den verschiedenen Lagen */
switch ( o ) {
case MMA8451_PL_PUF :
Serial . println ( " Portrait Up Front " ) ;
// BLAU
analogWrite ( REDPIN , 0) ;
analogWrite ( GREENPIN , 0) ;
analogWrite ( BLUEPIN , 255) ;
break ;
case MMA8451_PL_PUB :
Serial . println ( " Portrait Up Back " ) ;
// Gruen
analogWrite ( REDPIN , 0) ;
analogWrite ( GREENPIN , 255) ;
analogWrite ( BLUEPIN , 0) ;
break ;
case MMA8451_PL_PDF :
Serial . println ( " Portrait Down Front " ) ;
// ROT
analogWrite ( REDPIN , 255) ;
analogWrite ( GREENPIN , 0) ;
analogWrite ( BLUEPIN , 0) ;
break ;
case MMA8451_PL_PDB :
Serial . println ( " Portrait Down Back " ) ;
// GELB
analogWrite ( REDPIN , 255) ;
analogWrite ( GREENPIN , 255) ;
analogWrite ( BLUEPIN , 0) ;
break ;
case MMA8451_PL_LRF :
37
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
Serial . println ( " Landscape Right Front ") ;
// ORANGE
analogWrite ( REDPIN , 255) ;
analogWrite ( GREENPIN , 127) ;
analogWrite ( BLUEPIN , 0) ;
break ;
case MMA8451_PL_LRB :
Serial . println ( " Landscape Right Back " ) ;
// TueRKIS
analogWrite ( REDPIN , 0) ;
analogWrite ( GREENPIN ,255) ;
analogWrite ( BLUEPIN , 255) ;
break ;
case MMA8451_PL_LLF :
Serial . println ( " Landscape Left Front " ) ;
// LILA
analogWrite ( REDPIN , 127) ;
analogWrite ( GREENPIN , 0) ;
analogWrite ( BLUEPIN , 255) ;
break ;
case MMA8451_PL_LLB :
Serial . println ( " Landscape Left Back " ) ;
// MAGENTA
analogWrite ( REDPIN , 255) ;
analogWrite ( GREENPIN , 0) ;
analogWrite ( BLUEPIN , 255) ;
break ;
175
176
}
177
178
179
180
WT588D_Send_Command (2) ; // Lichtschwert Ein Sound
delay (50) ;
while ( digitalRead ( WT588D_BUSY ) == 0) { }
181
38
182
firstLoop = false ;
183
184
}
185
186
else if (( LaserschwertEin > 500) && ( Modus < 500) ) {
187
188
// Manueller Modus
189
190
191
192
PotiWertFarbton = map ( analogRead ( PotiPinFarbe ) , 0 ,
1023 , 0 , 360) ; // Map - Funktion : Die Analogwerte in
den Wertebereich 0:360
PotiValue_1 = analogRead ( analogInPin1 ) ;
faktor = modifiedMap ( PotiValue_1 , 0 , 1023 , 0.00 ,
1.00) ; // Faktor zum Dimmen des Lichts ,
modifiedMap fuer double - Werte
193
194
if ( digitalRead ( analogInPin3 ) ) {
195
196
197
// Der Farbbereich von rot (0) bis 60 Grad zu
blau (170) bis 300 Grad
Farbe = constrain ( map ( PotiWertFarbton ,
WinkelBereich , WinkelMax - WinkelBereich ,
FarbeRotLow , FarbeBlau ) , FarbeRotLow ,
FarbeBlau ) ;
198
199
200
// Helligkeit bei 0 -60 Grad
Helligkeit = constrain ( map ( PotiWertFarbton ,
WinkelMin , WinkelBereich , HelligkeitMin ,
HelligkeitMax ) , HelligkeitMin , HelligkeitMax
);
201
202
203
// Helligkeit bei 300 -360 Grad
Helligkeit = Helligkeit - constrain ( map (
PotiWertFarbton , WinkelMax - WinkelBereich ,
39
WinkelMax , HelligkeitMin , HelligkeitMax ) ,
HelligkeitMin , HelligkeitMax ) ;
204
205
}
206
207
208
209
else {
// Farbkreismodus ( Rot zu Rot , in einem Kreis ) .
210
211
Farbe = map ( PotiWertFarbton , WinkelMin ,
WinkelMax , FarbeRotLow , FarbeRotHigh ) ;
212
213
214
Helligkeit = 255;
}
215
216
217
// Umwandlung
HSBToRGB ( Farbe , Saettigung , Helligkeit , &r , &g , & b )
;
218
219
220
221
analogWrite ( REDPIN , r * faktor ) ; // Den Dimm - Faktor an
r multiplizieren
analogWrite ( GREENPIN , g * faktor ) ;
analogWrite ( BLUEPIN , b* faktor ) ;
222
223
224
225
226
227
WT588D_Send_Command (2) ; // Lichtschwert Ein Sound
delay (50) ;
while ( digitalRead ( WT588D_BUSY ) == 0) { }
delay (200) ;
228
229
230
231
firstLoop = false ;
}
}
232
40
233
else {
234
235
236
if (( LaserschwertEin > 500) && ( Modus > 500) ) {
Taster = analogRead ( analogInPin7 ) ;
237
238
if ( Taster < 500) {
239
240
241
242
243
firstLoop3 == true ;
WT588D_Send_Command (4) ; // Taster Sound
delay (50) ;
while ( digitalRead ( WT588D_BUSY ) == 0) { while (
firstLoop3 == true ) {
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
// Blau zu Violett
for ( r = 0; r < 256; r ++)
analogWrite ( REDPIN , r );
delay (2) ;
}
// Violett zu Rot
for ( b = 255; b > 0; b - -)
analogWrite ( BLUEPIN , b) ;
delay (2) ;
}
// Rot zu Gelb
for ( g = 0; g < 256; g ++)
analogWrite ( GREENPIN , g ) ;
delay (2) ;
}
// Gelb zu Gruen
for ( r = 255; r > 0; r - -)
analogWrite ( REDPIN , r );
delay (2) ;
}
// Gruen zu Blau - Gruen
41
{
{
{
{
for ( b = 0; b < 256; b ++) {
analogWrite ( BLUEPIN , b) ;
delay (2) ;
}
// Blau - Gruen zu Blau
for ( g = 255; g > 0; g - -) {
analogWrite ( GREENPIN , g ) ;
delay (2) ;
}
266
267
268
269
270
271
272
273
274
275
firstLoop3 == false ;
break ;
276
277
278
}
279
}
280
281
}
282
283
mma . read () ;
284
285
286
sensors_event_t event ;
mma . getEvent (& event ) ;
287
288
uint8_t o = mma . getOrientation () ;
289
290
291
292
293
294
295
296
297
298
299
switch ( o ) {
case MMA8451_PL_PUF :
Serial . println ( " Portrait Up Front " ) ;
// BLAU
analogWrite ( REDPIN , 0) ;
analogWrite ( GREENPIN , 0) ;
analogWrite ( BLUEPIN , 255) ;
break ;
case MMA8451_PL_PUB :
Serial . println ( " Portrait Up Back " ) ;
42
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
// Gruen
analogWrite ( REDPIN , 0) ;
analogWrite ( GREENPIN , 255) ;
analogWrite ( BLUEPIN , 0) ;
break ;
case MMA8451_PL_PDF :
Serial . println ( " Portrait Down Front " ) ;
// ROT
analogWrite ( REDPIN , 255) ;
analogWrite ( GREENPIN , 0) ;
analogWrite ( BLUEPIN , 0) ;
break ;
case MMA8451_PL_PDB :
Serial . println ( " Portrait Down Back " ) ;
// GELB
analogWrite ( REDPIN , 255) ;
analogWrite ( GREENPIN , 255) ;
analogWrite ( BLUEPIN , 0) ;
break ;
case MMA8451_PL_LRF :
Serial . println ( " Landscape Right Front " );
// ORANGE
analogWrite ( REDPIN , 255) ;
analogWrite ( GREENPIN , 127) ;
analogWrite ( BLUEPIN , 0) ;
break ;
case MMA8451_PL_LRB :
Serial . println ( " Landscape Right Back " ) ;
// TueRKIS
analogWrite ( REDPIN , 0) ;
analogWrite ( GREENPIN ,255) ;
analogWrite ( BLUEPIN , 255) ;
break ;
case MMA8451_PL_LLF :
43
Serial . println ( " Landscape Left Front " );
// LILA
analogWrite ( REDPIN , 127) ;
analogWrite ( GREENPIN , 0) ;
analogWrite ( BLUEPIN , 255) ;
break ;
case MMA8451_PL_LLB :
Serial . println ( " Landscape Left Back " ) ;
// MAGENTA
analogWrite ( REDPIN , 255) ;
analogWrite ( GREENPIN , 0) ;
analogWrite ( BLUEPIN , 255) ;
break ;
}
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
}
349
350
351
352
353
else if (( LaserschwertEin > 500) && ( Modus < 500) )
{
Taster = analogRead ( analogInPin7 ) ;
if ( Taster < 500) {
354
355
356
357
358
WT588D_Send_Command (4) ; // Taster Sound
delay (50) ;
while ( digitalRead ( WT588D_BUSY ) == 0) {}
}
359
360
361
362
PotiWertFarbton = map ( analogRead ( PotiPinFarbe ) , 0 ,
1023 , 0 , 360) ;
PotiValue_1 = analogRead ( analogInPin1 ) ;
faktor = modifiedMap ( PotiValue_1 , 0 , 1023 , 0.00 ,
1.00) ;
363
364
if ( digitalRead ( analogInPin3 ) ) {
365
44
Farbe = constrain ( map ( PotiWertFarbton ,
WinkelBereich , WinkelMax - WinkelBereich ,
FarbeRotLow , FarbeBlau ) , FarbeRotLow ,
FarbeBlau ) ;
366
367
Helligkeit = constrain ( map ( PotiWertFarbton ,
WinkelMin , WinkelBereich , HelligkeitMin ,
HelligkeitMax ) , HelligkeitMin ,
HelligkeitMax ) ;
368
369
Helligkeit = Helligkeit - constrain ( map (
PotiWertFarbton , WinkelMax - WinkelBereich
, WinkelMax , HelligkeitMin , HelligkeitMax )
, HelligkeitMin , HelligkeitMax ) ;
}
370
371
372
else {
373
374
Farbe = map ( PotiWertFarbton , WinkelMin ,
WinkelMax , FarbeRotLow , FarbeRotHigh ) ;
Helligkeit = 255;
}
375
376
377
378
HSBToRGB ( Farbe , Saettigung , Helligkeit , &r , &g , & b )
;
379
380
analogWrite ( REDPIN , r * faktor ) ;
analogWrite ( GREENPIN , g * faktor ) ;
analogWrite ( BLUEPIN , b* faktor ) ;
381
382
383
384
}
385
386
else if ( LaserschwertEin < 500) {
387
388
if ( firstLoop2 ) {
45
WT588D_Send_Command (1) ; // Laserschwert Sound aus
delay (50) ;
while ( digitalRead ( WT588D_BUSY ) == 0) { }
delay (200) ;
analogWrite ( BLUEPIN , 0) ;
analogWrite ( REDPIN , 0) ;
analogWrite ( GREENPIN , 0) ;
firstLoop2 = false ;
}
389
390
391
392
393
394
395
396
397
398
else {
analogWrite ( BLUEPIN , 0) ;
analogWrite ( REDPIN , 0) ;
analogWrite ( GREENPIN , 0) ;
firstLoop = true ;
firstLoop2 = true ;
}
399
400
401
402
403
404
405
}
406
}
407
408
}
409
410
// Funktionendeklaration
411
412
413
414
415
416
417
418
419
420
void HSBToRGB (
unsigned int inFarbe , unsigned int inSaettigung ,
unsigned int inHelligkeit ,
unsigned int * oR , unsigned int * oG , unsigned int *
oB )
{
if ( inSaettigung == 0)
{
// farblos
* oR = * oG = * oB = inHelligkeit ;
}
46
421
422
else
{
unsigned int FarbeSkaliert = ( inFarbe * 6) ;
unsigned int Sektor = FarbeSkaliert >> 8; //
Sektor 0 bis 5 auf dem Farbkreis
unsigned int offsetInSektor = FarbeSkaliert - (
Sektor << 8) ; // Position im Sektor
unsigned int p = ( inHelligkeit * ( 255 inSaettigung ) ) >> 8;
unsigned int q = ( inHelligkeit * ( 255 - ((
inSaettigung * offsetInSektor ) >> 8) ) ) >>
8;
unsigned int t = ( inHelligkeit * ( 255 - ((
inSaettigung * ( 255 - offsetInSektor )) >>
8) ) ) >> 8;
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
int p ;
switch ( Sektor ) {
case 0:
* oR = inHelligkeit ;
* oG = t ;
* oB = p ;
break ;
case 1:
* oR = q ;
* oG = inHelligkeit ;
* oB = p ;
break ;
case 2:
* oR = p ;
* oG = inHelligkeit ;
* oB = t ;
break ;
case 3:
* oR = p ;
47
* oG = q ;
* oB = inHelligkeit ;
break ;
case 4:
* oR = t ;
* oG = p ;
* oB = inHelligkeit ;
break ;
default :
// case 5:
* oR = inHelligkeit ;
* oG = p ;
* oB = q ;
break ;
}
448
449
450
451
452
453
454
455
456
457
458
459
460
461
}
462
463
}
464
465
466
467
468
469
470
471
double modifiedMap ( double x , double in_min , double
in_max , double out_min , double out_max )
{
double temp = ( x - in_min ) * ( out_max - out_min ) / (
in_max - in_min ) + out_min ;
temp = ( int ) (30* temp + .5) ;
return ( double ) temp /30;
}
472
473
void WT588D_Send_Command ( unsigned char addr ) {
474
475
unsigned char i;
476
477
digitalWrite ( WT588D_CS , LOW ) ;
478
479
delay (5) ;
48
480
481
482
483
484
485
486
487
488
for ( i = 0; i < 8; i ++) {
digitalWrite ( WT588D_SCL , LOW ) ;
if ( bitRead ( addr , i )) digitalWrite ( WT588D_SDA , HIGH ) ;
else digitalWrite ( WT588D_SDA , LOW ) ;
delay (2) ;
digitalWrite ( WT588D_SCL , HIGH ) ;
delay (2) ;
} // Ende for - Schleife
489
490
digitalWrite ( WT588D_CS , HIGH ) ;
491
492
} // Ende WT588D_Send_Command
49
C
Platinen-Layout
50
Herunterladen