.. note:: Ciao, benvenuto nella community di SunFounder Raspberry Pi & Arduino & ESP32 su Facebook! Approfondisci la tua esperienza con Raspberry Pi, Arduino ed ESP32 insieme ad altri appassionati. **Perché unirti a noi?** - **Supporto Esperto**: Risolvi i problemi post-vendita e le sfide tecniche con l'aiuto della nostra comunità e del nostro team. - **Impara e Condividi**: Scambia suggerimenti e tutorial per migliorare le tue competenze. - **Anteprime Esclusive**: Ottieni accesso anticipato agli annunci di nuovi prodotti e alle anteprime. - **Sconti Speciali**: Approfitta di sconti esclusivi sui nostri prodotti più recenti. - **Promozioni Festive e Giveaway**: Partecipa a concorsi e promozioni festive. 👉 Pronto a esplorare e creare con noi? Clicca su [|link_sf_facebook|] e unisciti subito! .. _1.1.6_c: 1.1.6 Modulo Matrice LED ================================== Introduzione -------------------- In questo progetto, imparerai a conoscere il Modulo Matrice LED. Il modulo utilizza il driver MAX7219 per gestire la matrice LED 8 x 8. Componenti Necessari ------------------------------ In questo progetto, abbiamo bisogno dei seguenti componenti. .. image:: ../img/list_dot.png È sicuramente conveniente acquistare un kit completo, ecco il link: .. list-table:: :widths: 20 20 20 :header-rows: 1 * - Nome - COMPONENTI NEL KIT - LINK * - Raphael Kit - 337 - |link_Raphael_kit| Puoi anche acquistarli separatamente dai seguenti link. .. list-table:: :widths: 30 20 :header-rows: 1 * - INTRODUZIONE AI COMPONENTI - LINK PER L'ACQUISTO * - :ref:`cpn_gpio_extension_board` - |link_gpio_board_buy| * - :ref:`cpn_breadboard` - |link_breadboard_buy| * - :ref:`cpn_wires` - |link_wires_buy| * - :ref:`cpn_dot_matrix` - |link_led_matrix_buy| Schema Elettrico ----------------------- ============ ======== ======== ==== T-Board Name physical wiringPi BCM SPIMOSI Pin 19 12 MOSI SPICE0 pin 24 10 CE0 SPISCLK Pin 23 14 SCLK ============ ======== ======== ==== .. image:: ../img/schematic_dot.png Procedure Sperimentali ---------------------------- **Passo 1:** Costruisci il circuito. .. image:: ../img/1.1.6fritzing.png **Passo 2:** Accendi il SPI prima di iniziare l'esperimento, fai riferimento a :ref:`spi_configuration` per i dettagli. **Passo 3:** Vai alla cartella del codice. .. raw:: html .. code-block:: cd ~/raphael-kit/c/1.1.6/ **Passo 4:** Compila il codice. .. raw:: html .. code-block:: make **Passo 5:**: Esegui il file eseguibile. .. raw:: html .. code-block:: sudo ./1.1.6_LedMatrix Dopo aver eseguito il codice, la matrice LED mostrerà in sequenza i numeri da 0 a 9 e le lettere da A a Z. .. note:: Se non funziona dopo l'esecuzione, o appare un messaggio di errore: \"wiringPi.h: No such file or directory\", fai riferimento a :ref:`install_wiringpi`. **Codice** .. code-block:: c #include #include #include #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; } **Spiegazione del Codice** #. File di intestazione: * ``wiringPi.h``: Fornisce funzioni per il controllo dei GPIO. * ``wiringPiSPI.h``: Fornisce funzioni per la comunicazione SPI. * ``stdio.h``: Libreria di input/output standard per funzioni come printf. #. Definizioni: * ``SPI_CHANNEL``: Specifica il canale SPI (0 o 1) usato per la comunicazione. * ``SPI_SPEED``: Imposta la velocità della comunicazione SPI a 1 MHz. .. code-block:: c #define SPI_CHANNEL 0 // Definisce il canale SPI (0 o 1) #define SPI_SPEED 1000000 // Velocità SPI impostata a 1 MHz #. Funzione ``max7219_write``: Invia dati a un registro specifico del driver del display MAX7219. * ``address``: Indirizzo del registro a cui scrivere. * ``data``: Dati da scrivere nel registro. * Crea un buffer contenente indirizzo e dati. * Utilizza ``wiringPiSPIDataRW`` per inviare il buffer via SPI. .. code-block:: c void max7219_write(unsigned char address, unsigned char data) { unsigned char buffer[2]; buffer[0] = address; // Indirizzo del registro a cui scrivere buffer[1] = data; // Dati da scrivere nel registro wiringPiSPIDataRW(SPI_CHANNEL, buffer, 2); // Invia i dati tramite SPI } #. Funzione ``max7219_init``: Inizializza il modulo display MAX7219 con le impostazioni necessarie. * Imposta il modo di decodifica su "no decode" poiché stiamo controllando direttamente i LED. * Imposta l'intensità (luminosità) a un livello medio (0x03). * Imposta il limite di scansione a 7 per abilitare tutte le 8 cifre (righe) del display. * Esce dalla modalità di spegnimento per accendere il display. * Disattiva la modalità di test del display. * Pulisce il display scrivendo 0x00 su tutti i registri delle cifre. .. code-block:: c void max7219_init() { max7219_write(0x09, 0x00); // Modo di decodifica: Nessuna decodifica per le cifre (utile per display a 7 segmenti) max7219_write(0x0A, 0x03); // Intensità: Imposta il livello di luminosità (0x00 a 0x0F) max7219_write(0x0B, 0x07); // Limite di scansione: Visualizza cifre 0-7 (tutte le 8 cifre) max7219_write(0x0C, 0x01); // Registro di spegnimento: Operazione normale (non in modalità spegnimento) max7219_write(0x0F, 0x00); // Test del display: Operazione normale (nessuna modalità di test) // Pulisce tutte le cifre sul display for (int i = 1; i <= 8; i++) { max7219_write(i, 0x00); // Scrive 0 su ogni registro delle cifre } } #. Funzione ``max7219_display``: Aggiorna il display con un pattern di 8 byte. * ``data``: Un array contenente il pattern da visualizzare. * Itera attraverso ciascuna delle 8 righe (cifre) e scrive i dati corrispondenti. .. code-block:: c void max7219_display(unsigned char *data) { for (int i = 1; i <= 8; i++) { max7219_write(i, data[i - 1]); // Scrive ogni riga del pattern sul display } } #. Funzione ``display_pattern``: Visualizza un pattern per un tempo specificato. * ``pattern``: Il pattern da visualizzare (array di 8 byte). * ``delay_ms``: Durata di visualizzazione del pattern in millisecondi. * Chiama ``max7219_display`` per mostrare il pattern. * Usa ``delay`` per attendere la durata specificata. .. code-block:: c void display_pattern(const unsigned char pattern[8], int delay_ms) { max7219_display((unsigned char *)pattern); // Visualizza il pattern delay(delay_ms); // Attende il tempo specificato in millisecondi } #. Array patterns: * Contiene pattern predefiniti per il quadrato, cuore e numeri da 0 a 9. * Ogni pattern è un array di 8 byte, che rappresenta 8 righe della matrice LED 8x8. * Ogni byte usa la notazione binaria dove ogni bit rappresenta un LED (1 per acceso, 0 per spento). .. code-block:: c const unsigned char patterns[][8] = { // Pattern del quadrato { 0b11111111, // Riga 1 0b10000001, // Riga 2 0b10000001, // Riga 3 0b10000001, // Riga 4 0b10000001, // Riga 5 0b10000001, // Riga 6 0b10000001, // Riga 7 0b11111111 // Riga 8 }, ... // Numero 9 { ... }, }; #. Funzione main: * Inizializza ``WiringPi`` e l'interfaccia ``SPI``. .. code-block:: c if (wiringPiSetup() == -1) { printf("Errore nell'inizializzazione di WiringPi\n"); return 1; } if (wiringPiSPISetup(SPI_CHANNEL, SPI_SPEED) == -1) { printf("Errore nell'inizializzazione di SPI\n"); return 1; } * Chiama ``max7219_init`` per configurare il modulo MAX7219. .. code-block:: c max7219_init(); // Inizializza il modulo MAX7219 * Entra in un ciclo infinito per visualizzare continuamente i pattern. Mostra ogni pattern per 1 secondo prima di passare al successivo. .. code-block:: c while (1) { // Visualizza il pattern del quadrato display_pattern(patterns[0], 1000); // Visualizza per 1000 millisecondi // Visualizza il pattern del cuore display_pattern(patterns[1], 1000); // Visualizza i numeri da 0 a 9 for (int i = 2; i <= 11; i++) { display_pattern(patterns[i], 1000); } } **Comprensione dei pattern** * Rappresentazione binaria: * Ogni pattern è definito utilizzando letterali binari (prefisso 0b). * Ogni byte corrisponde a una riga della matrice LED 8x8. * Ogni bit all'interno del byte rappresenta una colonna (LED) in quella riga. * Il bit più significativo (a sinistra) corrisponde al primo LED a sinistra. * Creazione di pattern personalizzati: * È possibile creare nuovi pattern definendo nuovi array di 8 byte. * Ogni pattern può essere aggiunto all'array patterns. * Aggiorna il ciclo di visualizzazione nel main per includere i nuovi pattern. **Regolazioni e personalizzazione** * Cambiare la luminosità: Modificare il livello di intensità in ``max7219_init``: .. code-block:: c max7219_write(0x0A, brightness_level); // brightness_level compreso tra 0x00 e 0x0F * Modificare il tempo di visualizzazione: Cambia il parametro ``delay_ms`` nelle chiamate a ``display_pattern`` per regolare quanto tempo viene visualizzato ogni pattern. Immagine del Fenomeno -------------------------- .. image:: ../img/1.1.6led_dot_matrix.JPG