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