testbericht zum WS2812

hi,

ich hab’ jetzt grad meinen strip mit WS2812er rgb-leds bekommen:
http://www.ebay.at/itm/370732507841?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1497.l2649
lieferung war in ordnung, freitag abend bestellt, donnerstag angekommen.
die WS2812 sind 5050er SMD-RGB-LEDS mit eingebautem WS2811-controller. es gibt nur eine leitung vom arduino zum strip. keine clock-leitung, deswegen ist das timing sehr wichtig, aber das erledigt diese bibliothek:
http://code.google.com/p/fastspi/
den strip anschließen, im beispielsketch die anzahl der leds angeben und bei der auswahl des chipsets
FastSPI_LED.setChipset(CFastSPI_LED::SPI_WS2801); auswählen und ausbessern auf:
FastSPI_LED.setChipset(CFastSPI_LED::SPI_WS2811);

sketch hochladen und das testprogramm läuft. wär nur alles so einfach…

gruß stefan

ich hab' jetzt grad meinen strip mit WS2812er rgb-leds bekommen:

Du glücklicher Du, oder Ich warte noch auf meine. Felix Austria!! Danke für Deinen Erfahrungsbericht. Grüße Uwe

Ui, cool. Also erst mal Karma+ für den Erfahrungsbericht an Eisebaer. Und dann gleich ein paar Verständnisfragen, die du beantworten könntest, falls du Zeit zum rumspielen hast.

  • Müssen die WS permanent mit Daten versorgt werden oder kann eine (wenn ja, Zeitlimit?) Pause nach Datensatz für alle WS + Anzeigereset kommen?
  • Gibt es Probleme mit einigen Zentimetern Bahn oder Kabel zwischen Dout und Din nach jeweils etwa 5-7 LED mit kleinem Abstand, wie störanfällig ist der Dout/Din-Bus?
  • Muss der letzte Dout terminiert werden?
  • kann man die Anzahl der WS irgendwie ermitteln, wenn die Anzahl dynamisch ist?

Erklärung: ich überlege die WS2812 als Statusanzeigen einer Remote-Lichtsteuerung einzusetzen, wenn ich mal Zeit dafür habe. Also will ich dem Arduino Farbmischung und Helligkeit füttern und eine oder mehrere WS2812 mit den Werten als optische Kontrolle anzeigen lassen. Dafür hat mein Sketch dann mehrere Sachen zu tun und kann sich nicht nur um die LEDs kümmern. Und evtl. will ich modular erweitern können, also mehrere "Signalgeber-/Kontrollanzeigeeinheiten" seriell hintereinanderhängen (Eingabe passiert über I2C, MAX127). Falls "dynamisch zählen" nicht geht muss ich das anders realisieren, z.B. über I2C-Abfragen, ob da "jemand" auf der Adresse "wohnt".

Dankeschön schon mal für die Infos bisher.

Dirk

PS: Bei Interesse male ich mal auf, wie mein bisheriger "Version-0-Gedankenspiel-Ansatz" ist ...

Den Thread habe ich jetzt erst gesehen, aber da so viele Interesse an den LEDs haben schreibe ich das hier auch nochmal, da Eisebaer ja per PN angefragt hatte.

Der Schaltplan ist wirklich nicht schön (erster eagle Versuch) und ich bin auch kein Elektroniker, aber zur Veranschaulichung sollte er reichen.
(und ob der so funktioniert weiß ich auch noch nicht)

http://imageshack.us/photo/my-images/802/ws2812.png/

Pinbelegung der LED
unbelegt 4 3 Plus
Plus 5 2 Data In
Masse(-) 6 1 Data Out

Wie man sieht, hat man 2 mal Plus, welche miteinander verbunden werden.
Jeweils der Data Out Pin muss auf den Data In Pin der nächsten LED.

Hier ein Teil meines Codes. Mit dem habe ich getestet, es sind eigene Funktionen dabei und es muss jeder selber wissen ob er die benötigt.
Ansich ist vieles davon eine Portierung des Adafruit Codes des WS2801.

Anschluss der ersten LED des Data In Pins auf Arduino-Pin #13.

Der Code ist noch nicht ganz schön, basiert jedoch auf der FastSPI library… aber ich glaub hier wird mehr Interesse auf Funktion gegeben

#include <FastSPI_LED.h>
#define NUM_LEDS 25  // Anzahl der LEDs definieren 



struct CRGB { unsigned char g; unsigned char r; unsigned char b; };  // die WS2812 haben GRB anstelle RGB 
//struct CRGB { unsigned char r; unsigned char g; unsigned char b; };   // Bei bedarf ersetzen, wenn rot und grün vertauscht sind
struct CRGB *leds;
#define PIN 13  

void setup()
{
  FastSPI_LED.setLeds(NUM_LEDS);             
  FastSPI_LED.setChipset(CFastSPI_LED::SPI_WS2811);
  FastSPI_LED.setDataRate(2);
  FastSPI_LED.setPin(PIN); 
  FastSPI_LED.init();
  FastSPI_LED.start();


  leds = (struct CRGB*)FastSPI_LED.getRGBData(); 
}


void loop() { 

// Alle LEDs nacheinander rot aufleuchten lassen
int i; 
for (i = 0; i < NUM_LEDS; i++){
 
  setPixelColor(i, 255,0,0);
 FastSPI_LED.show();  // Daten ausgeben
 delay(500); // nur ein delay,

}

blanking(1000); // Alle LEDs ausschalten
rainbow(50); 
rainbowCycle(50); 


}
  void rainbow(uint8_t wait) {
  int i, j;
   
  for (j=0; j < 256; j++) {    
    for (i=0; i < NUM_LEDS; i++) {
      colorHex(i, Wheel( (i + j) % 255));
    }  
    FastSPI_LED.show();   
    delay(wait);
  }}
  


void rainbowCycle(uint8_t wait) {
  int i, j;
  
  for (j=0; j < 256 * 5; j++) {     
    for (i=0; i < NUM_LEDS; i++) {
       colorHex(i, Wheel( ((i * 256 / NUM_LEDS) + j) % 256));
    }  
    FastSPI_LED.show();  
    delay(wait);
  }}


uint32_t Wheel(byte WheelPos){  
   if (WheelPos < 85) {
   return Color(WheelPos * 3, 255 - WheelPos * 3, 0);  } 
   else if (WheelPos < 170) {
   WheelPos -= 85;
   return Color
  (255 - WheelPos * 3, 0, WheelPos * 3);  } 
  else {
   WheelPos -= 170; 
   return Color(0, WheelPos * 3, 255 - WheelPos * 3);  }}

// 24 Bit Farbwert umwandeln 
    void colorHex(int pix, uint32_t c){
  leds[pix].r = (c >> 16) & 0xFF;
  leds[pix].g = (c >> 8) & 0xFF;
  leds[pix].b = c & 0xFF;
  }


// 3 x 8 bit color to 24bit color 
  uint32_t Color(byte r, byte g, byte b){
  uint32_t c;
  c = r;
  c <<= 8;
  c |= g;
  c <<= 8;
  c |= b;
  return c; }
  
  
  // Aufruf mit setPixelColor(LED, rot, grün, blau); mit jeweils 0-255 als Wert.  
    void setPixelColor(int pix, int rr, int gg, int bb){
  leds[pix].r = rr;
  leds[pix].g = gg;
  leds[pix].b = bb;  
  }
  
  
  // Alle LEDs ausschalten 
  
void blanking (uint16_t wait) {
    int i;
    for (i=0; i < NUM_LEDS; i++) {
    setPixelColor(i, 0,0,0); }
    FastSPI_LED.show(); 
    
  delay(wait);}

// edit

dischneider:

  • Müssen die WS permanent mit Daten versorgt werden oder kann eine (wenn ja, Zeitlimit?) Pause nach Datensatz für alle WS + Anzeigereset kommen?
  • Gibt es Probleme mit einigen Zentimetern Bahn oder Kabel zwischen Dout und Din nach jeweils etwa 5-7 LED mit kleinem Abstand, wie störanfällig ist der Dout/Din-Bus?
  • Muss der letzte Dout terminiert werden?
  • kann man die Anzahl der WS irgendwie ermitteln, wenn die Anzahl dynamisch ist?
  1. Sobald keine Daten mehr kommen, bleiben die LEDs in ihrem letzten “Status” - hast du z.B. einer LED gesagt sie soll rot sein und du trennst die Data Leitung - bleibt diese rot, sofern noch Strom vorhanden ist.
  2. Ich habe keine Probleme gehabt mit ca 10 cm - aber da kann ich nichts genaueres dazu sagen.
  3. der Dout muss nicht terminiert werden
  4. Soviel ich weiß muss man das manuell festlegen, die Daten werden ja einfach nur durchgeschoben wie bei einem Schieberegister und keine zurückgegeben.

Falls ihr noch einen Ethernet Adapter habt, empfehle ich euch noch folgenden Link: http://www.deskontrol.net/blog/arduino-based-artnet-node-for-led-pixels/
Dazu z.B. die Software “Glediator” oder ein anderes Artnet LED Pixel Programm. Für mein großes Projekt werde ich das Artnet nutzen, für mein kleines POV Display bleibe ich bei der FastSPI :wink:

Ich hoffe dass damit die meisten in die WS2811 einsteigen können, ganz so einfach ist das Thema ja leider nicht, da sind die WS2801 einfacher aber leider teurer

// edit 2
Die Strips bekommt man jedoch auch wesentlich günstiger über China (50% vom Bucht Preis). Ich habe dort noch nichts bestellt, aber ab 4 metern lohnt sich das eher und werde über china auch bestellen (ich werde wohl aber auch ca 40-50 meter benötigen)

China LED Strips WS2811

Danke für die Antworten, das war genau das, was ich brauchte!

Dirk

hi,

danke erstmal an Dich, diddy. ich hatte starke bedenken, ob ich das mit dem timing usw hinbekomme, und wollte, während ich auf den stripe wartete, schon mal infos einholen. dank der library ist alles sehr einfach und hat auf anhieb funktioniert. danke trotzdem für die hilfe und die PN.

die fragen von Dir, dirk, hat diddy ja im großen und ganzen beantwortet, hier ein paar ergänzungen:

  1. wie diddy sagt, zustand bleibt stabil.
  2. ich hab' grad mal Deiner frage wegen einen meter litze zwischen die schon angeschlossenen 15 LEDs und die restlichen 105 gelötet. einfach anzahl der LEDs im sketch geändert, funtioniert einwandfrei.
  3. diddy
  4. es werden nur daten rausgeschoben, also kein feedback. kein I²C, also auch keine abfragen, wer wo wohnt. aber es könnte Dir helfen, daß die daten nicht, wie bei einem schieberegister, immer weitergeschoben werden, sondern das erste triple, das Du sendest, in der ersten LED bleibt, das zweite triple in der zweiten LED usw.. wenn Du also zb. vier mal 15 LEDs ansteuern willst, kannst Du trotzdem als anzahl 90 angeben, die daten für die nicht vorhandenen 30 LEDs laufen einfach ins leere. und Du kannst dann jederzeit noch 30 hinten anhängen, ohne am sketch was ändern zu müssen. also eigentlich eine frage der reihenfolge.

gruß stefan

hi,

gleicher chip, anderes thema:

ich finde ja genial, daß man von der bibliothek ein array zur verfügung gestellt bekommt, in dem man die werte ändert, und mit show werden dann die LEDs beschickt. einfacher geht's nicht.

aber man hat keine möglichkeit, mehrere streifen über verschiedene PINs anzusprechen. sieht da jemand einen weg? um die bibliothek umzuschreiben, bin ich nicht fit genug in der materie.

gruß stefan

Hi Eisebaer,

danke dir für die Infos. Damit hab ich alles, was ich brauche. Doch, I2C würde bei mir gehen, würde mehrere geleiche Platinen mit je einem MAX127 und diversen LED aufbauen und dann seriell aneinanderhängen. Dann kann ich die MAX127 abfragen. Die haben zwar nicht primär was mit den LED zu tun, aber ich hätte die Anzahl :) OK, mehr beschicken als ich hab geht auch ... mal wieder was zum grübeln.

Zu deiner Frage:

Wozu mehrere Stripes an verschiedene PINS, wenn du doch alle hintereinanderhängen kannst? Oder brauchst du mehr, als du auf einmal ausgeben kannst? Du kannst doch mit einem Konstruktor die Daten für Stripe1, Stripe2, Stripe 3 miteinander verketten und dann rausjagen? So kannst du dann auch die Datensätze einzelner Stripes aktualisieren und die restlichen unverändert lassen ...

Dirk

noch ein nachtrag zum schaltplan, diddy:

im datenblatt zum WS2812er ist eine abbildung mit je einem widerstand und einem kondensator, häng’ ich unten an.
den widerstand seh’ ich auf meinem streifen nicht, aber ein kondensator ist da verbaut. sieht man auch hier:
http://www.ebay.at/itm/370732507841?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1497.l2649
und hier noch einmal eine günstige adresse:
http://rita.en.alibaba.com/product/677814159-213640342/5050_SMD_RGB_LED_with_built_in_WS2811_IC.html

gruß stefan

hi, dirk,

ist zwar nicht meine situation, aber so läßt es sich am einfachsten beschreiben: stell Dir die weihnachtsbeleuchtung an einer häuserfront vor. mehrere streifen an veschiedenen plätzen. wenn ich da die enden eines streifens mit dem anfang des nächsten verbinde, komm' ich auf eher untragbare leitungslängen (da bricht mir wahrscheinlich die spannung der datenleitung weg). wenn ich allerdings einen controller in der mitte hab, sollte es problemlos gehen...

gruß stefan

Hmm, ich seh noch nicht, warum du dann nicht die Stripes hintereinander hängen kannst. Da Din und Dout ja definierte Signale bzw Pegel hane würde ich einfach eine WS281x nach ein paar Metern (ausprobieren?) als Repeater zwischenhängen und nicht ansteuern (blinde LED), alternativ die +5V für die LED nicht beschalten (die für den IC natürlich schon). Wird nur schwierig, wenn du einen Stern bauen müsstest ... aber eine bessere Idee hab ich momentan auch nicht, ausser mehrere Arduino als Steuergeräte über I2C miteinander koppeln und jeweils einen Stripe damit beschicken. Hätte den Vorteil, dass du nur jeweils den mit Daten beschicken musst, der etwas ändern soll.

Dirk

PS: Mir gefallen die "Waterproof", die Diddy postete, gut. Aber der Versand ...

Eisebaer:
hi, dirk,

ist zwar nicht meine situation, aber so läßt es sich am einfachsten beschreiben:
stell Dir die weihnachtsbeleuchtung an einer häuserfront vor. mehrere streifen an veschiedenen plätzen. wenn ich da die enden eines streifens mit dem anfang des nächsten verbinde, komm’ ich auf eher untragbare leitungslängen (da bricht mir wahrscheinlich die spannung der datenleitung weg). wenn ich allerdings einen controller in der mitte hab, sollte es problemlos gehen…

gruß stefan

Hi Stefan

wie wäre es als Leitung gutes Cat 7 Netzwerkkabel zu legen?
Durch die Schirmung lässt sich damit bestimmt einiges an Länge gewinnen.

Gruss
Diddy

//edit:
von wievielen Metern reden wir denn? evtl kann ich das testen, hab noch irgendwo 70 meter davon rumliegen :wink:

hi,

offensichtlich war die weihnachtsbeleuchtung ein schlechtes beispiel, weil man davon ausgeht, daß da effekte laufen, die ständig neu mit daten beschickt werden müssen.

ich denke aber in richtung beleuchtung. ich hab’ jetzt im wohnzimmer 26 12V LED-lampen in der decke eingebaut und überlege, die steuerung von 74HC595 auf dimmbar umzustellen. gesteuert wird über webinterface von einem tablet oder smartphone. die helligkeit eines streifens mit 15 WS2812 scheint sogar größer zu sein als die einer einzelnen lampe bei mir. also warum nicht statt der LED-lampen jeweils einen 15er-streifen mit den 2812ern? einen schlitz in die deckenpaneele fräsen und mit plexglas abdecken, oben darauf den streifen…

die einzelnen zimmer, arbeitsflächenbeleuchtung in der küche, schreibtischbeleuchtung usw wären aber schöner zu schalten, wenn man je einen PIN dazu verwenden könnte. es wären ja auch insgesamt etwa 1500 WS2812. von den kosten her vertretbar, weil ein 15er-streifen etwa soviel kostet wie eine LED-lampe (5€). im vergleich zu halogen-lampen noch billig, von den stromkosten gar nicht zu reden…

einzelne atmega328 zu verwenden, ist natürlich eine alternative, die 3 euro machen’s ja nicht aus, aber komplizierter.

davon abgesehen find’ ich die idee mit dem “repeater” gut, aber eben für weihnachtsbeleuchtungen.

danke für das angebot mit den 70 metern, ist für andere zwecke sicher ausprobierenswert. CAT7 ist für mich ohnehin das kabel schlechthin, die fallen in der firma immer wieder an.

gruß stefan

Eisebaer: ... aber man hat keine möglichkeit, mehrere streifen über verschiedene PINs anzusprechen. sieht da jemand einen weg? um die bibliothek umzuschreiben, bin ich nicht fit genug in der materie. gruß stefan

Ich befürchte wegen dem kritischen Timing kann man nicht mehrere Stränge an mehrere Pins betreiben. Die maximale Anzahl der LED (von 512 bzw 1024) ist an die Bedingung einer Bildwiederholrate von 30 Hz verknüpft. Nur in diesem Fall ist die Schnittstelle schnell genug um die Daten für alle LED in unter einer 30-stel Sekunde zu übertragen. Wenn man weniger dynamische Verläufe akzeptiert (niedrigere Bildwiederholfrequenz), kann man auch mehr LEDs hintereinander schalten.

Ich glaube aber, es wäre kein Problem, bei relativ statischen Ansteuerungen die Ansteuerung über einen Analogmultiplexer wie zB einen CD4051 bzw CD4067 laufen zu lasssen. Jeder "Ausgang" des Multiplexers sollte dann aber mit einem 10kOhm Widerstand auf 5V geschaltet werden da ansonsten bei nicht selektionierten "Ausgang" dieser kein definiertes Potential haben würde. Mit 3 bzw 4 Ausgängen würde man dann den Strang aussuchen, auf den die Daten gerade geschickt werden. Auch diese Methode würde die Gesamtbildwiederholfrequenz heruntersetzen, würde aber die Möglichkeit bieten, einzelne Stränge zeitweise mit hohen Bildwiederholfrequenzen zu betreiben.

Viele Grüße Uwe

hi,

uwe, Du kennst mich inzwischen... ich hab' keine ahnung, was ein analogmultiplexer ist, deswegen erklärst Du's gleich ein bißchen und schon hilft's mir weiter :) . wenn ich's richtig verstehe, kann ich mit einem acht-kanal-teil mit einem datenausgang und acht bzw. drei (bei binärcodierung) leitungen den ausgang wählen. diese acht oder drei kann ich dann ja auch über 74HC595 ansprechen, oder? wenn ich zwei oder mehr dieser analogmultiplexer brauche, ist es dann besser, einen davon vorweg zu stellen, und den dann den gewollten ansprechen zu lassen, oder stell' ich sie einfach nebeneinander, schließe den datenausgang des arduino an alle dateneingänge der multiplexer an, wähle über schieberegister den richtigen ausgang des richtigen multiplexers und lasse bei jedem einen ausgang frei, den ich verwende, wenn er nichts tun soll? der CD4067 ist ja ein 16-kanal-ding, das über vier kanäle angespochen wird, wie ich grade gegoogelt habe. sieht gut aus, aber 16 könnten grade nicht reichen, deshalb bleiben meine fragen. zeitkritisch ist bei mir garnichts, zwischen dem rausschalten einzelner "kanäle" bleiben immer mindestens sekunden. sollten die 4067er die beste wahl sein, werd' ich mir mal welche bei conrad besorgen.

danke einstweilen und gruß stefan

hi nochmal,

mir ist da dieser beitrag eingefallen: http://arduino.cc/forum/index.php/topic,134544.msg1012124.html#msg1012124 hab' ich immer noch herumliegen. Du, uwe, hast damals folgendes geschrieben:

4x MC14067BCP analog multiplexer: verbindet den gemeinsamen Pin mit einem der 16 Ein/Ausgänge. Auswahl durch 4 Adressleitungen. Funktioniert analog und in beide Richtungen (das Signal kann am gemeinsamen Pin oder einem der 16 angelegt werden) CMOS- Tecnologie.

wären die genausogut oder soll ich mir lieber das neuere teil besorgen? es geht nur um den weg von einer halben stunde, das geld in dieser größenordnung spielt keine rolle. könnte beim probieren mit den alten teilen was passieren oder würden die das gepulste signal beinflussen?

gruß stefan

Entschuldige Stefan. Hab nicht auf Deine Frage geantwortet. Hatte es so verstanden daß Du die WS2811/12 verwenden wolltest. Werde Dir morgen antworten. Grüße Uwe

hi, uwe,

verstehe jetzt nicht, Du hast genau richtig geantwortet. es geht nur darum, mehrere WS2812er-streifen getrennt voneinander mit daten beschicken zu können, und ich habe kein zeitproblem. wenn ich alle sekunden den kanal umschalten kann, und dann auf diesem kanal einmal ein datenpaket für die LEDs auf diesem kanal schicken kann, ist das schon mehr als genug.

aber jetzt gute nacht, bis morgen...

gruß stefan

Wenn es kein Zeitproblem gibt dann einfach alle WS2811 LED in Reihe schalten.

Der 4051 bze 4067 ist wie ein Stufenschalter mit 8 bzw 16 Schalterstellungen. Der gemeinsame Pol wird auf einen der 8 bzw 16 Kontakte geschalten. Die Flußrichtung kann in beide Richtungen erfolgen. Beim 4051 bzw 4067 erfolgt die Auswahl des "Ausganges" über eine 3 bzw 4 Bit Zahl. Du wählst den Ausgang aus und schickst die Daten an den LED-Strang der an diesem Ausgang hängt. Damit die anderen "Ausgänge" einen definierten Pegel haben schaltest Du einen Pullupwiderstand an. So bekommen die Eingänge der nicht geschaltenen WS2811 keine Störsignale.

Grüße Uwe

Naja, Eisebaer hat schon recht. Wenn er mehrere "Einheiten" oder Räume beschicken will, sollte er nicht alle LED mitlaufen lassen, sonst frisst sich der Stromvorteil irgendwann auf. Aber Multiplexen sollte gehen, im einfachsten Fall über eine Interruptroutine im Arduino? Also den Ausgabepin auf einen InterruptPin legen, den Interrupt auslesen und mittels einer Variable direkt an einem anderen Port wieder ausgeben lassen?

Also mal schematisch so gedacht: define AusgabePin 0; //irgenein Port, der Interruptfähig ist byte Channel = 0; // Variable für späteren Ausgabeport

setup() { }

loop() { => Ausgabe definieren, Channel mit Wert belegen => mit fastspi auf AusgabePin ausgeben }

interrupthandler() { Wenn Interrupt an Port AusgabePin, dann AusgabePin lesen und direkt an Channel wieder ausgeben; }

Wäre das ein denkbarer Ansatz? Die Idee mit dem AusgabePin, der gleichzeitig wieder Interrupt-Eingang ist, habe ich aus einem DCF77-Filter-Projekt (auch hier im Forum) entliehen.

Liebe Grüße

Dirk