PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 8X8 Matrix mit Arduino zum duchlaufen bringen



PatrickHH
10.07.2014, 18:32
Hallo,
ich arbeite mich grade in die Programmierung von Arduino ein.
Nun habe ich das "fritzing" creator kit dem auch eine 8 X 8 LED matrix beiliegt.

folgende "einfache" Aufgabenstellung habe ich mir überlegt.
Die LED sollen hintereinander Zeile für Zeile die Spalten durchlaufen.
Hört sich ja ersteinmal recht trivial an. Bedauerlicherweise bin ich damit schon gescheitert.
hier mein Versuch:


// Pinbelegung für Arduino MEGA
int spaltenPins[8] = {13,3,4,10,6,11,15,16}; // Anschlüsse der Spaltenpins am Arduino in der Reihenfolge der Spalten auf der Matrix
int reihenPins[8] = {9,14,8,12,1,7,2,5}; // Anschlüsse der Reihenpins am Arduino in der Reihenfolge der Reihen auf der Matrix

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

}
}

void loop(){

for (int x=0; x<8; x++){
digitalWrite(spaltenPins[x],LOW); // Spalte 1 auf Masse schalten
for (int y=0; y<8; x++){
digitalWrite(reihenPins[y],HIGH); // Zeile 1 auf +5V schalten
delay(300); // 300 milli Sekunden warten
digitalWrite(reihenPins[y],LOW); } // Zeile 1 auf Masse schalten

digitalWrite(spaltenPins[x],HIGH); } // Spalte 1 auf +5V schalten
}


Was passiert? die Erste Zeile leuchtet kontinuierlich komplett.

Ich wüde gerne die
for Schleife verstehen lernen.

Sisor
10.07.2014, 21:27
// Pinbelegung für Arduino MEGA
int spaltenPins[8] = {13,3,4,10,6,11,15,16}; // Anschlüsse der Spaltenpins am Arduino in der Reihenfolge der Spalten auf der Matrix
int reihenPins[8] = {9,14,8,12,1,7,2,5}; // Anschlüsse der Reihenpins am Arduino in der Reihenfolge der Reihen auf der Matrix

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

void loop(){

for (int x=0; x<8; x++){
digitalWrite(spaltenPins[x],LOW); // Spalte 1 auf Masse schalten
for (int y=0; y<8; y++){
digitalWrite(reihenPins[y],HIGH); // Zeile 1 auf +5V schalten
delay(300); // 300 milli Sekunden warten
digitalWrite(reihenPins[y],LOW); } // Zeile 1 auf Masse schalten

digitalWrite(spaltenPins[x],HIGH); } // Spalte 1 auf +5V schalten
}

PatrickHH
11.07.2014, 06:06
Guten morgen,
vielen Dank für die schnelle Antwort.
Wenn es denn nun an der fehlenden Variabele und dem erstmaligen Deaktivieren der der Masse Ausgänge (na das hört sich ja vielleicht idiotisch an :-)) gelegen haben sollte wäre ich hochzufrieden.
Das würde ja schon mal bedeuten, das ich das Prinip verstanden habe.
Ich bin schon gespannt darauf den code heute nach mittag zu testen.

PatrickHH
11.07.2014, 19:29
So, nun konnte ich den optimierten code testen.
Eines vorweg, ich weiss es zu schätzen, dass Ihr hier im forum Euch die Mühe macht über meine Zeilen zu schauen. Vielen Dank dafür!
Die Funktionalität sieht nun mit dem Code folgendermassen auss:

Komplette Matrix leuchtet, bis auf die erste Zeile und Spalte.
die Spalte wird nach rechts duchgeschaltet (also dunkel geschaltet) und nach erreichen der letzten Spalte wird die nächste Zeile dunkel geschaltet und die Spalten entsprechend wieder von links nach rechts.
Ich hoffe das war einigermassen verständlich.

Eine ähnliche Funktion hatte ich auch schon errreicht. Da wurde das "dunkle Kreuz" quasi diagonal durch die matrix geschaltet.

Vielleicht findet sich ja doch noch eine Lösung.

PatrickHH
12.07.2014, 08:36
Okay,
nach etwas herumprobieren, habe ich mein Lauflicht bekommen.
Es mussten nur noch die Polaritäten invertiert werden (HIGH -> LOW / LOW -> HIGH) und initial auch die Reihen definiert auf einen Wert gesetzt


// 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

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

void loop(){

for (int x=0; x<8; x++){
digitalWrite(spaltenPins[x],HIGH); // Spalte +5V
for (int y=0; y<8; y++){
digitalWrite(reihenPins[y],LOW); // Zeile 1 Masse
delay(300); // 300 milli Sekunden warten
digitalWrite(reihenPins[y],HIGH); } // Zeile 1 +5V

digitalWrite(spaltenPins[x],LOW); } // Spalte 1 Masse
}