Jak podłączyć LED Matrix do Arduino za pomocą MAX 7219?

9

Mam:

P: Zastanawiam się, jak mogę to połączyć z Arduino Duemilanove ?

Googlowałem, ale nie mogłem się dowiedzieć, jak to zrobić.

Jusaca
źródło
@Bruno - Usunąłeś link, więc myślałem, że nie żyje. Ale jest w porządku i nie wyjaśniłeś, dlaczego usunąłeś, więc wycofałem się. Jeśli masz dobry powód, aby usunąć link, zostaw go w polu komentarza.
stevenvh
@stevenvh Przepraszamy, przetestowałem go wcześniej i nie działał. Może miałem problemy z łącznością z Internetem, ale teraz działa. Udało ci się cofnąć moją edycję.
Bruno Ferreira,

Odpowiedzi:

11

Bryan Chung miał jeszcze samouczek w internetowym archiwum, w jaki sposób podłączyć matrycę LED do Arduino za pomocą MAX7219:

Oto eksperyment z matrycą LED 8 × 8, napędzaną przez układ scalony MAX7219, sterowany przez płytkę mikrokontrolera Arduino. Tan od DinoTech wykonał niestandardową płytkę drukowaną, aby uporządkować wszystkie przewody łączące matrycę LED i układ scalony. Dostarczany jest z osobnym zasilaczem 12V, aby nie spuścić wszystkiego z płyty Arduino.

Do kontrolowania układu scalonego sterownika MAX7219 potrzebne są tylko 4 przewody. Oni są

Zegar danych Zatrzask / obciążenie Uziemienie

Piny danych i zegara powinny pasować do pinów dla polecenia shiftOut () w Arduino. Kołek zatrzaskowy da impuls LOW do WYSOKI po poleceniu shiftOut. Napisałem oryginalny program dla Javelin Stamp. Ponieważ Arduino może przesunąć tylko 8 bitów danych, muszę użyć 2 oddzielnych poleceń, aby przesunąć zarówno górny, jak i dolny bajt do MAX7219, który wymaga 2 bajtów kontroli dla każdego polecenia.

Do struktury danych matrycy LED 8 × 8 używam tablicy bajtów - macierzy o długości 8. Każdy wiersz w macierzy odpowiada wymiarowi Y. Każdy bit z rzędu odpowiada wymiarowi X. Cyfra 1 jest włączona; 0 jest wyłączone. Kierunek X jest odwrócony i występuje również przesunięcie o 1 bit. Służy do tego funkcja updateLED ().

Pierwszy program to animacja ruchu jednowierszowego.

int CLOCK = 12;
int LATCH = 13;
int DATA  = 11;
byte matrix[8];
int idx = 0;

void setup() {
  pinMode(CLOCK, OUTPUT);
  pinMode(LATCH, OUTPUT);
  pinMode(DATA,  OUTPUT);
  digitalWrite(CLOCK, LOW);
  digitalWrite(LATCH, LOW);
  digitalWrite(DATA,  LOW);
  initLED();
  clearLED();
}

void loop() {
  for (int j=0;j<8;j++) {
    updateLED(idx, j, true);
  }
  refreshLED();
  delay(200);
  for (int j=0;j<8;j++) {
    updateLED(idx, j, false);
  }
  refreshLED();
  delay(100);
  idx++;
  idx %= 8;
}

void ledOut(int n) {
  digitalWrite(LATCH, LOW);
  shiftOut(DATA, CLOCK, MSBFIRST, (n>>8));
  shiftOut(DATA, CLOCK, MSBFIRST, (n));
  digitalWrite(LATCH, HIGH);
  delay(1);
  digitalWrite(LATCH, LOW);
}

void initLED() {
  ledOut(0x0B07);
  ledOut(0x0A0C);
  ledOut(0x0900);
  ledOut(0x0C01);
}

void clearLED() {
  for (int i=0;i<8;i++) {
    matrix[i] = 0x00;
  }
  refreshLED();
}

void refreshLED() {
  int n1, n2, n3;
  for (int i=0;i<8;i++) {
    n1 = i+1;
    n2 = matrix[i];
    n3 = (n1<<8)+n2;
    ledOut(n3);
  }
}

void updateLED(int i, int j, boolean b) {
  int t = 1;
  int n = 0;
  int m = 0;
  if (j==0) {
    m = 7;
  }
  else {
    m = j-1;
  }
  n = t<<m;
  if (b) {
    matrix[i] = n | matrix[i];
  }
  else {
    n = ~n;
    matrix[i] = n & matrix[i];
  }
}
littlebirdceo
źródło
2

Przepraszam, jeśli jest trochę za późno, ale właśnie napisałem post o używaniu MAX7219 z matrycami LED i 7-segmentowymi wyświetlaczami LED.


źródło