Egy 8x8-as LED-mátrix vezérlése.

Sor-oszlop szkennelés egy 8x8-as LED-mátrix vezérléséhez.


Utolsó felülvizsgálat: 2022.02.04 16:50


A LED-kijelzőket gyakran LED-mátrixokba csomagolják, amelyek közös anódok soraiban és közös katódok oszlopaiban vannak elrendezve, vagy fordítva. Íme egy tipikus példa, és annak vázlata:

Ezek nagyon hasznos kijelzők lehetnek. A mátrix vezérléséhez a sorait és az oszlopait is a mikrokontrollerhez kell csatlakoztatnia. Az oszlopok a LED-ek katódjaihoz vannak csatlakoztatva (lásd az 1. ábrát), ezért az oszlopnak LOW-nak kell lennie ahhoz, hogy az oszlopban lévő LED-ek bármelyike bekapcsoljon. A sorok a LED-ek anódjaihoz vannak csatlakoztatva, így a sornak MAGASnak kell lennie ahhoz, hogy az egyes LED-ek bekapcsoljanak. Ha a sor és az oszlop egyaránt magas vagy mindkettő alacsony, a LED-en nem folyik át áram, és nem kapcsol be.

Az egyes LED-ek vezérléséhez az oszlopát LOW-ra, a sorát pedig HIGH-ra kell állítani. Ha egy sorban több LED-et szeretne vezérelni, állítsa be a sort HIGH, majd emelje az oszlopot magasra, majd állítsa be az oszlopokat LOW vagy HIGH megfelelően; a LOW oszlop bekapcsolja a megfelelő LED-et, a HIGH oszlop pedig kikapcsolja.

Tipp – A PinMode paranccsal OUTPUT értékre beállított tűk LOW értékre vannak állítva, ha nincs másképp megadva.

Bár léteznek előre elkészített LED-mátrixok, 64 LED-ből is elkészítheti saját mátrixát a fenti kapcsolási rajz segítségével.

Nem mindegy, hogy a mikrokontroller melyik kivezetésére kötöd a sorokat, oszlopokat, mert szoftveresen lehet hozzárendelni a dolgokat. A csapokat úgy csatlakoztassa, hogy a vezetékezés a legegyszerűbb legyen. Az alábbiakban egy tipikus elrendezés látható.

Íme a kivezetések csatlakozásainak mátrixa a fenti diagram alapján:

Mátrix kivezetés száma Sor Oszlop Arduino kivezetés száma
1 5 - 13
2 7 - 12
3 - 2 11
4 - 3 10
5 8 - 16 (analóg 2)
6 - 5 17 (analóg 3)
7 6 - 18 (analóg 4)
8 3 - 19 (analóg 5)
9 1 - 2
10 - 4 3
11 - 6 4
12 4 - 5
13 - 1 6
14 2 - 7
15 - 7 8
16 - 8 9

Hardver szükséglet

  • Arduino kártya

  • 8 x 8 LED mátrix

  • 2 10kohm-os potenciométer

  • összekötő vezetékek

  • dugdosós próbapanel (breadboard)

Az áramkör

A mátrix 16 kivezetése az Arduino tábla 16 kivezetéséhez van csatlakoztatva. Az analóg érintkezők közül négy digitális bemenetként szolgál a 16-19. A kivezetések sorrendje két tömbben van hozzárendelve a kódban.

Két, a 0 és 1 analóg kivezetéshez csatlakoztatott potenciométer szabályozza a világító LED mozgását a mátrixban.

Vázlat

A kód

/*
  Row-Column Scanning an 8x8 LED matrix with X-Y input

  Ez a példa egy 8x8 LED-es mátrixot vezérel két analóg bemenet használatával.

  Ez a példa a Lumex LDM-24488NI mátrixra vonatkozik. Lásd
  https://sigma.octopart.com/140413/datasheet/Lumex-LDM-24488NI.pdf
  a kivezetések csatlakoztatásához.

  Más LED-katódos oszlopmátrixok esetén csak a row[] és column[] tömbök kivezetés-számait kell megváltoztatnia.

  sorok az anódok
  oszlopok a katódok
  ---------

  Kivezetés-számok:
  Matrix:
  - digitális kivezetések 2 - 13,
  - analóg kivezetések 2 - 5 digitálisként használhatók, 16 - 19
  Potenciométerek:
  - a középső csatlakozó az analóg 0 és 1-re csatlakoztatva
  - a szélső csatlakozók a +5V-ra és a földre csatlakoztatva
  
  created 27 May 2009
  modified 30 Aug 2011
  by Tom Igoe

  Ez a kód nyilvános.

  https://docs.arduino.cc/built-in-examples/display/RowColumnScanning
*/

// A sorok kivezetés-számainak kétdimenziós tömbje:
const int row[8] = {
  2, 7, 19, 5, 13, 18, 12, 16
};

// Az oszlopok kivezetés-számainak kétdimenziós tömbje:
const int col[8] = {
  6, 11, 10, 3, 17, 4, 8, 9
};

// a pixelek kétdimenziós tömbje:
int pixels[8][8];

// kurzor pozíciója:
int x = 5;
int y = 5;

void setup() {
  // inicializálja az I/O kivetetéseket, ahogy a kimenetek a kivezetések között ismétlődnek:
  for (int thisPin = 0; thisPin < 8; thisPin++) {
    // inicializálja a kimeneti kivezetéseket:
    pinMode(col[thisPin], OUTPUT);
    pinMode(row[thisPin], OUTPUT);
    // emelje magasra a col kivezetéseket (azaz a katódokat), hogy biztosítsa a LED-ek kikapcsolását:
    digitalWrite(col[thisPin], HIGH);
  }

  // inicializálja a pixel mátrixot:
  for (int x = 0; x < 8; x++) {
    for (int y = 0; y < 8; y++) {
      pixels[x][y] = HIGH;
    }
  }
}

void loop() {
  // bemenet olvasása:
  readSensors();

  // rajzold meg a képernyőt:
  refreshScreen();
}

void readSensors() {
  // az utolsó pozíció kikapcsolása:
  pixels[x][y] = HIGH;
  // olvassa le az X és Y értékek érzékelőit:
  x = 7 - map(analogRead(A0), 0, 1023, 0, 7);
  y = map(analogRead(A1), 0, 1023, 0, 7);
  // állítsa az új pixelpozíciót alacsonyra, hogy a LED a következő
  // képernyőfrissítéskor bekapcsoljon:
  pixels[x][y] = LOW;

}

void refreshScreen() {
  // iteráld a sorokat (anódok):
  for (int thisRow = 0; thisRow < 8; thisRow++) {
    // vedd magasra a sor kivezetéseket (anódot):
    digitalWrite(row[thisRow], HIGH);
    // iteráld az oszlopokat (katódok):
    for (int thisCol = 0; thisCol < 8; thisCol++) {
      // lekérni az aktuális pixel állapotát;
      int thisPixel = pixels[thisRow][thisCol];
      // Ha a sor HIGH és a col LOW, a LED, ahol találkoznak,
      // felgyullad:
      digitalWrite(col[thisCol], thisPixel);
      // kapcsold ki a pixelt:
      if (thisPixel == LOW) {
        digitalWrite(col[thisCol], HIGH);
      }
    }
    // húzza le a sor kivezetéseket az egész sor kikapcsolásához:
    digitalWrite(row[thisRow], LOW);
  }
}

Tudj meg többet

További alapvető oktatóanyagokat a beépített példák részben talál.

Felfedezheti a nyelvi referenciát is, az Arduino programozási nyelv részletes gyűjteményét.