WS2801 auf WS2811 "übersetzen"

Hallo,

ich habe gerade zwei pojekte am laufen.
Bei dem einen Projekt möchte ich LEDs mittels Handy-App über ein Arduino UNO steuern (über Bluetooth) und bei dem anderen möchte ich eine Hintergrundbeleuchtung des Fernsehers machen.
Gerade kam mir die Idee die beiden Projekte zu kombinieren.

Das Problem: Die Hintergrundbeleuchtung des Fernsehers wird über ein Raspberry PI bewerkstelligt.
Dieses hat zwar eigentlich eine potentere Hardware, ist aber aufgrund des Betriebssystems und der Umrechnung des Bildsignals leider schon sehr arg beschäftigt.
Zudem gibt es ein riesen Problem: Das PI gibt das Steuersignal (CLK und DATA) für WS2801 aus.
Ich habe hier WS2811 (eigentlich WS2812B die aber den gleichen Chip integriert haben) und will nun das Arduino als "Übersetzer" nehmen.
Schöner wäre es zwar eigentlich das PI direkt mit den WS2811er LEDs zu betreiben und mein anderes Projekt so weiter zu machen, aber das geht wohl nicht. (Falls jemand eine Idee dazu hat, dann her damit :smiley: )

Funktioniert es denn mit einem UNO die Steuerdaten für WS2801 abzugreifen und als ein WS2811 Signal auszugeben oder hat das vielleicht jemand sogar schonmal gemacht?
Würde mich über Ideen dazu freuen.

Vielen Dank!

Mit welcher Geschwindigkeit werden die Daten des WS2801 ausgegeben?
Grüße Uwe

hi,

wird das so ein atmolight-ähnliches projekt? und kannst Du dann nur sendungen, die auf dem computer laufen, nehmen?
ich hab’ einen sat-receiver, mit dem das geht, also ohne pc, warte aber noch auf eine sendung aus chinaland.

falls ich das signal des receiver-plugins entschlüsseln kann, mach ich’s auch mit WS2812ern.

gruß stefan

Ich hab leider kein Oszilloskop hier und kann daher auch keine Messungen machen, wie es real aussieht.
Generell kann man aber in dem Datenblatt eine grobe Richtung sehen.
Wenn ich nicht falsch geschaut habe, dann sollte das WS2801 mit 200kHz befeuert werden.
Die WS2811 brauchen ja entweder 400kHz oder 800kHz.
Ich weiß allerdings nicht 100%ig ob das so stimmt.

@eisbear:
Ich hab mir diese Atmo/Sudo ... was auch immer -Light Projekte nicht genau angeschaut, weil sie sehr begrenzt verwendbar sind.
Das was ich nachbaue ist unahängig von irgendwelchen Dreamboxen oder HTPCs.
Es wird lediglich ein HDMI-Ausgang gesplittet bevor er an den TV kommt und dann das Signal abgegriffen.

Hoffe die Angaben reichen euch um mir zu sagen wie und ob es geht :smiley:

hi,

nein, der 2801 wird komplett anders gesteuert wie der 2811/12.
beim 2801 hast Du data UND clock. mit clock bestimmst Du selbst die geschwindigkeit der datensendung.
der 2811er/12er hat keine clock-leitung, da ist es eine zeitabhängige sache.

entweder wie beim 2811er (also IC extra) mit 400 oder 800.
oder bei in den LEDs eingebauten chips fix mit 800.

einiges zum WS2812 wurde hier geschrieben:

http://forum.arduino.cc/index.php?topic=146157.0

mit der fastSPI_led2 bibliothek kann man die dinger sehr gut steuern, selbst etwas zu schreiben ist wegen des engen timings nur absoluten assembler-profis möglich.

wäre scharf, wenn Du das hinkriegst, bin sehr interessiert.

gruß stefan

nachtrag:

Hoffe die Angaben reichen euch um mir zu sagen wie und ob es geht

natürlich geht es. wenn man die rgb-werte der einzelnen leds bekommt, ist die ansteuerung der streifen kein problem.
HDMI-splitter hab' ich hier, streifen auch, und ein wenig erfahrung damit, also wenn ich helfen kann, sag's nur.

gruß stefan

Ich hatte mich bisher mit den 2801ern nicht so beschäftigt.
Zwar wusste ich, dass diese als (ich zitiere mich selbst) "Steuersignal (CLK und DATA) für WS2801" brauchen, hatte aber (um es kurz zu machen) einen Denkfehler.

Mit der fastSPI_led2 library steuere ich die WS2812B momentan auch an.
Ich weiß nicht ob du mein anderes Thema verfolgst (oder gesehen hast), aber die Ansteuerung der LED funktioniert perfekt.
Link zum Thema mit Video

Also das ist so ziemlich das Einzige, was von Anfang an ohne Probleme funktionierte...

Wir können ja "einen Deal" machen ^^
Du zeigst mir, wie ich mit dem Arduino aus einem WS2801 Steuersignal ein WS2811/WS2812 Signal mache (mit 800kHz).
Und ich schreibe ne Anleitung wie man ein HDMI basierendes Ambilight für WS2811/WS2812 LEDs macht.
Deal? :smiley:

Und bevor ich mich hier mit fremden Federn schmücke.
Die Idee für das Ganze kam mir vor Jahren, allerdings hat gkaindl auf github erstmals eine universelle Lösung basierend auf ein Raspberry PI für Jedermann geschafft.

Nur damit jeder weiß, was für Geräte benötigt werden und was ich bezahlt habe:
5V 10A Netzteil (Preis: 10,56€)
HDMI Splitter (Preis: 9,22€)
HDMI->CVBS Konverter (Preis: 19,76€ TEUER)
USB Videograbber (Preis: 5,19€)
Raspberry Pi Model B (Preis: 28,95€)
Kühlkörper fürs PI wegen Übertaktung (Preis: 2,98€)
2x HDMI 1.4a Kabel (3,86€)

Gesamtpreis ohne LEDs: 80,52€ (wenn man keins der oben genannten Geräte hat)
Das ist zwar alles in allem nicht wenig, allerdings verglichen mit den anderen Ambilight Klonen (Adalight, Sudolight... etc.) sehr wenig und vor allem Quellenunabhängig (!!!!)

Und wenn man keine WS2801 (oder lpd8806) LEDs da hat, sondern WS281x, dann braucht man noch ein Arduino, das die Übersetzung der Signale übernimmt.
Das Problem ist nämlich, dass das Raspberry das wohl nicht hinbekommt, wegen dem genauen Timing.

Wobei ich sagen muss, dass ich die WS2812B die ich habe im vergleich zu den WS2801 wesentlich ausgewogener finde (und erhoffe mir daher auch einen besseren Effekt)

Die Übertragung zum Raspberry PI steht auch schon und läuft ohne große Verzögerung (bei Bedarf mach ich n Video).

Das ganze würde ich dann noch versuchen mit in meine App zu packen und dann das Ambilight über Handy (Bluetooth, weil Wifi Shields (noch) zu teuer) an und aus zu schalten, statische Farben oder Effekte einzustellen.
So jedenfalls der Plan... läuft nämlich nicht alles so Reibungslos wie man es wünscht.

Die schweren Schritte überlasse ich dann man den Profis hier :smiley:

Du möchtest den WS2801 Datenstrom einlesen, zwischenspeichern und dann als WS2811 wieder ausgeben.
Hast Du keine Möglichkeit die RGB-Werte aus dem Rasberry rauszubekommen (serielle Schnittstelle oder SPI)?
Das Problem ist daß der Arduino mit C wahrscheinlich zu langsam ist, um den WS2801 Datenstrom zu lesen. Assembler müßte gehen aber das muß man mal können.
Von wievielen LEDs sprechen wir denn? bei 10A Netzteil könnten es 160 sein.
Grüße Uwe

hi,

hab' mir das mal angesehen. das auslesen des datenstroms geht sich zeitmäßig nicht aus. aber ich verstehe ohnehin nicht, warum man unbedingt WS2812-LEDs verwenden sollte, wenn das programm daten für WS2801 ausgibt (oder, wie auf der webseite angegeben, LPD8806. keine ahnung, ob die gleich sind).
direkt mit dem raspberry auf WS2812er loszugehen, wird, wie Du richtig sagst, kaum gehen. bin zwar jetzt kein linux-spezialist, aber betriebssysteme haben den nachteil, zwischendurch immer mal was eigenes zu machen, und das geht mit den 2812ern nicht.

da wäre es viel interessanter, die daten aus dem programm zu holen, bevor sie in einen datenstrom für einen strip umgewandelt werden. also vom raspberry zb. 3x240 bytes seriell an den arduino, und der schießt die in den WS2812er-strip. das ist zeitmäßig kein problem.

gruß stefan

Eisebaer:
da wäre es viel interessanter, die daten aus dem programm zu holen, bevor sie in einen datenstrom für einen strip umgewandelt werden. also vom raspberry zb. 3x240 bytes seriell an den arduino, und der schießt die in den WS2812er-strip. das ist zeitmäßig kein problem.
gruß stefan

Hab ich das nicht schon gesagt?
Ok mein Südtiroler Deutsch ist einem Wiener-Deutsch sprechenden und lesenden Österreicher schwer verständlich :wink: :wink: :wink: :wink:
grüße Uwe

@uwe: HÄÄÄ? :roll_eyes:

Gut geraten uwe...
Es sind 158 LEDs.

Ich hatte das glück ws2801, ws2811 und meine ws2812b im vergleich zu sehen. Die letzten beiden waren deutlich ausgewogener vom licht - natürlich rein subjektiv.
Das jetzt leider diese ambilight lösung nur die ws2801 unterstützt ist halt pech für mich, aber ich hoffe ein umgehbares..

Ich weiß leider nicht in wie weit man die led daten direkt abgreifen kann.
Weiß das jemand von euch?

Falls nein, hatte ich gedacht, dass das einlesen des data und clk signal und dann das befeuern der ws2811 zu schaffen.
Das ist eine allgemeinere lösung und man muss nicht so hierzu vom raspberry wissen - auch wenn sie nicht so elegant ist. Wobei ich erstmal nur lösungsorientiert bin :wink:

Irgendwelche konkreten ideen?

Mal eine kurze Frage, wie sieht das Programm an sich auf dem Ras aus, konntest du das selbst schreiben, oder konntest du nur eine unveränderbare Version aufspielen. Ist doch gut möglich, dass es evtl. für andere Strips inzwischen erweitert wurde.

Bezüglich dem ausgewogenen Licht kann ich dir zustimmen. Einen wirklichen sichtbaren Unterschied zwischen WS2811/12 kann ich nicht feststellen, wenn möglich aber immer auf den 12B zurückgreifen.

Der ist gerade, was die Thermik angeht, verbesser worden.

ok wir reden also von 474 Byte
Teoretisch ist das WS2801 Signal mit der SPI-Schnittstelle kompatiebel. Wenn der Arduino als Slave konsfiguriert ist und das CS Signal dauend aktiv geschaltet ist, dann müßte es gehen. Was ich nicht weiß ist ob die Empfangsgeschwindigkeit reicht.
Grüße Uwe

hi,

ich hab' auf github nachgesehen, eine andere ausgabe als auf LPD8806 (ist der gleich zum WS2801?) ist dort nicht vorgesehen. ich hab' den programmierer der anwendung angeschrieben, vielleicht meldet er sich ja bei mir oder hier im thread.

die 474 byte sind natürlich nicht fix, ich zb bräuchte 720.

das programm gibt's hier GitHub - gkaindl/ambi-tv: a flexible ambilight clone for embedded linux samt beschreibung des hardwareaufbaus.

gruß stefan

hi,

danke für den Link Eisbaer...
ich hätte ihn auch schon geschickt, wenn ich nicht vom Handy aus geschrieben hätte (das ist da immer etwas umständlich).
Jedenfalls war das googlen mit meiner Beschreibung zumindest einfach.

Die LPD8806 sind nicht identisch - jedoch wurde von einem Benutzer die Ausgabe zum WS2801 hingehend verändert.
Siehe hier: Link
Allerdings steht in diesem Thema auch, dass die Einbindung von WS2811 aufgrund der Timings nicht möglich sei - ob dem wirklich so ist, kann ich aufgrund fehlendem Wissens nicht sagen.

Fakt ist, dass es Leute gibt, die mit einem PI die WS2811 ansteuern können.
Ob das allerdings hier auch Möglich ist, ist eine ganz andere sache: Die CPU des PIs ist auf anschlag, bei der Auswertung des Bildes. Grund dafür ist, dass die CPU die Arbeit des fehlenden (oder zumindest nicht echten) USB-Controllers mit übernehmen muss. Das ist dann leider etwas zu viel für die CPU.
Man könnte eigentlich die GPU mit einbinden und dann die Last besser verteilen, aber dazu und auch zum direkten abgreifen der SPI Daten, fehlen mir deutlich die Kenntnisse.

Also theoretisch ist viel möglich - das weiß ich.
Mir geht es allerdings mehr darum, was mit eurer Hilfe wirklich machbar ist, ohne ein komplettes Programm für das PI schreiben zu müssen.

Ich danke dir Eisbaer für die Kontaktaufnahme an den Entwickler der Anwendung, das ist mir aufgrund eines fehleneden github accounts (und alle namen die ich wollte waren bereits vergeben) erstmal nicht möglich.
Leider bezweifel ich, dass dieser etwas für mich (uns) einbinden wird, wenn man das Thema mit den WS2801 betrachtet.

Anscheinend ist die "übersetzung" allerdings nicht so trivial wie ich das erhofft hatte, da hier sonst wahscheinlich schon ein sketch schnipsel aufgetaucht wäre der die DATA und CLK inputs ausliest und auf nem andern Pin die WS2811 befeuern würde.

Liebe grüße!

hi,

könntest Du mir das für den 2801er-strip angepaßte raspi-programm mal hier reinstellen, bitte.

gruß stefan

Leon333:
Anscheinend ist die "übersetzung" allerdings nicht so trivial wie ich das erhofft hatte, da hier sonst wahscheinlich schon ein sketch schnipsel aufgetaucht wäre der die DATA und CLK inputs ausliest und auf nem andern Pin die WS2811 befeuern würde.

Nein ist nicht so einfach.
Das Protokoll des WS2801 ist einfach. Die Datenleitung gibt ein H oder L und ist beim L-H Überang des Takts gültig. So ist die Geschwindigkeit der Schnittstelle variabel.
Das WS2811/12/12B protokoll hat eine fisxe Frequenz von 800kHz (der 11 auch 400kHz) Die H und L werden in dem Verhältnis von H zu L innerhalb einen Peride dekodiert. H ist ca 50% zu 50% und L ist ca 20% zu 80% (siehe http://www.adafruit.com/datasheets/WS2811.pdf Seite 3 unten)
Darum ist ein kontinuierliches empfangen und senden nicht möglich. Theoretisch ist es möglich alle Daten zu empfangen und dann alle Daten zu schicken.
Grüße Uwe

@Eisbär:

Das kann ich leider nicht, da ich gerade ein image für den LPD8806 drauf habe.
Ich habe eine 4GB SD Karte ist die bei dir auch vorhanden?
das Image ist 3,69GB groß -> verpackt 1,26GB (hast du space?)

Ansonsten kannst du das auch selbst erstellen - ist keine große Aktion.
Raspbian installieren: Download-Link

Tutorial hier: Link
Aber statt

wget https://github.com/gkaindl/ambi-tv/archive/master.zip

bitte das hier nehmen:

https://github.com/mnorthfield/ambi-tv/archive/master.zip

Bzw. noch besser hier die Anleitung nehmen: Link

Sorry für den Doppelpost, aber ich bin mal so frei...

Ich hab gerade nochmal extra für dich Eisbär ein Image erstellt mit den WS2801 LEDs...
Es wird gerade in 100MB parts hochgeladen (auf zippyshare).
Wenn es fertig ist, füge ich die Download-Links hier ein. (meine Leitung ist mit DSL6000 nicht die Beste)

EDIT: ABGEBROCHEN siehe nächsten Beitrag

Das Image ist getestet bis zur synchronen Übertragung des Bildes auf das Pi (mit leichtem lag, dass durch den Grabber zustande kommt...).
Das System ist ansonsten sauber und hat sonst keine weiteren Programme bzw. "Addons".

Du - und alle anderen die das hier im stillen sehen und runterladen - musst nur ab Schritt 6 nach diesem Tutorial weitermachen.
Weiter machen kann ich ja nicht, aufgrund nicht vorhandener WS2801 LEDs.
Ich bitte um Rückmeldung (!)

Dennoch habe ich was gesehen, was interssant aussieht, auch wenn ich es nicht ganz verstehe :D:D
Wahrscheinlich wichtiger Link! ^^
Kann mir bitte jemand erklären, was ich damit anfangen kann? (haha)
Sorry, aber ich weiß nicht was ein "sink" ist.
Allerdings steht da was von WS2811 was mich hoffen lässt :slight_smile:

Leider weiß ich auch nicht, wie ich den Entwickler "stozze" anschreiben kann, aber ich denke ihr könnt mir da weiterhelfen.
Liebe Grüße