Arduino Projekten

Tue 20-Aug-19
01:33:28




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 PinsDigital PinsExtended 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

paneel02_samen_01.jpg
1/14: paneel02_samen_01.jpg.
paneel02_samen_02.jpg
2/14: paneel02_samen_02.jpg.
paneel02_samen_03.jpg
3/14: paneel02_samen_03.jpg.
paneel02_samen_04.jpg
4/14: paneel02_samen_04.jpg.
paneel02_samen_05.jpg
5/14: paneel02_samen_05.jpg.
paneel02_samen_06.jpg
6/14: paneel02_samen_06.jpg.
paneel02_samen_07.jpg
7/14: paneel02_samen_07.jpg.
paneel02_samen_08.jpg
8/14: paneel02_samen_08.jpg.
paneel02_samen_09.jpg
9/14: paneel02_samen_09.jpg.
paneel02_samen_10.jpg
10/14: paneel02_samen_10.jpg.
paneel02_samen_11.jpg
11/14: paneel02_samen_11.jpg.
paneel02_samen_12.jpg
12/14: paneel02_samen_12.jpg.
paneel02_samen_13.jpg
13/14: paneel02_samen_13.jpg.
paneel02_samen_14.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