Samenstelling voor de Mega Unit
Datum: Fri 23 January 2015
Samenvatting: Alle units worden samengevoegd via een Mega Protoshield, zodat de Arduino Mega alles kan aansturen.
Om alle units op de Arduino Mega aan te sluiten, die alles met elkaar laat werken, is besloten om dit via een zogeheten Mega Protoshield te doen. Hierop moeten diverse print-connctors worden gesoldeerd en worden verbonden met de diverse I/O-pinnen van de Mega.
Maar eerst zijn de diverse units gemonteerd op de bodem van het RGB Led Matrix Paneel. Hiervoor zijn lange M3 schroeven gebruikt met moeren en (kunststof) sluitringen. Van een PC-verloopkabel zijn een zwarte en gele draad gebruikt en deze zijn gesoldeerd op de adapter-aansluiting op de Mega. Waarom geel en niet rood? De Gele draad staat voor +12V in de PC en dat is ook de spanning die op de adapter-aansluiting komt te staan, wil de spannings-stabilisator (soort van 7805) van de Mega zijn werk behoorlijk kunnen doen. De adapter-stekker gebruiken, dat zou makkelijker zijn geweest, maar dan steekt deze weer uit over de bodem-oppervlak, waardoor de samenstelling niet strak ergens tegen aan kan staan.
Een aluminium strip bovenlangs moet de kabels vanuit de PC-voeding op zijn plaats houden met tie-wraps. Dit verminderd de kans op kortsluiting vanuit de voeding stekers en de diverse units.
De Protoshield is uit zijn verpakking gehaald en alle print-stekers zijn erop gesoldeerd. Daarna begon de lastige klus met het solderen van de diverse verbindingen. Hierbij is het opletten dat alle verbindingen ook echt kontakt maken, want een draadje dat niet bleef zitten was makkelijk de oorzaak van een losse verbinding (zie in het blauwe rondje). In dit geval was het rond de steker voor de Midi Module.

Soldering die los is gegaan.
Alle stekers moeten dan worden gecontroleerd, zodat alles elektrisch ook werkt, voordat aan de eigenlijke programmeer-klus wordt begonnen. Elke unit kreeg ook zijn eigen test programmaatje. Vanwege dit testen, zijn er geen losse programmaatjes opgeslagen, c.q. hieronder weergegeven.
Front schakelaars en potmeters.
De aan/uit schakelaar werkt zoals gepland. Met als aantekening, als de PC-voeding uit staat, maar de USB-kabel wel vast zit, blijft de Mega wel strooom ontvangen en is de power-Led op de voorzijde gewoon aan.
De Potmeters zijn getest met een test-programmatje dat de potmeter-waarde omzet in een PWM-waarde voor de "analogWrite()".
Front Leds
Als eerste is de Led/ Display module getest. Deze geeft het makkelijkste test-programmaatje, omdat er alleen uitgangen zijn. Er zijn 256 combinaties van de standaard "digitalWrite()" uitgeschreven (dat werd eerder copieren en aanpassen), wat al gauw een programma van 24kb oplevert. Daarna is het direct schrijven naar de poort-register getest. En hier is de eerste drempel gekomen.
Heeft de Arduino Uno een eenvoudige register structuur (elke groep pinnen heeft zijn eigen register), bij de Mega zit deze logica er totaal niet in. De eerder geplande pinnen D47 .. D53 zijn echter over 2 poorten verdeeld te zijn. Aangezien ik de waarde simpel per byte naar het betreffende register wil sturen, zijn de aansluitingen veranderd naar de pinnen D42..D49 (met register L).
Alleen de front Leds zijn getest, omdat de displays op dit moment nog in bestelling zijn.
Midi-Module.
De Midi-Module heeft meer storingen opgeleverd, zoals de bovengenoemde losse soldering (in dat blauwe rondje op bovenstaande foto) en een mechanische vastschroef kortsluiting. Maar met zijn eigen test-programmaatje is ook deze fase goed verlopen.
RGB Led Matrix Panelen.
Het testen van de RGB Led Matrix panelen heeft meer extra uitzoekwerk opgeleverd. Het blijkt namelijk dat veel pinnen op de Mega niet per poort geördend zijn. Vooral de eerste 14 basis-pennen, zoals de Uno ze kent, zijn al over 4 poorten verdeeld. En deze heb ik juist in de planning gehad om te gebruiken, helaas ... Wanneer basis funkties gebruikt worden heeft men hier totaal geen last van, maar zodra er snelle bewerkingen moeten worden gebruikt (zoals via "PORTB" en "DDRB") wordt dit lastig en tijdrovender ... OF er moeten andere pinnen worden gebruikt. Ik ga voor het laatste, dus moeten er draadjes worden omgesoldeerd, of opnieuw worden aangelegd (6+3+1 stuks).
Ik heb eerst maar uitgezocht hoe het zit met al die pinnen en poorten. De volgende tabel geeft aan hoe ze geördend zijn. v geeft een mooie geördende poort aan. x geeft een verdeling aan over diverse poorten.
Analog Pins | | Digital Pins | | Extended Pins |
---|
F0 v | = a0 | | E0 x | = d0 rx0 | | J1 x | = d14 tx3 | | C7 v | = d30 | | L7 v | = d42 |
F1 v | = a1 | | E1 x | = d1 tx0 | | J0 x | = d15 rx3 | | C6 v | = d31 | | L6 v | = d43 |
F2 v | = a2 | | E4 x | = d2 pwm | | H1 x | = d16 tx2 | | C5 v | = d32 | | L5 v | = d44 pwm |
F3 v | = a3 | | E5 x | = d3 pwm | | H0 x | = d17 rx2 | | C4 v | = d33 | | L4 v | = d45 pwm |
F4 v | = a4 | | G5 x | = d4 pwm | | D3 x | = d18 tx1 | | C3 v | = d34 | | L3 v | = d46 pwm |
F5 v | = a5 | | E3 x | = d5 pwm | | D2 x | = d19 rx1 | | C2 v | = d35 | | L2 v | = d47 |
F6 v | = a6 | | H3 x | = d6 pwm | | D1 x | = d20 sda | | C1 v | = d36 | | L1 v | = d48 |
F7 v | = a7 | | H4 x | = d7 pwm | | D0 x | = d21 scl | | C0 v | = d37 | | L0 v | = d49 |
| | | | | | | | | | | | | |
K0 v | = a8 | | H5 x | = d8 pwm | | A0 v | = d22 | | D7 x | = d38 | | B3 x | = d50 miso |
K1 v | = a9 | | H6 x | = d9 pwm | | A1 v | = d23 | | G2 x | = d39 | | B2 x | = d51 mosi |
K2 v | = a10 | | B4 x | = d10 pwm | | A2 v | = d24 | | G1 x | = d40 | | B1 x | = d52 sck |
K3 v | = a11 | | B5 x | = d11 pwm | | A3 v | = d25 | | G0 x | = d41 | | B0 x | = d53 ss |
K4 v | = a12 | | B6 x | = d12 pwm | | A4 v | = d26 | | | | | | |
K5 v | = a13 | | B7 x | = d13 pwm | | A5 v | = d27 | | | | | | |
K6 v | = a14 | | | | | A6 v | = d28 | | | | | | |
K7 v | = a15 | | | | | A7 v | = d29 | | | | | | |
Al met al is deze tabel een nuttige uitzoekerij geweest voor de (nog te bouwen) ArSid. Op een duitse site over FisherTechniek is het volgende plaatje van de Mega en de aansluitingen gevonden.

Grafisch de Poort-toewijzingen, gevonden op een duitse Fishertechniek site.
De (zwarte) Poort-letters (A t/m L) zijn zelf toegevoegd.
Het nu correct aansluiten van de draden op de MegaShield.
Met deze nieuwe gegevens zijn de draadjes op de MegaShield opnieuw aangesloten, maar nu op de poort-aansluitingen die wel netjes 8 bits naast elkaar hebben. Op de brede connector aan de korte zijkant zitten 3 van deze types (pinnen 22..29 (= poort A) , 30..37 (= poort C) en 42..49 (= poort L, zoals hierboven al is beschreven)). Met het oog op directe poort aansturing lijken dit de meest logische aansluitingen te zijn.
De oude draadjes zijn van de Led matrix Paneel connector gesoldeerd en deze zijn allen naar deze brede connector gebracht. Groene draadjes voor de data (R1 G21 B1 R2 G2 B2), witte draadjes voor de regel selectie (A(A0) B(A1) C(A2)) en de geel/bruine draadjes voor de control-draadjes (Clock, Latch, OutputEnable).
De regel selectie draadjes gaan nu ook naar de Led/ Display aansturing selectie lijnen (A(A0) B(A1) C(A2)). De OutputEnable heeft zijn eigen pinnetje gekregen op de zelfde groep pinnen van de Mega.
Het testen van het geheel.
En natuurlijk moet er ook getest worden. Dit is met een recht-toe recht-aan programma gedaan. Alles is met de standaard functies (pinMode() & digitalWrite()) gedaan met weinig slimme programmeer technieken, zoals de bron-code laat zien. Het is maar om te testen of het werkt ... en dat doet het.
De Leds en Displays gaan keurig mee met de gekozen Led-Matrixregel. Alles wordt 1 voor 1 aan (en weer uit) gezet. Dit is het bovenste programma in de broncode.
Bij het testen met directe poort aansturingen (DDRx en PORTx) blijk ik toch weer de bitjes van een port omgedraaid te hebben, zodat dit foutje weer gecorrigeerd moet worden. Maar uiteindelijk werkt ook dat zoals bedoeld is. Wat opvalt is dat de directe poort aansturing een korter programma oplevert met nog meer functionaliteit erin. In dit geval potmeter 1 (op pin A0) voor de snelheid en potmeter 4 (op pin A3) om te bepalen welke display/ Led-regel, c.q. Paneel regels er moeten branden. Dit staat in het tweede programma in de broncode.
Hierna kunnen de andere truken (interupt gebruik - nodig voor een constant beeld op de Leds, Displays en Panelen) op de Mega worden gedaan, om te komen tot een vernieuwd Midi Paneel ... Één die niet stuk loopt op te weinig variabelen-geheugen.
Broncode:
[1: Samenstelling.]
1: De broncode van Samenstelling.
(Sat 14 February 2015)
Het testprogramma van de samenstelling - alles is recht-toe recht-aan geprogrammeerd met alleen standaard Arduino functies.
Deze broncode heeft 234 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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
|
//
// First Testprogram of The Mega for Panel 02
//
// Just done plain and simple, with a lots of standard functions
//
// Port L = output to Led and Display Data
const int led0 = 49;
const int led1 = 48;
const int led2 = 47;
const int led3 = 46;
const int led4 = 45;
const int led5 = 44;
const int led6 = 43;
const int led7 = 42;
// Port A = output to Panel Data
const int r1 = 24;
const int g1 = 25;
const int b1 = 26;
const int r2 = 27;
const int g2 = 28;
const int b2 = 29;
// Port C 0..3 = Adress
const int a = 37; // A
const int b = 36; // B
const int c = 35; // C
// Port C 4..7 = Control
const int clk = 33; // Clock Panel
const int lap = 32; // Latch Panel
const int oep = 31; // Oe Panel
const int oel = 30; // Oe leds
int dd=100;
int qq=255;
void setup()
{
pinMode (led0, OUTPUT);
pinMode (led1, OUTPUT);
pinMode (led2, OUTPUT);
pinMode (led3, OUTPUT);
pinMode (led4, OUTPUT);
pinMode (led5, OUTPUT);
pinMode (led6, OUTPUT);
pinMode (led7, OUTPUT);
pinMode (r1, OUTPUT);
pinMode (g1, OUTPUT);
pinMode (b1, OUTPUT);
pinMode (r2, OUTPUT);
pinMode (g2, OUTPUT);
pinMode (b2, OUTPUT);
pinMode (a, OUTPUT);
pinMode (b, OUTPUT);
pinMode (c, OUTPUT);
pinMode (clk, OUTPUT);
pinMode (lap, OUTPUT);
pinMode (oep, OUTPUT);
pinMode (oel, OUTPUT);
}
void loop()
{
front(5,qq);
// delay(100);
if (qq<255) { qq=qq+1; } else { qq=0; }
}
void front (int rij,
int waarde)
{ rij = rij & 0x07;
waarde = waarde & 0xFF;
if ( ( qq & 1 ) == 0 ) { digitalWrite(a, LOW ); } else { digitalWrite(a, HIGH); }
if ( ( qq & 2 ) == 0 ) { digitalWrite(b, LOW ); } else { digitalWrite(b, HIGH); }
if ( ( qq & 4 ) == 0 ) { digitalWrite(c, LOW ); } else { digitalWrite(c, HIGH); }
digitalWrite(clk, LOW );
digitalWrite(lap, HIGH);
digitalWrite(oep, LOW );
digitalWrite(oel, LOW );
digitalWrite(led0, HIGH);
digitalWrite(clk, HIGH);
digitalWrite(clk, LOW );
delay(dd);
digitalWrite(led0, LOW );
digitalWrite(led1, HIGH);
digitalWrite(clk, HIGH);
digitalWrite(clk, LOW );
delay(dd);
digitalWrite(led1, LOW );
digitalWrite(led2, HIGH);
digitalWrite(r1, HIGH);
digitalWrite(clk, HIGH);
digitalWrite(clk, LOW );
delay(dd);
digitalWrite(r1, LOW );
digitalWrite(led2, LOW );
digitalWrite(led3, HIGH);
digitalWrite(g1, HIGH);
digitalWrite(clk, HIGH);
digitalWrite(clk, LOW );
delay(dd);
digitalWrite(g1, LOW );
digitalWrite(led3, LOW );
digitalWrite(led4, HIGH);
digitalWrite(b1, HIGH);
digitalWrite(clk, HIGH);
digitalWrite(clk, LOW );
delay(dd);
digitalWrite(b1, LOW );
digitalWrite(led4, LOW );
digitalWrite(led5, HIGH);
digitalWrite(r2, HIGH);
digitalWrite(clk, HIGH);
digitalWrite(clk, LOW );
delay(dd);
digitalWrite(r2, LOW );
digitalWrite(led5, LOW );
digitalWrite(led6, HIGH);
digitalWrite(g2, HIGH);
digitalWrite(clk, HIGH);
digitalWrite(clk, LOW );
delay(dd);
digitalWrite(g2, LOW );
digitalWrite(led6, LOW );
digitalWrite(led7, HIGH);
digitalWrite(b2, HIGH);
digitalWrite(clk, HIGH);
digitalWrite(clk, LOW );
delay(dd);
digitalWrite(b2, LOW );
digitalWrite(led7, LOW );
}
=============================================================================================
//
// Second Testprogram of The Mega for Panel 02
//
// Using Direct Port programming - DDRx and PORTx
//
// Port L = output to Led and Display Data
// const int led0 = 49;
// const int led1 = 48;
// const int led2 = 47;
// const int led3 = 46;
// const int led4 = 45;
// const int led5 = 44;
// const int led6 = 43;
// const int led7 = 42;
// Port A = output to Panel Data
// const int r1 = 24;
// const int g1 = 25;
// const int b1 = 26;
// const int r2 = 27;
// const int g2 = 28;
// const int b2 = 29;
// Port C 0..3 = Adress
// const int a = 37; // A
// const int b = 36; // B
// const int c = 35; // C
// Port C 4..7 = Control
// const int clk = 33; // Clock Panel
// const int lap = 32; // Latch Panel
// const int oep = 31; // Oe Panel
// const int oel = 30; // Oe leds
int pot0=0;
int pot1=0;
int pot2=0;
int pot3=0;
int qq=0;
void setup()
{
// Leds Data - All Output
DDRL = 0xFF;
// Panel Data - All Output
DDRA = 0xFF;
// Adress & Control - All Output
DDRC = 0xFF;
}
void loop()
{
pot0=analogRead(0);
pot1=analogRead(1);
pot2=analogRead(2);
pot3=analogRead(3) / 128;
front(pot3,qq);
delay(pot0+10);
if (qq<255) { qq=qq+1; } else { qq=0; }
}
void front (int rij,
int waarde)
{ rij = rij & 0x07;
waarde = waarde & 0xFF;
// if ( ( qq & 1 ) == 0 ) { digitalWrite(a, LOW ); } else { digitalWrite(a, HIGH); }
// if ( ( qq & 2 ) == 0 ) { digitalWrite(b, LOW ); } else { digitalWrite(b, HIGH); }
// if ( ( qq & 4 ) == 0 ) { digitalWrite(c, LOW ); } else { digitalWrite(c, HIGH); }
PORTC = ( PORTC & 0xF0 ) | rij;
// digitalWrite(clk, LOW ); // C4
// digitalWrite(lap, HIGH); // C5
// digitalWrite(oep, LOW ); // C6
// digitalWrite(oel, LOW ); // C7
PORTC = ( PORTC & 0x0F ) | B00100000;
PORTL = waarde;
PORTA = waarde;
PORTC = PORTC | B00010000; // Clk High
PORTC = PORTC & B11101111; // Clk Low
|
Broncode:
[1: Samenstelling.]
|
Afbeeldingen

1/14: paneel02_samen_01.jpg.

2/14: paneel02_samen_02.jpg.

3/14: paneel02_samen_03.jpg.

4/14: paneel02_samen_04.jpg.

5/14: paneel02_samen_05.jpg.

6/14: paneel02_samen_06.jpg.

7/14: paneel02_samen_07.jpg.

8/14: paneel02_samen_08.jpg.

9/14: paneel02_samen_09.jpg.

10/14: paneel02_samen_10.jpg.

11/14: paneel02_samen_11.jpg.

12/14: paneel02_samen_12.jpg.

13/14: paneel02_samen_13.jpg.

14/14: paneel02_samen_14.jpg.
|
De aansluitingen van Samenstelling.
De basis-aansluitingen van de Mega-samenstelling
Arduino Mega
|
|
Pwr USB
|
?
|
|
|
|
|
?
|
|
|
|
aref
|
|
|
|
gnd
|
Gnd's
|
|
?
|
d13
|
|
|
ioreff
|
d12
|
|
Reset
|
reset
|
d11
|
|
|
+3.3v
|
d10
|
|
+5V
|
+5v
|
d9
|
|
Gnd's
|
gnd
|
d8
|
|
Gnd's
|
gnd
|
|
|
|
Vin
|
d7
|
|
|
|
d6
|
|
Potmeter 1
|
a0
|
d5
|
|
Potmeter 2
|
a1
|
d4
|
|
Potmeter 3
|
a2
|
d3
|
|
Potmeter 4
|
a3
|
d2
|
|
|
a4
|
d1
|
Tx
|
|
a5
|
d0
|
Rx
|
|
a6
|
|
|
|
a7
|
d14
|
|
|
|
d15
|
|
|
a8
|
d16
|
|
|
a9
|
d17
|
|
|
a10
|
d18
|
Tx1 Midi Out
|
|
a11
|
d19
|
Rx1 Midi In
|
|
a12
|
d20
|
|
|
a13
|
d21
|
|
|
a14
|
/~\
|
|
|
a15
|
\_/
|
|
Onderconnector
|
|
d22 | d23
|
|
R1 |A2
|
d24 | d25
|
A3| G1
|
B1 |A4
|
d26 | d27
|
A5| R2
|
G2 |A6
|
d28 | d29
|
A7| B2
|
|
|
|
|
Oe Led & Display |C7
|
d30 | d31
|
C6| Oe Paneel
|
Latch Paneel |C5
|
d32 | d33
|
C4| Clock Paneel
|
|C3
|
d34 | d35
|
C2| C (A2)
|
B (A1) |C1
|
d36 | d37
|
C0| A (A0)
|
|
|
|
|
|
d39 | d39
|
|
|
d40 | d41
|
|
|
|
|
|
Led Display |L7
|
d42 | d43
|
L6| Led Display
|
Led Display |L5
|
d44 | d45
|
L4| Led Display
|
Led Display |L3
|
d46 | d47
|
L2| Led Display
|
Led Display |L1
|
d48 | d49
|
L0| Led Display
|
|
|
|
|
|
d50 | d51
|
|
|
d52 | d53
|
|
|