This forum is archived, go to the new forum!

This is the old fritzing discussion forum. Search it for valuable information from 2009 to 2015.

Erklärung und Programm im Beispiel „Matrix“

upscho 5 years ago

Im Beispiel „Matrix“ passen die Erklärungen im Buch nicht zur Funktion des Programms. Zumindest, wenn man die Matrix-Anschlüsse 13, 3, 4 usw. und die dazugehörigen Arduino-Pins 9, 3, 2 usw. als Spalten ansieht, was aber auf Grund der Abbildungen im Buch naheliegt. Im Text wird von einem zeilenweisen Durchlauf gesprochen („Um alle LEDs einzeln an- und abzuschalten, müssen die Zeilen einzeln durchlaufen werden.“), das Programm baut den Smiley jedoch spaltenweise auf. Dies wird offensichtlich, wenn man nach der Zeile „delay Microseconds…“ testweise eine zusätzliche Zeile mit „delay(200);“ einfügt.

Bei der verwendeten Schaltung ist es tatsächlich auch sinnvoll, das Bild spaltenweise aufzubauen. Baut man es nämlich zeilenweise auf, fließt der Strom aller in einer Zeile aktivierten LEDs durch den gleichen Vorwiderstand. Je mehr LEDs in dieser Zeile aktiviert sind, desto größer wird der Spannungsabfall am Widerstand. Letzten Endes leuchten dadurch Zeilen, in denen wenig LEDs aktiviert sind, etwas heller als Zeilen, in denen mehr LEDs aktiviert sind: Der Smiley leuchtet ungleichmäßig. Dieser Effekt wird bei einem spaltenweisen Aufbau vermieden.

Auch der Code und die Kommentare passen nicht zu einem spaltenweisen Aufbau: Die Variablen „spaltenPins“ und „reihenPins“ sowie „x“ und „y“ müssen jeweils gegeneinander vertauscht und die Kommentare angepasst werden. Das geänderte Programm würde dann so aussehen:

 

/*
  Matrix
  LED-Matrix zeigt ein Bild
 
  Dieses Beispiel aus dem Fritzing Creator Kit: www.fritzing.org/creator-kit. />*/

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


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


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 deklariert und die Spaltenpins werden abgeschaltet
    pinMode(spaltenPins[i],OUTPUT);
    pinMode(reihenPins[i],OUTPUT);
    digitalWrite(spaltenPins[i],HIGH);
  }
}

void loop(){
  for (int x=0; x<8; x++){                       // spaltenweise werden
    for (int y=0; y<8; y++){                     // von oben nach unten alle Einträge des Arrays geprüft
      if (image[y][x]==1){                       // ist der Eintrag = 1
        digitalWrite(reihenPins[y],HIGH);        // wird der Zeilenpin eingeschaltet
      } else {                                   // sonst
        digitalWrite(reihenPins[y],LOW);         // abgeschaltet
      }
    }
    digitalWrite(spaltenPins[x],LOW);            // nun wird der Spaltenpin auf LOW geschaltet (da es die Kathode der LED betrifft bedeutet LOW eingeschaltet: LOW = GND)
    delayMicroseconds(100);                      // das Programm hält 100 Mikrosekunden an
    digitalWrite(spaltenPins[x],HIGH);           // danach wird der Spaltenpin wieder auf HIGH (in diesem Fall also ab-) geschaltet
  }
}


Anmerkung: Ein zusätzlicher Befehl wurde in der Methode setup() ergänzt, um die Spalten bereits von Beginn an abgeschaltet zu haben. Andernfalls sind sie erst nach erstmaligem Durchlaufen der Methode loop() abgeschaltet. Mit dem normalen Code fällt der Unterschied auf Grund des schnellen Bildaufbaus nicht auf. Fügt man jedoch wie oben eine zusätzliche Verzögerung ein, erkennt man, dass beim erstmaligen Durchlauf Muster angezeigt werden, die aus den noch nicht abgeschalteten Spalten resultieren.

oel 4 years, 11 months ago

Hallo, kann nochmal die Pinbelegung beim Mega als Bild hochgestellt werden, weil im Buch nur die von Uno ist. Unser zeigt irgendwas an, aber keine Smileys...