Forum: Mikrocontroller und Digitale Elektronik 64x32 RGB LED Panel (p3-6432-2121-16s-d1.0)


von Info (Gast)


Angehängte Dateien:

Lesenswert?

Hi, leider bekomme ich das 64x32 RGB Panel "p3-6432-2121-16s-d1.0" nicht 
zum Laufen.

So sieht die Rückseite aus:
https://ae01.alicdn.com/kf/HTB1M92ThZnI8KJjSsziq6z8QpXag/192-96mm-64-32pixels-1-16-Scan-Indoor-SMD2121-RGB-full-color-P3-LED-module-for.jpg

Das Panel hat offenbar einen "Hub75"(-ähnlichen) Anschluss mit 2x8 Pins.
Infos dazu:

https://learn.adafruit.com/32x16-32x32-rgb-led-matrix?view=all
https://web.archive.org/web/20121201205905/http://www.hobbypcb.com/blog/item/3-16x32-rgb-led-matrix-technical-details.html
http://fw.hardijzer.nl/?p=223
http://bikerglen.com/projects/lighting/led-panel-1up/
https://github.com/hzeller/rpi-rgb-led-matrix/blob/master/wiring.md


Ich gehe bislang von dieser Belegung aus (in Aufsicht, Pin 1 links 
oben):
1
 1:R1   2:G1
2
 3:B1   4:GND
3
 5:R2   6:G2
4
 7:B2   8:? (kein GND, unbelegt, aber auch LOW hat keinen Einfluss)
5
 9:A   10:B
6
11:C   12:D
7
13:CLK 14:STB
8
15:#OE 16:GND


Die beiden GNDs sind auf dem PCB verbunden.


ICs:

 3x DP74HC245
 4x TC7258E
24x ICN2028BP

Ich benutze ein STM32F103C "blue pill" board via stm32duino und Arduino 
IDE.

Dieses Programm
1
#define R1  PB3
2
#define G1  PB4
3
#define B1  PB5
4
#define R2  PB6
5
#define G2  PB7
6
#define B2  PB8
7
8
#define A   PA15
9
#define B   PA10
10
#define C   PA9
11
#define D   PA8
12
13
#define LAT PB14
14
#define CLK PB15
15
#define OE  PB13
16
17
18
void shift(uint32_t data){
19
20
   digitalWrite(LAT,LOW);
21
22
   for (uint8_t n=0; n<8; n++) {  // s.u.
23
      digitalWrite(CLK,LOW);
24
      if( 1L<<n & data )
25
        digitalWrite(R1,HIGH);
26
      else
27
        digitalWrite(R1,LOW);
28
      digitalWrite(CLK,HIGH);
29
    }
30
31
    digitalWrite(OE,HIGH);
32
    digitalWrite(LAT,HIGH);
33
    //ROW
34
    digitalWrite(OE,LOW);
35
}
36
37
38
void setup() {
39
    
40
    pinMode(PC13, OUTPUT);
41
42
    Serial.begin(115200);
43
    while( !Serial );
44
    Serial.println("Hello World!");
45
    
46
    pinMode(R1 , OUTPUT);
47
    pinMode(G1 , OUTPUT);
48
    pinMode(B1 , OUTPUT);
49
50
    pinMode(B2 , OUTPUT);
51
    pinMode(R2 , OUTPUT);
52
    pinMode(G2 , OUTPUT);
53
    
54
    pinMode(A  , OUTPUT);
55
    pinMode(B  , OUTPUT);
56
    pinMode(C  , OUTPUT);
57
    pinMode(D  , OUTPUT);
58
    
59
    pinMode(LAT, OUTPUT);
60
    pinMode(CLK, OUTPUT);
61
    pinMode(OE , OUTPUT);
62
63
    
64
    digitalWrite(CLK,LOW);
65
    digitalWrite(LAT,LOW);
66
    digitalWrite(OE,LOW);
67
68
    digitalWrite(A,LOW);
69
    digitalWrite(B,LOW);
70
    digitalWrite(C,LOW);
71
    digitalWrite(D,LOW);
72
    
73
    digitalWrite(R1,LOW);
74
    digitalWrite(G1,LOW);
75
    digitalWrite(B1,LOW);
76
    digitalWrite(R2,LOW);
77
    digitalWrite(G2,LOW);
78
    digitalWrite(B2,LOW);
79
        
80
}
81
82
void loop() {
83
    digitalWrite(PC13,!digitalRead(PC13));
84
    
85
86
    shift(0x0F);
87
    delay(100);
88
    
89
    shift(0xF0);
90
    delay(100);
91
    
92
}

Erzeugt z.B. die Signale im Anhang. Alles anderen sind LOW.
Die "Aufnahme" erfolgte über eine zusätzliche Schneid-Klemm-Leiste am 
beigelegten Flachbandkabel, 1:1 neben dem Leiterplattenverbinder.

Ja, ich schiebe hier nur 8 Bits, und eigentlich müsste das ein 
16-Kanal-Treiber sein, der laut dem unbrauchbaren "Datenblatt" sogar 
zwei Schieberegister enthält(?). Aber auch 16 oder 32 Bits haben keine 
Anzeige gebracht. Ich mache also etwas falsch - nur was?

Das Panel geht grundsätzlich, beim Flashen des Prozessors zucken einige 
LEDs (ziemlich hell, das Ding).

von Info (Gast)


Lesenswert?

Mal durchgeklingelt:
1
PUT_IN
2
 1: R1  -> U1.2 A0 -> B0 -> UR1.2 (UR1.22 -> UR2.2, UR2.22 -> UR5.2, UR5.22 -> UR6.2)
3
 2: G1  -> U1.3 A1 -> B1 -> UG1.2
4
 3: B1  -> U1.4 A2 -> B2 -> UB1.2
5
 4: GND
6
 5: R2  -> U3.2 A0 -> B0 -> UR3.2
7
 6: G2  -> U3.3 A1 -> B1 -> UG3.2
8
 7: B2  -> U3.4 A2 -> B2 -> UB3.2
9
 8: ?   -> U3.9 A7 -> B7 -> PUT_OUT.8
10
 9: A   -> U2.5 A3 -> B3 -> T1/2/3/4.15
11
           U2.6 A4 -> B4 -> PUT_OUT.9 
12
10: B   -> U2.4 A2 -> B2 -> T1/2/3/4.16
13
           U2.7 A5 -> B5 -> PUT_OUT.10
14
11: C   -> U2.3 A1 -> B1 -> T1/2/3/4.2
15
           U2.8 A6 -> B6 -> PUT_OUT.11
16
12: D   -> U2.2 A0 -> B0 -> T2/4.7
17
           U2.9 A7 -> B7 -> PUT_OUT.12
18
13: CLK -> U1.5 A3 -> B3 -> UR/G/B/1/2/5/6.3
19
           U1.6 A4 -> B4 -> PUT_OUT.13 
20
           U3.8 A6 -> B6 -> UR/G/B/3/4/7/8.3
21
14: STB -> U1.9 A7 -> B7 -> UR/G/B/1/2/5/6.4
22
           U3.5 A3 -> B3 -> PUT_OUT.14
23
           U3.6 A4 -> B4 -> UR/G/B/3/4/7/8.4 
24
15: #OE -> U1.7 A5 -> B5 -> UR/G/B/1/2/5/6.21 
25
           U1.8 A6 -> B6 -> PUT_OUT.15
26
           U3.7 A5 -> B5 -> UR/G/B/3/4/7/8.21 
27
16: GND

von Info (Gast)


Lesenswert?

TC7258E
Dieses Datenblatt stimmt überein:
http://www.superchip. 
cn/Private/ProductFiles/6364584403048069321406626239.pdf
Damit ist eine Ergänzung erforderlich:
1
12: D   -> U2.2 A0 -> B0 -> T2/4.7 & T1/3.10

D schaltet also zwischen den Zeilentreiber-Paaren um.

von Info (Gast)


Angehängte Dateien:

Lesenswert?

Einen chinesischen Artikel zum IC gibt es hier

http://www.21ic.com/np/ce/201604/672866.htm bzw. hier 
https://translate.google.com/translate?sl=auto&tl=en&js=y&prev=_t&hl=en&ie=UTF-8&u=http%3A%2F%2Fwww.21ic.com%2Fnp%2Fce%2F201604%2F672866.htm&edit-text=&act=url

Gibt aber außer Timing-Diagrammen zur Darstellung der Vorzüge der zwei 
Latches/Register ggü. "herkömmlichen" ICs auch nicht viel her.

Ich habe es nun aber zufällig zum Laufen gebracht: es geht aus mir 
unbekannten Gründen nur, wenn die Zeilen gewechselt werden.
Und das Umschalten der Zeilen muss man auf jeden Fall bei deaktivierter 
Ausgabe machen, sonst gibt es Ghosting.

Bildaufbau ist von links nach rechts (das erste Bit ist links).
1
#define R1  PB3
2
#define G1  PB4
3
#define B1  PB5
4
#define R2  PB6
5
#define G2  PB7
6
#define B2  PB8
7
8
#define A   PA15
9
#define B   PA10
10
#define C   PA9
11
#define D   PA8
12
13
#define LAT PB14
14
#define CLK PB15
15
#define OE  PB13
16
17
18
uint8_t line = 0;
19
20
void shift(uint64_t data){
21
22
   for (uint8_t n=0; n<64; n++) {
23
      
24
      if( ((uint64_t)1<<n) & data ){
25
        digitalWrite(R1,HIGH);
26
        digitalWrite(G2,HIGH);
27
      }
28
      else {
29
        digitalWrite(R1,LOW);
30
        digitalWrite(G2,LOW);
31
      }
32
33
      #if 1
34
      if(n==63){
35
        digitalWrite(B1,HIGH);
36
        digitalWrite(B2,HIGH);
37
      }
38
      else {
39
        digitalWrite(B1,LOW);
40
        digitalWrite(B2,LOW);
41
      }
42
      #endif
43
44
      digitalWrite(CLK,LOW);
45
      digitalWrite(CLK,HIGH);
46
    }
47
48
    digitalWrite(LAT,LOW);
49
    digitalWrite(LAT,HIGH);
50
51
    digitalWrite(OE,HIGH);
52
53
    #if 1
54
55
    if(line & 1)
56
      digitalWrite(A,HIGH);
57
    else
58
      digitalWrite(A,LOW);
59
60
    if(line & 2)
61
      digitalWrite(B,HIGH);
62
    else
63
      digitalWrite(B,LOW);
64
65
    if(line & 4)
66
      digitalWrite(C,HIGH);
67
    else
68
      digitalWrite(C,LOW);
69
70
    if(line & 8)
71
      digitalWrite(D,HIGH);
72
    else
73
      digitalWrite(D,LOW);
74
    
75
    #endif
76
    
77
    digitalWrite(OE,LOW);
78
    
79
}
80
81
82
void setup() {
83
    
84
    pinMode(PC13, OUTPUT);
85
86
    Serial.begin(115200);
87
    while( !Serial );
88
    Serial.println("Hello World!");
89
    
90
    pinMode(R1 , OUTPUT);
91
    pinMode(G1 , OUTPUT);
92
    pinMode(B1 , OUTPUT);
93
94
    pinMode(B2 , OUTPUT);
95
    pinMode(R2 , OUTPUT);
96
    pinMode(G2 , OUTPUT);
97
    
98
    pinMode(A  , OUTPUT);
99
    pinMode(B  , OUTPUT);
100
    pinMode(C  , OUTPUT);
101
    pinMode(D  , OUTPUT);
102
    
103
    pinMode(LAT, OUTPUT);
104
    pinMode(CLK, OUTPUT);
105
    pinMode(OE , OUTPUT);
106
107
    
108
    digitalWrite(CLK,LOW);
109
    digitalWrite(LAT,LOW);
110
    digitalWrite(OE,LOW);
111
112
    digitalWrite(A,LOW);
113
    digitalWrite(B,LOW);
114
    digitalWrite(C,LOW);
115
    digitalWrite(D,LOW);
116
    
117
    digitalWrite(R1,LOW);
118
    digitalWrite(G1,LOW);
119
    digitalWrite(B1,LOW);
120
    digitalWrite(R2,LOW);
121
    digitalWrite(G2,LOW);
122
    digitalWrite(B2,LOW);
123
        
124
}
125
126
127
128
void loop() {
129
    digitalWrite(PC13,!digitalRead(PC13));
130
131
    shift( line | (uint64_t)1<<31 );
132
    if(++line > 15)
133
      line = 0;
134
    
135
    delay(10);    
136
}
-> Public Domain.

von Jan (Gast)


Lesenswert?

Hallo,

läuft es bei Dir jetzt stabil? Habe auch eine Weile romprobiert, und 
festgestellt, dass der 2. GND Anschluss (der unter der G1, welchen du 
nicht genau spezifizieren konntest) der E-Pin ist. Entsprechende 
Verbindung hergestellt, und es funktioniert.

Gruß Jan

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.