.. note::
Bonjour et bienvenue dans la Communauté Facebook des passionnés de Raspberry Pi, Arduino et ESP32 de SunFounder ! Plongez plus profondément dans l'univers des Raspberry Pi, Arduino et ESP32 avec d'autres passionnés.
**Pourquoi rejoindre ?**
- **Support d'experts** : Résolvez les problèmes après-vente et les défis techniques avec l'aide de notre communauté et de notre équipe.
- **Apprendre et partager** : Échangez des astuces et des tutoriels pour améliorer vos compétences.
- **Aperçus exclusifs** : Accédez en avant-première aux annonces de nouveaux produits et aux aperçus.
- **Réductions spéciales** : Profitez de réductions exclusives sur nos produits les plus récents.
- **Promotions festives et cadeaux** : Participez à des cadeaux et des promotions de vacances.
👉 Prêt à explorer et à créer avec nous ? Cliquez [|link_sf_facebook|] et rejoignez-nous aujourd'hui !
.. _1.1.6_c:
1.1.6 Module Matrice à LED
==================================
Introduction
--------------------
Dans ce projet, vous allez découvrir le module de matrice à LED. Ce module utilise le driver MAX7219 pour piloter la matrice de LED 8 x 8.
Composants nécessaires
------------------------------
Dans ce projet, nous avons besoin des composants suivants.
.. image:: ../img/list_dot.png
Il est certainement pratique d'acheter un kit complet, voici le lien :
.. list-table::
:widths: 20 20 20
:header-rows: 1
* - Name
- ITEMS IN THIS KIT
- LINK
* - Raphael Kit
- 337
- |link_Raphael_kit|
Vous pouvez également les acheter séparément via les liens ci-dessous.
.. list-table::
:widths: 30 20
:header-rows: 1
* - INTRODUCTION DES COMPOSANTS
- LIEN D'ACHAT
* - :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|
Schéma de câblage
-----------------------
============ ======== ======== ====
Nom T-Board Physique wiringPi BCM
SPIMOSI Pin 19 12 MOSI
SPICE0 pin 24 10 CE0
SPISCLK Pin 23 14 SCLK
============ ======== ======== ====
.. image:: ../img/schematic_dot.png
Procédures expérimentales
----------------------------
**Étape 1 :** Construisez le circuit.
.. image:: ../img/1.1.6fritzing.png
**Étape 2:** Activez le SPI avant de commencer l'expérience, référez-vous à :ref:`spi_configuration` pour les détails.
**Étape 3:** Accédez au dossier du code.
.. raw:: html
.. code-block::
cd ~/raphael-kit/c/1.1.6/
**Étape 4:** Compilez le code.
.. raw:: html
.. code-block::
make
**Étape 5:** Exécutez le fichier exécutable.
.. raw:: html
.. code-block::
sudo ./1.1.6_LedMatrix
Après l'exécution du code, la matrice de LED affiche les chiffres de 0 à 9 et les lettres de A à Z en séquence.
.. note::
Si cela ne fonctionne pas après l'exécution, ou s'il y a une erreur : \"wiringPi.h: No such file or directory\", veuillez vous référer à :ref:`install_wiringpi`.
**Code**
.. 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;
}
**Explication du code**
#. Fichiers d'en-tête :
* ``wiringPi.h`` : Fournit des fonctions pour le contrôle GPIO.
* ``wiringPiSPI.h`` : Fournit des fonctions pour la communication SPI.
* ``stdio.h`` : Bibliothèque d'entrée/sortie standard pour des fonctions comme printf.
#. Définitions :
* ``SPI_CHANNEL`` : Spécifie le canal SPI (0 ou 1) utilisé pour la communication.
* ``SPI_SPEED`` : Définit la vitesse de communication SPI à 1 MHz.
.. code-block:: c
#define SPI_CHANNEL 0 // Définit le canal SPI (0 ou 1)
#define SPI_SPEED 1000000 // Vitesse SPI définie à 1 MHz
#. Fonction ``max7219_write`` : Envoie des données à un registre spécifique du pilote d'affichage MAX7219.
* ``address`` : L'adresse du registre à écrire.
* ``data`` : Les données à écrire dans le registre.
* Crée un buffer contenant l'adresse et les données.
* Utilise ``wiringPiSPIDataRW`` pour envoyer le buffer via SPI.
.. code-block:: c
void max7219_write(unsigned char address, unsigned char data) {
unsigned char buffer[2];
buffer[0] = address; // Adresse du registre à écrire
buffer[1] = data; // Données à écrire dans le registre
wiringPiSPIDataRW(SPI_CHANNEL, buffer, 2); // Envoie les données via SPI
}
#. Fonction ``max7219_init`` : Initialise le module d'affichage MAX7219 avec les réglages nécessaires.
* Définit le mode de décodage sur "sans décodage" car nous contrôlons directement les LED.
* Définit l'intensité (luminosité) à un niveau modéré (0x03).
* Définit la limite de balayage à 7 pour activer les 8 chiffres (lignes) de l'affichage.
* Désactive le mode veille pour allumer l'affichage.
* Désactive le mode de test de l'affichage.
* Efface l'affichage en écrivant 0x00 dans tous les registres de chiffres.
.. code-block:: c
void max7219_init() {
max7219_write(0x09, 0x00); // Mode de décodage : Pas de décodage pour les chiffres (utile pour les affichages à 7 segments)
max7219_write(0x0A, 0x03); // Intensité : Définit le niveau de luminosité (0x00 à 0x0F)
max7219_write(0x0B, 0x07); // Limite de balayage : Affiche les chiffres 0-7 (tous les 8 chiffres)
max7219_write(0x0C, 0x01); // Registre d'arrêt : Fonctionnement normal (pas en mode veille)
max7219_write(0x0F, 0x00); // Test d'affichage : Fonctionnement normal (pas en mode de test)
// Efface tous les chiffres de l'affichage
for (int i = 1; i <= 8; i++) {
max7219_write(i, 0x00); // Écrit 0 dans chaque registre de chiffre
}
}
#. Fonction ``max7219_display`` : Met à jour l'affichage avec un modèle de 8 octets donné.
* ``data`` : Un tableau contenant le modèle à afficher.
* Itère à travers chacune des 8 lignes (chiffres) et écrit les données correspondantes.
.. code-block:: c
void max7219_display(unsigned char *data) {
for (int i = 1; i <= 8; i++) {
max7219_write(i, data[i - 1]); // Écrit chaque ligne du modèle sur l'affichage
}
}
#. Fonction ``display_pattern`` : Affiche un modèle pendant une durée spécifiée.
* ``pattern`` : Le modèle à afficher (tableau de 8 octets).
* ``delay_ms`` : Durée d'affichage du modèle en millisecondes.
* Appelle ``max7219_display`` pour afficher le modèle.
* Utilise ``delay`` pour attendre la durée spécifiée.
.. code-block:: c
void display_pattern(const unsigned char pattern[8], int delay_ms) {
max7219_display((unsigned char *)pattern); // Affiche le modèle
delay(delay_ms); // Attendre la durée spécifiée en millisecondes
}
#. Modèles de tableaux :
* Contient des modèles prédéfinis pour le carré, le cœur et les chiffres 0-9.
* Chaque modèle est un tableau de 8 octets, représentant 8 lignes de la matrice LED 8x8.
* Chaque octet utilise la notation binaire où chaque bit représente une LED (1 pour allumé, 0 pour éteint).
.. code-block:: c
const unsigned char patterns[][8] = {
// Modèle de carré
{
0b11111111, // Ligne 1
0b10000001, // Ligne 2
0b10000001, // Ligne 3
0b10000001, // Ligne 4
0b10000001, // Ligne 5
0b10000001, // Ligne 6
0b10000001, // Ligne 7
0b11111111 // Ligne 8
},
...
// Chiffre 9
{
...
},
};
#. Fonction principale :
* Initialise l'interface ``WiringPi`` et ``SPI``.
.. code-block:: c
if (wiringPiSetup() == -1) {
printf("Échec de l'initialisation de WiringPi\n");
return 1;
}
if (wiringPiSPISetup(SPI_CHANNEL, SPI_SPEED) == -1) {
printf("Échec de l'initialisation de SPI\n");
return 1;
}
* Appelle ``max7219_init`` pour configurer le module MAX7219.
.. code-block:: c
max7219_init(); // Initialise le module MAX7219
* Entre dans une boucle infinie pour afficher les modèles en continu. Affiche chaque modèle pendant 1 seconde avant de passer au suivant.
.. code-block:: c
while (1) {
// Affiche le modèle de carré
display_pattern(patterns[0], 1000); // Affiche pendant 1000 millisecondes
// Affiche le modèle de cœur
display_pattern(patterns[1], 1000);
// Affiche les chiffres 0-9
for (int i = 2; i <= 11; i++) {
display_pattern(patterns[i], 1000);
}
}
**Comprendre les Modèles**
* Représentation Binaire :
* Chaque modèle est défini en utilisant des littéraux binaires (préfixe 0b).
* Chaque octet correspond à une ligne de la matrice LED 8x8.
* Chaque bit dans l’octet représente une colonne (LED) dans cette ligne.
* Le bit le plus significatif (à gauche) correspond à la première LED à gauche.
* Création de Modèles Personnalisés :
* Vous pouvez créer de nouveaux modèles en définissant de nouveaux tableaux de 8 octets.
* Chaque modèle peut être ajouté au tableau des modèles.
* Mettez à jour la boucle d'affichage dans la fonction principale pour inclure vos nouveaux modèles.
**Ajustements et Personnalisation**
* Changer la Luminosité : Modifiez le niveau d'intensité dans ``max7219_init`` :
.. code-block:: c
max7219_write(0x0A, brightness_level); // brightness_level entre 0x00 et 0x0F
* Modifier le Temps d'Affichage : Changez le paramètre ``delay_ms`` dans les appels à ``display_pattern`` pour ajuster la durée d'affichage de chaque modèle.
Image du phénomène
-----------------------
.. image:: ../img/1.1.6led_dot_matrix.JPG