Warpcore

Crystal Clear action run.png
Warpcore

Status: stable

Warp core title.jpg
Beschreibung Trafficanzeige im Rack
Autor: schinken
Flattr Flattr Warpcore
PayPal Spenden für Warpcore

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 3

Warum?

Nachdem die vorherige Version nicht zuverlässig war, und mittlerweile die LED-Stripes mit WS2812 deutlich günstiger sind, würde der Warpcore nochmal komplett neu aufgebaut.

Hardware

Wir verwenden einen Arduino MEGA mit Ethernet-Shield für den Aufbau. Hier haben wir noch einige Ports übrig um Kontakte/Temperatusensoren/etc anzuschließen, als auch genug Speicherplatz und RAM für die Software. An dem MEGA sind aktuell die WS2812 LED-Stripes sowie der Serverschrank-Türkontakt angeschlossen.

Software

Die Software liegt wie immer auf Github. Hier kann man PINs definieren, welche bei Statusänderung ihren Status auf ein MQTT-Topic publishen. Die Geschwindigkeit des Warpcores wird auch über MQTT gesteuert. Außerdem ist der Warpcore noch auf das Alarm-Topic sowie den Türkontakten und dem MemberCount subscribed.

Dadurch schaltet sich der Warpcore aus, wenn niemand anwesend ist (Strom sparen), oder dimmt, wenn nur die Tür abgesperrt ist. Er regiert dadurch außerdem auf unsere Alarm-Benachrichtigungen auf dem LED Board.

Zur Zeit ist ein Temperatursensor als Test angeschlossen, welcher seine Temperatur per MQTT published.

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

LEDs vorbereiten

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

Laufender Download...

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