Forum: Mikrocontroller und Digitale Elektronik Probleme mit 8x8RGB Matrix


von Michele S. (dragonthb)


Angehängte Dateien:

Lesenswert?

Hallöchen

Ich habe ein bisschen Probleme mit meiner RGB Matrix ich hatte die 
letztens so zum Spaß aufgebaut. Doch jetzt habe ich das Problem, das ich 
nicht weis wie ich am besten die LED´s dimme und mische. Ich bekomme es 
zwar teilweise hin doch ist das recht aufwendig. ich hatte mir letztens 
ein Programm geschrieben um Bilder zu erzeugen. Doch kann das Programm 
nur die einfachen Töne Blau,Rot und Grün erzeugen. Ich habe mal ein 
Prinziepschaltbild hoch geladen das Bild zeigt zwar nur eine 3x3 Matrix 
und ich habe aber 8x8 Matrix, aber zum verdeutlichen müsste es reichen. 
Ich steuere alle Transistoren direkt von einem Arduino Mega 2560 Board 
an, da es sich ja nur um 36 Pins handelt. Hier ist mal ein Beispiel wie 
ich 3 LED´s in reihe schalten würde.

Die Variable "Hilfe" Dient zum Zählen der erzeugten Bilder.
Die Variable "ausgleich" dient dazu, dass ein Bild welches nur 1 Pixel 
zeigt genau so lange dauert wie ein Bild was 64 Pixel zeigt.
Die Variable "Zwischenzeit" dient dazu, dass ich die LED´s nicht mit 
System Takt schalte.

Kann mir vielleicht eine Helfen wie ich die Farben am besten mischen und 
dimmen kann. Weil in meinem Fall geht es ja nicht das ich auf einen Pin 
ein PWM Signal gebe wenn ich die Pins alle 550 µS schalte.
1
void setup(){
2
pinMode(2, OUTPUT); 
3
pinMode(3, OUTPUT); 
4
pinMode(4, OUTPUT); 
5
pinMode(5, OUTPUT); 
6
pinMode(6, OUTPUT); 
7
pinMode(7, OUTPUT); 
8
pinMode(8, OUTPUT); 
9
pinMode(9, OUTPUT); 
10
pinMode(22, OUTPUT); 
11
pinMode(24, OUTPUT); 
12
pinMode(26, OUTPUT); 
13
pinMode(28, OUTPUT); 
14
pinMode(30, OUTPUT); 
15
pinMode(32, OUTPUT); 
16
pinMode(34, OUTPUT); 
17
pinMode(36, OUTPUT); 
18
pinMode(38, OUTPUT); 
19
pinMode(40, OUTPUT); 
20
pinMode(42, OUTPUT); 
21
pinMode(44, OUTPUT); 
22
pinMode(46, OUTPUT); 
23
pinMode(48, OUTPUT); 
24
pinMode(50, OUTPUT); 
25
pinMode(52, OUTPUT); 
26
27
28
}
29
void loop(){
30
  int Hilfe=1;
31
  int Zwischenzeit =550;
32
  int Frames =0;
33
 int ausgleich=0;
34
 int Framezahl=10;
35
 while(1)
36
 {
37
 
38
ausgleich=16;
39
Frames=ausgleich*Framezahl;
40
while(Hilfe<Frames)
41
{
42
digitalWrite(9, HIGH);
43
digitalWrite(36, HIGH);
44
delayMicroseconds(Zwischenzeit);
45
digitalWrite(9, LOW);
46
digitalWrite(36, LOW);
47
digitalWrite(8, HIGH);
48
digitalWrite(36, HIGH);
49
delayMicroseconds(Zwischenzeit);
50
digitalWrite(8, LOW);
51
digitalWrite(36, LOW);
52
digitalWrite(7, HIGH);
53
digitalWrite(36, HIGH);
54
delayMicroseconds(Zwischenzeit);
55
digitalWrite(7, LOW);
56
digitalWrite(36, LOW);
57
digitalWrite(6, HIGH);
58
digitalWrite(36, HIGH);
59
delayMicroseconds(Zwischenzeit);
60
digitalWrite(6, LOW);
61
digitalWrite(36, LOW); 
62
Hilfe++;
63
}
64
Hilfe=0;
65
 } 
66
 }

von Max H. (hartl192)


Lesenswert?

Es wäre hilfreich, wenn du den gesamten Schaltplan posten würdest oder 
zumindest bei deinem die Pinnummern hinzufügst.

Ich vermute etwas bei deine Hardware ist suboptimal. Für eine 8x8 
RBG-Matrix reichen meiner Meinung nach 24 Pins nicht. Eine 8x8 RGB 
Matrix ist elektrisch meist eine 8x24 Matrix.

Um + zu schalten verendet man normalerweise PNP-Transistoren.

: Bearbeitet durch User
von Bla (Gast)


Lesenswert?

Also, wenn du die LEDs so angeschlossen hast, bleiben sie dunkel.

von Gibts N. (schneeblau)


Lesenswert?

Genau, die sind nämlich falschrum drinne;)

von MaWin (Gast)


Lesenswert?

Gibts Ne schrieb:
> Genau, die sind nämlich falschrum drinne;)

Nicht nur das, wenn das jeweils R G B nebeneinander sind, verwenden die 
deselben Vorwiderstand und sind parallelgeschaltet - da leuchtet nur die 
rote.

Es ist immer wieder erstaunlich, warum Leute das Rad jedesmal falsch 
erfinden müssen, und sich weigern, vorher nachzugucken, wie andere das 
erfolgreich aufgebaut haben.

von Max H. (hartl192)


Lesenswert?

Gibts Ne schrieb:
> Genau, die sind nämlich falschrum drinne;)
MaWin schrieb:
> und sind parallelgeschaltet

Michele S. schrieb:
> Hier ist mal ein Beispiel wie
> ich 3 LED´s in reihe schalten würde.
Wenn er mal den gesamten Schaltplan posten würde, würden wir Wissen 
welche dieser Fehler er wirklich gemacht hat...

: Bearbeitet durch User
von Michele S. (dragonthb)


Lesenswert?

Ach habe den schaltplan gerade nur erstellt um euch zu zeigen wie es 
aufgebaut ist. Habe die LED´s ausversehen falsch herum eingezeichnet. 
Die Schaltung funktioniert das ist nicht das Problem es geht nur darum 
faben zu mischen. Das ist schon die ganze Schaltung ich könnte höchstens 
noch an die Transistoren Zahlen von von 1-32 Schreiben ich habe mich 
oben verschrieben ich brauche natürlich keine 36Pins sondern nur 32.

8xAnode
8xKathode Blau
8xKathode Rot
8xKathode Grün

Wie schon gesagt würde ich es auch an sich hinbekommen die Farben zu 
dimmen. Nur wäre es dan sehr aufwändig weil ich dan in manchen Frames ab 
und zu die LED länger dunkel lassen müsste was keine schöne Lösung wäre.

: Bearbeitet durch User
von Max H. (hartl192)


Lesenswert?

Michele S. schrieb:
> Die Schaltung funktioniert das ist nicht das Problem es geht nur darum
> faben zu mischen.
Was ist dein Problem beim Mischen? Hättest du auch ein Problem, wenn du 
z.B. Magenta ( R 100%, G 100%, B 0%); mischen willst? Oder geht es dir 
dabei auch ums dimmen?


Michele S. schrieb:
> digitalWrite(9, LOW);
> digitalWrite(36, LOW);
> digitalWrite(8, HIGH);
> digitalWrite(36, HIGH);
Wieso schaltest du Pin 36 immer wieder von '1' auf '0' und dann wider 
auf '1'?
Wenn Pin 36 die Anoden steuert würde man das so machen:
Alles Kathoden ein-/ausschalten
Anode1 auf '1'
Delay
Anode1 auf '0'
Alles Kathoden ein-/ausschalten
Anode2 auf '1'
Delay
Anode2 auf '0'
Alles Kathoden ein-/ausschalten
Anode3 auf '1'
Delay
Anode3 auf '0'
Alles Kathoden ein-/ausschalten
Anode4 auf '1'
...
Normalerweise schaltet man nicht jede LEDs einzeln, sondern Zeilenweise.
Hier eine kurze Animation dazu: 
http://www.franksworkshop.com.au/Electronics/RGB/multiplex_ani/multiplex.gif

von Michele S. (dragonthb)


Lesenswert?

Ja das mit dem Zeilenweise schalten stimmt dadurch könnte ich die 
Leistung etwas verbessern und den Quelcode verkürzen.

Mangan wäre jetzt kein Problem einfach 2 LEDs anzumachen aber z.b.
R 70%, G 50%, B 20%

Weil der PWM Ausgang Des Arduino Funktioniert ja mit 490HZ das bedeutet 
ja eine Periode dauert 2,04x10Hoch-3 Sekunden. Bei mir dauert ein 
Schaltvorgang der LED ja aber nur ca 500x10Hoch-6 Sekunden.

: Bearbeitet durch User
von Max H. (hartl192)


Angehängte Dateien:

Lesenswert?

Das Dimmen würde ich mit bit angle Modulation machen.
Für 8bit BAM musst du jeden Frame 8-mal ausgeben.

Jedes bit des PWNM-Registers wir einmal ausgegeben. Das MSb wird
8-mal so lange wie das LSb ausgegeben.

In Anhang eine kurze Erklärung.

: Bearbeitet durch User
von Michele S. (dragonthb)


Lesenswert?

Das hört sich sehr gut an es erinnert mich auch an eine Sache die ich 
bereits ausprobiert hatte. Danke

von Max H. (hartl192)


Lesenswert?

Michele S. schrieb:
> Das hört sich sehr gut an es erinnert mich auch an eine Sache die ich
> bereits ausprobiert hatte. Danke
Es hat den Vorteil gegenüber normalem PWM, dass man viel weniger CPU 
Auslastung hat. Ich einem 10bit PWM mit 100Hz zum Vergleich mit beiden 
Methoden auf einem PIC24 (@32MHz) gemacht:
PWM: ~11% CPU Auslastung
BAM: ~0.18% CPU Auslastung
Beides in Software natürlich.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.