Bemerkung

Hallo und willkommen in der SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasten-Gemeinschaft auf Facebook! Tauchen Sie tiefer ein in die Welt von Raspberry Pi, Arduino und ESP32 mit anderen Enthusiasten.

Warum beitreten?

  • Expertenunterstützung: Lösen Sie Nachverkaufsprobleme und technische Herausforderungen mit Hilfe unserer Gemeinschaft und unseres Teams.

  • Lernen & Teilen: Tauschen Sie Tipps und Anleitungen aus, um Ihre Fähigkeiten zu verbessern.

  • Exklusive Vorschauen: Erhalten Sie frühzeitigen Zugang zu neuen Produktankündigungen und exklusiven Einblicken.

  • Spezialrabatte: Genießen Sie exklusive Rabatte auf unsere neuesten Produkte.

  • Festliche Aktionen und Gewinnspiele: Nehmen Sie an Gewinnspielen und Feiertagsaktionen teil.

👉 Sind Sie bereit, mit uns zu erkunden und zu erschaffen? Klicken Sie auf [hier] und treten Sie heute bei!

1.1.6 LED Dot Matrix Modul

Einführung

In diesem Projekt werden Sie das LED Matrix Modul kennenlernen. Das LED Matrix Modul verwendet den MAX7219 Treiber, um die 8 x 8 LED Matrix zu steuern.

Benötigte Komponenten

Für dieses Projekt benötigen wir die folgenden Komponenten.

../_images/list_dot.png

Es ist definitiv praktisch, ein ganzes Kit zu kaufen. Hier ist der Link:

Name

ARTIKEL IN DIESEM KIT

LINK

Raphael Kit

337

Raphael Kit

Sie können sie auch separat über die untenstehenden Links kaufen.

KOMPONENTENBESCHREIBUNG

KAUF-LINK

GPIO Extension Board

KAUFEN

Steckbrett

KAUFEN

Jumper-Kabel

KAUFEN

LED Matrix Modul

KAUFEN

Schaltplan

T-Board Name

physical

wiringPi

BCM

SPIMOSI

Pin 19

12

MOSI

SPICE0

pin 24

10

CE0

SPISCLK

Pin 23

14

SCLK

../_images/schematic_dot.png

Experimentelle Verfahren

Schritt 1: Bauen Sie die Schaltung.

../_images/1.1.6fritzing.png

Schritt 2: Schalten Sie das SPI vor Beginn des Experiments ein. Siehe SPI-Konfiguration für Details.

Schritt 3: Navigieren Sie zum Ordner des Codes.

cd ~/raphael-kit/c/1.1.6/

Schritt 4: Kompilieren Sie den Code.

make

Schritt 5: Starten Sie die ausführbare Datei.

sudo ./1.1.6_LedMatrix

Nach dem Ausführen des Codes zeigt die LED-Punktmatrix nacheinander ein Quadrat, ein Herz und die Zahlen 0 bis 9 an.

Bemerkung

Wenn es nach dem Start nicht funktioniert oder eine Fehlermeldung erscheint: "wiringPi.h: No such file or directory", bitte beziehen Sie sich auf Installieren und Überprüfen von WiringPi.

Code

#include <wiringPi.h>
#include <wiringPiSPI.h>
#include <stdio.h>

#define SPI_CHANNEL    0           // Define SPI channel (0 or 1)
#define SPI_SPEED      1000000     // SPI speed set to 1 MHz

// Function to write data to a MAX7219 register
void max7219_write(unsigned char address, unsigned char data) {
    unsigned char buffer[2];
    buffer[0] = address;   // Register address to write to
    buffer[1] = data;      // Data to write into the register
    wiringPiSPIDataRW(SPI_CHANNEL, buffer, 2);  // Send data via SPI
}

// Function to initialize the MAX7219 display module
void max7219_init() {
    max7219_write(0x09, 0x00); // Decode Mode: No decoding for digits (useful for 7-segment displays)
    max7219_write(0x0A, 0x03); // Intensity: Set brightness level (0x00 to 0x0F)
    max7219_write(0x0B, 0x07); // Scan Limit: Display digits 0-7 (all 8 digits)
    max7219_write(0x0C, 0x01); // Shutdown Register: Normal operation (not in shutdown mode)
    max7219_write(0x0F, 0x00); // Display Test: Normal operation (no test mode)

    // Clear all digits on the display
    for (int i = 1; i <= 8; i++) {
        max7219_write(i, 0x00); // Write 0 to each digit register
    }
}

// Function to display a pattern on the MAX7219
void max7219_display(unsigned char *data) {
    for (int i = 1; i <= 8; i++) {
        max7219_write(i, data[i - 1]); // Write each row of the pattern to the display
    }
}

// Function to display a pattern for a specified duration
void display_pattern(const unsigned char pattern[8], int delay_ms) {
    max7219_display((unsigned char *)pattern); // Display the pattern
    delay(delay_ms);                           // Wait for the specified time in milliseconds
}

// Array of patterns to display
const unsigned char patterns[][8] = {
    // Square pattern
    {
        0b11111111, // Row 1
        0b10000001, // Row 2
        0b10000001, // Row 3
        0b10000001, // Row 4
        0b10000001, // Row 5
        0b10000001, // Row 6
        0b10000001, // Row 7
        0b11111111  // Row 8
    },
    // Heart pattern
    {
        0b01100110, // Row 1
        0b11111111, // Row 2
        0b11111111, // Row 3
        0b11111111, // Row 4
        0b01111110, // Row 5
        0b00111100, // Row 6
        0b00011000, // Row 7
        0b00000000  // Row 8
    },
    // Number 0
    {
        0b00111100, // Row 1
        0b01100110, // Row 2
        0b11000011, // Row 3
        0b11000011, // Row 4
        0b11000011, // Row 5
        0b11000011, // Row 6
        0b01100110, // Row 7
        0b00111100  // Row 8
    },
    // Number 1
    {
        0b00011000, // Row 1
        0b00111000, // Row 2
        0b01111000, // Row 3
        0b00011000, // Row 4
        0b00011000, // Row 5
        0b00011000, // Row 6
        0b01111110, // Row 7
        0b01111110  // Row 8
    },
    // Number 2
    {
        0b01111110, // Row 1
        0b11000011, // Row 2
        0b00000011, // Row 3
        0b00001110, // Row 4
        0b00110000, // Row 5
        0b11000000, // Row 6
        0b11111111, // Row 7
        0b00000000  // Row 8
    },
    // Number 3
    {
        0b01111110, // Row 1
        0b11000011, // Row 2
        0b00000011, // Row 3
        0b00111110, // Row 4
        0b00000011, // Row 5
        0b11000011, // Row 6
        0b01111110, // Row 7
        0b00000000  // Row 8
    },
    // Number 4
    {
        0b00001110, // Row 1
        0b00011110, // Row 2
        0b00110110, // Row 3
        0b01100110, // Row 4
        0b11111111, // Row 5
        0b00000110, // Row 6
        0b00000110, // Row 7
        0b00000000  // Row 8
    },
    // Number 5
    {
        0b11111111, // Row 1
        0b11000000, // Row 2
        0b11111110, // Row 3
        0b00000011, // Row 4
        0b00000011, // Row 5
        0b11000011, // Row 6
        0b01111110, // Row 7
        0b00000000  // Row 8
    },
    // Number 6
    {
        0b00111110, // Row 1
        0b01100000, // Row 2
        0b11000000, // Row 3
        0b11111110, // Row 4
        0b11000011, // Row 5
        0b11000011, // Row 6
        0b01111110, // Row 7
        0b00000000  // Row 8
    },
    // Number 7
    {
        0b11111111, // Row 1
        0b11000011, // Row 2
        0b00000110, // Row 3
        0b00001100, // Row 4
        0b00011000, // Row 5
        0b00110000, // Row 6
        0b00110000, // Row 7
        0b00000000  // Row 8
    },
    // Number 8
    {
        0b01111110, // Row 1
        0b11000011, // Row 2
        0b11000011, // Row 3
        0b01111110, // Row 4
        0b11000011, // Row 5
        0b11000011, // Row 6
        0b01111110, // Row 7
        0b00000000  // Row 8
    },
    // Number 9
    {
        0b01111110, // Row 1
        0b11000011, // Row 2
        0b11000011, // Row 3
        0b01111111, // Row 4
        0b00000011, // Row 5
        0b00000110, // Row 6
        0b01111100, // Row 7
        0b00000000  // Row 8
    },
};

int main() {
    if (wiringPiSetup() == -1) {
        printf("Failed to initialize WiringPi\n");
        return 1;
    }

    if (wiringPiSPISetup(SPI_CHANNEL, SPI_SPEED) == -1) {
        printf("Failed to initialize SPI\n");
        return 1;
    }

    max7219_init();  // Initialize the MAX7219 module

    // Display patterns in a loop
    while (1) {
        // Display the square pattern
        display_pattern(patterns[0], 1000);  // Display for 1000 milliseconds

        // Display the heart pattern
        display_pattern(patterns[1], 1000);

        // Display numbers 0-9
        for (int i = 2; i <= 11; i++) {
            display_pattern(patterns[i], 1000);
        }
    }

    return 0;
}

Code-Analyse

  1. Header-Dateien:

    • wiringPi.h: Bietet Funktionen zur Steuerung der GPIO-Schnittstellen.

    • wiringPiSPI.h: Bietet Funktionen für die SPI-Kommunikation.

    • stdio.h: Standard-Ein-/Ausgabe-Bibliothek für Funktionen wie printf.

  2. Definitionen:

    • SPI_CHANNEL: Legt den verwendeten SPI-Kanal (0 oder 1) für die Kommunikation fest.

    • SPI_SPEED: Setzt die SPI-Kommunikationsgeschwindigkeit auf 1 MHz.

    #define SPI_CHANNEL    0           // Definiere den SPI-Kanal (0 oder 1)
    #define SPI_SPEED      1000000     // SPI-Geschwindigkeit auf 1 MHz gesetzt
    
  3. Funktion max7219_write: Sendet Daten an ein bestimmtes Register des MAX7219-Anzeigetreibers.

    • address: Die Adresse des Registers, an das geschrieben werden soll.

    • data: Die zu schreibenden Daten in das Register.

    • Erstellt einen Puffer, der die Adresse und Daten enthält.

    • Verwendet wiringPiSPIDataRW, um den Puffer über SPI zu senden.

    void max7219_write(unsigned char address, unsigned char data) {
        unsigned char buffer[2];
        buffer[0] = address;   // Registeradresse, an die geschrieben werden soll
        buffer[1] = data;      // Daten, die in das Register geschrieben werden
        wiringPiSPIDataRW(SPI_CHANNEL, buffer, 2);  // Daten über SPI senden
    }
    
  4. Funktion max7219_init: Initialisiert das MAX7219-Display-Modul mit den erforderlichen Einstellungen.

    • Setzt den Decode-Modus auf „No Decode“, da wir die LEDs direkt steuern.

    • Setzt die Intensität (Helligkeit) auf ein moderates Niveau (0x03).

    • Setzt das Scan-Limit auf 7, um alle 8 Stellen (Reihen) des Displays zu aktivieren.

    • Beendet den Shutdown-Modus, um das Display einzuschalten.

    • Deaktiviert den Display-Testmodus.

    • Löscht das Display, indem 0x00 an alle Stellen-Register geschrieben wird.

    void max7219_init() {
        max7219_write(0x09, 0x00); // Decode-Modus: Kein Decode für Ziffern (nützlich für 7-Segment-Displays)
        max7219_write(0x0A, 0x03); // Intensität: Helligkeitsstufe einstellen (0x00 bis 0x0F)
        max7219_write(0x0B, 0x07); // Scan-Limit: Zeigt Ziffern 0-7 (alle 8 Ziffern) an
        max7219_write(0x0C, 0x01); // Shutdown-Register: Normalbetrieb (nicht im Shutdown-Modus)
        max7219_write(0x0F, 0x00); // Display-Test: Normalbetrieb (kein Testmodus)
    
        // Löscht alle Ziffern auf dem Display
        for (int i = 1; i <= 8; i++) {
            max7219_write(i, 0x00); // Schreibt 0 in jedes Stellen-Register
        }
    }
    
  5. Funktion max7219_display: Aktualisiert das Display mit einem gegebenen 8-Byte-Muster.

    • data: Ein Array, das das anzuzeigende Muster enthält.

    • Durchläuft jede der 8 Reihen (Ziffern) und schreibt die entsprechenden Daten.

    void max7219_display(unsigned char *data) {
        for (int i = 1; i <= 8; i++) {
            max7219_write(i, data[i - 1]); // Schreibt jede Reihe des Musters auf das Display
        }
    }
    
  6. Funktion display_pattern: Zeigt ein Muster für eine bestimmte Zeitdauer an.

    • pattern: Das anzuzeigende Muster (Array von 8 Bytes).

    • delay_ms: Dauer der Anzeige des Musters in Millisekunden.

    • Ruft max7219_display auf, um das Muster anzuzeigen.

    • Verwendet delay, um die angegebene Zeit abzuwarten.

    void display_pattern(const unsigned char pattern[8], int delay_ms) {
        max7219_display((unsigned char *)pattern); // Zeigt das Muster an
        delay(delay_ms);                           // Warten für die angegebene Zeit in Millisekunden
    }
    
  7. Array-Muster:

    • Enthält vordefinierte Muster für das Quadrat, Herz und die Zahlen 0-9.

    • Jedes Muster ist ein Array von 8 Bytes und stellt 8 Reihen der 8x8-LED-Matrix dar.

    • Jedes Byte verwendet die Binärnotation, wobei jedes Bit eine LED darstellt (1 für ein, 0 für aus).

    const unsigned char patterns[][8] = {
        // Quadrat-Muster
        {
            0b11111111, // Reihe 1
            0b10000001, // Reihe 2
            0b10000001, // Reihe 3
            0b10000001, // Reihe 4
            0b10000001, // Reihe 5
            0b10000001, // Reihe 6
            0b10000001, // Reihe 7
            0b11111111  // Reihe 8
        },
        ...
        // Zahl 9
        {
            ...
        },
    };
    
  8. Funktion main:

    • Initialisiert WiringPi und die SPI-Schnittstelle.

      if (wiringPiSetup() == -1) {
          printf("Fehler bei der Initialisierung von WiringPi\n");
          return 1;
      }
      
      if (wiringPiSPISetup(SPI_CHANNEL, SPI_SPEED) == -1) {
          printf("Fehler bei der Initialisierung von SPI\n");
          return 1;
      }
      
    • Ruft max7219_init auf, um das MAX7219-Modul zu konfigurieren.

      max7219_init();  // Initialisiert das MAX7219-Modul
      
    • Betritt eine Endlosschleife, um die Muster kontinuierlich anzuzeigen. Zeigt jedes Muster 1 Sekunde lang an, bevor zum nächsten gewechselt wird.

      while (1) {
          // Zeigt das Quadrat-Muster an
          display_pattern(patterns[0], 1000);  // Anzeige für 1000 Millisekunden
      
          // Zeigt das Herz-Muster an
          display_pattern(patterns[1], 1000);
      
          // Zeigt die Zahlen 0-9 an
          for (int i = 2; i <= 11; i++) {
              display_pattern(patterns[i], 1000);
          }
      }
      

Verständnis der Muster

  • Binäre Darstellung:

    • Jedes Muster wird mit Binärliteralen (0b-Präfix) definiert.

    • Jedes Byte entspricht einer Reihe auf der 8x8-LED-Matrix.

    • Jedes Bit im Byte stellt eine Spalte (LED) in dieser Reihe dar.

    • Das höchstwertige Bit (links) entspricht der ersten LED links.

  • Erstellen benutzerdefinierter Muster:

    • Sie können neue Muster erstellen, indem Sie neue Arrays von 8 Bytes definieren.

    • Jedes Muster kann dem patterns-Array hinzugefügt werden.

    • Aktualisieren Sie die Anzeigeschleife in main, um Ihre neuen Muster einzuschließen.

Anpassungen und Anpassbarkeit

  • Ändern der Helligkeit: Passen Sie den Intensitätswert in max7219_init an:

    max7219_write(0x0A, brightness_level); // brightness_level zwischen 0x00 und 0x0F
    
  • Anpassung der Anzeigedauer: Ändern Sie den Parameter delay_ms in den display_pattern - Aufrufen, um die Dauer der Anzeige jedes Musters anzupassen.

Phänomen-Bild

../_images/1.1.6led_dot_matrix.JPG