testbericht zum WS2812

hi, uwe,

Auf die Idee von WS2801 auf WS2811 auszubesser wäre ich nie gekommen.

in der bibliothek ist WS2811 definiert, nur im beispielsketch haben sie drauf vergessen...

gruß stefan

Ja, die Bibiothek hab ich mir auch nicht genau angeschaut.
Grüße Uwe

Aber manchmal hilft lesen, Eisebaer hat das schon im ersten Post dieses Threads geschrieben :slight_smile:

LG
Dirk

Hallo,

ich habe letztens beim Arduino Open Space bei uns in Dresden ein paar Sachen gesehen, die ein paar Leute mit den WS2812 LEDs angestellt haben. Es waren 2 Arrys dabei. Einer hatte Stripeabschnitte als Matrix verschaltet. Die Datenleitungen linear, also quasi zickzack und Die Versorgungsspannung E-förmig in die Stripes eingespeist, so das die Stücke parallel geschaltet sind.
Ein 5V 30A Netzteil lief permanent an der "Kotzgrenze" :slight_smile:
Das Ganze hat er mit der Glediator-Software gefüttert. Sieht jedenfalls gigantisch aus. Am brilliantesten sehen Streifen mit Siliconbeschichtung aus. Das sieht wie eine Lackierung aus. Werde mir bei Gelegenheit auch mal welche bestellen :smiley:

Gruß Gerald

dischneider:
Aber manchmal hilft lesen, Eisebaer hat das schon im ersten Post dieses Threads geschrieben :slight_smile:
LG
Dirk

Ihr habt mich ertappt.
(hoffentlich war das ein Teil meiner 0,36733% Fehlerrate :wink: :wink: :wink: )
Grüße Uwe

hi,

kein problem, uwe, das war kein fehler, sondern eine unachtsamkeit. nachdem ich nicht Deine frau bin, wird das einfach übergangen...

gruß stefan

hi,

frage an uwe:
ich hab' eine bibliothek gefunden, die diese streifen mit 8MHz ansteuern kann, habe aber keine möglichkeit (chip), das hier auszuprobieren. hast Du sowas herumliegen?

ich baue gerade für einen freund so einen streifen mit atmega328P und quarz auf 16MHZ. wär praktisch, diesen quarz nicht verbauen zu müssen. muß mir gleich attiny85er bestellen, nur blöd, daß guloshop nicht nach ö liefert.

gruß stefan

noch eingefallen:

wenn ich diese biblothek richtig verstehe, kann man auch bis zu 8 streifen unabhängig ansteuern. ist zwar momentan nicht mehr interessant, die idee von oben hab' ich verworfen, aber prinzipiell natürlich paktisch.

noch ein gruß, noch ein stefan

Eisebaer:
hi,

frage an uwe:
ich hab' eine bibliothek gefunden, die diese streifen mit 8MHz ansteuern kann, habe aber keine möglichkeit (chip), das hier auszuprobieren. hast Du sowas herumliegen?

ich baue gerade für einen freund so einen streifen mit atmega328P und quarz auf 16MHZ. wär praktisch, diesen quarz nicht verbauen zu müssen. muß mir gleich attiny85er bestellen, nur blöd, daß guloshop nicht nach ö liefert.

gruß stefan

Hallo Stefan.
Soweit ich das Datenblatt studiert habe, gibt es 2 Betriebsmodi beim 2811 wobei beim 2812 nur der langsamere möglich ist da das Pin zur auswahl nicht herausgeführt ist und fix verschaltet ist.

  • When the refresh rate is 30fps, low speedmodelc
    ascade number are not less than 512 points, high
    speed mode not less than1024 points.
  • Send data at speeds of up to 400 Kbps and 800
    Kbps two patterns

Ein Bit ist immer 2,5µS bzw 1,25µS lang. Da Verhältnis im langsamen Modus von H zu L ist für ein 1-Bit 0,5 zu 2,0 und für ein 0-Bit 1,2 zu 1,3µS. Alle Zeiten auf eine Genauigkeit von 0,15µS.

Da kann ich mir nicht vorstellen wie den WS2811/12 schneller ansteuern zu können.

ich hab' eine bibliothek gefunden, die diese streifen mit 8MHz ansteuern kann,

Welche Bibiothek ist das?

Grüße Uwe

Ähm, wenn der PIN nicht herausgeführt ist und fix verschaltet, dann gehen nur die 800 kbaud, oder?
Und ob der uC mit 8 oder 16 MHz läuft dürfte doch nur für das Timing spannend werden, arbeiten die Bibliotheken mit Zeiten oder Taktzyklen?
Bei ersterem sollte der Takt doch egal sein?
Nur wie empfindlich gegen Taktschwankungen ist das Ganze, wenn man einen ATTiny mit internem Takt fährt?
Wollte auch testen, bin noch nicht zum bestellen gekommen ...

Liebe Grüße

Dirk

hi, uwe,

ich wußte nicht, ob's Dich interessiert, und ich muß da noch was dazu erklären.
erstmal:
http://rurandom.org/justintime/index.php?title=Controlling_WS2811_led_strings_at_800kbit/s_without_external_oscillator
hab die ws2811_8.h-datei in die libraries gelegt und in einem leeren sketch includiert.
fehlermeldung: no _delay_us declared in this scope oder so ähnlich. diese funktion hab ich in einer delay.h im arduino-verzeichnis gefunden (gibt 2). die delay.h ins sketch-verzeichnis gelegt und auch includiert (mit " -zeichen). jetzt läßt es sich kompilieren, aber wie gesagt, kein chip zur hand. außerdem muß ich mir noch ansehen, ob dieses struct CRGB dort genauso funkt wie in der fast_SPI.

gruß stefan

jetzt wo ich's nochmal lese, uwe. ich meinte einen 8MHz chip verwenden, die Ansteuerung muß natürlich gleich schnell bleiben.

gruß stefan

dischneider:
Ähm, wenn der PIN nicht herausgeführt ist und fix verschaltet, dann gehen nur die 800 kbaud, oder?
Und ob der uC mit 8 oder 16 MHz läuft dürfte doch nur für das Timing spannend werden, arbeiten die Bibliotheken mit Zeiten oder Taktzyklen?
Bei ersterem sollte der Takt doch egal sein?
Nur wie empfindlich gegen Taktschwankungen ist das Ganze, wenn man einen ATTiny mit internem Takt fährt?
Wollte auch testen, bin noch nicht zum bestellen gekommen ...

Liebe Grüße

Dirk

Ich glaube mich zu erinnern daß es 400kBaud sind.
Grüße Uwe

Eisebaer:
hi, uwe,

ich wußte nicht, ob's Dich interessiert, und ich muß da noch was dazu erklären.
erstmal:
Driving the WS2811 at 800 kHz with an 8 MHz AVR - Just in Time
hab die ws2811_8.h-datei in die libraries gelegt und in einem leeren sketch includiert.
fehlermeldung: no _delay_us declared in this scope oder so ähnlich. diese funktion hab ich in einer delay.h im arduino-verzeichnis gefunden (gibt 2). die delay.h ins sketch-verzeichnis gelegt und auch includiert (mit " -zeichen). jetzt läßt es sich kompilieren, aber wie gesagt, kein chip zur hand. außerdem muß ich mir noch ansehen, ob dieses struct CRGB dort genauso funkt wie in der fast_SPI.

gruß stefan

Heute (Nacht) interssiert es mich nicht mehr; nach dem Wochenende geren.
Grüße Uwe

Eisebaer:
jetzt wo ich's nochmal lese, uwe. ich meinte einen 8MHz chip verwenden, die ansteuerung muß natürlich gleich schnell bleiben.

gruß stefan

Da habe ich Dich wirklich falsch verstanden.

Ich weiß nicht wie kritisch der WS2811/12 auf Timingungenaugikeiten reagiert. Ein interner RC-Taktgenerator ist viel ungenauer als ein Resonator oder ein Quarz.

Grüße Uwe

uwe, Du treibst gerade Deine (natürlich immer noch lächerlich geringe) fehlerquote hoch. die 2812er laufen mit 800.

ich hab' mir jetzt 20 attiny85 bestellt, schlimmstenfalls nehm' ich sie als streusel für kekse.
bestenfalls verwende ich einen für meinen arbeitskollegen, dann bleiben mir immer noch 19 für die kekse. ich kann einfach nicht einen um 2€ kaufen, wenn ich 20 um 22€ krieg'. Ihr solltet mich mal im puff erleben...

gruß stefan

Eisebaer:
uwe, Du treibst gerade Deine (natürlich immer noch lächerlich geringe) fehlerquote hoch. die 2812er laufen mit 800.

auch wenn ichs so unbestimmt formuliere?

Ich glaube mich zu erinnern daß es 400kBaud sind.

Kann man den ATtiny85 wenns sein muß nicht auch mit externen 16 Mega Quarz betreiben?

Gute Nacht nach Wien.

Ist ganz klar mein Fehler, nicht Uwes!
Ich hätte ja dazuschreiben können, dass ich dein vage formulierten Einwand 800kbaud aus dem Datenblatt entnommen habe und mir daher eigentlich ziemlich sicher war ...

Liebe Grüße

Dirk

Hallo zusammen,

erstmal vorweg, vielen Dank für diesen hilfreichen Thread.
Habe mir ebenfalls 2m WS2812 Strips bestellt also 120 LEDs.

Will diese mit dem Arduino Due verbinden. Hab dazu schon extrem viele Seiten gelesen, Interesannt ist für mich das Thema ob ich nicht mehrere Pins für verschiedene Strips verwenden kann.
Für mein Projekt "Wohnzimmerbeleuchtung" brauch ich über 40m Strips. Was dann folglich über 2400 LEDs sind.
Diese an einem Pin zu betreiben erscheint mir ein Ding der Unmöglichkeit. Da ich mit dem Due eine höhere Taktrate habe, müsste ich die Strips doch bei 800kHz auf mehreren Pins parallel betreiben können, oder sehe ich das falsch?

Ich bin ein absoluter Anfänger in Sachen Mircocontroller. Und würde mich echt freuen, wenn Ihr mir bei dem Projekt unter die Arme greift.

Lieben Gruß

Til

hi,

kein problem, du mußt dann nur das:

         LD __tmp_reg__, %a[dataptr]+"	"\n" 
"            LSL __tmp_reg__"	"\n"
"            LDI %[bits], 4"    "\n"
"            BRCC L13"	"\n"
"            RJMP L5"	"\n"
"    H1:     NOP"	"\n"
"            NOP"	"\n"
"            OUT %[portout], %[downreg]"	"\n"
"            NOP"	"\n"
"            RJMP END"	"\n"
"    L1:     SUBI %[bits], 1"	"\n"
"            BREQ M2"	"\n"
"            NOP"	"\n"
"            NOP"	"\n"
"            OUT %[portout], %[downreg]"	"\n"
"            LSL __tmp_reg__"	"\n"
"            OUT %[portout], %[upreg]"	"\n"
"            BRCC L8"	"\n"
"            NOP"	"\n"
"    L15:    NOP"	"\n"
"            NOP"	"\n"
"            NOP"	"\n"
"            RJMP L9"	"\n"
"    M4:     LDI %[bits], 4"	"\n"
"            LD __tmp_reg__, %a[dataptr]+"	"\n"
"            OUT %[portout], %[upreg]"	"\n"
"            NOP"	"\n"
"            NOP"	"\n"
"            SUBI %[bytes], 1"	"\n"
"            BREQ H1"	"\n"
"            LSL __tmp_reg__"	"\n"
"            BRCS L9"	"\n"
"            NOP"	"\n"
"    L16:    OUT %[portout], %[downreg]"	"\n"
"            NOP"	"\n"
"    L13:    OUT %[portout], %[upreg]"	"\n"
"            LSL __tmp_reg__"	"\n"
"            OUT %[portout], %[downreg]"	"\n"
"            BRCC L10"	"\n"
"            SUBI %[bits], 1"	"\n"
"            BREQ M4"	"\n"
"            NOP"	"\n"
"            NOP"	"\n"
"            NOP"	"\n"
"            LSL __tmp_reg__"	"\n"
"            OUT %[portout], %[upreg]"	"\n"
"            BRCS L15"	"\n"
"            NOP"	"\n"
"    L8:     NOP"	"\n"
"            NOP"	"\n"
"            NOP"	"\n"
"            RJMP L16"	"\n"
"    M2:     LDI %[bits], 4"	"\n"
"            OUT %[portout], %[downreg]"	"\n"
"            NOP"	"\n"
"            OUT %[portout], %[upreg]"	"\n"
"            LD __tmp_reg__, %a[dataptr]+"	"\n"
"            SUBI %[bytes], 1"	"\n"
"            BREQ H1"	"\n"
"            LSL __tmp_reg__"	"\n"
"            BRCC L16"	"\n"
"            NOP"	"\n"
"    L9:     OUT %[portout], %[downreg]"	"\n"
"            NOP"	"\n"
"    L5:     OUT %[portout], %[upreg]"	"\n"
"            LSL __tmp_reg__"	"\n"
"            BRCS L1"	"\n"
"            SUBI %[bits], 1"	"\n"
"            BREQ M1"	"\n"
"            NOP"	"\n"
"            NOP"	"\n"
"            NOP"	"\n"
"            OUT %[portout], %[downreg]"	"\n"
"            LSL __tmp_reg__"	"\n"
"            OUT %[portout], %[upreg]"	"\n"
"            NOP"	"\n"
"            OUT %[portout], %[downreg]"	"\n"
"            BRCC L4"	"\n"
"            NOP"	"\n"
"    L12:    NOP"	"\n"
"            NOP"	"\n"
"            NOP"	"\n"
"            RJMP L5"	"\n"
"    M3:     LD __tmp_reg__, %a[dataptr]+"	"\n"
"            OUT %[portout], %[upreg]"	"\n"
"            LDI %[bits], 4"	"\n"
"            OUT %[portout], %[downreg]"	"\n"
"            SUBI %[bytes], 1"	"\n"
"            BREQ H2"	"\n"
"            LSL __tmp_reg__"	"\n"
"            BRCC L16"	"\n"
"            NOP"	"\n"
"            RJMP L5"	"\n"
"    L10:    SUBI %[bits], 1"	"\n"
"            BREQ M3"	"\n"
"            NOP"	"\n"
"            NOP"	"\n"
"            LSL __tmp_reg__"	"\n"
"            OUT %[portout], %[upreg]"	"\n"
"            NOP"	"\n"
"            OUT %[portout], %[downreg]"	"\n"
"            BRCS L12"	"\n"
"            NOP"	"\n"
"    L4:     NOP"	"\n"
"            NOP"	"\n"
"            NOP"	"\n"
"            RJMP L13"	"\n"
"    M1:     LD __tmp_reg__, %a[dataptr]+"	"\n"
"            OUT %[portout], %[downreg]"	"\n"
"            LDI %[bits], 4"	"\n"
"            OUT %[portout], %[upreg]"	"\n"
"            NOP"	"\n"
"            OUT %[portout], %[downreg]"	"\n"
"            SUBI %[bytes], 1"	"\n"
"            BREQ H2"	"\n"
"            LSL __tmp_reg__"	"\n"
"            BRCS L9"	"\n"
"            NOP"	"\n"
"            RJMP L13"	"\n"
"    H2:     NOP"	"\n"
"            NOP"	"\n"
"            NOP"	"\n"
"            NOP"	"\n"
"    END:    NOP"	"\n"

so umschreiben, daß es zur taktfrequenz des DUE paßt, und dann natürlich auch noch an die anzahl der verwendeten strips anpassen.
was ich damit sagen will:
das ist KEINE sache, die Du mit einem sketch lösen kannst, und Du wirst hier im (deutschsprachigen) forum niemanden finden, der das kann. nimm Dir zwei UNOs, lass die beiden miteinander reden und zwei streifen steuern. einer davon ist der "master". dann nimm den anderen, den "slave", aus dem UNO raus, steckst ihn auf ein breadboard, und einen neuen ATMega328 mit bootloader um 3€ in den sockel des uno. dann kannst Du drei miteinander reden lassen. wenn Du dann, sagen wir mal, fünf hast, bist Du fertig. fünf chips, die zusammen 2400 rgbLEDs steuern können. anders wirst Du das nicht lösen können.

gruß stefan