POV-Globus-Geschwindigkeitsfragen

Ich plane, einen RGB-LED-POV-Globus zu erstellen, der nur physisch größer ist als dieser.

Ich plane die Verwendung von 64 RGB-LEDs, die 3x Pins pro LED für insgesamt 192 Ausgänge benötigen. Offensichtlich brauche ich einige Schieberegister. Ich habe mir 74HC595 (8 Bit) angesehen und es wären 24 dieser Chips erforderlich, um alle diese LEDs zu verarbeiten.

Ich plane, diese Schieberegister mit 6 pro Kanal von meinem Mikrocontroller in Reihe zu schalten.

Der 74HC595 hat eine Schaltfrequenz von 100 MHz.

Mir wurde gesagt, dass ich den Globus mit etwa 1500 U / min (25 pro Sekunde) drehen muss.

Der Plan ist, einen Arduino für den Mikrocontroller zu verwenden, aber ich bin offen für Vorschläge.

Meine Fragen sind:

  • Gibt es für dieses Projekt einen besser geeigneten Chip als den 74HC595?
  • Gibt es neben dem Arduino einen besser geeigneten Mikrocontroller für dieses Projekt?
  • Ich möchte die LEDs nicht vom Mikrocontroller ausschalten, also brauche ich externe Stromversorgung. Wie würde ich vorgehen?
  • Wie schnell könnte ich mit 6x 74HC595 in Reihe alle LED-Farben auf diesem Kanal umschalten?
  • Wie schnell könnte ich mit 12x 74HC595 in Reihe alle LED-Farben auf diesem Kanal umschalten?
@davidcary bist du derselbe David Carrie, den ich letztes Jahr im Vancouver Hack Space (VHS) getroffen habe?
Ich wünschte, ich wäre es – Fotos von diesem Raum, die ich im Internet sehe, sehen fantastisch aus. Ich würde gerne einen solchen Raum in Tulsa eröffnen. Leider war ich seit Jahren nicht mehr in Kanada.
@davidcary hier ist einer in Tulsa, es sieht eher nach Software als nach Hardware aus, aber es wäre ein guter Anfang. hackerspaces.org/wiki/Free_Information_Exchange_Foundation

Antworten (3)

1. Ein Haufen 74HC595-Chips wird großartig funktionieren. Andere Chips, die auch genauso gut und vielleicht etwas besser funktionieren würden, sind aufgelistet unter: Welcher SIPO-Chip ist besser, 74HC4094 oder 74HC595 oder etwas anderes?

2. Der Arduino ist eine ausgezeichnete Wahl für das Prototyping, besonders wenn Sie mit gcc vertraut sind. Vielleicht wäre es jetzt schneller, einen zu verwenden. Leider vermute ich, dass Sie bald Code für dieses POV-Display schreiben werden, das mehr RAM benötigt, als der Arduino zur Verfügung hat -- zu diesem Zeitpunkt verwenden Sie entweder (a) einen oder mehrere Tricks, um den benötigten RAM zu reduzieren, oder (b) fügen einige hinzu externes RAM, oder (c) den Code auf einen anderen Mikrocontroller mit mehr RAM portieren (vielleicht den ATMEGA1284?).

Der Parallax-Propeller ist eine ausgezeichnete Wahl für ein hochauflösendes POV-Display – er hat eine Größenordnung mehr internen RAM (32 KB RAM) als der ATmega238 im Arduino. (Gibt es irgendetwas, was ich tun kann, um die Portierung von gcc auf den Propeller zu unterstützen?)

Manche Leute bevorzugen "quadratische Pixel". Sie wissen sicher bereits, dass der Abstand um den Äquator einer Kugel doppelt so lang ist wie der Abstand von Pol zu Pol (der Äquator der Erde ist etwas mehr als doppelt so lang). Da Sie 64 Pixel vom Südpol zum Nordpol haben, können Sie eine neue vertikale „Linie“ von Pixeln 2*64 = 128 mal pro Umdrehung neu laden, um 128 „quadratische Pixel“ am Äquator zu erhalten. Der einfachste Weg, dies zu tun, besteht darin, das Vollbild unkomprimiert im RAM zu speichern. Das erfordert 64*128 Pixel * 3 Bits/Pixel = 24 576 Bits = 3 072 Bytes plus ein paar Bytes RAM für andere Programmvariablen. Leider hat der Atmel ATmega328 im Arduino nur 2 048 Byte RAM.

Frühere POV-Anzeigenverwendete Mikrocontroller mit einer Größenordnung (!) weniger RAM als dieser. Die Leute haben also eine Vielzahl von Tricks entwickelt, mit denen Sie dies umgehen können. Ein Trick: Beleuchten Sie nur die "vordere" Hälfte des Globus, während Sie die LEDs sehen, und schalten Sie dann alle LEDs aus (oder lassen Sie sie in einer konstanten Farbe) während der "hinteren" Hälfte, die Sie nicht direkt können siehe LEDs. Das halbiert die Menge an RAM, die Sie benötigen, und passt dann in den Arduino. Wenn Ihnen dieser Trick nicht gefällt, gibt es andere Tricks, die Sie verwenden können, die weniger offensichtlich sind. Ein weiterer Trick: Speichern Sie das Bild im Flash-Programmspeicher. Der Arduino hat genug Flash-Programmspeicher, um mehrere 3072-Byte-Frames zu speichern. Noch ein Trick: Verwenden Sie ASCII-Text, um den Text zu speichern, den Sie anzeigen möchten, und verwenden Sie dann den Flash-Programmspeicher, um das "Zeichengenerator-ROM" zu speichern. Daten. Ich bin mir ziemlich sicher, dass es noch andere POV-Tricks gibt ...

3. Wenn ich es bauen würde, würde ich den Arduino und die 74HC595-Chips von einem großen Netzteil mit Strom versorgen und den Motor, der den POV dreht, von einem separaten Netzteil mit Strom versorgen.

Erst nachdem ich das alles zum Laufen gebracht hatte, würde ich überhaupt ein komplizierteres getrenntes Stromversorgungssystem in Betracht ziehen. (Wenn Sie ein separates "rotes" Schaltnetzteil haben, dessen + V nur mit 74HC595-Chips verbunden ist, die wiederum nur mit roten LEDs verbunden sind, können Sie die Ausgangsspannung unabhängig voneinander einstellen, um die Gesamtstrom- und Wärmeerzeugung zu minimieren das System. Aber es scheint unnötig kompliziert.)

4. und 5. Die vielleicht einfachste Möglichkeit für den Arduino, das POV-Display anzusteuern, besteht darin, alle 24 74HC595-Chips in einer langen einzelnen Zeichenfolge zu verketten und dann die Arduino-SPI-Bibliothek zu verwenden . Das erfordert 192 Taktimpulse, um die neue Datenspalte einzutakten, und dann einen Impuls auf dem RCLK (auch bekannt als Framing-Impuls, SS usw.), um mit der Anzeige dieser neuen Daten zu beginnen. Laut einem Arduino-zu-SPI-Schnittstellen-Tutorial ist die schnellste SPI-Taktrate die Systemgeschwindigkeit / 4. Der 16-MHz-Arduino kann also einen SPI-CLK von 4 MHz ausgeben. Wenn Sie es mit einem 20-MHz-Quarz aufrüsten, können Sie einen SPI-CLK von 5 MHz erhalten. Wenn Sie Ihr Programm schnell genug bekommen, um mit der SPI-Hardware Schritt zu halten, können Sie eine neue Spalte bestenfalls in 5 MHz / 193 Impulsen ausgeben, sodass die theoretisch maximal mögliche Geschwindigkeit 25 907 Spalten/Sekunde beträgt.

Bei der standardmäßigen Zeichentrickfilm-Aktualisierungsrate von 24 Bildern/Sekunde (die merklich flimmert – Sie möchten etwas Besseres) und bei 128 Spalten/Bild, um „quadratische“ Pixel am Äquator zu erhalten (Sie möchten möglicherweise mehr, um eine bessere Auflösung zu erhalten). , das ergibt 24 Frames/Sekunde * 128 Spalten/Frame = 3072 Spalten/Sekunde.

Zwischen "der gewünschten Geschwindigkeit": 3072 Spalten/Sekunde und "der Geschwindigkeit, die auf Arduino-Hardware völlig unmöglich ist": 25.908 Spalten/Sekunde, liegt fast eine Größenordnung Luft zum Atmen. Hoffentlich gibt dir das genug Platz.

Einige Leute denken, dass Sie eine schnellere Spaltenaktualisierungsrate erhalten können, indem Sie die 74HC595-Chips in 2 oder mehr Ketten neu anordnen und alle Ketten parallel laden. Manche Leute sind so – sie sehen unbenutzte Pins auf dem Arduino und brennen darauf, sie für etwas zu verwenden . Aber es kann kontraproduktiv sein – die SPI-Hardware ist nur mit einem Satz Pins auf dem Arduino verbunden, und so müssen Ketten, die an andere Pins angeschlossen sind, mit emulierter „Bit-Banging“-Software geladen werden, die ausnahmslos langsamer und langsamer ist verbrauchen mehr CPU-Zeit als die eingebaute SPI-Hardware.

Beachten Sie, dass Sie, um andere Farben als nur Aus, Weiß, Rot, Grün, Blau, Gelb, Cyan und Fuchsia zu erhalten, Ihre eigene PWM ausführen müssen, wenn Sie nur ein Schieberegisterbit verwenden, um jede LED-Komponente zu steuern . Sie müssen jedes Bit PWMen, während Sie jede Gruppe hineinschieben, also müssen Sie dies für Ihre Aktualisierungsrate berücksichtigen, und es wird auch Ihren Code etwas komplexer machen.

Alternativ könnten Sie einen IC wie den TI TLC5947 verwenden, der 24 PWM-Kanäle ausführt, basierend auf den Bits, die Sie hineinschieben. http://focus.ti.com/lit/ds/symlink/tlc5947.pdf

Bei dieser Lösung müssten Sie für jeden Kanal 12 Bit (statt 1) ​​verschieben, aber es kümmert sich um die PWM für Sie, sodass es sich möglicherweise um eine lohnende Lösung handelt.

Ich unterstütze das. Diese Familie von LED-Treibern ist wirklich nett - sie macht Strombegrenzungswiderstände überflüssig und macht die Verwendung separater Netzteile sehr einfach. Der 24-Ausgangsteil würde gut zu Ihren LEDs passen. Ziehen Sie möglicherweise einen Chip mit mehreren SPI-E / A in Betracht.
Funktioniert PWM auf einem sich drehenden POV-Display?
@davidcary Ja, Sie können PWMs auf einem POV-Display verwenden
Alle mechanisch drehenden Displays, die ich bisher gesehen habe, geben höchstens die 8 Farben aus: die von Ihnen erwähnten CMYK + RGB + W. Die ~ 7000 kbit/s, um Vollfarbe zu erhalten (statt ~ 600 kbit/s, um 8 Farben zu erhalten), scheinen für einen Arduino schwierig zu sein, aber es könnte ein cooles zusätzliches Feature sein.

Angenommen, Sie benötigen 500 Aktualisierungen pro Rotation. Das sind 500*192*25 'Verschiebungen' pro Sekunde - das sind nur 2,4 MHz Shift-Out-Frequenz, geteilt durch 6 Kanäle = 400 kHz Shift-Out-Frequenz.

Dies ist mit Arduino (20 MHz wirklich bevorzugt) erreichbar, erfordert jedoch sorgfältige Programmierung und Timing.

Also zu deinen Fragen:

1) Ich denke nicht. 8-Bit-Register würden ein kniffliges PCB-Routing erfordern

2) Wenn Sie 24 Ausgänge hätten, wäre es einfacher. Außerdem wäre es für ein so großes Display schön, genügend internen Speicher für Framebuffer zu haben, um die Programmierung zu vereinfachen. Auf dem Minimum würden Sie 16 KB Speicher benötigen, was Sie bei 8-Bit-AVRs nicht finden können. Mittelklasse-ARMs sind vielleicht besser, aber schwieriger zu entwickeln.

3) Nun, das bist du nicht. Sie verwenden Strom von 595, sie sind nicht sehr leistungsfähig, aber im einfachsten Fall ausreichend (siehe Datenblatt für das jeweilige Modell, das Sie haben).

4,5) Schneller als nötig :-)