Forum: Analoge Elektronik und Schaltungstechnik LED - Strips hintereinander?


von Hannes H. (hannesf)


Lesenswert?

Hallo,

ich habe eine Frage zu adressable LED stripes - soetwas wie diesem hier:
https://www.pololu.com/product/2548

wieviele davon kann man hintereinander betreiben, wenn jede einzelne mit 
Strom versorgt wird.

Also ist es möglich sagen wir 120m Led streifen aneinander zu hängen und 
immernoch jede einzelne LED zu steuern?

Gruß

: Verschoben durch Admin
von Pink S. (pinkshell)


Lesenswert?

Ja.

Von den LEDs her kein Problem. Die Update-Rate sinkt natürlich 
entsprechend.

Wenn Du eine Library nimmst, müsste man abklären, ob und wo es da eine 
Grenze gibt (abklären = ausprobieren). Die Libraries, die ich kenne 
(FastLED, Adafruit) können auch an mehreren Ports LED-Streifen 
ansteuern.

von Torsten_C (Gast)


Lesenswert?

Die Update-Rate wurde ja schon genannt, weitere Grenze:

Bei WS2812 müssen die kompletten Daten im RAM sein, damit sie an einem
Stück gesendet werden können. Die RAM-Speicher-Größe der MCU begrenzt 
also die Länge.

Die Streifen mit APA102 sind hier flexibler. Bei denen kann die Daten 
z.B. so langsam raus geben, wie man die Muster gerade berechnet oder 
auch mal eine ISR zwischendrin bearbeiten:

https://cpldcpu.wordpress.com/2014/11/30/understanding-the-apa102-superled/

von Oliver R. (orb)


Lesenswert?

Vergiss nur den Strom nicht.
Bei 60LEDs/m und 50mA pro LED bei Weiss und voller Helligkeit hast Du 3A 
pro Meter oder 360A für Deine 120 Meter.
Da sollstest Du mindestens alle 10 Meter ein Netzteil setzen.

von Bernd K. (prof7bit)


Lesenswert?

Torsten_C schrieb:
> Bei WS2812 müssen die kompletten Daten im RAM sein

...oder schnell bei Bedarf errechnet werden können.

von c-hater (Gast)


Lesenswert?

Torsten_C schrieb:

> Bei WS2812 müssen die kompletten Daten im RAM sein, damit sie _an einem_
> Stück gesendet werden können. Die RAM-Speicher-Größe der MCU begrenzt
> also die Länge.

Man könnte natürlich einfach auch so programmieren, dass die Berechnung 
in Echtzeit erfolgt. Bei maximal 800kBit/s Richtung LEDs muss man nur 
eine Datenrate von 100kByte/s schaffen. Bei 20MHz stehen also für die 
Berechnung und den Versand jedes verschissenen Bytes 200 Takte zur 
Verfügung. Darin kann man wohl locker alles berechnen, was für eine 
solche Anwendung üblicherweise nötig ist.

Oder was für ein ausgefallenes Muster schwebt dir vor, welches man nicht 
in dieser Zeit berechnen könnte?

von Pink S. (pinkshell)


Lesenswert?

c-hater schrieb:
> was für ein ausgefallenes Muster schwebt dir vor

Fraktale :-) :-)

200 Takte pro Byte heisst aber, dass die Bits per Hardware geschoben 
werden müssen. Bei dem etwas proprietären Timing der WS2812 wird das mit 
einem einfachen Controller kaum funktionieren. Das heisst man braucht 
externe Hardware, und zwar nicht nur ein einfaches Shift-Register.

Aus diesem Grunde haben wir einen Arduino Due dafür genommen, mit 
reichlich RAM. Manche haben es auch schon mit dem Raspberry geschafft, 
die Bits im DMA-Mode rauszuschieben.

von MCP (Gast)


Lesenswert?

Pink Shell schrieb:
> Das heisst man braucht
> externe Hardware, und zwar nicht nur ein einfaches Shift-Register.
Oder so etwas:
http://ww1.microchip.com/downloads/en/AppNotes/00001606A.pdf

von c-hater (Gast)


Lesenswert?

Pink Shell schrieb:

> 200 Takte pro Byte heisst aber, dass die Bits per Hardware geschoben
> werden müssen.

Richtig.

> Bei dem etwas proprietären Timing der WS2812 wird das mit
> einem einfachen Controller kaum funktionieren.

Natürlich geht das problemlos. Bei AVR8 z.B. hat man die Wahl zwischen 
SPI, USART oder USI, um das zu realisieren. Je nachdem, was im 
verwendeten AVR drinsteckt. Irgendetwas davon hat wohl wirklich absolut 
jeder. Man muß die gebotene Hardware einfach nur sinnvoll nutzen.

Ja, es ist nicht ganz so einfach wie "out UDR,NextDataByte", aber auch 
nicht wesentlich komplizierter. Man muß einfach nur mal ernsthaft 
darüber nachdenken...

von Thomas E. (picalic)


Lesenswert?

MCP schrieb:
> Oder so etwas:
> http://ww1.microchip.com/downloads/en/AppNotes/00001606A.pdf

Oder sowas:
http://www.picalic.de/PIC2WS2812

(ich wollte es halt mit einem einen µC mit nur 8 Pins erledigen ;) )

von Pink S. (pinkshell)


Lesenswert?

Thomas Elger schrieb:
> Oder sowas:
> http://www.picalic.de/PIC2WS2812

"Die kurzen Impulse (250ns) für die "0"-Bits werden als PWM-Signal durch 
TMR2 in Verbindung mit dem CCP1-Modul erzeugt. Für die längeren "1"-Bit 
Impulse (625ns) wird das SPI Clock-Signal (SCL) benutzt."

Ein bisschen ein Gebastel ist das aber schon. Aber durchaus interessant. 
Gibt es sowas auch auf AVR-Basis?

Der andere Link ist ja für WS2811, die mit der extra Clock-Leitung.

von MCP (Gast)


Lesenswert?

Pink Shell schrieb:
> Der andere Link ist ja für WS2811, die mit der extra Clock-Leitung.
WS2811 ist der Chip in den WS2812 LEDs...

von Pink S. (pinkshell)


Lesenswert?

MCP schrieb:
> WS2811 ist der Chip in den WS2812 LEDs...

Ja, richtig. Aber gab es da nicht einen Chip mit Clk und Daten getrennt?

von c-hater (Gast)


Lesenswert?

Pink Shell schrieb:

> Ein bisschen ein Gebastel ist das aber schon. Aber durchaus interessant.
> Gibt es sowas auch auf AVR-Basis?

Ja, viel besser, und mit wesentlich weniger "Gebastel"...

Allerdings: das Prinzip (Zuhilfenahme der UART o.ä. Hardware, 
Hauptsache, dass sie ein Schieberegister beinhaltet) wäre natürlich mit 
den PICs ganz genauso realisierbar. Und ich bin mir ziemlich sicher, daß 
es irgendwo auch einen fähigen PIC-Programmierer geben wird, der es 
bereits umgesetzt hat.

von MCP (Gast)


Lesenswert?

Pink Shell schrieb:
> MCP schrieb:
>> WS2811 ist der Chip in den WS2812 LEDs...
> Ja, richtig. Aber gab es da nicht einen Chip mit Clk und Daten getrennt?
Meinst du vielleicht den WS2801?

c-hater schrieb:
> Ja, viel besser, und mit wesentlich weniger "Gebastel"...
Geht das auch ein bisschen genauer?

von Thomas E. (picalic)


Lesenswert?

Pink Shell schrieb:
> Ja, richtig. Aber gab es da nicht einen Chip mit Clk und Daten getrennt?

Ja, es gibt diverse Chips mit CLK und Daten, die sich per SPI-Interface 
ansprechen lassen. In LEDs integriert heißen die dann z.B. APA102
(siehe auch: https://cpldcpu.wordpress.com/2014/08/27/apa102/)
Habe schon seit einiger Zeit einen LED-Streifen von denen hier liegen, 
aber bislang noch nix damit gemacht. Interessant gegenüber den WS281x 
ist u.a. auch die sehr hohe (interne) PWM-Frequenz von den Chips, womit 
sie auch für POV-Anwendungen geeignet wären. Bei den WS281x geht das 
nicht.

@c-hater: klar könnte ich auch ohne "Gebastel" irgendwelche Bitmuster 
auf der SPI-Datenleitung ausgeben, um die HIGHs und LOWs für die LEDs zu 
erzeugen - so krass ist meine Unfähigkeit dann doch noch nicht!
Aber damit schafft man pro SPI-Datenbyte mal gerade so zwei Nutz-Bits zu 
erzeugen, ob das besser ist, als mein "Gebastel", wo ich tatsächlich mit 
jedem SPI-Byte auch ein komplettes Datenbyte ausgebe?
Am Ende soll ja schließlich möglichst viel Rechenzeit zum Berechnen der 
Daten parallel zur Ausgabe übrig bleiben...

: Bearbeitet durch User
von c-hater (Gast)


Lesenswert?

Thomas Elger schrieb:

> Aber damit schafft man pro SPI-Datenbyte mal gerade so zwei Nutz-Bits zu
> erzeugen

Richtig. Deswegen nehme ich auch die UART, damit gehen drei. Außerdem 
ist die beim AVR im Gegensatz zum SPI double buffered, was die 
Freiheiten bei der Benutzung der verbleibenden Takte massiv erhöht.

von Thomas E. (picalic)


Lesenswert?

Hmmm - also, ich versuche es mal zu übersetzen:

Ohne "Gebastel", dafür mit UART:
- UART ist belegt, steht also nicht mehr für Übertragung von Daten von 
außen an den Controller zur Verfügung,
- pro LED (3 "Nutzbyte") = 8 Sende-Interrupts für 24 bits,
- Umsetzung der RGB-Nutzdaten in 8 Bytes Sendedaten notwendig (in der 
ISR: verlängert die ISR-Laufzeit, oder vorher: mehr Auslastung des 
Sendepuffers). In jedem Fall sind es wohl auch ein paar Takte, die für 
die Transformation der Daten notwendig sind.

Mit "Gebastel":
- ich kann meinem Controller noch Daten und Befehle über UART schicken,
- nur 3 Sende-Interrupts pro LED,
- RGB-Werte müssen nicht übersetzt werden.

Nein Danke, ich bleibe erstmal bei meinem Gebastel (und: Basteln macht 
Spass!)

von Torsten_C (Gast)


Lesenswert?

c-hater schrieb:
> Man könnte natürlich einfach auch so programmieren, dass die Berechnung
> in Echtzeit erfolgt.

Das geht nicht, wenn der µC mit dem Bit-Timing beschäftigt ist.

Um das zu vermeiden gibt es - wie gesagt - viele Ansätze:

UART, Timer+DMA, bitbang-DMA, ...

UART ist am effizientesten: Drei Bit bekommt man in einem Byte mit 
"n,8,1" unter. Also 8 Bytes DMA-Puffer pro RGB-Wert. Allerdings muss TXD 
dabei invertiert werden.

Mit UART + DMA gehen vielleicht auch Fraktale ;-) im Hintergrund.

von Mitleser (Gast)


Lesenswert?

Oliver R. schrieb:
> Da sollstest Du mindestens alle 10 Meter ein Netzteil setzen.

Ach nee :-(

Hannes Häppi schrieb:
> wieviele davon kann man hintereinander betreiben, wenn jede einzelne mit
> Strom versorgt wird.

von c-hater (Gast)


Lesenswert?

Thomas Elger schrieb:

> Ohne "Gebastel", dafür mit UART:
> - UART ist belegt, steht also nicht mehr für Übertragung von Daten von
> außen an den Controller zur Verfügung,

Zum einen gibt es durchaus nicht wenige AVRs, die über mehr als nur eine 
USART verfügen, zum anderen ist die USART zur Übertragung von 
Steuerinformationen heutzutage nicht mehr ganz so wichtig wie 
früher(tm).

> - pro LED (3 "Nutzbyte") = 8 Sende-Interrupts für 24 bits,

Wer sagt, daß man die regelmäßige, taktgenau vorhersehbare Hauptarbeit 
eines µC in Interrupts abhandeln muß? Nur Idioten sagen sowas. Nein, 
natürlich wird man einem µC, dessen Hauptaufgabe es ist, unendlich lange 
WS2811-Ketten anzusteuern, erlauben, das in "main()" zu tun. Gerade 
dann, wenn man einen Hardware-DoubleBuffer zur Verfügung hat, um das 
Timing auch dann nicht abreißen zu lassen, wenn zwischendurch Interrupts 
abzuarbeiten sind.

In diesen Interupts wird nämlich das restliche Zeug abgehandelt, z.B. 
die Hostkommunikation (viel mehr wird es ja sowieso nicht sein als das).

> - Umsetzung der RGB-Nutzdaten in 8 Bytes Sendedaten notwendig

Das stimmt natürlich. Der Aufwand dafür ist aber bei auch nur halbwegs 
cleverer Programierung durchaus erträglich.

> Mit "Gebastel":
> - ich kann meinem Controller noch Daten und Befehle über UART schicken,

Könnte ich auch. Mein AVR hat nämlich zwei davon. Tatsächlich speise ich 
die Steuerungskommandos allerdings per IR-Fernbedienung ein und 
verarbeite sie in einem Timer-Interrupt.

> - nur 3 Sende-Interrupts pro LED,

Ich brauch für die LEDs überhaupt keinen Interrupt-Overhead, weil der 
ganze WS2812-Quatsch als Hauptaufgabe des µC natürlich in "main()" 
läuft.

> - RGB-Werte müssen nicht übersetzt werden.

Bei den fest enthaltenen Programmen müssen sie bei mir nichtmal 
übersetzt werden, da kommen sie nämlich aus Tabellen im Flash. Aber es 
gibt auch einen "free mode", bei dem tatsächlich die Konvertierung 
erfolgen muß. Kostet exakt teure 17 Takte pro LED und Farbkomponente 
(und wäre ziemlich wahrscheinlich noch etwas optimierbar). Warum habe 
ich an dieser Stelle nicht optimiert? Ganz einfach:

Kein Schwein ist in der Lage, die FB schnell genug zu betätigen, daß 
diese Konvertierungsroutine jemals zeitkritisch werden könnte...

Du hast noch viel zu lernen. Insbesondere, zu erkennen, worauf es 
wirklich ankommt...

von Thomas E. (picalic)


Lesenswert?

c-hater schrieb:
> Thomas Elger schrieb:
>
>> Ohne "Gebastel", dafür mit UART:
>> - UART ist belegt, steht also nicht mehr für Übertragung von Daten von
>> außen an den Controller zur Verfügung,
>
> Zum einen gibt es durchaus nicht wenige AVRs, die über mehr als nur eine
> USART verfügen, zum anderen ist die USART zur Übertragung von
> Steuerinformationen heutzutage nicht mehr ganz so wichtig wie
> früher(tm).

Ja, ich bin dann wohl ein ziemlicher Hinterwäldler, weil ich immer noch 
diese antiquarische Schnittstelle zum Senden von Daten vom PC an den µC 
bevorzuge...
Ich kenne auch µCs mit noch mehr UARTs, trotzdem will ich das nicht so 
machen, weil es einfach mehr CPU-Zeit erfordert, und außerdem offenbar 
auch noch einen Inverter! Ich frage mich gerade, was mehr "Gebastel" 
ist: der zusätzliche Inverter-Chip oder die bei mir notwendige simple 
Verbindung zwischen zwei benachbarten Pins am µC?

>
>> - pro LED (3 "Nutzbyte") = 8 Sende-Interrupts für 24 bits,
>
> Wer sagt, daß man die regelmäßige, taktgenau vorhersehbare Hauptarbeit
> eines µC in Interrupts abhandeln muß? Nur Idioten sagen sowas. Nein,
> natürlich wird man einem µC, dessen Hauptaufgabe es ist, unendlich lange
> WS2811-Ketten anzusteuern, erlauben, das in "main()" zu tun. Gerade
> dann, wenn man einen Hardware-DoubleBuffer zur Verfügung hat, um das
> Timing auch dann nicht abreißen zu lassen, wenn zwischendurch Interrupts
> abzuarbeiten sind.

Du willst also behaupten, es sei besonders schlau, der main() 
aufzuzwingen, regelmäßg alle 3,75 Mikrosekunden ein Datenbyte 
auszugeben? Gut, durch Dein "Double-Buffering" dürfen es dann vielleicht 
auch mal 7 Mikrosekunden sein, wenn es dafür im nächsten Schritt wieder 
entsprechend schneller geht.
Was ist, wenn die Berechnung eines RGB-Pixels z.B. mal 20µs dauert?
Ich sehe das so: die main() soll rechnen und sich nicht mit stupiden 
Ausgabe-Timing-Vorgaben herumschlagen. Letzteres sollte am Besten eine 
DMA-Ausgabe erledigen, ohne DMA dann ersatzweise eben ein 
Interrupt-getriebener Software-FIFO.


> Ich brauch für die LEDs überhaupt keinen Interrupt-Overhead, weil der
> ganze WS2812-Quatsch als Hauptaufgabe des µC natürlich in "main()"
> läuft.

s.o.
Wenn Deine LED-Applikation primitiv genug ist, daß Deine main alles 
Timing-korrekt ausführen kann: schön für Dich!


> Warum habe
> ich an dieser Stelle nicht optimiert? Ganz einfach:
>
> Kein Schwein ist in der Lage, die FB schnell genug zu betätigen, daß
> diese Konvertierungsroutine jemals zeitkritisch werden könnte...

Was hat jetzt die Eingabe per FB-Tasten mit der Berechnung und Ausgabe 
von LED-Daten zu tun?

>
> Du hast noch viel zu lernen. Insbesondere, zu erkennen, worauf es
> wirklich ankommt...

Oh, danke, großer Meister, daß Du mich auf meine grenzenlose 
Unwissenheit aufmerksam machst und mich endlich die echte Wahrheit 
lehrst!

: Bearbeitet durch User
von Axel L. (axel_5)


Lesenswert?

Es ist ja ziemlich egal, ob man das mit UART, SPI oder Bitbanging macht, 
bei dem engen Timing ist so ein 8-Bitter damit dicht. Da frage ich mich 
schon, ob es durch die ewigen Sprünge in die Interruptroutinen mit den 
damit verbundenen PUSH/POP Routinen nicht sogar deutlich länger zum 
Rausschieben der Daten braucht als beim Bit-Banging.

Ich habe es auch mit Bit-Banging realisiert, selbst für 100 oder 200 LED 
ist der Datenstrom so schnell rausgeschoben, dass der danach alles 
mögliche andere machen kann. Im Prinzip ist das nur eine Routine zum 
Rauschieben der LED Daten.

Und 120m LED Streifen wären 1800 LED bzw. 10800 Bytes. Könnte man im RAM 
ablegen, wenn man nicht gerade einen Tiny nimmt.

Gruss
Axel

von Martin L. (martin_l795)


Lesenswert?

Nur so Interessehalber - die Stromversorgung ist ja eine Sache, aber 
machen nicht bei 120m Datenleitung auch die Ausgangstreiber des 
PIC/AVR/whatever mal die Grätsche?

von Joachim B. (jar)


Lesenswert?

Martin Luerssen schrieb:
> aber
> machen nicht bei 120m Datenleitung auch die Ausgangstreiber des
> PIC/AVR/whatever mal die Grätsche?

die 120m werden ja nicht getrieben, es wird bei LED Stripes nur die 
Leitung zur ersten LED getrieben, danach verstärkt jede LED für die 
weiteren.

Ist die erste LED etwa 120m weit entfernt? sieht man an der 
Ausgangsfrage nicht.

von Martin L. (martin_l795)


Lesenswert?

Danke,klar. Hatte erst nen Denkfehler.

von Thomas E. (picalic)


Lesenswert?

Axel Laufenberg schrieb:
> Es ist ja ziemlich egal, ob man das mit UART, SPI oder Bitbanging macht,
> bei dem engen Timing ist so ein 8-Bitter damit dicht.

Nicht unbedingt! Bei meiner Lösung wird der Controller (PIC12F1840) 
durch die LED-Datenausgabe zu etwa 1/3 ausgelastet, d.h. bei 32MHz Takt 
bleibt quasi ein 20MHz getakteter PIC übrig, der Daten "on the fly" 
berechnen kann.
Damit kann ich mehrere "Objekte" unabhängig voneinander über einen 
praktisch beliebig langen LED-Streifen laufen lassen, obwohl der 
Controller nur läppische 256 Bytes RAM hat. Mir ging es dabei aber auch 
eher um die Knobelei, sowas mit geringsten Mitteln hinzubekommen, als um 
eine simple Lösung mit "overkill-Hardware".

> Da frage ich mich
> schon, ob es durch die ewigen Sprünge in die Interruptroutinen mit den
> damit verbundenen PUSH/POP Routinen nicht sogar deutlich länger zum
> Rausschieben der Daten braucht als beim Bit-Banging.

Wie vorher geschrieben, wird da nix langsamer. Die 
Ausgabegeschwindigkeit ist auf 800kbit/s nach Datenblatt eingestellt. 
PUSH und POP gibt's bei meinem PIC nicht.

Grüße,

Thomas

von MCP (Gast)


Lesenswert?

Thomas Elger schrieb:
>> Da frage ich mich
>> schon, ob es durch die ewigen Sprünge in die Interruptroutinen mit den
>> damit verbundenen PUSH/POP Routinen nicht sogar deutlich länger zum
>> Rausschieben der Daten braucht als beim Bit-Banging.
>
> Wie vorher geschrieben, wird da nix langsamer. Die
> Ausgabegeschwindigkeit ist auf 800kbit/s nach Datenblatt eingestellt.
> PUSH und POP gibt's bei meinem PIC nicht.

Der macht das Context Saving sogar automatisch während er ins Interrupt 
spring.

von Axel L. (axel_5)


Lesenswert?

Thomas Elger schrieb:
> Axel Laufenberg schrieb:
>> Es ist ja ziemlich egal, ob man das mit UART, SPI oder Bitbanging macht,
>> bei dem engen Timing ist so ein 8-Bitter damit dicht.
>
> Nicht unbedingt! Bei meiner Lösung wird der Controller (PIC12F1840)
> durch die LED-Datenausgabe zu etwa 1/3 ausgelastet, d.h. bei 32MHz Takt
> bleibt quasi ein 20MHz getakteter PIC übrig, der Daten "on the fly"
> berechnen kann.

Ok, bei 32 MHz stimmt das. Ich hatte das mal auf einem 8 MHz AVR 
implementiert, da ist der Gewinn längst nicht so gross. Der hatte aber 
widerum genug Speicher.

Aktuell habe ich das auf einem ESP8266 am laufen, da hat man die Option 
sowieso nicht.

Gruss
Axel

von Pink S. (pinkshell)


Lesenswert?

Ein 8 MHz AVR und ein 32 MHz PIC sind ungefähr gleich in der 
Rechenleistung.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.