LED Matrix ohne LED-Treiber (z.B. MAX7219)

Hi ich wollte mal fragen ob es eine Möglichkeit gibt eine LED-Matrix so zu programmieren bzw. eine Bibliothek die ich verwenden kann wodurch ich das "shiften" der Buchstaben automatisiert ablaufen lassen kann?

Bisher hab ich das immer sehr aufwendig Bild für Bild Programmiert ich habe auch selbst alles durch geschaut und keine Lösung für dieses Problem gefunden.

Bin für jede Hilfe dankbar

Marco

Das Problem ist sicher nicht die Software, also der Sketch, sondern die Anzahl der nötigen Pins am Controller und der benötigte Strom für die Leds. Da wird es dann wohl ohne Treiber-IC schlecht lösbar sein.

Der Treiber MAX7219 übernimmt die Ansteuerung eines Blockes von 8x8 LED. Er rteuert die LED an und macht Multiplexing und Strombegrenzung.
Das kann natürlich auch ein Arduino aber nicht alleine. Wenigstens einen Treiber zb einen ULN2803 oder UDN2891 braucht es. Du mußt aber das Timing für das Multiplexing einhalten. Wenn Du mehr als 1 8x8 Display willst dann noch Port Expander oder Shift Register um mehr Pins zu haben. Ein Mega Hilft auch nicht viel da er nicht genügend Strom für viele LEDs liefern kann.

Also einfacher ist ein MAX7219 oder ein LED MODUL mit integrierten Treiber..

Grüße Uwe

noiasca:
Die Frage ist eher warum man sich das antun will wenn es eben den Max oder Ht gibt …

Weil es Spaß macht.

Gruß

Gregor, nur mit einem Nano eine 7x7-Matrix roter LEDs ansteuernd

PS: Schaltplan im Anhang.

wunderlampe.pdf (32.2 KB)

Ein IC-Grab macht keinen Spaß.
Sobald 3-4 Dot Matrix Displays anzusteuern sind wachsen die Anzahl der ICs stark.

Grüße Uwe

uwefed:
Ein IC-Grab macht keinen Spaß.
Sobald 3-4 Dot Matrix Displays anzusteuern sind wachsen die Anzahl der ICs stark.

Man kann ja Nanos nehmen. Wenn das welche aus Fernost sind, kostet's auch nicht sooo viel :slight_smile:

Gruß

Gregor

Man kann auch diskrete Transistoren und Dioden nehmen, wenn das ohne MAX7219 schon so viel Spaß macht, dann macht das bestimmt noch viel mehr Spaß. :wink:

Gruß Tommy

Hallo,

Marco meint bestimmt sowas LED-Matrix – Mikrocontroller.net


Sag ich doch. Statt 1 IC nun 2 ICs, 16 Transistoren und 24 Widerstände (es fehlen im Schaltbild die Basiswiderstände der Trasnsistoren Q1 bis Q8)
Grüße Uwe

Mein Problem bei dem ganzen ist eben nicht das die Ansteuerung der LED´s durch die PIN Anzahl ein Problem, sondern ich möchte wissen, ob es eine Möglichkeit gibt den Text der auf der Matrix (8x8) wiedergegeben werden soll gescrollt wird von links nach rechts (eine durchlaufende Schrift). Dafür habe ich jedes Bild einzeln einprogrammiert und es abspielen lassen dadurch komm ich aber schnell an die grenzen des "Arbeitsspeichers" meines Arduinos.

Montan gibt es mir diese Meldung aus:
Globale Variablen verwenden 2002 Bytes (97%) des dynamischen Speichers, 46 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.
Wenig Arbeitsspeicher verfügbar, es können Stabilitätsprobleme auftreten.

Meine Bilder:
byte M01 = {
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000
};
byte M02 = {
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000
};
byte M03 = {
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B11111111
};
byte M04 = {
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B11111111,
B11111110
};
byte M05 = {
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B11111111,
B11111110,
B00011100
};
byte M06 = {
B00000000,
B00000000,
B00000000,
B00000000,
B11111111,
B11111110,
B00011100,
B00111000
};
byte M07 = {
B00000000,
B00000000,
B00000000,
B11111111,
B11111110,
B00011100,
B00111000,
B00011100
};
byte M08 = {
B00000000,
B00000000,
B11111111,
B11111110,
B00011100,
B00111000,
B00011100,
B11111110
};
byte M09 = {
B00000000,
B11111111,
B11111110,
B00011100,
B00111000,
B00011100,
B11111110,
B11111111
};
byte M1 = {
B11111111,
B11111110,
B00011100,
B00111000,
B00011100,
B11111110,
B11111111,
B00000000
};
byte M2 = {
B11111110,
B00011100,
B00111000,
B00011100,
B11111110,
B11111111,
B00000000,
B00000000
};
byte M3 = {
B00011100,
B00111000,
B00011100,
B11111110,
B11111111,
B00000000,
B00000000,
B00000000
};

Du brauchst die Bitwerte des gesamten Zeichensatzes bzw der von Dir darzustellenden Zeichen. Diese Infos können mittels progmem() im Flash bleiben und müssen nicht ins RAM.
Auch kannst Du so einen Animation entwerfen bei der Hintereinander die im Flash abgelegten Bilder angezeigt werden. siehe https://www.arduino.cc/reference/en/language/variables/utilities/progmem/

Im RAM hast Du nur den Bildspeicher (bei einem 8x8x Matrix ein Array mit 8 Elemente)

Dann mußt Du die Bitwerte für jede Darstellung nach links shiften ( << )
Also das erste Zeichen nach links shiften und einen Teil des nächsten in den entstanden Lücke einfügen.

Oder mit anderen Worten Du willst sowas machen: https://forum.arduino.cc/index.php?topic=203178.0

Grüße Uwe

Hallo,

wenn ich anmerken darf. Q1 - Q8 arbeiten als Impedanzwandler/Spannungsfolger, die Basiswiderstände werden nicht benötigt. Die Beschaltung hat einen hohen Eingangswiderstand, keine Spannungsverstärkung, nur Stromverstärkung.

Marco, dann war dein Eingangsposting komplett irreführend.

Zu deiner Frage. Ja es ist möglich. Darstellung erstellen, und dann nur noch alle Segmentwerte immer zur nächsten Spalte schiften.

Entschuldigt die Verwirrung. Ich werd das mit dem Flash versuchen und werde mich nach dann wieder melden

Danke an alle die was gepostet haben auch wenn die ersten postst nicht passend zu meiner Frage waren hab ich dennoch eine bessere Möglichkeit gefunden die Matrix anzusteuern
:smiley:

Grüße Marco

Doc_Arduino:
Hallo,

wenn ich anmerken darf. Q1 - Q8 arbeiten als Impedanzwandler/Spannungsfolger, die Basiswiderstände werden nicht benötigt. Die Beschaltung hat einen hohen Eingangswiderstand, keine Spannungsverstärkung, nur Stromverstärkung.

UPS, das sind ja NPN.
Uwe

MarcoMK:
Danke an alle die was gepostet haben auch wenn die ersten postst nicht passend zu meiner Frage waren.....

Dann solltest du zukünftig deine Frage besser formulieren, damit die auch richtig zu verstehen ist.

Ich habe nun auf all eure Ratschläge hin das ganze geändert und es komplett anders versucht nun komme ich an dem Punkt nicht weiter an dem ich das ganze shiften muss ich habe versucht diese von dem anderen Thread zu übernehmen bzw. passend umzuschreiben. Ganz geschafft habe ich dies nicht kann mir jemand helfen?

Ihr könnt jegliche Fehler anmerken :slight_smile:

8x8MatrixMK2_1.ino (12 KB)

Mein Tipp fürs Erste: Mach Deinen Code hübscher. Damit meine ich nicht die Blöcke aus Bitmustern sondern Einrückungen/Klammerungen/Zeilenlängen usw.

Gruß

Gregor

MarcoMK:
Ihr könnt jegliche Fehler anmerken :slight_smile:

na dann:

const byte  Zeichen[] = {32, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 33, 63};

das scheint mir ein wenig ungeschickt zu sein. Wenn das ein Mapping von deinem Charset auf ANSI/ASCII ist, wüde ich das ein wenig umsortieren und evtl. mit zwei ifs das blank und die Zahlen separieren.
Oder überhaupt die paar Sonderzeichen von 57 - 65 auch definieren, immer noch besser als so ein großes Array im Speicher zu halten ^^

unsigned char IMAGES[][8] = {

das charset würde ich den Progmem legen und nicht im RAM halten.

und durchsuche mal deinen Code auf int und überprüfe ob das wirklich unsigned 2 bytes überall braucht wo du das verwendest.

... wüde ich das ein wenig umsortieren ...

Der Größe nach?

SCNR

Gregor

Ja.
Aber bitte schon alles lesen was ich schrieb, es macht durchaus Sinn!

122, 48,

noch fragen?