PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Arduino Mega Matrix



oel
03.10.2014, 18:52
Hallo,

habe von Papa einen Fritzing Creator Kit bekommen mit Arduino Mega. Im Buch ist aber ein Arduino Uno. Nun sitzen wir und wollen die Matrix anschließen. Wo bekommt man die Info, wie man diese, bzw an welche Pins des Bords man die 8x8 Matrix anschließt.

Danke für die Information

Sisor
03.10.2014, 19:23
Hier gibts das Programm:
Matrix (https://code.google.com/p/fritzing/source/browse/fritzing/sketches/core/Fritzing+Creator+Kit+DE%2BEN/creator-kit-de/Fritzing+Creator+Kit/Matrix/Matrix.ino?spec=svn410c00829e30061e3ea22c1a0e86205 e545464f5&r=410c00829e30061e3ea22c1a0e86205e545464f5)

Im Code steht...

/*
Matrix
LED-Matrix zeigt ein Bild

Dieses Beispiel aus dem Fritzing Creator Kit: www.fritzing.org/creator-kit.
*/

// Pinbelegung für Arduino UNO
int reihenPins[8] = {9,3,2,12,15,11,7,6}; // Anschlüsse der Reihenpins am Arduino
int spaltenPins[8] = {13,8,17,10,5,16,4,14}; // Anschlüsse der Spaltenpins am Arduino


// Pinbelegung für Arduino MEGA
// int reihenPins[8] = {9,3,2,12,55,11,7,6}; // Anschlüsse der Reihenpins am Arduino
// int spaltenPins[8] = {13,8,57,10,5,56,4,54}; // Anschlüsse der Spaltenpins am Arduino

...

Für den Mega müssen die Kommentarzeichen '//' entfernt werden, und der Uno-Teil wird am besten gelöscht.
Dein Programm sollte dann so beginnen:


/*
Matrix
LED-Matrix zeigt ein Bild

Dieses Beispiel aus dem Fritzing Creator Kit: www.fritzing.org/creator-kit.
*/

// Pinbelegung für Arduino MEGA
int reihenPins[8] = {9,3,2,12,55,11,7,6}; // Anschlüsse der Reihenpins am Arduino
int spaltenPins[8] = {13,8,57,10,5,56,4,54}; // Anschlüsse der Spaltenpins am Arduino

...

Wie du sieht, bleiben die Reihenpins die gleichen, die Spaltenpins ändern sich zum Teil.
Z.B. wird Matrix-Spaltenpin 3 auf Arduino-Mega-Pin 57 gelegt (statt 17 beim Uno).
Also insgesamt 3 Änderungen:
57 statt 17
56 statt 16
54 statt 14

Viel Spass mit dem Arduino!:p

oel
03.10.2014, 19:57
Danke, soweit war ich schon. Das hatte ich auch im Netz gefunden und empfand es teils als hilfreich.

Ich finde die Pins auf dem Bord nicht. Sollten es die Zahlen neben der Steckleiste sein, dann ist bei mir mit 53 Schluss, 54 und 55 sind dann wahrscheinlich GND aber 56 und 57 ist nicht zu finden.

Gibt es nicht ein Bild, wo die Steckverbindungen zu sehen sind, oder eine Schaltzeichnung, denn die Pin-Belegung von Uno und Mega scheint doch recht verschieden zu sein. ICH BIN ABSOLUTER NEULING.

Danke für die weitere Hilfe

http://pighixxx.com/unov3pdf.pdf
Das hab ich angesehen und das
http://arduino.cc/en/Hacking/PinMapping2560

Was ist zum Beispiel der unterschied zwischen digital Pin und mapped Pin?

Sisor
03.10.2014, 21:36
Na sowas, die Pins gibts ja gar nicht.
Naja, dann schreiben wir das Programm halt um, und suchen uns die Pins selbst aus.
Wir können im Prinzip alle Digital-Pins (0-53) als Digitalausgang benutzen.
Vorschlag: Statt 57, 56, 54 nehmen wir 47, 46, 44.

Sähe dann so aus:

/*
Matrix
LED-Matrix zeigt ein Bild

Dieses Beispiel aus dem Fritzing Creator Kit: www.fritzing.org/creator-kit.
*/

// Pinbelegung für Arduino MEGA
int reihenPins[8] = {9,3,2,12,55,11,7,6}; // Anschlüsse der Reihenpins am Arduino
int spaltenPins[8] = {13,8,47,10,5,46,4,44}; // Anschlüsse der Spaltenpins am Arduino

...



Was ist zum Beispiel der unterschied zwischen digital Pin und mapped Pin?
Mapped bedeutet, dass sich die Arduino-Entwickler eine eigene Pin-Bezeichnung überlegt haben.
Sie nennen die Pins des Boards z.B. Analog- oder Digitalpins. Das dient der Vereinfachung.
In Wirklichkeit liegen die Pins an unterschiedlichen Ports und haben andere, kryptische Bezeichnungen.
Diese kann man im Datenblatt des Microcontrollers finden.
Unter der Haube wird also z.B. Digitalpin 40 über eine Art Tabelle (Map) in eine Adresse überführt,
die den Port direkt adressiert. Man kann auch nicht direkt ein Bit eines Ports setzen, sondern nur alle 8.
Das geht über eine Bitoperation, die im Hintergrund ausgeführt wird, und für den Arduino-Programmierer
nicht sichtbar sind.
Für den normalen Arduino-Nutzer reicht daher zu wissen, wieviele Pins sein Arduino hat,
und welche davon durch sein Programm schon belegt sind.
Die Grundidee von Arduinos: Dem Programmierer den Low-Level Kram abzunehmen,
sodass er eigentlich kein Datenblatt des Microcontrollers lesen braucht, und sich stattdessen auf das
Lösen der eigentlichen Aufgabe konzentrieren kann (z.B. Ansteuerung einer Led-Matrix).

oel
03.10.2014, 22:30
Danke, das hab ich gemacht.

Nun muß ich nur noch wissen, was die Zahlen bedeuten an der Matrix

Da steht z. b. 16 15 11 6 10 4 3 13 oben und an der Seite 9 14 8 12 1 7 2 5

Woher weiß ich, welche Matrix-Zahl an welche Arduino Zahl kommt, also damit verbunden wird?

Und wo gibt es eine Legende, die die kryptischen Bezeichnungen auf der Pin-Map mir deutet?

solche Sache, wie a - analog d-digital, pwm - power with modulation, tx und rx krieg ich ja gedeutet, aber OCA4 (sieht aus wie ne Adresse) und PE1 nicht.

Sisor
04.10.2014, 01:40
Ja, beim Anschluss kann man sich schnell vertun...
Versuch mal folgende Belegung:






o o o o o o o o
22 24 26 28 30 32 34 36



38 40 42 44 46 48 50 52
o o o o o o o o
__




Hier das auf die neue Belegung abgestimmte Programm:

/*
Matrix
LED-Matrix zeigt ein Bild

Dieses Beispiel aus dem Fritzing Creator Kit: www.fritzing.org/creator-kit.
*/

// Belegung der Matrix (Z=Zeile / S=Spalte)
// obere Pins
// S1 Z5 Z3 S4 Z8 S2 Z2 Z1
// untere Pins
// S3 S6 Z4 S8 Z6 Z7 S7 S5

// Anschluss Matrix an Arduino Mega
// obere Pins
// 22 24 26 28 30 32 34 36
// untere Pins
// 38 40 42 44 46 48 50 52

// Pinbelegung für Arduino MEGA
int reihenPins[8] = {36,34,26,42,24,46,48,30};
int spaltenPins[8] = {22,32,38,28,52,40,50,44};


int image[8][8]={ // Bild, das auf der Matrix gezeigt wird. 1 = LED an, 0 = LED aus

{0,1,0,0,0,0,1,0},
{1,1,1,0,0,1,1,1},
{0,1,0,0,0,0,1,0},
{0,0,0,1,1,0,0,0},
{0,0,0,1,1,0,0,0},
{1,0,0,0,0,0,0,1},
{0,1,1,1,1,1,1,0},
{0,0,1,1,1,1,0,0}

};

void setup(){
for (int i=0; i<8; i++){ // Alle Pins werden als OUTPUT declariert
pinMode(reihenPins[i],OUTPUT);
pinMode(spaltenPins[i],OUTPUT);
}
}

void loop(){
for (int y=0; y<8; y++){ // zeilenweise werden
for (int x=0; x<8; x++){ // von links nach rechts alle Einträge des Arrays geprüft
if (image[x][y]==1){ // ist der Eintrag = 1
digitalWrite(spaltenPins[x],HIGH); // wird der Spaltenpin eingeschalten
} else { // sonst
digitalWrite(spaltenPins[x],LOW); // abgeschalten
}
}
digitalWrite(reihenPins[y],LOW); // nun wird der Reihenpin auf LOW geschalten (da es die Kathode der LED betrifft bedeutet LOW eingeschalten: LOW = GND)
delayMicroseconds(100); // das Programm hällt 100 Mikrosekunden an
digitalWrite(reihenPins[y],HIGH); // danach wird der Reihenpin wieder auf HIGH (in diesem Fall also abge-) schalten
}
}



Und wo gibt es eine Legende, die die kryptischen Bezeichnungen auf der Pin-Map mir deutet?
Im Datenblatt des ATMega2560-Microcontrollers von Atmel.
Aber wie schon geschrieben, dieses Wissen braucht man zum Arduino-Programmieren eigentlich nicht.

oel
04.10.2014, 08:00
Danke, hab alles umgesetzt, aber er tuts noch nicht. Also das Muster vom Image-Befehl wird nicht angezeigt.

Sag mir doch einfach mal, wie ich gezielt die Lampe A1 anspreche. Und dann muß dass doch analog für die anderen Zellen ebenso gelten, weil ich Zeile und Spalte hab ....

Ich hab jetzt kapiert, die Zahlen bei int ReihenPins sind die Anschlüsse auf dem Arduino Board.


Jetzt leuchten viele Zellen, außer A1, A8, A3, A4 und andere. Manche leuchten sehr stark, manche Glimmen nur. Wie das? Liegen unterschiedliche Spannungen auf den Ausgängen? Oder ist die Matrix kaputt?

Wenn ich ein zweites Delay (200) aktiviere, gibt es ein Wandern der nicht vollständigen Zeilen.

Sisor
04.10.2014, 08:50
Jetzt leuchten viele Zellen, außer A1, A8, A3, A4 und andere. Manche leuchten sehr stark, manche Glimmen nur. Wie das? Liegen unterschiedliche Spannungen auf den Ausgängen? Oder ist die Matrix kaputt?
Nein, falsch angeschlossen.

Ich hab jetzt kapiert, die Zahlen bei int ReihenPins sind die Anschlüsse auf dem Arduino Board.
Ja, aber nicht in der Reihenfolge.

Leg die Matrix mal auf den Rücken, sodass du die Pins siehst. Du siehst jetzt, dass die Ecken der Matrix etwas erhöht sind.
Aber da ist noch eine Erhöhung auf der Mitte einer Seite. Dreh die Matrix so, dass diese Erhöhung unten ist.
Jetzt hast du die Matrix so liegen, wie sie auf dem Belegungs-Schema oben zu sehen ist.
Mein Beispiel ist so gewählt, dass du das Matrix-Pin oben links mit Arduino-Pin 22 verbindest, das daneben mit 24 usw.

oel
04.10.2014, 09:57
Aber da ist noch eine Erhöhung auf der Mitte einer Seite.

Meinst Du mit Erhöhung den Gnubbel links obere Hälfte Mitte auf der Linie, der einen Lötpunkt verdeckt im Bild?

http://www.bilder-hochladen.net/files/kiyp-j-1f0e.jpg

Wenn ich, wegen meines Rumfummelns alle Bits auf 1 setzt, bleibt alles dunkel. Warum das?

Warum muß ich mich alle 3 Minuten hier im Forum neu einloggen?

So ich hab die Verbindungen jetzt mir total allein rausklamüsert:


MEGA PIN 36 34 32 30 28 26 24 22
BredbrdNr 12 13 14 15 16 17 18 19
Matrix Pin A B C D E F G H Oben
legt dod S8 S7 Z2 S1 Z4 S6 S4 Z1
A Zeile 1 DH H3 H4 GH H6 FH BH AH
A Zeile 2 DC C3 C4 GC C6 FC BC AC
A Zeile 3 D8 83 84 G8 86 F8 B8 A8
A Zeile 4 DE E3 E4 GE E6 FE BE AE
A Zeile 5 D1 13 14 G1 16 F1 B1 A1
A Zeile 6 D7 73 74 G7 76 F7 B7 A7
A Zeile 7 D2 23 24 G2 26 F2 B2 A2
A Zeile 8 D5 53 54 G5 56 F5 B5 A5
legt dod Z5 Z7 S2 S3 Z8 S5 Z6 Z3
Matrix Pin 1 2 3 4 5 6 7 8 Unten
BredbrdNr 12 13 14 15 16 17 18 19
MEGA PIN 52 50 48 46 44 42 40 38

Danach geht es so: Wenn ich Zelle A1 ansprechen will muß ich den Strom über oben D und oben H leiten. Matrix Pin 1 legt dod Z5 (Zeile 5)

Was ich noch nicht verstehe ist, wenn ich im Image-Befehl alle Bits auf 0 setze, warum dann trotzdem in Zeile 3 alle Dioden außer H3 aufleuchten im bestimmten Rhythmus?

Es stört, daß er zugleich mit Spalte A auch die Zelle E3 einschaltet. Wie kann das sein?

Sisor
04.10.2014, 11:21
Kein Wunder, dass es nicht klappt, meine Matrix ist eine andere. Die hat nur einen 'Gnubbel'. Hat anscheinend auch eine andere Verschaltung.

Dann fangen wir halt ganz von vorn an und bestimmen die Pinbelegung selbst.
Dazu folgendes Programm benutzen:

//------------------------------------------------------------------------------
// Matrix Inspektor
// (c) SISOR 10/2014
//------------------------------------------------------------------------------
/* Mit diesem Programm lässt sich die PinBelegung einer LED-Matrix bestimmen
Vorgehensweise:
-Zuerst eine Bennenung der MatrixPins festlegen
Tipp: Orientierung der Matrix mit Edding markieren
(auf der Rückseite oben links einen Punkt malen)
-ArduinoPin 22 und 24 mit jeweils einem Pin der Matrix verbinden
-Blinkt keine LED? -Andere MatrixPins wählen, solange versuchen,
bis eine Led blinkt
-Blinkt nun eine LED:
-Das an ArduinoPin 22 angeschlossene MatrixPin ein ReihenPin
-Das an ArduinoPin 24 angeschlossene MatrixPin ein SpaltenPin
-Jetzt kann ein Belegungsplan erstellt und durch weitere Versuche
ergänzt werden:
-z.B.: MatrixPin 1: Reihe 6
MatrixPin 2: Spalte 2
MatrixPin 3: Spalte 1
...
-Nun sind wir fast fertig und können den Belegungsplan erweitern,
indem wir jetzt festlegen, wo wir die einzelnen MatrixPins
am Arduino anschließen:
-z.B.: MatrixPin 1: Reihe 6 ArduinoPin 22
MatrixPin 2: Spalte 2 ArduinoPin 24
MatrixPin 3: Spalte 1 ArduinoPin 26
...
-Schließlich können wir die PinBelegung ins Fritzing-Programm übertragen:
1 2 3 4 5 6 7 8
int spaltenPins[8] = {26,24, ... };
int reihenPins[8] = { ... , 22, ... };
...
*/

void setup(){
pinMode(22, OUTPUT);
pinMode(24, OUTPUT);
digitalWrite(22, HIGH);
}

void loop(){
digitalWrite(24, LOW);
delayMicroseconds(200);
digitalWrite(24, HIGH);
delay(400);
}

oel
04.10.2014, 11:43
Das hab ich alles schon durch (sieh Tabelle). Die Spaltenansprache klappt, bloß das Flackern in Zeile 3 weist auf irgendeinen elektrischen Kurzschluss hin....

Was kann das sein?

ich nehme übrigens dies Programm, und Fummel zum Abtasten in der Image-Matrix rum

int spaltenPins [8] = {30,48,46,24,42,26,34,36} ; // also S1, S2 etc
int reihenPins [8] = {22,32,38,28,52,40,50,44} ; // also Z1 etc
int image[8][8]= {
{0,0,0,0,0,0,0,0},
{1,1,1,1,1,1,1,1},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},

};
void setup()
{
for (int i=0; i<8; i++)
{
pinMode (spaltenPins[i],OUTPUT);
pinMode (reihenPins[i], OUTPUT);
digitalWrite(spaltenPins[i],HIGH);
}
}

void loop()
{
for (int x=0; x<8; x++)
{
for (int y=0; y<8; y++)
{
if (image[x][y]==1)
{
digitalWrite(reihenPins[y],HIGH);
}
else
{
digitalWrite(reihenPins[y],LOW);
}
}
digitalWrite (spaltenPins[x],LOW);
delayMicroseconds(20);
delay (200);
digitalWrite(spaltenPins[x],HIGH);
}
}

Sisor
04.10.2014, 13:37
Das Flackern hast du mit delay(200) programmiert.

joar50
04.10.2014, 13:42
@oel

Hallo,


Ich finde die Pins auf dem Bord nicht. Sollten es die Zahlen neben der Steckleiste sein, dann ist bei mir mit 53 Schluss, 54 und 55 sind dann wahrscheinlich GND aber 56 und 57 ist nicht zu finden.


Versuche es mal mit diesem PDF:

oel
04.10.2014, 14:06
@oel

Hallo,



Versuche es mal mit diesem PDF:


das ist nur wenig informativer, als das Pin out, welches ich schon gepostet habe, trotschem, schön dank

- - - Aktualisiert - - -


Das Flackern hast du mit delay(200) programmiert.


ich bin langsam der Überzeugung, meine Matrix ist kaputt

wenn ich dies uploade:

int spaltenPins [8] = {30,48,46,24,42,26,34,36} ; // also S1, S2 etc
int reihenPins [8] = {22,32,38,28,52,40,50,44} ; // also Z1 etc
int image[8][8]= {

/* {0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},*/
{1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1},
};
void setup()
{
for (int i=0; i<8; i++)
{
pinMode (spaltenPins[i],OUTPUT);
pinMode (reihenPins[i], OUTPUT);
digitalWrite(spaltenPins[i],HIGH);
digitalWrite(reihenPins[i],LOW);
}
}

void loop()
{
for (int x=0; x<8; x++)

{


// digitalWrite (spaltenPins[x],HIGH);
digitalWrite (reihenPins[x],LOW);
delay (200);
}
};



leuchtet nur die altbekannte E3 Diode. Die Anschlüsse stimmen jetzt alle, die Belegungen auch.

Rabenauge
04.10.2014, 14:25
Dein Programm hier wird nicht funktionieren, da du ja die Zeile, die die Pins HIGH schalten sollte, auskommentiert hast?

Sisor
04.10.2014, 14:46
1. Das 63 deiner 64 Dioden kaputt sind ist SEHR unwahrscheinlich.
2. LED sind Light Emitting Diodes, also Dioden. Sie funktionieren nur in Flussrichtung, d.h. wenn du sie verpolst, sperren sie und leuchten niemals.
Das hast du offensichtlich bei allen Dioden bis auf eine gemacht.
Also ist deine Anschlussbelegung DEFINITIV falsch.
Dein Programm müsste bei richtiger PinBelegung alle LEDs zum leuchten bringen.
3. Dein Programm gibt jetzt immer Strom. Damit überlastest du die LEDs langfristig evtl.
Du könntest auch loop{} schreiben, denn in der Loop änderst du den Zustand der LEDs nicht.
Besser z.B.:


void loop() {
for (int x=0; x<8; x++) {
digitalWrite (reihenPins[x],LOW);
delayMicroseconds(100);
digitalWrite (reihenPins[x],HIGH);
delayMicroseconds(1000);
}
}

Dein Programm hier wird nicht funktionieren, da du ja die Zeile, die die Pins HIGH schalten sollte, auskommentiert hast?
Nein, die LEDs leuchten, wenn spaltenPins HIGH und reihenPins LOW sind.

oel
04.10.2014, 16:11
Jetzt klappt es erstmal symmetrisch. Muß aber mich noch genauer mit der Steuerung befassen...

vielen Dank