Hallo zusammen,
ich habe mehrere Matrizen von 6x6 LEDs, diese habe ich wiederum zu einem Quadrat von 2 x 2 zusammengesteckt. Aktuell muss ich im Code die Anzahl der LEDs manuell einstellen, aber ich würde gerne (wie auch immer), dass der Arduino das selber erkennt.
Es handelt sich um SK6812 LEDs.
Weiß jemand ob es ein Modul gibt, was den Arduino feedback gibt, sobald es Strom bekommt? Oder kann die LED vielleicht Feedback geben?
Du könntest den DOUT wieder zum Arduino zurückführen und dann schauen, nach wievielen LEDs da ein Signal rauskommt.
Eine andere Idee die zwar nicht automatisch ist, aber zumindest das Compileren vermeidet ist, das du die Anzahl der LEDs per serieller Schnittstelle einstellen kannst und dann im EEPROM speicherst.
Du könntest den DOUT wieder zum Arduino zurückführen und dann schauen, nach wievielen LEDs da ein Signal rauskommt.
Theoretisch würde es gehen, ein LED-Objekt mit sagen wir mal 1000 LEDs zu initialisieren, die Daten der letzten LED in den Controller zurückzuspeisen und die Zeit zu messen, nach welcher Daten hinten wieder rein kommen. Damit könnte man möglicherweise tatsächlich feststellen, wie oft die Daten weitergeschoben wurden = wieviele LEDs in der Kette hängen.
Problem dabei: Zu dem Zeitpunkt ist das LED Objekt mit fester Länge bereits initialisiert und die Messung bringt nichts mehr...
Fazit: Ich könnte mir vorstellen, dass das mit einem unabhängigen Sketch geht (ist aber auch nicht trivial), die Anzahl der LEDs "zu messen".
In einem einzigen Sketch mit "Autodetection" erscheint es mir unmöglich.
Gruß, H.
Das du deinen Speicherbedarf an den worst-case anpassen musst sollte klar sein.
Aber wie soll man z.B. einen Knightridereffekt implementieren, wenn man die Länge der LED-Kette nicht kennt?
Helmuth:
Theoretisch würde es gehen, ein LED-Objekt mit sagen wir mal 1000 LEDs zu initialisieren, die Daten der letzten LED in den Controller zurückzuspeisen und die Zeit zu messen, nach welcher Daten hinten wieder rein kommen.
Das geht nicht so einfach. Daten kommen ohne Zeitversatz hinten heraus, das ist ein Schieberegister
und es gibt nur eine Clock.
Man müsste also ein vorne eingeschobenes Muster abwarten,
bei welchem kannst du denn garantieren dass es nicht schon in der langen Kette versteckt ist?
Man könnte natürlich ausreichend (da liegt u.U. ein Problem) viele 0 durchschieben,
dann eine einzelne 1 durchschieben bis sie hinten wieder ankommt.
Aber auch da muss man zählen, Zeitmessungen helfen einem nicht.
Whandall:
Das geht nicht so einfach. Daten kommen ohne Zeitversatz hinten heraus, das ist ein Schieberegister
und es gibt nur eine Clock.
Schön das sich die LEDs da auch dran halten...
Wenn ich im Code nur die hälfte an LEDs angebe, leuchtet nur der halbe Strang. Müssten nicht alle leuchten?
Kannst du mir das erklären?
Was meinst du aus welchem Grund die andere Hälfte nicht leuchtet?
Weil deren Reset-0 noch nicht hinten herausgeschoben wurde.
Wenn du zweimal die Hälfte ausgibst sollten durchaus alle leuchten.
Wenn vorher alle Register auf 0 gesetzt werden leuchtet nur die Hälfte.
Bei solchen Ketten ist das Prinzip regelmäßig:
- die gewünschte Anzahl von Bits in das/die Register schieben
- Latch aktivieren um den momentanen Schieberegisterinhalt in das/die Output Register zu laden
Whandall:
Wenn du zweimal die Hälfte ausgibst sollten durchaus alle leuchten.
Ja eben nicht
Ist schon komisch, aber ich habe den Effekt auch schon gesehen.
Aber davon abgesehen:
Du hast pro LED ein DOUT transmission delay TPLZ von 500 ns
(steigende Flanke DIN zu steigende Flanke DOUT)
Es sollte also möglich sein die Länge der Kette zu messen wenn man mit Timer Capture arbeitet.
Leider steht im Datenblatt nur ein MAX Wert, kein MIN oder TYP.
Du könntest die Verzögerung ja ausmessen.
Wäre es auch möglich den Vorwiderstand der einzelnen LED zu messen? Ich meine, wenn ich weiß wieviel Widerstand eine kleine Matrix hat, weiß ich doch auch wie viel 4 oder 8 oder 16 haben, oder ist das zu einfach gedacht?
Nein
setto:
Wäre es auch möglich den Vorwiderstand der einzelnen LED zu messen?
Normalerweise gibt es höchstens vor der ersten LED einen Vorwiderstand
und ich wüsste nicht wie du den messen wolltest, also nein.
setto:
Ich meine, wenn ich weiß wieviel Widerstand eine kleine Matrix hat, weiß ich doch auch wie viel 4 oder 8 oder 16 haben, oder ist das zu einfach gedacht?
Ja, ist es. Eher nicht gedacht würde ich sagen.
Whandall. Du bist einem Fehler aufgesessen.
Die WS2812 und auch die hier genannten SK6812 verhalten sich nicht wie Shift Register a la 595.
Die erste LED nimmt sich die ersten 24 Bit in seinen Speicher auf und schickt erst die Bits ab 25 an die nächste weiter. Der Bus hat einen Geschwindigkeit von 800kHz oder anders gesagt ein Bit ist 1,25µs lang. 24 Bit sind 30µs.
Wenn man nun zb 5 LED hat kommt an Dout des 5. LEDs erst nach ca 150µS oder anders gesagt nach 120 Bits ein Signal (das 121. Bit) heraus
Grüße Uwe
Zur Matrix des TO.
Ich sehe als Lösung ein "intelligentes" Matrixmodul. Jede LED MAtrix hat seinen (Arduino) Controller und der steuert autonom seine 6x6 Matrix mit seinem RAM-Speicher an.
Der Haupt-Arduino kann über ein Interface mit den Matrixmodulen komunizieren und so auch die Anzahl der Module, den Speicherinhalt des "Bildspeichers der LED MAtrix-Module) abfragen bzw laden.
In diese Weise ist das LED Objekt immer gleich groß weil es im Speicher des Matrixcontrollers liegt. Der Master braucht kein LED Objekt sondern nur die Daten für das Objekt an die verschiedenen Matrixcontrollern übertragen.
Grüße Uwe
Whandall:
Das überzeugt mich nicht, schau in das Datenblatt.
Was hälst Du von dem?
Data protocol using unipolar NRZ communication mode, the pixel is
reset after the end of DIN, accept the data transmitted from the
controller to the 24bit, the first to send data by the first pixel to pixel
extraction, internal data latch, the remaining data after the internal
plastic the processing circuit after shaping amplification through the
DO port output began to turn to the next cascade of pixels, each pixel
through a transmission signal, reduce.
Im Datenblatt der WS2812B steht es deutlicher:
The data transfer protocol use single NZR communication mode. After the pixel power-on reset, the DIN port receive data from controller, the first pixel collect initial 24bit data then sent to the internal data latch, the other data which reshaping by the internal signal reshaping amplification circuit sent to the next cascade pixel through the DO port. After transmission for each pixel,the signal to reduce 24bit.
Grüße Uwe
Auch das überzeugt mich nicht, größtenteils finde ich es auch völlig unverständlich.
Das hier Light_WS2812 library V2.0 – Part I: Understanding the WS2812
überzeugt mich und erspart auch das Nachmessen.
Davon ausgehend sollte man messen können wieviele LEDs in der Kette hängen.
Ja, dort steht es ja auch:
After reset, each device reads the first 24 bit (GRB 8:8:8) of data into an internal buffer. All consecutive bits after the first 24 are forwarded to the next device go through internal data reshaping and are then forwarded via “Dout” to the next device. The internal buffer is written to the PWM controller during the next reset.
Grüße Uwe
