Arduino Projekten

Tue 20-Aug-19
01:33:43




Eerste aansturing van een RGB Matrix Paneel

Datum: Wed 08 January 2014
Samenvatting: Om meer te begrijpen hoe een paneel werkt, is een eenvoudig experiment nodig.


Om beter te begrijpen hoe een component werkt, zijn experimenten nodig. Niet lukraak uitproberen, maar beredeneren wat er zou gebeuren en dan aansluiten, programmeren, uitbreiden en dan zien wat het doet. Zoals altijd, is er ook logisch denken nodig wanneer het niet doet wat wordt verwacht en dan corrigeren.

Zoals altijd met nieuwe projekten, begin ik eerst te bouwen voordat ik mij realiseer dat het nuttig is om tussentijds foto's te maken. Het enthousiasme om iets werkends te maken is duidelijk erg groot.

Mijn eerste doel is geweest dat er gewoon iets moest branden op het paneel. Nog geen complexe plaatjes, maar gewoon de schuifregisters op het paneel gebruiken zoals men vroeger looplichten liet werken.

Een paneel verbruikt maximaal 2 Ampere, er moet dus een goede voeding komen. Bij de plaatselijke computerwinkel Alcco is een kleine compakte voeding gehaald, die ruim aan de eis voldeed om minimaal 4 Ampere te kunnen leveren op de 5 Volt lijn(en). Voor PC's, is dat tussen de rode draad (+5 Volt = Vcc) en de zwarte draad (0 Volt = GND). Deze voeding kan 15 Ampere leveren, genoeg voor bijna 8 panelen ...

Nu de panelen aansluiten op de voeding en op de Arduino en het eerste experiment kon beginnen. Een eenvoudig programmaatje (Arduino noemt het "een Sketch", maar waarom zoveel synoniemen verzinnen (Sketch, App...) voor iets wat op het zelfde neerkomt) liet van 1 regel de LED's branden in de 8 basiskleuren.

En toen ... toen werd het leuk. Alle 8 regels van een helft snel scannen voor blokken gekleurd licht [Function Do Rows]. De opbouw is erg standaard, alle rijen heel snel doorlopen en dat een (groot) aantal keer (16384*4096=67.108.864 Of te wel heel erg veel voor ongeveer een seconde loop tijd). Al met al valt mij de snelheid van de Arduino heel erg mee. Deze functie bepaalt ook de loopsnelheid van de kleurenblokken.

Daarna moest er iets bij om eenvoudig de LED-data in het paneel te stoppen [SetCols]. Sterker nog: De twee helften van hun eigen data voorzien, resulterend in twee rijen met gekleurde vierkanten. Het kleurpatroon zelf is de Gray-code, of te wel, tussen elk blok varieerd maar 1 kleur in een RGB-LED. De andere helft heeft net het complement van de kleur.

Met enkele variabelen is gepoogd om meer variatie te maken in het patroon, zoals 2 kolomen erin schuiven en dan de delay. Of 4 kolommen erin schuiven en dan pas de delay.

Ik heb twee panelen en ze kunnen achter elkaar worden aangesloten. Dus dan moet dat ook maar meteen gebeuren. Dit geeft 1 langwerpig kleurenvlak van 16x64 LED's

Het zal ook zo wezen dat niet alles gaat zoals bedoeld, de foto's laten zien dat de Gray-Code wel werkt op de onderste helft, in plaats van de op de geplande bovenste helft. Maar op dit moment zie ik dat als details. Het eerste experiment is wat mij betreft gelukt. Van deze basis kan ik verder uitbreiden tot iets om plaatjes op de panelen te tonen.

Om over na te denken: De regels moeten via een interupt worden geregeld, net als het sturen van de data naar de LED's.


Broncode: [1: Gekleurde blokken.]

1: De broncode van Gekleurde blokken.

(Wed 08 January 2014) De source code van dit eerste experiment.

Deze broncode heeft 105 regels met programma-code.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
/*     ---------------------------------------------------------
 *     |  Experimentation Kit for Arduino Example Code         |
 *     |  RGBMatrix : RGB Matrix                               |
 *     ---------------------------------------------------------
 */


//RGB Pin Definitions
int r1  =  2;  // Red 1
int g1  =  3;  // Green 1
int b1  =  4;  // Blue 1

int r2  =  5;  // Red 2
int g2  =  6;  // Green 2
int b2  =  7;  // Blue 2

int a   = A0;  // Address A (A0)
int b   = A1;  // Address B (A1)
int c   = A2;  // Address C (A2)

int clk =  8;  // Clock
int oe  =  9;  // outEnable
int lat = 10;  // Latch


void setup()
{
pinMode(r1 , OUTPUT);   // Set as outputs
pinMode(g1 , OUTPUT);   // Set as outputs
pinMode(b1 , OUTPUT);   // Set as outputs

pinMode(r2 , OUTPUT);   // Set as outputs
pinMode(g2 , OUTPUT);   // Set as outputs
pinMode(b2 , OUTPUT);   // Set as outputs

pinMode(a  , OUTPUT);   // Set as outputs
pinMode(b  , OUTPUT);   // Set as outputs
pinMode(c  , OUTPUT);   // Set as outputs

pinMode(clk, OUTPUT);   // Set as outputs
pinMode(oe , OUTPUT);   // Set as outputs
pinMode(lat, OUTPUT);   // Set as outputs
}

void loop()
{
int d1= 1;
int d2= 8;

SetCols(0,0,1 , d1,d2);
SetCols(0,1,1 , d1,d2);
SetCols(0,1,0 , d1,d2);
SetCols(1,1,0 , d1,d2);
SetCols(1,1,1 , d1,d2);
SetCols(1,0,1 , d1,d2);
SetCols(1,0,0 , d1,d2);
SetCols(0,0,0 , d1,d2);
}

void SetCols (int rr, int gg, int bb, int aant1, int aant2)
{
for (int ww=0; ww<aant2; ww=ww+1)
  {
  for (int qq=0; qq<aant1; qq=qq+1)
    {
      digitalWrite(oe , HIGH);
      //-------------------------------------------------------------------------------------
      digitalWrite(r1 , rr);
      digitalWrite(g1 , gg);
      digitalWrite(b1 , bb);
      //-------------------------------------------------------------------------------------
      digitalWrite(r2 , 1-rr);
      digitalWrite(g2 , 1-gg);
      digitalWrite(b2 , 1-bb);
      //-------------------------------------------------------------------------------------
      digitalWrite(clk, HIGH);
      digitalWrite(clk, LOW );
      //-------------------------------------------------------------------------------------
      digitalWrite(lat, LOW );
      digitalWrite(lat, HIGH);
      //-------------------------------------------------------------------------------------
      digitalWrite(oe , LOW );
      //-------------------------------------------------------------------------------------
    }
    DoRows(0);
  }
}

void DoRows (int ww)
{
//-------------------------------------------------------------------------------------
  for (int ww=0; ww<4096; ww=ww+1)
    {
    for (int qq=0; qq<16384; qq=qq+1);
      {
      digitalWrite(c  , HIGH);  digitalWrite(b  , HIGH);  digitalWrite(a  , HIGH);
      digitalWrite(c  , HIGH);  digitalWrite(b  , HIGH);  digitalWrite(a  , LOW );
      digitalWrite(c  , HIGH);  digitalWrite(b  , LOW );  digitalWrite(a  , HIGH);
      digitalWrite(c  , HIGH);  digitalWrite(b  , LOW );  digitalWrite(a  , LOW );
      digitalWrite(c  , LOW );  digitalWrite(b  , HIGH);  digitalWrite(a  , HIGH);
      digitalWrite(c  , LOW );  digitalWrite(b  , HIGH);  digitalWrite(a  , LOW );
      digitalWrite(c  , LOW );  digitalWrite(b  , LOW );  digitalWrite(a  , HIGH);
      digitalWrite(c  , LOW );  digitalWrite(b  , LOW );  digitalWrite(a  , LOW );
      }
    }
//-------------------------------------------------------------------------------------


Broncode: [1: Gekleurde blokken.] 

Afbeeldingen

paneel01_1.jpg
1/6: paneel01_1.jpg.
paneel01_2.jpg
2/6: paneel01_2.jpg.
paneel01_3.jpg
3/6: paneel01_3.jpg.
paneel01_4.jpg
4/6: paneel01_4.jpg.
paneel01_5.jpg
5/6: paneel01_5.jpg.
paneel01_6.jpg
6/6: paneel01_6.jpg.

De aansluitingen van Basis aansluitingen.

De basis-aansluitingen van de Arduino Library

Arduino Uno

Pwr USB ?
 
?
aref
gnd Gnd's (4x)
? d13
ioreff d12
reset d11
+3.3v d10 Stb = Lat
+5v d9 Oe
Gnd's (4x) gnd d8 Clk
Gnd's (4x) gnd
Vin d7 B2
d6 G2
A     (A0) a0 d5 R2
B     (A1) a1 d4 B1
C     (A2) a2 d3 G1
a3 d2 R1
a4 d1
a5 d0