adafruit rgb panel array fuellen

Hallo ich habe Eine Frage zur Lib. Von Adafruit.
Und zwar habe ich mir ein RGB Panel gekauft und soweit getestet. Nun möchte ich aber meine eigenen Bilder anzeigen lassen und verstehe nicht wie die Pixel in einem Array gesetzt werden.
Es gibt ein Bsp. In dem Link:

Ich verstehe, dass wir einen Pixeltiefe von 8Bit haben, aber wir haben ja mehr als 1024Byte in dem Array. Ich habe herausgefunden, dass 14Byte fuer die Ansteuerung von den Chips die ich hinten gefunden haben gebraucht wird.

Kann mir evt. Jmd erklären wie sich dieses Array zusammensetzt, denn ich bin langsam ratlos.

Gruß

Genaueres steht in der Bibliothek. Es sieht aber so aus, als ob die Bits so kompliziert angeordnet sind, daß sich daraus keine (einfache) Beschreibung erstellen läßt :frowning:

Ich würde diese Bibliothek nicht ohne ein Programm benutzen, mit dem sich Muster in verständlicher Form eingeben lassen. Gefunden habe ich allerdings nichts dergleichen, vielleicht hast Du mehr Erfolg?

Hast Du Creating GIFs for SmartMatrix gelesen?

agmue:
Hast Du Creating GIFs for SmartMatrix gelesen?

Das nützt (derzeit) nichts, da steht nur drin, wie man aus einer Quelle ein passendes Bild ausschneidet.

Ich möchte live beliebige, auf dem PC/Mac erstellte Bilder auf das Display "beamen". Dazu werde ich so vorgehen:

  1. ich verwende diese Lib mit den Beispielprogrammen: GitHub - adafruit/RGB-matrix-Panel: Arduino library and example code for the 16x32 RGB matrix panels in the shop
  2. ich bin gerade dabei, mir die Funktion "RGBmatrixPanel::dumpMatrix" anzusehen. Die liefert einen Dump der Matrix. Wenn ich sie verstanden habe, werde ich eine eigene Funktion bauen, die das Prinzip quasi umkehrt und Daten direkt in die Matrix schreibt
  3. ich stelle die Kommunkiation von Seriell auf Ethernet/UDP um
  4. zur Steuerung vom PC/Mac aus verwende ich ein selbstgeschriebenes Programm (verwende RealBasic/Xojo)

Ich verwende einen Mega an einem 32x64 Panel, aber sonst sollten sich viele Gemeinsamkeiten ergeben. Wir können ja diesbezüglich in Kontakt bleiben.

Ich werde den Verdacht nicht los, daß es eine Standard-Bibliothek zu solchen Displays gibt, und Du eine alternative Bibliothek benutzst, mit der Du Dir die Probleme selbst eingebrockt hast.

Wieso nimmst Du nicht die Adafruit_GFX Bibliothek, und z.B. drawBitmap()? Dazu gibt es schon Programme zum Umwandeln diverser Bild-Formate in Daten-Arrays.

hi,

also für mich sieht es so aus:

es sind 1536 byte, jede RGB-LED brauch drei bytes (rot, grün, blau), also ist das array für 512 LEDs.

zB. ein 32 x 16 panel.

gruß stefan

Ne, geht nicht, dafür hat ein Uno/Nano zu wenig Speicher.

Es werden pro Pixel nur 2 Byte verwendet, je 5/6/5 Bit für R/G/B. Diese Trickserei ist wegen des knappen Speichers notwendig - dann geht es "knack auf knirsch". Daraus ergeben sich dann auch die "etwas seltsamen" Bytewerte ...

qualidat:
Es werden pro Pixel nur 2 Byte verwendet, je 5/6/5 Bit für R/G/B. Diese Trickserei ist wegen des knappen Speichers notwendig - dann geht es “knack auf knirsch”. Daraus ergeben sich dann auch die “etwas seltsamen” Bytewerte …

Das nennt sich High Color und war früher auch auf PCs weit verbreitet. 6 Bit für Grün wird genommen weil das Auge für Grün empfindlicher ist.

hi,

wieder was gelernt, das mit 5/6/5 kannte ich nicht. eigentlich eine kluge lösung, aber wozu heutzutage eigentlich?

ich würde ein panel aus LEDs mit clk-ansteuerung nehmen. dann ist das tempo, mit dem ich die daten sende, doch.egal, und man kann die daten über seriell vom pc schicken, oder von SD-karte lesen oder was auch immer.

das bild, das man senden will, einfach als 24bit-windows-bitmap (*.bmp) speichern, da stehn dann wunderschön alle rgb-werte hintereinander.

übrigens: ist dann das verlinkte array für 32 x 24 ? seltsames format...

gruß stefan

Eisebaer:
hi,wieder was gelernt, das mit 5/6/5 kannte ich nicht. eigentlich eine kluge lösung, aber wozu heutzutage eigentlich?

Das gesamte Bild muss gepuffert werden, um es flimmerfrei darzustellen. Aber ein Uno/Nano hat nur 2kb (2048 Byte!) RAM - deshalb sind die Tricksereien notwendig.

hi,

bei LEDs mit clocksignal muß doch nicht das ganze array gespeichert werden. die daten können vom PC oder der SD-karte blockweise empfangen/abgerufen werden und dann in häppchen in die LEDs geschickt werden. jedenfalls stell ich mir das so vor, oder lieg' ich da falsch?

gruß stefan

EDIT: flimmerfrei verstehe ich garnicht. klar, mit dieser methode dauert der bildaufbau länger, aber sonst?

Hey, Danke für die vielen Antworten hatte leide viel zu tun. Ich habe nun mal einen Sketch geschrieben der sich nur der Funktion matrix.drawPixel(); bedient.

Ich habe leider festgestellt, dass wenn ich die ganze Matrix auf 0xFF zeichnen möchte die ersten Pixel noch weiß sind aber mit zunehmendem Index sich orange färben.
Habe bisher noch keine Erklärung gefunden. Für diejenigen die evt. Interesse haben:

#include <Adafruit_GFX.h>   // Core graphics library
#include <RGBmatrixPanel.h> // Hardware-specific library
#include "Bild.h"

#define OE   9
#define LAT 10
#define CLK 11
#define A   A0
#define B   A1
#define C   A2
#define D   A3

#define MATRIXL  64
#define MATRIXB  32
#define PIXELTIEFE  8

RGBmatrixPanel matrix(A, B, C, D, CLK, LAT, OE, false,64);

void setup() {
  Serial.begin(115200);


uint8_t PROGMEM img[]={
   0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF ,0xFF,0xFF,
  0xFF,0xFF,0xFF ,0xFF,0xFF,0xFF, 0xFF,0xFF,
   0xFF,0xFF,0xFF ,0xFF,0xFF,0xFF ,0xFF,0xFF,
    0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF, 0xFF,0xFF,
     0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF ,0xFF,0xFF,
      0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF, 0xFF,0xFF,
       0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF ,0xFF,0xFF,
};

int i=0,r=0,g=0,b=0,j=0,k=0;

matrix.begin();
for(i=1; i<10;i++){
 for(k=1; k<64+1;k++){
   // Pixeldaten umwandeln in 8 Bit Und verknüpfung danach auf 1ner Schieben dann mit Faktor multiplizieren
   r = ((img[k*i]&0x80)>>7)*4 + ((img[k*i]&0x40)>>6)*2 + ((img[k*i]&0x20)>>5); //Rot 1110 0000
   g = ((img[k*i]&0x10)>>4)*4 + ((img[k*i]&0x8)>>3)*2 + ((img[k*i]&0x4)>>2);// Grün  0001 1100
   b = ((img[k*i]&0x2)>>1)*4 + ((img[k*i]&0x1))*3;// Blau 0000 0011
   matrix.drawPixel(k-1,i-1, matrix.Color333(r,g,b));
     r=0;g=0;b=0;  //Pixel zurücksetzen
      Serial.println(img[i*k]);
 }
}

}//Setup

Gruß Nassim :slight_smile: