Pages: [1] 2 3 ... 15   Go Down
Author Topic: testbericht zum WS2812  (Read 28781 times)
0 Members and 1 Guest are viewing this topic.
Wien
Offline Offline
Edison Member
*
Karma: 28
Posts: 1894
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 266
Posts: 21656
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
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
Logged

northern germany
Offline Offline
Jr. Member
**
Karma: 2
Posts: 94
Ausbildung: Funkmechaniker, Systemadministrator
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ...


Logged

using arduino leonardo
--
tomorrow today will only be yesterday, so live your life today!

Offline Offline
Newbie
*
Karma: 0
Posts: 6
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Code:
#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

Quote from: 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 smiley-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
« Last Edit: February 01, 2013, 05:04:01 pm by Diddy5 » Logged

northern germany
Offline Offline
Jr. Member
**
Karma: 2
Posts: 94
Ausbildung: Funkmechaniker, Systemadministrator
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Dirk
Logged

using arduino leonardo
--
tomorrow today will only be yesterday, so live your life today!

Wien
Offline Offline
Edison Member
*
Karma: 28
Posts: 1894
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Wien
Offline Offline
Edison Member
*
Karma: 28
Posts: 1894
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

northern germany
Offline Offline
Jr. Member
**
Karma: 2
Posts: 94
Ausbildung: Funkmechaniker, Systemadministrator
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley
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
Logged

using arduino leonardo
--
tomorrow today will only be yesterday, so live your life today!

Wien
Offline Offline
Edison Member
*
Karma: 28
Posts: 1894
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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


* schaltung.gif (27.78 KB, 800x258 - viewed 244 times.)
Logged

Wien
Offline Offline
Edison Member
*
Karma: 28
Posts: 1894
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

northern germany
Offline Offline
Jr. Member
**
Karma: 2
Posts: 94
Ausbildung: Funkmechaniker, Systemadministrator
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ...
« Last Edit: February 02, 2013, 06:20:31 am by dischneider » Logged

using arduino leonardo
--
tomorrow today will only be yesterday, so live your life today!

Offline Offline
Newbie
*
Karma: 0
Posts: 6
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-wink
Logged

Wien
Offline Offline
Edison Member
*
Karma: 28
Posts: 1894
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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




* licht.jpg (83.96 KB, 800x600 - viewed 362 times.)

* web.jpg (88.06 KB, 800x600 - viewed 337 times.)
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 266
Posts: 21656
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

...
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
« Last Edit: February 02, 2013, 06:21:21 pm by uwefed » Logged

Wien
Offline Offline
Edison Member
*
Karma: 28
Posts: 1894
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley .
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
Logged

Pages: [1] 2 3 ... 15   Go Up
Jump to: