Tagebuch [Tagebuch] LED-Beleuchtung mit Arduino

crys_

Software-Overclocker(in)
Letztes Jahr habe ich angefangen nach dem optimalen Mini-Rechner zu suchen den man sich am Abend kurz unter den Arm klemmt und auf die nächste LAN oder zu einem Kollegen geht. Nach dem ersten Versuch mit einem Bitfenix Prodigy bin ich im zweiten Anlauf auf einen Alienware X51 gekommen. Von OEM Rechnern kann man halten was man will, aber bei dem Gerät hat Dell/Alienware viel richtig gemacht. Kleiner geht nicht, wenn auch mit der Prämisse externes Netzteil.
Jetzt bin ich gerade dabei mir einen neuen Rechner zu bauen - am Alienware konnte man nicht genug basteln :ugly:

Ein Feature hat es mir aber angetan: Die RGB Beleuchtung "Alien FX" mit der man Teile des Rechners in verschiedenen Farben beleuchten kann. Für mein neues Projekt möchte ich das nachbauen, am Markt habe ich leider nichts ordentliches Gefunden :daumen2:

Diesen ersten Post werde ich immer mit aktuellen Infos bestücken, z.B. wenn sich etwas grundlegend ändert oder neue Sachen dazukommen.

Was soll das System können?
- Vom Desktop aus steuerbar sein
- Easy to use und it just works
- Eine LED-Leiste in verschiedenen Farben beleuchten
- Die Beleuchtung über mehrere Frames hinweg animieren (siehe unten)
- In jeden Rechner integrierbar sein
- Günstiger als 50 Euro (alles zusammen)
- Beleuchtung komplett aus/an schalten
- In wenigen Minuten nachbaubar

Dem System soll man über eine UI mehrer Frames hinterlegen können. Ein Frame ist ein Zustand den die Beleuchtung annimmt. Es besteht aus einem Farbverlauf, den die Leiste von links nach rechts annimmt.
Hierfür kann die Farbe an beliebigen Stellen bis zu 10 "Color Stops", also Punkte mit einer besimmten Farbe definiert werden. Die Farben zwischen den Punkten werden berechnet. So kann z.B. die erste LED rot, die 10. grün und die 60. gelb sein, die Farbübergänge dazwischen werden errechnet. Neben einer Farbe hat auch jeder Color Stop eine Helligkeit, so lassen sich einzelne LEDs ausschalten.

Jedes Frame hat eine Zeit, welche die Dauer angiebt, wie lange das Frame unverändert gezeigt wird (Pause Time) und ein, die die Dauer des Übergangs zum nächsten Status angibt (Transition Time). Durch die Verkettung mehrer Frames lässt sich eine Farbanimation hinterlegen.

Wie soll das gehen?
Das hört sich alles wilder an als es ist. Hier seht ihr mal wie ich mir das System vorstelle:
ownFX.png

Das Arduino Board kontrolliert die Neopixels (unten mehr) und ist über einen internen Port mit dem PC verbunden. Der Treiber des Arduino Boards simuliert auf dem USB Anschluss eine Serielle Schnittstelle, welche mit einem Programm angesteuert werden soll. Ab hier kommt Routine: Ein kleiner Webserver hostet eine Webseite mit einer REST-Schnittstelle auf der der Nutzer Frames erstellen und verknüpfen kann. Klickt der Nutzer auf "Anwenden" sendet die Webseite die Konfiguration an den Server, welcher sie umwandelt und über die serielle Schnittstelle als Byte Abfolge zum Arduino schickt. Dieser speichert sie in seinen EEPROM, damit sie auch nach einem Neustart des PCs (kein Strom mehr) noch verfügbar ist und steuert die LEDs entsprechend an.

Warum ein Web-Frontend und keine "normale" Windows GUI?
Berechtigte Frage! Durch die Abkopplung der GUI und die Kommunikation über die REST-Schnittstelle ist es später im Endeffekt egal wo die GUI bzw. die Webseite läuft - lokal auf dem Rechner, auf dem Smartphone oder Tablet im Wohnzimmer...
Denkbar wäre auch die Webschnittstellen über eine extra App anzusteuern, aber das ist Zukunftsmusik :ugly:

Adafruit Neopixles
Die Neopixels sind eine einfache LED-Leiste mit RGB LEDs, die über eine C-lib vom Arduino angesteuert werden kann. Hierbei kann jeder LED eine individuelle Farbe hinterlegt werden. Die Leiste gibt es mit 30 LEDs/Meter (~20€), 60 LEDs/Meter (~30€) und 144 LEDs/Meter (~60€). Dabei ist zu beachten das der Arduino maximal 150 LEDs ansteuern kann. Die LED-Leiste lässt sich mit dem Klebeband an der Rückseite am Gehäuse festkleben. Die Leiste ist flexibel Teilbar, also nach jeder LED trennbar (per Schere, also kein zurück :fresse:), lässt sich aber wieder über Kabel verbinden. So lässt sich die Leiste auch gut im Gehäuse verteilen.
1138-00.jpg

Technische Einschränkungen
- Maximal ~400 LEDs (bei 2 KB RAM, es werden pro LED 4 Byte benötigt)
- Maximal 12 Frames
- Maximal 10 Color Stops/Frame
- Kein Lauflicht (also z.B. eine LED an, alles anderen aus und im nächste Schritt nur die nächste an etc.)

Wo gibts die Source?
Auf GitHub.

Über mich
Was qualifiziert mich? :ugly: Ich bin Informatikstudent im 5. Semester und habe auch schon vor dem Studium mehrere Jahre an der Schule und privat programmieren gelernt, bin also auch schon rund 7 Jahre dabei. Mein Fokus liegt auf Softwareengineering und Softwaredevelopment, durfte aber schon öfters als mir lieb ist auf diversen µConrollern Bits umherschieben und auch die Webentwicklung ist mir alles andere als fremd ;)

Aktueller Stand
- Webseite fertig (bis auf About)
- Server fertig
- Arduino empfängt alle Informationen
- Frames aus Profilen können ohne Animation dargestellt werden

Wenns gut laueft gibt es am Wochenende die erste lauffaehige version :daumen:
Screenshot (72).png Screenshot (9).png IMG_20141011_132323.jpg IMG_20141011_132620.jpg IMG_20141016_173844.jpg IMG_20141219_150212.jpg IMG_20141219_191130.jpg IMG_20141219_175436.jpg

Nächste Schritte
- Animierte Frameübergänge
- Letzer Feinschliff auf der Webseite (große Baustelle ist noch, dass keine zwei ColorStops aufeinander gezogen werden können)
- Letzter Feinschliff am Server (korrekte Verknüpfunge Webseite <-> Arduino)
- HowTo schreiben

Und los gehts...
Am Samstag trudelt das Arduino Board ein, welches ich für die Versuche nutzen will. LEDs habe ich vorerst noch nicht bestellt, da ich erst eine grundlegende Kommunikation zwischen eine PC-Programm und dem Arduino herstellen will. Google sagt das ist einfach, macht mir aber Bauchschmerzen :ugly: Ich poste hier immer meinen Fortschritt :daumen:
 
Zuletzt bearbeitet:
Sehr nettes Projekt :daumen:
Mache grad auch ein Projekt mit dem Arduino für den Informatik Unterricht an meiner Schule. Allerdings wird's bei mir eine Lüftersteuerung mit Temperatursensoren und von der Temperatur abhängiger Lüfterdrehzahl ;)
Insg. werden's 12x 3-Pin Lüfter über PWM geregelt :)

Werde dein Projekt verfolgen vlt. bastel ich das als kleines Add on zu der Steuerung als Gehäusebeleuchtung :ugly:
Das Userinterface interessiert mich besonders, da ich mich damit noch nicht so wirklich befasst habe beim Arduino.

Es ist doch theoretisch möglich mit Hilfe von Schieberegistern den Arduino wesentlich mehr LEDs ansteuern zu lassen, wenn ich mich nicht irre ;)
 
Es ist doch theoretisch möglich mit Hilfe von Schieberegistern den Arduino wesentlich mehr LEDs ansteuern zu lassen, wenn ich mich nicht irre ;)

Da hab ich mich verlesen :D Muessten rund 600 LEDs sein mit dem Arduino Uno. Limitierende Komponente ist der RAM, da die C-lib intern ein struct mit 3 Bytes (R, G und B) für jeden Pixel hinterlegt hat.
 
Da hab ich mich verlesen :D Muessten rund 600 LEDs sein mit dem Arduino Uno. Limitierende Komponente ist der RAM, da die C-lib intern ein struct mit 3 Bytes (R, G und B) für jeden Pixel hinterlegt hat.

Stimmt da war ja was :D Diese Speicherplatz-Knappheit ist man ja heutzutage gar nicht mehr gewohnt :ugly: 32KB ist aber auch ganz schön klein ;)
 
Hab letztes Semster ein µController Projekt gehabt bei dem ein Webserver + komplette Webseite auf 64kb passen müssen :fresse: Anforderung vom Prof: Alles top designed und viel bling bling mit Grafik und so...auf 64kb.... :wall: Hat aber super geklappt. Die Seite sollte das Board kontrollieren, also Klick auf einen Pin auf der Webseite schält den Pin real um und wird auf der Webseite wieder korrekt dargestellt (als an oder aus). Dafür sollten die Platine grafisch dargestellt werden. Um das zu machen haben wir die Platine in CSS mit Kreise, Rechtecken und Linien nachgebaut, weil sogar SVG zu viel Speicher brauchte :ugly:
 
Gibt ja da diese Komprimierungsfreaks :ugly:
4Sceners.de

Und wie sagt man so schön: Not macht kreativ :D

Edit: Die verlinkte Demo belegt entpackt ca. 1 GB RAM :ugly:
 
Zuletzt bearbeitet:
Wir wollen es ja nicht überteiben :D Villeicht kann man aber noch bisschen an der Performanceschraube drehen wenn mal der Unterbau soweit steht

Git steht inkl. erster Version der Webseite. Kann noch nichts, aber so stelle ich mir das vor:
Screenshot (2).png

Link zum Git gibts im ersten Post :daumen:

Un nochmal Update:
Screenshot (4).png

Habe jetzt rund 4-5h an der Webseite verbracht und soweit ist alles fertig bis auf:
- Verlauf einstellen (Color Stops)
- Geänderte Konfigurationen speichern (Gibt halt noch keinen Server :D)
- Anzahl der LEDs am System einstellen
 
Zuletzt bearbeitet von einem Moderator:
Update :D
Screenshot (6).png

Die Hauptseite ist soweit fertig. Man kann jetzt beliebige Konfigurationen zusammenstellen.
Was noch fehlt ist eine Art Kollisionserkennung für die Color Stops. Aktuell kann man noch zwei Color Stops auf eine Stelle machen, das sollte so nicht sein :D
Die Color Stops können jetzt elegant per Drag and Drop bewegt werden :daumen:

Auf der Seite fehlt jetzt noch:
- Eine Einstellungsseite (die Anzahl der LEDs etc)
- Die Kollisionserkennung für Colorstops
- Speichern (Server fehlt immer noch, will ich nächste Woche fertig machen)
- Alles mit Arduino...der hängt noch bei DHL in Leipzig :motz:
 
Und weiter gehts :D

Screenshot (73).png Screenshot (72).png ownFX.png

Die Statusseite ist fertig. Man kann:
- Neue Profile erstellen
- Profile loeschen
- Profile speichern (wird in ~/App Data/Local/ownFX abgelegt)
- Profile aktivieren (wenn dann der Arduino fertig waere :ugly:)
- Profile umbennen
- Profile exportieren (Download)
- Profile importieren
- Frames und Colorstops beliebig hinzufuegen / loeschen / aendern

Der Server laeuft auch. Er kuemmert sich um das Speichern der Profile etc. Hier fehlt noch das Speichern von Einstellungen, genau wie auf der Webseite.
Einstellen soll man koennen:
- Groesse RAM und EEPROM
- Maximale Anzahl Frames und Color Stops

Aus den Anzahl der Colorstops und Frames laesst sich der RAM und EEPROM Verbrauch des Arduinos berechnen und sollte man die Moeglichkeiten des Arduinos ueberschreiten gibt es eine Warnung.

Als naechstes kuemmere ich mich um die Einstellungen. Wenn das steht kommt die Kommunikation mit der Arduino. Mein Ziel waere die beiden Punkte bis Anfang naechster Woche abzuarbeiten.
Dann wueder nur noch das Anzeigen fehlen :)

Der Arduino ist inzwischen uebrigens da, die LEDs sind noch bei DHL.
 
Zuletzt bearbeitet:
Direkt mal Abonniert !
Top, mit was Programmierst du den Arduino ?

Ich hab mit meinem Arduino auch mal nen Webserver aufgesetzt, allerdings seehr seeehr einfach gehalten. Sendest du die Befehle über GET requests oder irgendwie anders ?
Wäre es möglich mal in den Quellcode reinzuschauen ? :)
 
Der Webserver ist auf dem PC, nicht auf der Arduino ;)
Ich nutze die Webseite nur als abgekoppelte UI, da ich das ganze dann auch vom Handy oder so steuern könnte ;) Der Quellcode ist komplett auf Github, Link ist im ersten Post.

Generell frägt die Webseite alle Daten über GET ab. hierbei wird nachdem die Seite geladen werden immer wieder Informationen von Server nachgeladen, z.B. wenn ein neues Profil augewählt wird. Die Profile werden als JSON repräsentiert. Wenn ein Profil gespeichert wird verwendet ich POST um die Informationen (also den JSON Text) an den Server zu übermitteln.

Kurzer Hinweis zum Quellcode:
Im web Ordner liegt die Webseite, im src Ordner der Server. Arduino fange ich morgen an, dann strukturiere ich das bisschen um
 
Ist ja viel Text :D

Noch ein kleines Update: Arduino ist da und ich hab ihn schon mal über den internen USB Anschluss zum laufen gebracht (Kabel hab ich selbst kurz gelötet) :daumen:
Sollten jetzt mal noch die LEDs eintrudeln wäre ja alles komplett :fresse:
Bin gerade noch an der Einstellungsseite, die ist aber soweit heut Mittag noch fertig. Morgen fang ich dann schon mit der Kommunikation zum Arduino an

IMG_20141011_132620.jpg IMG_20141011_132323.jpg IMG_20141011_132408.jpg Screenshot (9).png
 
Zuletzt bearbeitet:
Das sieht ja sehr nett aus. Ich hatte auch immer mal was ähnliches vor, bin aber aus Zeitgründen noch nicht dazu gekommen. Solltest du z.B. beim Arduino noch Hilfe brauchen wäre ich gerne dazu bereit.
2 kurze Fragen:
- was für eine IDE benutzt du da für die Server Entwicklung? Sieht gut aus das Ding ;)
- Das ist ja anscheinend ein Uno Klon den du da hast. Funktioniert der 100%ig? Und wenn ja wo bekommt man den? Ich baue mir für Projekte meistens meinen eigenen mini Arduino auf Atmega328 Basis, aber den Serial Chip will ich nicht selber drauf bauen (zu fummelig), also brauche ich für solche Projekte immer was fertiges.
 
Danke für das Angebot, aber gerade den Arduino möchte ich selbst machen :D Und so viel ist es gar nicht mehr...

Der Server wird in eclipse mit Java auf Basis von Jetty entwickelt. Entscheidung für Java ist gefallen um bisschen kompatibel zu Linux zu bleiben. Die Webseite wird mit Adobe Brackets entwickelt und basiert auf Twitter Bootstrap (ich nehme an das willst du wissen ;)). Bootstrap ist ein CSS/JS Framework und ermöglicht das fixe erstellen von Webseiten die nach was aussehen ohne Aufwand reinzustecken ;)

Das Board hab ich von Amazon, wollte eigentlich ein originales hab aber nicht aufgepasst :D Auf meinem steckt sogar der ATmega 32 und nicht der im Titel erwähnte 16er...Glück gehabt ^^

Zur Funktion kann ich noch nicht viel sagen weil die LEDs noch nicht da sind und ich sonst nichts rumliegen hab mit dem ich testen könnte. Aber bis jetzt passt alles, die LED blinkt :ugly:
 
Habe etwas ähnliches am laufen nur mit einem Raspberry Pi und 5 Meter Rgb Leds überall Hinter Schränken, unter dem Bett etc.^^
Am Raspberry lauft ein Apache Server auf dem die Webseite läuft und die Befehle umsetzt und auf den Ausgang das jeweilige PWM Signal zur Farbe ausgibt dass mir wiederrum 3 Mosfets schaltet die dann die 12V zu den Leds schalten.
Leider sieht meine Seite noch nicht so Professionell aus wie deine da ich nur Grundkentnisse kann.
 
Dann guck dir mal Bootstrap an :daumen:
Gibt hunderte Tutorials und das Ergebniss sieht immer professionell aus ;)
 
Zurück