Propelleruhr mit WS2812?

Gast #5655802
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?
#5655848
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.
Gast #5655866
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..
#5655896
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.
Gast #5656719
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/
Gast #5657220
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.
#5658019
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.
Gast #5676798
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
}
Angehängte Dateien:
#5682842
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 ? ;-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren