Forum: Mikrocontroller und Digitale Elektronik Propelleruhr mit WS2812?


von uv (Gast)


Lesenswert?

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?

von Olive W. (bittermelone)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

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.

von Olive W. (bittermelone)


Angehängte Dateien:

Lesenswert?

So sieht das dann aus.

von uv (Gast)


Lesenswert?

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..

von uv (Gast)


Lesenswert?

Olive O. schrieb:
> So sieht das dann aus.

Mit welchen Dateninhalt / Farbe?

von Rainer S. (enevile) Benutzerseite


Lesenswert?

Guck mal hier steht die ein oder andere Info drin:
https://www.mikrocontroller.net/articles/POV-Display

von Olive W. (bittermelone)


Lesenswert?

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.

von Teo D. (teoderix)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

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.

von holger (Gast)


Lesenswert?

Mit APA102 Leds könnte das gehen.

von uv (Gast)


Lesenswert?

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..

von WS2812-Bastler (Gast)


Lesenswert?

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/

von uv (Gast)


Lesenswert?

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.

von Armin K. (-donald-) Benutzerseite


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

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.

von Ulf (Gast)


Lesenswert?

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...

von Teo D. (teoderix)


Lesenswert?

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.

von Beluga (Gast)


Lesenswert?

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.

von uv (Gast)


Angehängte Dateien:

Lesenswert?

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
}

von Armin K. (-donald-) Benutzerseite


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

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 ? ;-)

von Hagen R. (hagen)


Lesenswert?

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
Noch kein Account? Hier anmelden.