Inhaltsverzeichnis:

64-Pixel-RGB-LED-Anzeige - Ein weiterer Arduino-Klon - Gunook
64-Pixel-RGB-LED-Anzeige - Ein weiterer Arduino-Klon - Gunook

Video: 64-Pixel-RGB-LED-Anzeige - Ein weiterer Arduino-Klon - Gunook

Video: 64-Pixel-RGB-LED-Anzeige - Ein weiterer Arduino-Klon - Gunook
Video: Arduino-Programmierung mit dem Smartphone #02: Grundlagen LED-Matrix 2024, November
Anonim
64-Pixel-RGB-LED-Anzeige - ein weiterer Arduino-Klon
64-Pixel-RGB-LED-Anzeige - ein weiterer Arduino-Klon
64-Pixel-RGB-LED-Anzeige - ein weiterer Arduino-Klon
64-Pixel-RGB-LED-Anzeige - ein weiterer Arduino-Klon
64-Pixel-RGB-LED-Anzeige - ein weiterer Arduino-Klon
64-Pixel-RGB-LED-Anzeige - ein weiterer Arduino-Klon

Dieses Display basiert auf einer 8x8 RGB LED Matrix. Zu Testzwecken wurde es mit 4 Schieberegistern an ein Standard-Arduino-Board (Diecimila) angeschlossen. Nachdem ich es zum Laufen gebracht hatte, habe ich es auf einer fabrizierten Platine permatisiert. Die Schieberegister sind 8 Bit breit und lassen sich leicht mit dem SPI-Protokoll verbinden. Zum Mischen der Farben wird Pulsweitenmodulation verwendet, dazu später mehr. Ein Teil des RAM der MCU wird als Framebuffer verwendet, um das Bild zu speichern. Der Video-RAM wird im Hintergrund von einer Interrupt-Routine geparst, sodass der Benutzer andere nützliche Dinge tun kann, wie zum Beispiel mit einem PC sprechen, Tasten und Potentiometer lesen. Weitere Informationen zu "Arduino": www.arduino.cc

Schritt 1: Pulsweitenmodulation zum Mischen von Farben

Pulsweitenmodulation zum Mischen von Farben
Pulsweitenmodulation zum Mischen von Farben

Pulsweitenmodulation - WAS ?Pulsweitenmodulation schaltet den Strom, der einem elektrischen Gerät zugeführt wird, ziemlich schnell ein und aus. Die nutzbare Leistung ergibt sich aus dem mathematischen Mittel der Rechteckfunktion über das Intervall einer Periode. Je länger die Funktion in der ON-Position bleibt, desto mehr Leistung erhalten Sie. PWM hat die gleiche Wirkung auf die Helligkeit von LEDs wie ein Dimmer bei AC-Leuchten. Die vor uns liegende Aufgabe besteht darin, die Helligkeit von 64 RGB-LEDs (= 192 Einzel-LEDs!) Spektrum der Farben. Es sollte möglichst kein Flackern oder andere störende Effekte auftreten. Die nichtlineare Helligkeitswahrnehmung des menschlichen Auges wird hier nicht berücksichtigt (zB erscheint der Unterschied zwischen 10 % und 20 % Helligkeit „größer“als zwischen 90 % und 100 %). der PWM-Algorithmus. Angenommen, der Code erhält einen Wert von 7 für die Helligkeit der LED (0, 0). Außerdem weiß es, dass es maximal N Helligkeitsstufen gibt. Der Code führt N Schleifen für alle möglichen Helligkeitsstufen und alle notwendigen Schleifen durch, um jede einzelne LED in allen Reihen zu bedienen. Falls der Schleifenzähler x in der Helligkeitsschleife kleiner als 7 ist, wird die LED eingeschaltet. Wenn es größer als 7 ist, wird die LED ausgeschaltet. Dies geschieht sehr schnell für alle LEDs, Helligkeitsstufen und Grundfarben (RGB), jede LED kann individuell angepasst werden, um die gewünschte Farbe anzuzeigen. Messungen mit einem Oszilloskop haben gezeigt, dass der Anzeigeaktualisierungscode etwa 50% CPU-Zeit benötigt. Der Rest kann verwendet werden, um serielle Kommunikation mit einem PC durchzuführen, Tasten zu lesen, mit einem RFID-Lesegerät zu sprechen, I. zu senden2C-Daten zu anderen Modulen…

Schritt 2: Sprechen mit Schieberegistern und LEDs

Sprechen mit Schieberegistern und LEDs
Sprechen mit Schieberegistern und LEDs
Sprechen mit Schieberegistern und LEDs
Sprechen mit Schieberegistern und LEDs

Ein Schieberegister ist ein Gerät, mit dem Daten seriell und parallel ausgegeben werden können. Der umgekehrte Betrieb ist mit dem entsprechenden Chip auch möglich. Ein gutes Tutorial zu Schieberegistern gibt es auf der arduino-Website. Die LEDs werden von 8-Bit-Schieberegistern vom Typ 74HC595 angesteuert. Jeder Port kann etwa 25 mA Strom liefern oder absenken. Der Gesamtstrom pro versenktem oder gespeistem Chip sollte 70 mA nicht überschreiten. Diese Chips sind extrem günstig, zahlen Sie also nicht mehr als etwa 40 Cent pro Stück. Da LEDs eine exponentielle Strom-/Spannungskennlinie haben, müssen Strombegrenzungswiderstände vorhanden sein. Nach dem Ohmschen Gesetz:R = (V - Vf) / IR = Begrenzungswiderstand, V = 5V, Vf = Durchlassspannung der LED, I = gewünschter StromRote LEDs haben eine Durchlassspannung von etwa 1,8 V, blau und grün reichen von 2,5 V bis 3,5 V. Verwenden Sie ein einfaches Multimeter, um das festzustellen. Für eine korrekte Farbwiedergabe sollte man einige Dinge berücksichtigen: spektrale Empfindlichkeit des menschlichen Auges (Rot/Blau: schlecht, Grün: gut), Effizienz der LED bei einer bestimmten Wellenlänge und Strom. In der Praxis nimmt man einfach 3 Potentiometer und stellt sie ein, bis die LED richtig weißes Licht zeigt. Natürlich darf der maximale LED-Strom nicht überschritten werden. Wichtig ist hier auch, dass das die Zeilen ansteuernde Schieberegister 3x8 LEDs mit Strom versorgen muss, also den Strom besser nicht zu hoch treiben. Ich war erfolgreich mit Begrenzungswiderständen von 270 Ohm für alle LEDs, aber das hängt natürlich von der Marke der LED-Matrix ab. Die Schieberegister sind mit SPI-Seriell verbunden. SPI = Serial Peripheral Interface (Bild (1)). Im Gegensatz zu den seriellen Ports bei PCs (asynchron, kein Taktsignal) benötigt SPI eine Taktleitung (SRCLK). Dann gibt es eine Signalleitung, die dem Gerät mitteilt, wann die Daten gültig sind (Chip Select / Latch / RCLK). Schließlich gibt es noch zwei Datenleitungen, eine heißt MOSI (Master Out Slave In), die andere heißt MISO (Master In Slave Out). SPI wird verwendet, um integrierte Schaltkreise zu verbinden, genau wie I2C. Dieses Projekt benötigt MOSI, SRCLK und RCLK. Zusätzlich wird auch die Freigabeleitung (G) verwendet. Ein SPI-Zyklus wird gestartet, indem die RCLK-Leitung auf LOW gezogen wird (Bild (2)). Die MCU sendet ihre Daten auf der MOSI-Leitung. Der logische Zustand davon wird vom Schieberegister an der steigenden Flanke der SRCLK-Leitung abgetastet. Der Zyklus wird beendet, indem die RCLK-Leitung wieder auf HIGH gezogen wird. Nun stehen die Daten an den Ausgängen zur Verfügung.

Schritt 3: Schaltplan

Schaltplan
Schaltplan
Schaltplan
Schaltplan

Bild (1) zeigt, wie die Schieberegister verdrahtet sind. Sie sind verkettet, sodass Daten in diese Kette und auch durch sie hindurch verschoben werden können. Daher ist das Hinzufügen weiterer Schieberegister einfach.

Bild (2) zeigt den Rest des Schaltplans mit MCU, Anschlüssen, Quarz… Die angehängte PDF-Datei enthält die gesamten Arbeiten, am besten zum Ausdrucken.

Schritt 4: C++-Quellcode

C++-Quellcode
C++-Quellcode
C++-Quellcode
C++-Quellcode
C++-Quellcode
C++-Quellcode

In C/C++ muss man normalerweise Funktionen prototypisieren, bevor man sie kodiert.#include int main(void);void do_something(void);int main(void) { do_something();}void do_something(void) { /* comment */ }Die Arduino IDE erfordert diesen Schritt nicht, da Funktionsprototypen automatisch generiert werden. Daher werden Funktionsprototypen im hier gezeigten Code nicht angezeigt. Bild (1): setup() functionImage (2): spi_transfer()-Funktion mit Hardware-SPI des ATmega168-Chips (läuft schneller)Image (3): Framebuffer-Code mit ein Timer1-Überlauf-Interrupt. Code-Stücke, die für Anfänger ein leicht kryptisches Aussehen haben, z while(!(SPSR & (1<<SPIF))) {} die Register der MCU direkt verwenden. Dieses Beispiel in Worten: "solange das SPIF-Bit im Register SPSR nicht gesetzt ist, tut man nichts". Ich möchte nur betonen, dass es bei Standardprojekten wirklich nicht nötig ist, sich mit diesen Dingen so eng mit der Hardware auseinanderzusetzen. Anfänger sollten sich davon nicht erschrecken lassen.

Schritt 5: Fertiges Gadget

Fertiges Gerät
Fertiges Gerät
Fertiges Gerät
Fertiges Gerät
Fertiges Gerät
Fertiges Gerät

Nachdem ich alle Probleme gelöst und den Code zum Laufen gebracht hatte, musste ich nur noch ein PCB-Layout erstellen und es an ein Fabhouse schicken. Es sieht so viel sauberer aus:-)Bild (1): vollständig bestückte ControllerplatineBild (2): Vorderseite der blanken PlatineBild (2): RückseiteEs gibt Anschlüsse, die PORTC und PORTD des ATmega168/328-Chips und 5V/GND ausbrechen. Diese Ports enthalten die seriellen RX-, TX-Leitungen, die I2C-Leitungen, digitale I/O-Leitungen und 7 ADC-Leitungen. Dies ist zum Stapeln von Schilden auf der Rückseite der Platine gedacht. Der Abstand ist für die Verwendung von Perfboard (0,1 Zoll) geeignet. Der Bootloader kann mit dem ICSP-Header geflasht werden (funktioniert mit USBtinyISP von adafruit). Sobald dies erledigt ist, verwenden Sie einfach einen Standard-FTDI-USB/TTL-Seriell-Adapter oder ähnliches. Ich habe auch einen Auto-Reset-Disable-Jumper hinzugefügt. Ich habe mir auch ein kleines Perl-Skript ausgedacht (siehe meinen Blog), das einen automatischen Reset mit FTDI-Kabeln ermöglicht, was normalerweise nicht sofort funktioniert (RTS vs. DTR-Linie). Dies funktioniert unter Linux, vielleicht auf MAC. Leiterplatten und ein paar DIY-KITs gibt es auf meinem Blog. SMD-Löten erforderlich! Bauanleitungen und Quellen für LED-Matrizen finden Sie in den PDF-Dateien.

Schritt 6: Anwendung: CPU Load Monitor für Linux mit Perl

Dies ist ein sehr einfacher Lastmonitor mit einem Verlaufsdiagramm. Es basiert auf einem Perl-Skript, das mit iostat alle 1s den "Lastdurchschnitt" des Systems erfasst. Die Daten werden in einem Array gespeichert, das bei jeder Aktualisierung verschoben wird. Neue Daten werden oben in der Liste hinzugefügt, der älteste Eintrag wird herausgeschoben. Nähere Informationen und Downloads (Code…) finden Sie auf meinem Blog.

Schritt 7: Anwendung: Mit anderen Modulen über I²C. sprechen

Anwendung: Kommunikation mit anderen Modulen mit I²C
Anwendung: Kommunikation mit anderen Modulen mit I²C

Dies ist nur ein Grundsatzbeweis und bei weitem nicht die einfachste Lösung für diese Aufgabe. Mit I2C ermöglicht die direkte Adressierung von bis zu 127 "Slave"-Karten. Hier ist das Board auf der rechten Seite im Video der "Master" (der alle Übertragungen initiiert), das linke Board ist der Slave (wartet auf Daten). ich2C benötigt 2 Signalleitungen und die üblichen Stromleitungen (+, -, SDA, SCL). Da es sich um einen Bus handelt, sind alle Geräte parallel daran angeschlossen.

Schritt 8: Anwendung: "Game Cube":-)

Anwendung
Anwendung

Nur ein Freak-Gedanke. Dieser passt auch in das Holzgehäuse, das auf der Intro-Seite gezeigt wird. Auf der Rückseite befinden sich 5 Knöpfe, die zum Spielen eines einfachen Spiels verwendet werden können. DAS ENDE ?

Schritt 9: Anzeigen von Bildern / Animationen auf der Matrix - Quick Hack

Anzeigen von Bildern / Animationen auf der Matrix - Quick Hack
Anzeigen von Bildern / Animationen auf der Matrix - Quick Hack
Anzeigen von Bildern / Animationen auf der Matrix - Quick Hack
Anzeigen von Bildern / Animationen auf der Matrix - Quick Hack
Anzeigen von Bildern / Animationen auf der Matrix - Quick Hack
Anzeigen von Bildern / Animationen auf der Matrix - Quick Hack
Anzeigen von Bildern / Animationen auf der Matrix - Quick Hack
Anzeigen von Bildern / Animationen auf der Matrix - Quick Hack

Es hat also nur 8x8 Pixel und ein paar Farben zur Verfügung. Verwenden Sie zuerst etwas wie Gimp, um Ihr Lieblingsbild auf genau 8x8 Pixel zu verkleinern und im Rohformat ".ppm" (nicht ASCII) zu speichern. PPM ist einfach zu lesen und in einem Perl-Skript zu verarbeiten. Die Verwendung von ImageMagick und dem Befehlszeilentool "convert" funktioniert nicht richtig. Laden Sie den neuen Arduino-Code hoch und verwenden Sie dann das Perl-Skript zum Hochladen auf den Controller. Das Flimmern ist nur eine Fehlanpassung der LED-Aktualisierung und der Bildrate meiner Kamera. Nachdem der Code ein wenig aktualisiert wurde, läuft er ziemlich flott. Alle Bilder werden live über seriell übertragen, wie Sie sie sehen. Längere Animationen können in einem externen EEPROM gespeichert werden, wie dies bei verschiedenen Spoke-Pov-Boards der Fall ist.

Schritt 10: Interaktive Steuerung gespeicherter Animationen

Warum den Mikrocontroller den ganzen Spaß haben lassen? Beim Arduino-Kult dreht sich alles um physikalisches Rechnen und Interaktion, also fügen Sie einfach ein Potentiometer hinzu und übernehmen Sie die Kontrolle! Die Verwendung eines der 8 Analog-Digital-Wandlereingänge macht dies sehr einfach.

Schritt 11: Live-Video anzeigen

Die Verwendung eines Perl-Skripts und einiger Module macht es recht einfach, quasi Live-Videos auf X11-Systemen anzuzeigen. Es wurde auf Linux kodiert und kann auch auf MACs funktionieren. wiederholen

Schritt 12: Mehr Licht fast kostenlos

Mehr Licht fast kostenlos
Mehr Licht fast kostenlos

Mit nur zwei Stufen lässt sich die Helligkeit deutlich erhöhen. Ersetzen Sie die 270Ω-Widerstände durch 169Ω-Widerstände und huckepack ein weiteres 74HC595-Schieberegister auf IC5.

Empfohlen: