Mam:
- 2 matryca LED 8x8 , oraz
- Chip MAX7219.
P: Zastanawiam się, jak mogę to połączyć z Arduino Duemilanove ?
Googlowałem, ale nie mogłem się dowiedzieć, jak to zrobić.
Mam:
P: Zastanawiam się, jak mogę to połączyć z Arduino Duemilanove ?
Googlowałem, ale nie mogłem się dowiedzieć, jak to zrobić.
Odpowiedzi:
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];
}
}
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.