4x4 Matrix mit arduino

Hallo !

Ich habe gestern ein 4x4 Matrix selbstgebaut. Nun geht es an den Code. Nur ich hab da so meine probleme mit dem Multiplexing. Da ich dabei nicht wirklich weitergekommen bin, habe ich mal ein bischen in dem Arduino Playground geguckt. Und schwubs hab ich etwas gefunden :slight_smile:
http://arduino.cc/playground/Main/DirectDriveLEDMatrix

Da ich kein 8x8 Matrix habe sondern ein 4x4 hab ich versucht den Code für das kleiner Matrix umzuschreiben. Hier ist mein bearbeiteter Code:

#include <FrequencyTimer2.h>

#define SPACE { \
    {0, 1, 0, 0},  \
    {0, 1, 0, 0}, \
    {0, 1, 0, 0}, \
    {0, 1, 0, 0}  \
}

#define H { \
    {1, 0, 0, 0},  \
    {0, 1, 0, 0}, \
    {0, 0, 1, 0}, \
    {0, 0, 0, 1}  \
}

#define E  { \
    {1, 1, 1, 1},  \
    {0, 0, 0, 0}, \
    {0, 0, 0, 0}, \
    {0, 0, 0, 0}  \
}

#define L { \
    {0, 0, 0, 0},  \
    {0, 0, 0, 0}, \
    {0, 0, 0, 0}, \
    {1, 1, 1, 1}  \
}

#define O { \
    {1, 0, 1, 0},  \
    {0, 0, 0, 0}, \
    {1, 0, 1, 0}, \
    {0, 0, 0, 0}  \
}

byte col = 0;
byte leds[4][4];

// pin[xx] on led matrix connected to nn on Arduino (-1 is dummy to make array start at pos 1)
int pins[9]= {-1, 4, 5, 6, 7, 8, 9, 10, 11};

// col[xx] of leds = pin yy on led matrix
int cols[4] = {pins[7], pins[6], pins[5], pins[4]};

// row[xx] of leds = pin yy on led matrix
int rows[4] = {pins[11], pins[10], pins[9], pins[8]};

const int numPatterns = 6;
byte patterns[numPatterns][4][4] = {
  H,E,L,L,O,SPACE
};

int pattern = 0;

void setup() {
  // sets the pins as output
  for (int i = 1; i <= 8; i++) {
    pinMode(pins[i], OUTPUT);
  }

  // set up cols and rows
  for (int i = 1; i <= 4; i++) {
    digitalWrite(cols[i - 1], LOW);
  }

  for (int i = 1; i <= 4; i++) {
    digitalWrite(rows[i - 1], LOW);
  }

  clearLeds();

  // Turn off toggling of pin 11
  FrequencyTimer2::disable();
  // Set refresh rate (interrupt timeout period)
  FrequencyTimer2::setPeriod(2000);
  // Set interrupt routine to be called
  FrequencyTimer2::setOnOverflow(display);

  setPattern(pattern);
}

void loop() {
    pattern = ++pattern % numPatterns;
    slidePattern(pattern, 60);
}

void clearLeds() {
  // Clear display array
  for (int i = 0; i < 4; i++) {
    for (int j = 0; j < 4; j++) {
      leds[i][j] = 0;
    }
  }
}

void setPattern(int pattern) {
  for (int i = 0; i < 4; i++) {
    for (int j = 0; j < 4; j++) {
      leds[i][j] = patterns[pattern][i][j];
    }
  }
}

void slidePattern(int pattern, int del) {
  for (int l = 0; l < 4; l++) {
    for (int i = 0; i < 3; i++) {
      for (int j = 0; j < 4; j++) {
        leds[j][i] = leds[j][i+1];
      }
    }
    for (int j = 0; j < 4; j++) {
      leds[j][3] = patterns[pattern][j][0 + l];
    }
    delay(del);
  }
}

// Interrupt routine
void display() {
  digitalWrite(cols[col], LOW);  // Turn whole previous column off
  col++;
  if (col == 4) {
    col = 0;
  }
  for (int row = 0; row < 4; row++) {
    if (leds[col][3 - row] == 1) {
      digitalWrite(rows[row], LOW);  // Turn on this led
    }
    else {
      digitalWrite(rows[row], HIGH); // Turn off this led
    }
  }
  digitalWrite(cols[col], HIGH); // Turn whole column on at once (for equal lighting times)
}

Ich hoffe das mir jemand mit meinem Problem weiterhelfen kann ! :wink:
Schon mal danke im vorraus !!!

wer noch einen schaltplan von dem Matrix benötigt kann hier mal vorbeischauen: http://minipenguin.com/?cat=14
(den Code, den man unten auf der seite findet, funktioniert leider nicht bei mir, deswegen versuch ich auch
mit dem obigen code weiterzukommen ! Vielleicht könnte mir ja auch die fehler des codes auf der seite sagen)

Bitte sag uns genau was nicht funktioniert. Bitte auch Fehlermeldungen.
Funktioniert der Code mit dem IDE 0023?
Eine Fehler ist sicher daß Du ein 9 Element Array definierst aber auf 11 Elemente zugreifst:

int pins[9]= {-1, 4, 5, 6, 7, 8, 9, 10, 11};
....
int cols[4] = {pins[7], pins[6], pins[5], pins[4]};
int rows[4] = {pins[11], pins[10], pins[9], pins[8]};

Grüße Uwe

uwefed:
Bitte sag uns genau was nicht funktioniert. Bitte auch Fehlermeldungen.
Funktioniert der Code mit dem IDE 0023?
Eine Fehler ist sicher daß Du ein 9 Element Array definierst aber auf 11 Elemente zugreifst:

int pins[9]= {-1, 4, 5, 6, 7, 8, 9, 10, 11};

....
int cols[4] = {pins[7], pins[6], pins[5], pins[4]};
int rows[4] = {pins[11], pins[10], pins[9], pins[8]};



Grüße Uwe

Der Code ist ja nicht indem sinne falsch, dass der code fehler enthält und ich den nicht auf das board laden kann, sondern das der code falsch auf dem board ausgeführt wird.
Am Anfang des Codes, werden ja die verschiedenen "Muster" dargestellt. Die haben jetzt nicht wirklich etwas mit dem Buchstaben der da jeweils drübersteht.
Da ich ja die Muster vorgegeben habe, sollten diese ja nach der reihnfolge auf dem Matrix erscheinen. Jedoch da liegt das Problem. Bei mir geht nur eine ganze Reihe an, die ständig flackert !
Ich hoffe das ist mehr verständlich.

int pins[9]= {-1, 4, 5, 6, 7, 8, 9, 10, 11};
....
int cols[4] = {pins[7], pins[6], pins[5], pins[4]};
int rows[4] = {pins[11], pins[10], pins[9], pins[8]};

Hier weiß ich nicht was du meinst mit 11 Elementen und so ?! passt doch alles...oder täusch ich mich da ?
9 pins in der klammer ist doch richtig ???

lgrube96:

int pins[9]= {-1, 4, 5, 6, 7, 8, 9, 10, 11};

....
int cols[4] = {pins[7], pins[6], pins[5], pins[4]};
int rows[4] = {pins[11], pins[10], pins[9], pins[8]};




Hier weiß ich nicht was du meinst mit 11 Elementen und so ?! passt doch alles...oder täusch ich mich da ?
9 pins in der klammer ist doch richtig ???

Wenn Du ein Array mit 9 Elementen definierst, geht der Index für den Zugriff auf die Elemente von 0 bis 8 (pins[0] bis pins[8]).
Mit pins[9], pins[10] und pins[11] greifst Du auf Bereiche außerhalb des Arrays zu. Beim Lesen kommt da nur zufälliger Müll, beim Schreiben wirds kritisch.

Bei mir geht nur eine ganze Reihe an, die ständig flackert !

Hört sich für mich so an als ob die Matrix nicht gemultiplext würde, sondern das statt dessen alle Zeileninformationen in einer einzigen Zeile dargestellt werden !

MaFu:

lgrube96:

int pins[9]= {-1, 4, 5, 6, 7, 8, 9, 10, 11};

....
int cols[4] = {pins[7], pins[6], pins[5], pins[4]};
int rows[4] = {pins[11], pins[10], pins[9], pins[8]};




Hier weiß ich nicht was du meinst mit 11 Elementen und so ?! passt doch alles...oder täusch ich mich da ?
9 pins in der klammer ist doch richtig ???

Wenn Du ein Array mit 9 Elementen definierst, geht der Index für den Zugriff auf die Elemente von 0 bis 8 (pins[0] bis pins[8]).

Mit pins[9], pins[10] und pins[11] greifst Du auf Bereiche außerhalb des Arrays zu. Beim Lesen kommt da nur zufälliger Müll, beim Schreiben wirds kritisch.

Aso, stimmt, wusst ich noch gar nicht so genau.
Müsst ich dann statt der 9 eine 11 nehmen oder wie ? ich bin da jetzt nicht so der schlauste -_-

Megaionstorm:

Bei mir geht nur eine ganze Reihe an, die ständig flackert !

Hört sich für mich so an als ob die Matrix nicht gemultiplext würde, sondern das statt dessen alle Zeileninformationen in einer einzigen Zeile dargestellt werden !

Joa könnte sein, jedoch bin ich da in dem Gebiet noch nicht sehr informiert. Bin noch so am anfang, deswegen hab ich mir gedacht mache ich das mal erst mit Beispielen. Aber es flackert nicht so wie ne kerze oder so....es ist nur so ganz leicht, das man auch nur, wenn man länger draufschaut, erkennt. :smiley:

lgrube96:

MaFu:

lgrube96:

int pins[9]= {-1, 4, 5, 6, 7, 8, 9, 10, 11};

....
int cols[4] = {pins[7], pins[6], pins[5], pins[4]};
int rows[4] = {pins[11], pins[10], pins[9], pins[8]};




Hier weiß ich nicht was du meinst mit 11 Elementen und so ?! passt doch alles...oder täusch ich mich da ?
9 pins in der klammer ist doch richtig ???

Wenn Du ein Array mit 9 Elementen definierst, geht der Index für den Zugriff auf die Elemente von 0 bis 8 (pins[0] bis pins[8]).

Mit pins[9], pins[10] und pins[11] greifst Du auf Bereiche außerhalb des Arrays zu. Beim Lesen kommt da nur zufälliger Müll, beim Schreiben wirds kritisch.

Aso, stimmt, wusst ich noch gar nicht so genau.
Müsst ich dann statt der 9 eine 11 nehmen oder wie ? ich bin da jetzt nicht so der schlauste -_-

Für mich sieht es so aus als ob Du bei pins[] immer die Werte reinschreibst die im Array drin sind. Du musst aber den Index (beginnend mit 0) des Arrayfeldes eintragen.
Um das erste Feld (welches -1 beinhaltet) auszulesen greifst Du mit pins[0] darauf zu.
Für das zweite Feld (Inhalt 4) schreibst Du pins[1]
Für das dritte Feld (Inhalt 5) schreibst Du pins[2]
etc.

MaFu:

lgrube96:

MaFu:

lgrube96:

int pins[9]= {-1, 4, 5, 6, 7, 8, 9, 10, 11};

....
int cols[4] = {pins[7], pins[6], pins[5], pins[4]};
int rows[4] = {pins[11], pins[10], pins[9], pins[8]};




Hier weiß ich nicht was du meinst mit 11 Elementen und so ?! passt doch alles...oder täusch ich mich da ?
9 pins in der klammer ist doch richtig ???

Wenn Du ein Array mit 9 Elementen definierst, geht der Index für den Zugriff auf die Elemente von 0 bis 8 (pins[0] bis pins[8]).

Mit pins[9], pins[10] und pins[11] greifst Du auf Bereiche außerhalb des Arrays zu. Beim Lesen kommt da nur zufälliger Müll, beim Schreiben wirds kritisch.

Aso, stimmt, wusst ich noch gar nicht so genau.
Müsst ich dann statt der 9 eine 11 nehmen oder wie ? ich bin da jetzt nicht so der schlauste -_-

Für mich sieht es so aus als ob Du bei pins[] immer die Werte reinschreibst die im Array drin sind. Du musst aber den Index (beginnend mit 0) des Arrayfeldes eintragen.
Um das erste Feld (welches -1 beinhaltet) auszulesen greifst Du mit pins[0] darauf zu.
Für das zweite Feld (Inhalt 4) schreibst Du pins[1]
Für das dritte Feld (Inhalt 5) schreibst Du pins[2]
etc.

Habe das mal so geändert wie du es beschrieben hast. Es bewegt sich jetzt zwar etwas über den bildschirm, wenn man die muster ein bischen verändert aber so ganz klappt es nun auch wieder nicht, da die muster die man eingibt nicht so richtig erscheinen -_-

trotzdem vielen dank !

Angenommen die Kolonnen der Matrix hängen an den Pins 4,5,6 und 7 und die Reihen an 8,9,10 und 11.
richtig ist:

int pins[9]= {-1, 4, 5, 6, 7, 8, 9, 10, 11};
....
int cols[4] = {pins[4], pins[3], pins[2], pins[1]};
int rows[4] = {pins[8], pins[7], pins[6], pins[5]};

oder:

int cols[4] = {7,6,5,4};
int rows[4] = {11,10,9,8};

Grüße Uwe

uwefed:
Angenommen die Kolonnen der Matrix hängen an den Pins 4,5,6 und 7 und die Reihen an 8,9,10 und 11.
richtig ist:

int pins[9]= {-1, 4, 5, 6, 7, 8, 9, 10, 11};

....
int cols[4] = {pins[4], pins[3], pins[2], pins[1]};
int rows[4] = {pins[8], pins[7], pins[6], pins[5]};




oder:



int cols[4] = {7,6,5,4};
int rows[4] = {11,10,9,8};




Grüße Uwe

Vielen vielen danke !!!

Es klappt ! :wink: eeeeendlich....
aber es gibt noch ein kleines problem. Die anzeige läuft noch viel zu schnell, wie
könnte ich das noch langsamer machen, dass man auch etwas erkennt ?!
ich habe schon versucht

 // Set refresh rate (interrupt timeout period)
  FrequencyTimer2::setPeriod(2000);

die zeit zu ändern aber bis jetzt hat sich noch nciht geändert...
Ich hoffe da kann mir hier auch einer weiterhelfen :wink:

Hat sich schon erledigt, ich habe einfach hier:

void loop() {
    pattern = ++pattern % numPatterns;
    slidePattern(pattern, 60);

die zahl erhöht, dann verlangsamt sich das automatisch :wink:

jedoch hab ich noch etwas:

die leds die eigentlich aus sein sollen, sind noch immer relativ hell ! -_-
woran kann das liegen ??