testbericht zum WS2812

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)

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