Go Down

Topic: testbericht zum WS2812 (Read 34308 times) previous topic - next topic

uwefed

#60
Feb 26, 2013, 09:51 pm Last Edit: Feb 26, 2013, 10:03 pm by uwefed Reason: 1

Ich hab noch immer keine WS bestellt :(

Aber: die Bibliothek kann doch Ports initialisieren, hat das jetzt schon mal jemand *getestet*?

Code: [Select]

  FastSPI_LED.setPin(PIN);
    FastSPI_LED.init();
  FastSPI_LED.start();


initialisiert das Ganze, also kann der PIN übergeben werden
Was passiert, wenn man im Sketch mit

Code: [Select]
FatsSPI_LED.stop();

das ganze beendet und auf einem anderen Port neu initialisiert??

Eventuell noch mit verschiedenen Längen diese anpassen (FastSPI_LED.setLeds).

Das einzige Problem könnte die Verzögerung sein, die dann zwischen den Strängen entsteht, aber ist das ein Problem?

Und @Til: Wenn du deine Beleuchtung zonenabhängig machst, willst du dann die LED einzeln ansprechen können? Ansonsten könnte man ja auch Stränge parallel betreiben?

Dirk


Es ist kein Unterschied ob 3x2400Byte an einen Ausgang verschickt oder diese nacheinander in Teilen an verschiedene Pins. Die Zeit um für 2400 LED die Daten zu senden bleibt fast gleich (die Stückweise Sendung ist etwas langsamer, da das Umschalten und Initialisieren auch Zeit braucht).
Wenn wir jetzt die 2400 LED so gruppieren, daß bei Farbwechseln nur eine Gruppe beteiligt ist, dann ist die Wiederholrate natürlich größer und der Übergang weicher. 

Die Ansteuerung der WS2811/12 ist sehr zeitkritisch. Da muß man schon gute Assembler / Maschienensprachekenntnisse haben und das Innenleben des Kontrollers kennen Um das Programm zu schreiben. Ich traue es mir das zB nicht zu.
Die Ansteuerung zB des WS2801 (in einem Anderen aktuellen Tread) ist weniger Zeitkritisch da die Daten mit eimen Takt übergeben werden und die max mögliche Frequenz größer ist.

Wie bereits Vorgeschlagen würde ich einen Teensy3.0 nehmen (da dort bereits Beispiele gibt) oder die LED in Gruppen aufteilen und jeweils von einen ATmega328 oder ATmega2560 ansteuern lassen. Das Programm wird von einem zentralen "Server" übergeben. Da könnte jeder ATmega 328 ca 150 LED ansprechen da so der Speicher für 2 bis 3 Datensätze ausreichend ist und die Wiederholrate bei Farbüberläufen genügend hoch ist. Man muß Zeit für die Datenübertragung und auch die Zeit für die Berechnung der neuen Werte berücksichtigen.

Grüße Uwe

uwefed


Nein, genau das eben nicht.
Das Timing muss passen, die Daten müssen an die Kette im 125us-pro-Bit-Rhytmus, ohne Pause bis zum Reset (anzeigen).
...
Dirk


Der WS 2811/12 hat eine Zykluszeit von 1,25µS pro Bit im Fast-Modus; der WS2811 auch eine Zykluszeit von 2,5µS im slow Modus.

Grüße Uwe

dischneider

Ups, da ist mir das Komma verloren gegangen, Uwe entgeht mal wieder nichts.
War ein Test :)


Es ist kein Unterschied ob 3x2400Byte an einen Ausgang verschickt oder diese nacheinander in Teilen an verschiedene Pins. Die Zeit um für 2400 LED die Daten zu senden bleibt fast gleich ( die stückweise sendung ist etwas langsamer da das umschalten und initialisieren auch Zeit braucht.
Wenn wir jetzt die 2400 LEd so gruppieren, daß bei Farbwechseln nur eine Gruppe beteiligt ist, dann ist die Wiederholrate natürlich größer und der Übergang weicher.


Das war mir klar, es ging eher um die Möglichkeit einzelne Stränge definiert anzusprechen, um ggf. statische Stränge gar nicht ansprechen zu müssen.

Danke für die Fehlerkorrektur.

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

Eisebaer

hi,

Quote
wieso 16MHz?
Der DUE rennt doch mit 84MHz?
genuegend Zeit die Pins zu wechseln, und wieder zurueckzuschalten, oder?


Du hast keine library für den DUE !!!

bei der library für den teensy gibt es kein umschalten.

außerdem war das nur ein beispiel, um Dir zu erklären, wie die WS2811 arbeiten und welche zeitprobleme es gibt. auf das umschalten bin ich nirgends eingegangen. was das umschalten bringen könnte, wäre, speicherplatz zu sparen. dafür hat man auch nirgends den istzustand gespeichert. muß aber auch nicht unbedingt sein.

ansonsten kommt es darauf an, was man mit den LEDs zeigen will.
langsame farbübergänge sind mit dem teensy möglich, aber um als beispiel ein knight-rider-licht einmal um den raum laufen zu lassen, geht eben nicht. bei diesem beispiel wird jede led innerhalb nicht mal einer sekunde von 0 auf 100% und wieder zurück gesetzt. das geht nicht in vertretbaren schritten mit 2400 LEDs, die von einer zentralen stelle gesteuert werden, egal ob das ein UNO, ein DUE oder ein cray-supercomputer ist.

ich sehe nicht viele möglichkeiten. mit einem UNO kannst Du, sagen wir mal, 500 LEDs steuern, dann geht Dir der speicher bald aus. also jeder raumteil mit zwei UNOs, aber dann wird die programmierung für ein solches knightrider-licht in einem solchen raumteil sehr unkomfortabel.

oder ein ATmega1284P für jeden raumteil, gesteuert von einem zentralen uno, am besten mit ethenet-shield, dann kannst Du alles vom handy/tablet/computer aus steuern

gruß stefan

Eisebaer

hi,

Quote
die LED in Gruppen aufteilen und jeweils von einen ATmega328 oder ATmega2560 ansteuern lassen. Das Programm wird von einem zentralen "Server" übergeben. Da könnte jeder ATmega 328 ca 150 LED ansprechen da so der Speicher für 2 bis 3 Datensätze ausreichend ist


vernünftige aussage.
nur die 150 seh' ich als zu niedrig an. jede rgbLED braucht 3 Byte, also sollten 400 doch leicht machbar sein. ein ATmega1284P mit 16k speicher für 800 LEDs geht sicher. und mit 800 LEDs hat man eine wiederholrate von sagen wir mal 30fpS, weil rechnen will der microconroller ja auch.

gruß stefan

uwefed

#65
Feb 26, 2013, 10:36 pm Last Edit: Feb 26, 2013, 10:53 pm by uwefed Reason: 1

War ein Test :)

Das zieht bei mir nicht.  ;) ;) ;) Ein italienische Politiker windet sich auch immer aus den Fettnäpfchen indem er sagt, man habe ihn falsch verstanden oder falsch zitiert oder es war gar nicht so gemeint.  ]:D ]:D ]:D  Wenn ich mich so recht erinnere hat er nie gesagt, daß er eigentlich gar nicht da war.

Grüße Uwe

uwefed

#66
Feb 26, 2013, 10:53 pm Last Edit: Feb 26, 2013, 11:28 pm by uwefed Reason: 1

...
ich sehe nicht viele möglichkeiten. mit einem UNO kannst Du, sagen wir mal, 500 LEDs steuern, dann geht Dir der speicher bald aus. also jeder raumteil mit zwei UNOs, aber dann wird die programmierung für ein solches knightrider-licht in einem solchen raumteil sehr unkomfortabel.

oder ein ATmega1284P für jeden raumteil, gesteuert von einem zentralen uno, am besten mit ethenet-shield, dann kannst Du alles vom handy/tablet/computer aus steuern

gruß stefan


500 LED sehe ich für den Arduino UNO schon zuviel, da die Daten dafür satte 1500Byte sind. Bei 2048 Byte RAM des UNO ist da nicht mehr viel Platz für anderes. Da muß mann schon mit allen kniffen Programmieren und RAMverwendung extrem sparen.

Meine Wahl der max LED basiert auf folgender Überlegung:
*Bildwiederholrate über 25-30 /sec.
*Berechnung der Werte zB dimmen von 1 Farbe von 0 auf 255 oder Farbüberläufe mit neuen Werten aller 3 Farben zwischen 2 Datenübertragungen.(150 bis 450 Berechnungen)
*Übertragung der Daten von SD-Karte oder von Master zwischen 2 "Bildern"
*Speicherplatz für 2 Abbilder.
*Speicherverbrauch unter 1kByte RAM. 2x 3x150Byte = 900 Byte RAM
Ok, es könnten auch 200 LED sein. (600 Byte pro Satz) aber da wirds mit dem RAM in Arduino UNO knapp.

Grüße Uwe

Eisebaer

hi,

uwe, ich hab' noch nie mit "abbildern" gearbeitet, deswegen rechne ich nur einen satz von 3 byte pro rgbLED, eben das struct CRBG. "bilder" braucht man meiner meinung nach nicht bei streifen rund ums zimmer, normales licht in jeder farbe und helligkeit geht ohne, effekte werden auch erst zur laufzeit berechnet. auch eine SD-karte ist dann nicht nötig.

der uno "in der mitte" soll ja auch nichts für die satelliten berechnen, sondern nur sagen,welches ihrer "programme" sie ausführen sollen und in welchen farben. berechnen müssen sie dann selber.

aber egal wie, ein ATmega1284P mit 16k ist auf jeden fall besser, doppelt soviel RAM wie ein mega2560. damit reicht einer für jeden raumteil.

gruß stefan


uwefed

Hallo Stefan
Als Bild oder Abbild meinte ich die vorberechneten oder vom Server übertragenen Daten die vom Arduino oder ATmega in einem Rutsch an die LED-Strippe übertragen werden. Die einzige Möglichkeit um keine vorberechneten Daten zu brauchen ist alle LED einer Strippe mit dem gleichen Wert anzusteuern.Für eine Bedingung das x-te LED

Speicherkarten haben den Vorteil, daß die Daten nicht berechnet werden müssen und auch komplizierte Muster, die zu aufwändig zum Berechnen sind, dargesellt werden können. Ist ja nur eine der möglichen Optionen.

Grüße Uwe

AgentTil

Hey,

vielen vielen Dank für die ganzen Infos. Ich wollte euch damit echt nicht nerven.
Ich bin Informatiker und kein Nachrichtentechniker.
Habe bis jetzt auf jeden Fall schon viel gelernt. *thx a lot*

Wenn ich das Ganze mal zusammenfasse - so wie ich es verstanden habe - ist folgendes die beste Möglichkeit:

- Ein zentraller "Server" (am liebsten den Due, denn den hab ich schon bestellt)
* der berechnet das gesamte "Bild"
* teilt das "Bild" in die Abschnitte und schickt es an die "Slaves"

- Drei Slaves Typ "ATmega1284P" für jeden Abschnitt
* jeder Slave bekommt sein Bild und "pushed" es bei einem gemeinsamen Signal an die Strips

- Die Übertragung des Teilbildes an den Strip muss fix mit 800kHz erfolgen
- Die Übertragung des Teilbildes an die Slaves muss mit mindestes 2.4MHz erfolgen, da ja 3 Teilbilder verschickt werden
- Das Sync Signal muss vom "Server" kommen und 30 Hz betragen.
- das gemeinsame Sync-Signal darf nur die "Slaves" erreichen, die eine Änderung des Teilbildes haben, Strips die nicht verändert werden behalten so die vorherige Einstellung bei.

Ist das so richtig?

Til
There are only 10 types of people in the world: Those who understand binary, and those who don't.

AgentTil

Nachtrag:
Habe gerade mal den größten Abschnitt berechnet.
Dieser ist 12.4m lang, also runt 740 LEDs.
Das liegt ja dann unter den 1000 LEDs und müsste mit 30fps zu machen sein.
Oder?
There are only 10 types of people in the world: Those who understand binary, and those who don't.

Paul Stoffregen

Hi.  I found this thread looking for people using OctoWS2811 (the library I released a few days ago).  Sorry about the English reply... I don't speak German.  :-(

One difficulty with using an ATMEGA1284P is the interrupts must be disabled while the WS2811 output is generated.  Each WS2811 LED requires 30 microseconds.  If you update 240 LEDs, the interrupts must be disabled 7.2 milliseconds.

During those 7.2 millseconds, the ATMEGA1284P can not reliably receive more than 2 bytes of serial data, because the AVR USART has only a two byte buffer.  If your Due transmits with a baud rate faster than 2777 bits/sec, it must not send during those 7.2 milliseconds.  You will need to connect another signal from each ATMEGA1284P to the Due, so it can know when the ATMEGA1284P is "blind".  If the Due waits until after the 7.2 millisecond blind time, then this system should be able to work.

I designed OctoWS2811 to solve these types of problems.  The CPU remains free for your use, and interrupts are enabled while the WS2811 LEDs update, so you can receive serial communication or use other libraries which require interrupts.

Of course I hope you'll consider Teensy 3.0 for a future project.  If you already have the Due and ATMEGA1284P chips, hopefully this message will at least help design your program to avoid frustrating data loss during those blind times while interrupts must be disabled.

mkl0815

Nochmal die Frage ... Brauchst Du wirklich 740 LEDs an einem Strang? Ich habe gerade den ersten Testlauf für meine Lavalampe 2.0 (altes Modell ist 20 Jahre alt, hat eine 60W Glühlampe und braucht 1h um warm zu werden) gemacht. In der neuen Lampe sind 20 von den WS2811 LEDs verbaut und ich kann damit schon einen kleinen Raum ausleuchten. Selbst bei indirekter Beleuchtung dürften Deine LEDs eher in Richtung Flutlichtanlage tendieren. Abgesehen von Stromverbrauch. Angegeben sind die Strips mit max. 3,6A pro Meter. Gemessen habe ich bei 20 LEDs max weiss gerade mal 750mA, komme also pro Meter eher auf weniger als 2,5A. Trotzdem würdest Du bei 12,4m da schon über 30 A benötigen, das sind 150 Watt was die LEDs ziehen, dazu kommt ja noch der "Verschnitt" vom Netzteil. Und das nur bei einem Strang. Entweder läufst Du immer nur auf 10% Helligkeit, kannst dann aber kaum sinvolle Farbverläufe bauen, da Du zu wenig Steps hast (0-25  bei 10% statt 0-256 bei 100%) oder Du erblindest langsam und verarmst an Deiner Stromrechnung. Da man die Strips an jeder einzelnen LED teilen kann, wäre es auch möglich (wenn auch eine schweine Arbeit) die Strips auseinander zu ziehen und z.B nur 10 LEDs pro Meter zu verwenden, das würde sämtliche Kosten drücken.
1) Anschaffung der LED Strips
2) Anschaffung Netzteil
3) Laufende Stromkosten

Btw, Danke für die Tips zu den LEDs und der Software in diesem Thread, damit war dann der mechanische Teil plus das Löten der 20 x 6 Lötaugen und der 48 Drähte (Abmessen, Zuschneiden, Abisolieren und 92 Mal anlöten) der langwierigste Teil der Lampe.
Hier ein Video vom ersten Testlauf / Funktionstest, zur Zeit noch mit einem nicht ganz passenden Demo-Sketch.
http://www.youtube.com/watch?v=k2k_QGbkKJI [/img]

MaFu

Ich bekommen nur die Meldung: "Dieses Video ist privat"
_______
Manfred

Go Up