Hi Leute, Ich frage mich gerade, ob man für eine Propeller-Uhr so eine Klebeleiste mit 8-10 WS2812 LEDs gut verwenden könnte (angesteuert mit einem kleinen AVR). Eigentlich hatte ich diskrete LEDs vor, aber die Klebeleiste wäre wohl viel einfacher realisierbar, wenn das Timing ausreicht. Also ich habe mir gedacht, das Protokoll für ein Update so einer 10er Leiste dauert 10x1,25 Mikrosekunden + 50 Mikrosekunden Pause + Reserve, also sagen wir maximal 100 Mikrosekunden. Wenn sich der Propeller sich 25x pro Sekunde dreht, also mit 1500U/min, dauert so eine Vollkreis-Umdrehung 40ms. Das hieße also, ich könnte maximal 400 Updates pro Umdrehung erreichen bzw. etwas besser als 1 Grad - was mir ausreichen würde. Hab ich das richtig gerechnet oder für die Machbarkeit etwas übersehen - stimmt das so alles?
Die PWM der WS2812 ist bei schnellen Bewegungen durchaus sichtbar und interferiert außerdem mit der Update-Frequenz, wenn die in den kHZ-Bereich geht.
uv schrieb: > Ich frage mich gerade, ob man für eine Propeller-Uhr so eine Klebeleiste > mit 8-10 WS2812 LEDs gut verwenden könnte (angesteuert mit einem kleinen > AVR). Eher nicht. > Eigentlich hatte ich diskrete LEDs vor, aber die Klebeleiste wäre > wohl viel einfacher realisierbar, wenn das Timing ausreicht. Es gibt auch Klebeleisten mit normalen LEDs > Also ich habe mir gedacht, das Protokoll für ein Update so einer 10er > Leiste dauert 10x1,25 Mikrosekunden + 50 Mikrosekunden Pause + Reserve, > also sagen wir maximal 100 Mikrosekunden. Falsch! Ein einzelnes BIT dauert 1,25us, jede LED braucht 24 davon! Macht bei 10 LEDs 1,25us 24 10 = 300us. Und selbst wenn man die 10 LEDs alle parallel lädt, was mit einem größeren Controller und DMA möglich ist, dauert es immer noch 30us. OK, das ist kurz. > Wenn sich der Propeller sich 25x pro Sekunde dreht, also mit 1500U/min, > dauert so eine Vollkreis-Umdrehung 40ms. Richtig. > Das hieße also, ich könnte maximal 400 Updates pro Umdrehung erreichen > bzw. etwas besser als 1 Grad - was mir ausreichen würde. Bei serieller Ansteuerung wären es nur 40ms/0,3ms = 133 Schritte/U Naja, geht so, für den ersten Versuch ausreichend. Allerdings hast du mit den WS2812 ein Problem. Deren interne PWM ist nicht synchron mit deinem Update, das wird wild flackern. Ergo so nicht. Einfach: Normale LEDs mit ON/OFF Steuerung Besser: RGB mit ON/OFF Steuerung Am Besten: RGB-LEDs mit synchroner PWM, das kann man mit TLC5940 und Co erreichen. Dann ist nämlich ein Update-Zyklus = N volle PWM Zyklen.
Falk B. schrieb: > Falsch! Ein einzelnes BIT dauert 1,25us, jede LED braucht 24 davon! > Macht bei 10 LEDs 1,25us 24 10 = 300us. Upps! na gut, dass ich gefragt habe. Falk B. schrieb: > Allerdings hast du mit den WS2812 ein Problem. Deren interne PWM ist > nicht synchron mit deinem Update, das wird wild flackern. Auch wenn ich RGB einzeln oder alle je mit 255 lade? Dann ist ja keine PWM mehr nötig.. Ich hätte allerdings nur 7 Farben zur Auswahl..
Guck mal hier steht die ein oder andere Info drin: https://www.mikrocontroller.net/articles/POV-Display
OK, das Bild passt nicht 100%. Ich hatte hier versucht, die Helligkeit nochmal zu modulieren (weil mir 1 schon zu hell war), indem ich schnell zwischen RGB 1 und 0 hin und her schalte, was aber holpert, da nicht synchron mit der internen PWM. Wahrscheinlich ist hier eher die Modulationsfrequenz zu sehen, es war ein recht langsamer Schwenk. Die PWM kann man aber auf jeden Fall auch mit bloßem Augenrollen sehen. uv schrieb: > Auch wenn ich RGB einzeln oder alle je mit 255 lade? Dann ist ja keine > PWM mehr nötig.. Ich hätte allerdings nur 7 Farben zur Auswahl.. Bei 255 natürlich nicht. Wenn die Update-Frequenz für die gewünschte Auflösung reicht, wäre es einen Versuch wert. Es könnte dann höchstens noch etwas Jitter geben, weil die Elektronik in der LED nicht synchron läuft und es unterschiedlich lange dauert, bis der neue Wert tatsächlich erscheint.
uv schrieb: > Auch wenn ich RGB einzeln oder alle je mit 255 lade? Dann ist ja keine > PWM mehr nötig.. Ich hätte allerdings nur 7 Farben zur Auswahl.. Schau mal nach WS2813D. Die brauchen nur 5mA und wären dann nicht so hell. Allerdings haben die noch Weiß mit drin, also 4Byte. http://www.world-semi.com/DownLoadFile/136
uv schrieb: > Auch wenn ich RGB einzeln oder alle je mit 255 lade? Dann nicht, dann gibt es auch keine PWM. > Dann ist ja keine > PWM mehr nötig.. Ich hätte allerdings nur 7 Farben zur Auswahl.. Eben. Das kann man mit ein paar IOs einfacher haben.
holger schrieb: > Mit APA102 Leds könnte das gehen. cool.. Die könnte man mit Hardware-SPI schneller und einfacher füttern! Die hatte ich ja noch gar nicht auf dem Schirm - danke! Ja, mit vielen Ports geht es auch, aber so reicht selbst ein AtTiny..
Die ganzen Berechnungen wie lange es dauert, ein Neopixel zu programmieren, sind für die Betrachtung der Eignung für POV-Devices nicht der kritische Punkt. Die folgenden Eigenschaften machen WS2812 untauglich für POV-Projekte: 1.) Man kann zwar einen Neo-Pixel in 300µs programmieren, er ändert seine Farbe jedoch immer nur alle 2ms! Zwischenzeitlich vorgenommene Farbänderungen in den Registern werden immer nur nach einem PWM-Zyklus zur Anzeige übernommen. 2.) Die PWM-Zyklen laufen auf allen Neopixel asynchron ab, daher werden sich die Neopixel auch mit bis zu 2ms asynchron updaten 3.) Auch bei eine Farbwert von 255 gibt es noch einen PWM-Puls (spielt angesichts der beiden ersten Punkte aber keine Rolle mehr) Die ausführlichsten Untersuchungen zum Them finden sich in diesem Blog: https://wp.josh.com/2014/05/15/getting-physical-to-uncover-neopixel-pwm-secrets/
WS2812-Bastler schrieb im Beitrag #5656719: > 1.) Man kann zwar einen Neo-Pixel in 300µs programmieren, er ändert > seine Farbe jedoch immer nur alle 2ms! Ah - eine wichtige Info, danke! Ob das bei den APA202 auch so ist? davon habe ich mir mal einen Meter zum Spielen bestellt.
uv schrieb: > Wenn sich der Propeller sich 25x pro Sekunde dreht, also mit 1500U/min, > dauert so eine Vollkreis-Umdrehung 40ms. Bloß braucht man keine 25 Umdrehungen/Sekunde. Da wird das schon laut. Auch weniger reicht aus, um ein halbwegs flackerfreies Bild zu bekommen. Und lesbar ist es auch bei 1 U/s.
Armin K. schrieb: > Bloß braucht man keine 25 Umdrehungen/Sekunde. Kommt drauf an. > Da wird das schon laut. Das ist eine andere Frage. > Auch weniger reicht aus, um ein halbwegs flackerfreies Bild zu bekommen. > Und lesbar ist es auch bei 1 U/s. Sagt einer, der noch nie eine Propelleruhr gebaut hat, geschweige denn die bei 1U/s betrachtet hat.
Armin K. schrieb: > Bloß braucht man keine 25 Umdrehungen/Sekunde. Da wird das schon laut. > Auch weniger reicht aus, um ein halbwegs flackerfreies Bild zu bekommen. Ich habe mal einen POV-Globe gebaut. Der hatte 40 ms Umlaufzeit. Das hat deutlich geflackert...
Ulf schrieb: > Ich habe mal einen POV-Globe gebaut. Der hatte 40 ms Umlaufzeit. Das hat > deutlich geflackert... Gehört das nich irgend wie dazu. :) Manche scheine vom Gefühl her, nicht wirklich zu erfassen, wie lange eine Sekunde wirklich ist.
Teo D. schrieb: > Manche scheine vom Gefühl her, nicht wirklich zu erfassen, wie lange > eine Sekunde wirklich ist. Das nenne ich einen gelungenen Satz. Da stimmt die ziselierte Grammatik mit der pointierten Semantik überein.
uv schrieb: > WS2812-Bastler schrieb im Beitrag #5656719: >> 1.) Man kann zwar einen Neo-Pixel in 300µs programmieren, er ändert >> seine Farbe jedoch immer nur alle 2ms! > > Ah - eine wichtige Info, danke! Ob das bei den APA202 auch so ist? davon > habe ich mir mal einen Meter zum Spielen bestellt. Also ich denke, mit den APA202 wird es werden! Hier mal mein Testaufbau und ein kleines Demo-Programm:
1 | #include <SPI.h> |
2 | byte leds=9; |
3 | |
4 | void setup() { |
5 | pinMode(SS,OUTPUT); |
6 | pinMode(SCK,OUTPUT); |
7 | pinMode(MOSI,OUTPUT); |
8 | SPI.begin; |
9 | SPI.beginTransaction(SPISettings(16000000, MSBFIRST, SPI_MODE0)); |
10 | }
|
11 | |
12 | void led_ein(byte hell, byte blue, byte green, byte red) { |
13 | if (hell > 31) {hell=31;} |
14 | SPI.transfer(128+64+32+hell); |
15 | SPI.transfer(blue); |
16 | SPI.transfer(green); |
17 | SPI.transfer(red); |
18 | }
|
19 | |
20 | void led_start() { |
21 | SPI.transfer(0); |
22 | SPI.transfer(0); |
23 | SPI.transfer(0); |
24 | SPI.transfer(0); |
25 | }
|
26 | |
27 | void led_stop() { |
28 | SPI.transfer(255); |
29 | SPI.transfer(255); |
30 | SPI.transfer(255); |
31 | SPI.transfer(255); |
32 | }
|
33 | |
34 | void shiftNled(int myDelay, byte anzahl, byte hell, byte blue, byte green, byte red) { |
35 | |
36 | alle_led_aus(anzahl); |
37 | byte pos=1; |
38 | do { |
39 | led_start(); |
40 | for (byte j=1; j<=anzahl;j++) { |
41 | if (j<pos) {led_ein(0,0,0,0);} |
42 | if (j==pos) {led_ein(hell,blue,green,red);} |
43 | if (j>pos) {led_ein(0,0,0,0);} |
44 | }
|
45 | //dummy, letzte
|
46 | led_ein(0,0,0,0); |
47 | pos=pos+1; |
48 | delay(myDelay); |
49 | } while (pos <= anzahl); |
50 | |
51 | }
|
52 | |
53 | void alle_led_aus(byte anzahl) { |
54 | led_start(); |
55 | for (byte i=0;i< anzahl;i++) { |
56 | led_ein(0,0,0,0); |
57 | }
|
58 | led_stop(); |
59 | }
|
60 | |
61 | void loop() { |
62 | int s=21; |
63 | byte h=4; |
64 | byte uh=255; |
65 | shiftNled(s,leds,h,0,0,uh); |
66 | shiftNled(s,leds,h,0,uh,0); |
67 | shiftNled(s,leds,h,uh,0,0); |
68 | shiftNled(s,leds,h,0,uh,uh); |
69 | shiftNled(s,leds,h,uh,uh,0); |
70 | shiftNled(s,leds,h,uh,0,uh); |
71 | shiftNled(s,leds,h,uh,uh,uh); |
72 | }
|
Falk B. schrieb: > Sagt einer, der noch nie eine Propelleruhr gebaut hat, geschweige denn > die bei 1U/s betrachtet hat. Stimmt leider nicht. Ich hab sehr wohl eine selbst entwickelt. Ich meinte nur, dass es selbst bei 1U/s noch lesbar ist, es ist erstaunlich, was das menschliche Hirn aus diesem langsamen Geblinke noch lesen kann.
Armin K. schrieb: > Falk B. schrieb: >> Sagt einer, der noch nie eine Propelleruhr gebaut hat, geschweige denn >> die bei 1U/s betrachtet hat. > > Stimmt leider nicht. Ich hab sehr wohl eine selbst entwickelt. > Ich meinte nur, dass es selbst bei 1U/s noch lesbar ist, es ist > erstaunlich, was das menschliche Hirn aus diesem langsamen Geblinke noch > lesen kann. Warst du dabei bekifft, daß dadurch die Punkte auf der Netzhaut stehen geblieben sind ? ;-)
Falk B. schrieb: > Warst du dabei bekifft, daß dadurch die Punkte auf der Netzhaut stehen > geblieben sind ? ;-) Quatsch, er hat im Takt von 1010ms geblinzelt und konnte so das Interfernezbild im Hirn zusammensetzen, eine echte Begabung.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.