Warpcore
Warpcore Status: stable | |
---|---|
Beschreibung | Trafficanzeige im Rack |
Autor: | schinken |
PayPal |
Beschreibung
Der Warpcore ist eine Beleuchtung des Racks mit Leuchtdioden, welche an den Warp-Kern des Raumschiff Enterprise angelehnt ist. Hierbei sollen die zwei verwendeten Farben abwechselnd an- und ausgeschalten, bzw "gefaded" werden.
Zugleich wird die Beleuchtung auch dazu verwendet, den aktuellen Internet-Traffic (incoming) zu visualieren. Hierzu wird die Geschwindigkeit des "Fadens" bei hohem Traffic erhöht, sowie bei geringem Traffic reduziert. Um Strom zu sparen wird die Beleuchtung abgeschalten sobald sich keine Member mehr im Space befinden. Hierzu wird die API des Open/Close_Anzeiger verwendet.
Videos von den aufbauten befinden sich hier:
Version 2
Warum?
Die erste Version des Warpcores nutzte node-firmata sowie den daran angeschlossenen Arduino mit dessen PWM-Ausgänge zum Ansteuern der Transistoren. Node-firmata nutzte für die serielle Kommunikation die Bibliothek node-serialport, welche im C/C++-Binding durch die Verwendung einer Queue zu Problemen führte.
Hierbei wurden alle Bytes die gesendet werden sollten in eine Queue geworfen, welche aber bei einer zu hohen Senderate voll lief. Leider gab es keine Möglichkeit den aktuellen Stand der Queue auszulesen, um das Aktualisieren des PWM-Ports zu reduzieren oder zu unterbrechen. Nach einer gewissen Zeit war der Speicher der Flepo aufgebraucht und das node-Programm beendete sich mit einen memory allocaton error.
Hardware
Um jede Leuchtdiode einzeln ansteuern zu können wurde die Platine aus dem Projekt dmx2rgb wiederverwendet. Diese Platine wurde ohne RS485-Chip bestückt, da wir den vorhandenen USB2UART-Adapter direkt an den Prozessor angeschlossen haben.
Datenübertragung
Der USB2UART-Adapter beherrscht nur die Standard-Baudraten, weshalb wir nicht die 250kHz von DMX verwenden konnten. Hierfür haben wir die Firmware der dmx2rgb-Platine modifiziert und einen eigenen Branch im dmx2rgb-repository angelegt. Die momentan verwendete Baudrate ist 230400.
Um den Anfang des Datenpaktes zu markieren, beginnt jede Übertragung mit 0x55AA, gefolgt von 48 Byte Daten. Jedes Byte addresiert einen Kanal der dmx2rgb-Platine.
Visualisierung
Zurzeit läuft ein simples Testprogramm welches einen einfachen Sinus durch alle Kanäle laufen lässt. Geplant ist die Wiederherstellung der ursprünglichen Funktionalität, um den aktuellen Netzwerktraffic anzeigen.
Hierzu muss die Traffic-Ermittlung via SNMP komplett neugeschrieben, da die node.js-Library nicht weiter verwendet werden kann.
Version 1
LEDs
Für die Realisierung wurden 20 blaue LEDs mit 8000mcd und 18 cyan/türkise LEDs mit 9000mcd verwendet. Die Leuchtdioden wurden auf eBay jeweils im 50er-Pack inklusive Vorwiderstände und Schrumpfschläuche für wenige Euros bestellt.
Im ersten Schritt wurde an jeder Leuchtdiode der mitgelieferte 470 Ohm-Widerstand an der Kathode (-) angelötet. Danach wurde ein zwei bis drei Zentimeter langes Stück des Schrumpfschlauches über den Widerstand geschoben und erhitzt, damit es nicht versehentlich bei der Montage zum Kurzschluss kommen kann. Pro Farbe wurden im Abstand von 20 Zentimeter die LEDs an einen zweiadrigen Klingeldraht angelötet. Hierbei wurde mit einem Teppichmesser die Isolierung entfernt um den Kupferdraht offenzulegen.
Die Verkabelung wurde im Rack mit Heißkleber befestigt und verlegt.
Ansteuerung
Für die Ansteuerung verwenden wir einen Arduino Uno in der Revision 3. Als Ausgänge wurden die PINs 5 und 6 verwendet, da diese als PWM-Ausgang verwendet werden können. Da der Prozessor nur 40mA am Ausgang bereitstellen kann, wurde eine kleine Lochrasterplatine mit Klemmen und BC337-16 Transistoren aufgebaut.
Beschaltung der Transistoren:
\\ +----[ 470 ]--|<---- +12V _____ |/ PIN5 --+----[_____]-----| | 4k7 |> | \ | +---- GND | | \\ | +----[ 470 ]--|<---- +12V | _____ |/ +----[_____]------| | 4k7 |> etc. \ +---- GND
Für jede Farbe wurden 4 Transistoren verbaut, da vorgesehen ist auf jeder Seite des Serverschranks eine "LED-Leiste" anzubringen. Alle Dioden einer Farbe sind miteinander verbunden. Hierbei wurde für Cyan der PIN5 und für Blau der PIN6 verwendet.
Arduino/Firmata
Der Arduino Uno ist per USB mit der Flepo verbunden. Als Firmware wurde Firmata verwendet. Implementiert wurde die Steuerung des Arduinos mit node.js, da hierfür eine nodejs-firmata Library existiert.
Die Helligkeitsberechnung wurde mit der Sinus-Funktion sin(x) realisiert. Der Wert x wird je nach Geschwindigkeit unterschiedlich stark inkrementiert. Für die Ansteuerung der zweiten LED-Farbe wurde der berechnete Wert invertiert. Die Berechnung und senden des Wertes an den Arduino wird in einem Intervall von xx Millisekunden vorgenommen.
Da der Netzwerktraffic sprunghaft steigt oder fällt, wurde der Wert mit der exponentielle Glättung geglättet. Die Geschwindigkeit ist mit maximal 6000 kb/s und minmal 100 kb/s gedeckelt.
Der Code für die Ansteuerung befindet sich hier: nodejs-warpcore und hier H.A.R.M.
SNMP Traffic
Um den Netzwerkverkehr unseres Routers zu lesen wurde das Protokoll SNMPv2 verwendet. Hierfür konnte die bereits existierende Library node-snmp-native genutzt werden.
Unter der OID ".1.3.6.1.2.1.2.2.1.10.5" stellt OpenWRT backfire 10.03.1. den Wert "br0-wan incoming" als Bytes seit der Inbetriebnahme des Gerätes zur Verfügung. Zum errechnen der aktuellen Kilobytes pro Sekunde wurde der aktuelle Wert alle 2 Sekunden abgefragt und die Zeit seit der letzten Änderung gemessen.
Der Code befindet sich hier nodejs-snmp-traffic