Skip to Content

Comment utiliser Arduino UNO avec le pilote LED 7 segments TM1638

Comment utiliser Arduino UNO avec le pilote LED 7 segments TM1638

Dans cet article, je vais vous montrer comment fonctionne le circuit intégré pilote LED TM1638 à 7 segments et comment le connecter à un Arduino UNO.

J’ai utilisé le circuit intégré pilote LED TM1638 dans des projets précédents, car il décharge énormément de travail du microcontrôleur hôte. Ajouter ce pilote LED à votre projet est simple et facile.

Je commencerai par vous présenter les spécifications du pilote LED, partager des astuces, et vous montrer comment afficher des chiffres et scanner les boutons.

Nous entrerons ensuite dans les détails avec le guide de connexion et le code Arduino pour l’interface parallèle LCD du pilote LED TM1638. Nous répondrons aussi aux questions fréquentes.

Prenez votre carte Arduino, et c’est parti !

Composants nécessaires pour réaliser le projet Arduino et TM1638

Composants matériels

Logiciel

Principes fondamentaux du module pilote LED TM1638

Commençons par comprendre les principales caractéristiques du circuit intégré pilote LED TM1638 :

  • Contrôle de 8 chiffres (7 segments)
  • Pilotage de 8 LEDs
  • Scan de huit interrupteurs tactiles
  • Contrôle de la luminosité
  • Interface série – CLK, DIO, STB

Une connexion typique entre l’Arduino et le circuit intégré TM1638 est illustrée dans l’image ci-dessous.

Connection between Arduino and TM1638
Connexion entre Arduino et TM1638

Dans la section suivante, nous étudierons les interfaces entre les différents périphériques et le TM1638.

Détails des broches du circuit intégré pilote LED TM1638

Nom de la broche Type de broche Description de la broche
DIO Entrée/sortie de données Données série entre l’Arduino et le circuit intégré TM1638
STB Sélection du circuit Initialise l’interface série lors du front descendant/montant, puis reçoit l’instruction. Le premier octet est l’instruction lorsque STB est bas. CLK est ignoré lorsque STB est haut.
CLK Entrée d’horloge Entrée de sortie sur les données série
K1 ~ K3 Entrée de données de scan des touches Les données entrées sur cette broche sont verrouillées après la fin du cycle d’affichage.
SEG1/KS1 ~ SEG8/KS8 Sortie (segment) Sortie segment. Sortie drain ouvert.
SEG9 ~ SEG10 Sortie (segment) Sortie segment. Sortie drain ouvert.
GRID1 ~ GRID8 Sortie (grille) Sortie grille. Sortie drain ouvert.
VDD Alimentation logique 5 V ± 10%
GND Masse logique Connexions à la masse

Une note spéciale concernant la broche DIO : La broche Digital-Input-Output (DIO) du module TM1638 est un N-type open drain. Vous devez fournir une résistance de tirage externe pour maintenir la ligne DIO à un niveau logique haut. La valeur recommandée est de 10 kOhms. Voir le circuit ci-dessous :

Open drain of TM1638
Drain ouvert du TM1638

Scan des touches et registre de données de scan

Le taux de trame du scan des touches est de 8 x 3 bits. C’est similaire à une matrice de lignes et colonnes. Vous pouvez considérer cela comme une matrice de huit lignes et trois colonnes. Cela signifie que vous pouvez utiliser jusqu’à 24 boutons poussoirs.

Dans l’image ci-dessous, vous pouvez voir comment utiliser les broches K et KS du circuit intégré TM1638 pour scanner 24 boutons.

Button Matrix
Matrice de boutons

Jeu d’instructions

Vous pouvez utiliser les bits B7 et B6 du bit DIO pour déterminer le type d’instruction. Le circuit intégré TM1638 utilise le mécanisme de décodage ci-dessous pour identifier le type d’instruction envoyé par l’Arduino.

B7 B6 Instruction
0 1 Jeu d’instructions de données
1 0 Jeu d’instructions de contrôle d’affichage
1 1 Jeu d’instructions d’adresse

Jeu d’instructions de données .

Typiquement, vous utiliserez surtout le jeu d’instructions de données. Il est responsable de la lecture et de l’écriture des données. Note : B1 et B0 ne doivent pas être réglés sur 01 ou 11 pour ce jeu d’instructions.

B7 B6 B5 B4 B3 B2 B1 B0 Fonction Instruction
0 1 0 0 0 0 0 0 Mode d’écriture des données Écrire des données dans le registre
0 1 0 0 0 0 1 0 Lire les données du scan des touches
0 1 0 0 0 0 0 0 Mode d’ajout d’adresse Ajout automatique d’adresse
0 1 0 0 0 1 0 0 Adresse fixe
0 1 0 0 0 0 0 0 Mode test Mode normal
0 1 0 0 1 0 0 0 Mode test

Dans les images ci-dessous, vous pouvez voir le timing et le schéma d’horloge pour l’écriture et la lecture depuis le circuit intégré TM1638.

Timing and Clocking Signals
Signaux de timing et d’horloge

Notez que lors de la lecture des données depuis la puce, vous devez insérer un délai d’au moins 1 µs entre l’instruction et la réception des données. Ceci est obligatoire.

Data and Clock Signals
Signaux de données et d’horloge

Pour savoir comment connecter les broches d’affichage TM1638 à l’afficheur LED 7 segments, référez-vous à l’image ci-dessous. L’exemple ci-dessous est pour un type d’afficheur à cathode commune, où toutes les broches cathodes des LEDs sont reliées ensemble.

Pinout for common cathode type segment display
Brochage pour afficheur à segments cathode commune

Une alternative est le type d’afficheur à anode commune, où toutes les broches anodes des LEDs sont reliées ensemble.

Pinout for common anode type segment display
Brochage pour afficheur à segments anode commune

Il est important de connaître les spécifications électriques de la puce avec laquelle vous travaillez. Cela vous aidera à déboguer et à éviter d’endommager la puce. Plus vous connaissez les spécificités du circuit intégré, plus il sera facile de faire les connexions et de construire des circuits fiables.

Voici les spécifications électriques du circuit intégré pilote LED TM1638 :

Paramètre Plage
Tension d’alimentation logique Typique 5 V
Tension d’entrée haut niveau Minimum 0,7 x VDD
Tension d’entrée bas niveau Maximum 0,3 x VDD
Courant de sortie haut niveau Maximum 40 mA
Courant de sortie bas niveau Maximum 140 mA
Consommation de courant active Maximum 5 mA
Fréquence d’horloge maximale 1 MHz
Capacité d’entrée 15 pF

Assez de théorie ; ) Dans les sections suivantes, construisons le projet !

Comment connecter le TM1638 à l’Arduino UNO

Je vais maintenant vous montrer comment réaliser un projet avec l’Arduino UNO et le module d’affichage TM1638. Commençons par les connexions matérielles.

Voici le résumé des connexions nécessaires pour relier l’Arduino UNO au module TM1638. J’espère que cela vous donnera une vue d’ensemble. Suivez le guide de connexion.

Broche sur le module TM1638 Broche Arduino UNO Remarques
VCC 5 V Alimentation
GND GND Connexions à la masse
STB Ligne de stroboscope, broche 8 N’importe quelle broche IO
CLK Ligne de données, broche 9 N’importe quelle broche IO
DIO Ligne d’horloge, broche 10 N’importe quelle broche IO

Étape 1 : Compléter la connexion TM1638 et Arduino UNO

Voici le schéma de connexion entre l’Arduino UNO et la puce TM1638.

Wiring of TM1638 and Arduino
Câblage du TM1638 et Arduino

Les données série utilisent seulement deux fils. Cela vous permet d’économiser des broches sur la carte et réduit aussi le nombre de fils.

Le protocole série utilisé par le TM1638 n’est pas un standard. Mais pas d’inquiétude. Il existe d’excellentes bibliothèques que vous pouvez utiliser ! Vous pouvez en trouver une telle bibliothèque here.

N’oubliez jamais de commencer par les connexions à la masse. Attendez de fournir l’alimentation au projet que toutes les connexions soient faites.

Étape 2 : Programmer le code Arduino UNO ci-dessous

Suivez l’étape suivante pour comprendre l’implémentation du code. Vous pouvez utiliser le code ci-dessous pour tester le module TM1638. Nous n’utilisons aucune bibliothèque ici.

const int strobe = 8; // STB to D8
const int clock = 9;  // CLK to D9
const int data = 10;  // DIO to D10

void sendCommand(uint8_t value)
{
  digitalWrite(strobe, LOW);
  shiftOut(data, clock, LSBFIRST, value);
  digitalWrite(strobe, HIGH);
}

void reset()
{
  sendCommand(0x40); // Set auto increment mode
  digitalWrite(strobe, LOW);
  shiftOut(data, clock, LSBFIRST, 0xc0);   // Set starting address to 0
  for (uint8_t i = 0; i < 16; i++)
  {
    shiftOut(data, clock, LSBFIRST, 0x00);
  }
  digitalWrite(strobe, HIGH);
}

void setup()
{
  pinMode(strobe, OUTPUT);
  pinMode(clock, OUTPUT);
  pinMode(data, OUTPUT);
  sendCommand(0x8f);  // Set maximum display brightness
  reset();
}

#define COUNTING_MODE 0
#define SCROLL_MODE 1
#define BUTTON_MODE 2

void loop()
{
  static uint8_t mode = COUNTING_MODE;
  switch (mode)
  {
    case COUNTING_MODE:
      mode += counting();
      delay(500);
      break;
    case SCROLL_MODE:
      mode += scroll();
      break;
    case BUTTON_MODE:
      buttons();
      break;
  }
  delay(200);
}

bool counting()
{
  /*0*/ /*1*/ /*2*/ /*3*/ /*4*/ /*5*/ /*6*/ /*7*/ /*8*/ /*9*/
  uint8_t digits[] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f };
  static uint8_t digit = 0;
  sendCommand(0x40);
  digitalWrite(strobe, LOW);
  shiftOut(data, clock, LSBFIRST, 0xc0);
  for (uint8_t position = 0; position < 8; position++)
  {
    shiftOut(data, clock, LSBFIRST, digits[digit]);
    shiftOut(data, clock, LSBFIRST, 0x00);
  }
  digitalWrite(strobe, HIGH);
  digit = ++digit % 10;
  return digit == 0;
}

bool scroll()
{
  uint8_t scrollText[] =
  {
    /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    /*H*/ /*E*/ /*L*/ /*L*/ /*O*/ /*.*/ /*.*/ /*.*/
    0x76, 0x79, 0x38, 0x38, 0x3f, 0x80, 0x80, 0x80,
    /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    /*H*/ /*E*/ /*L*/ /*L*/ /*O*/ /*.*/ /*.*/ /*.*/
    0x76, 0x79, 0x38, 0x38, 0x3f, 0x80, 0x80, 0x80,
  };
  static uint8_t index = 0;
  uint8_t scrollLength = sizeof(scrollText);
  sendCommand(0x40);
  digitalWrite(strobe, LOW);
  shiftOut(data, clock, LSBFIRST, 0xc0);

  for (int i = 0; i < 8; i++)
  {
    uint8_t c = scrollText[(index + i) % scrollLength];
    shiftOut(data, clock, LSBFIRST, c);
    shiftOut(data, clock, LSBFIRST, c != 0 ? 1 : 0);
  }

  digitalWrite(strobe, HIGH);
  index = ++index % (scrollLength << 1);
  return index == 0;
}

void buttons()
{
  uint8_t promptText[] =
  {
    /*P*/ /*r*/ /*E*/ /*S*/ /*S*/ /* */ /* */ /* */
    0x73, 0x50, 0x79, 0x6d, 0x6d, 0x00, 0x00, 0x00,
    /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    /*b*/ /*u*/ /*t*/ /*t*/ /*o*/ /*n*/ /*S*/ /* */
    0x7c, 0x1c, 0x78, 0x78, 0x5c, 0x54, 0x6d, 0x00,
    /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  };
  static uint8_t block = 0;
  uint8_t textStartPos = (block / 4) << 3;

  for (uint8_t position = 0; position < 8; position++)
  {
    sendCommand(0x44);
    digitalWrite(strobe, LOW);
    shiftOut(data, clock, LSBFIRST, 0xC0 + (position << 1));
    shiftOut(data, clock, LSBFIRST, promptText[textStartPos + position]);
    digitalWrite(strobe, HIGH);
  }

  block = (block + 1) % 16;
  uint8_t buttons = readButtons();

  for (uint8_t position = 0; position < 8; position++)
  {
    uint8_t mask = 0x1 << position;
    setLed(buttons & mask ? 1 : 0, position);
  }
}

uint8_t readButtons(void)
{
  uint8_t buttons = 0;
  digitalWrite(strobe, LOW);
  shiftOut(data, clock, LSBFIRST, 0x42);
  pinMode(data, INPUT);

  for (uint8_t i = 0; i < 4; i++)
  {
    uint8_t v = shiftIn(data, clock, LSBFIRST) << i;
    buttons |= v;
  }

  pinMode(data, OUTPUT);
  digitalWrite(strobe, HIGH);
  return buttons;
}

void setLed(uint8_t value, uint8_t position)
{
  pinMode(data, OUTPUT);
  sendCommand(0x44);
  digitalWrite(strobe, LOW);
  shiftOut(data, clock, LSBFIRST, 0xC1 + (position << 1));
  shiftOut(data, clock, LSBFIRST, value);
  digitalWrite(strobe, HIGH);
}

Étape 3 : Explication du code

Parcourons le code.

const int strobe = 8; // STB to D8
const int clock = 9;  // CLK to D9
const int data = 10;  // DIO to D10

strobe, clock, et data sont des constantes représentant les broches connectées aux broches STB, CLK, et DIO du module d’affichage, respectivement.

void sendCommand(uint8_t value)

Cette fonction envoie une commande au module d’affichage. Elle met la broche STB à bas, envoie l’octet de commande avec la fonction shiftOut() , puis remet la broche STB à haut.

void reset()

Cette fonction réinitialise le module d’affichage à son état initial.

Elle appelle sendCommand() pour activer le mode d’incrémentation automatique et réinitialiser l’adresse de départ. Ensuite, elle utilise une boucle pour envoyer 16 octets de valeur 0x00 afin d’effacer l’affichage.

La fonction setup() effectue les tâches suivantes une fois :

Elle configure les modes des broches STB, CLK, et DIO. Elle appelle sendCommand() pour activer l’affichage avec la luminosité maximale. Enfin, elle appelle reset() pour initialiser l’affichage.

La fonction loop() est appelée en boucle après setup(). C’est la boucle principale du programme qui tourne en continu. Elle utilise une variable statique mode pour suivre le mode actuel.

void loop()

Elle utilise une instruction switch pour exécuter différentes actions selon le mode actuel :

COUNTING_MODE appelle la fonction counting() et incrémente le mode lorsque le compteur atteint une condition spécifique.

SCROLL_MODE appelle la fonction scroll() et incrémente le mode lorsque le défilement atteint une condition particulière.

BUTTON_MODE appelle la fonction buttons() pour gérer les entrées des boutons.

Elle inclut des délais entre les actions. J’espère que cela vous aidera.

FAQ sur le circuit intégré pilote LED TM1638

Vous trouverez ci-dessous une liste des questions les plus fréquemment posées sur les projets réalisés avec l’Arduino UNO et le circuit intégré pilote LED TM1638.

Si vous avez d’autres questions, n’hésitez pas à les poser dans la section commentaires.

Qu’est-ce qu’un module d’affichage TM1638 ?

Le module d’affichage TM1638 est une option populaire pour les amateurs pour interfacer des affichages LED, des boutons et d’autres périphériques. Il intègre un contrôleur d’affichage et un scanner de clavier. Cela facilite le contrôle et l’interaction avec diverses entrées et sorties.

Comment le module d’affichage TM1638 communique-t-il avec un microcontrôleur ?

Le module TM1638 communique avec un microcontrôleur via un protocole de communication série simple.

Pour envoyer et recevoir des données, trois lignes de contrôle sont nécessaires (données, horloge et strobe). Veuillez vous référer à la section principes fondamentaux de l’article pour comprendre en détail le protocole de communication.

Quelles sont les principales caractéristiques du module d’affichage TM1638 ?

Le module TM1638 offre généralement huit affichages LED à 7 segments, un ensemble d’indicateurs LED, et plusieurs boutons tactiles. Il fournit aussi un contrôle de la luminosité pour l’affichage et supporte le multiplexage pour réduire le nombre de broches I/O nécessaires.

Puis-je contrôler plusieurs modules TM1638 avec un seul microcontrôleur ?

Il est possible de contrôler plusieurs modules TM1638 avec un seul microcontrôleur. Chaque module peut se voir attribuer une adresse unique via un adressage matériel, permettant un contrôle individuel dans une configuration multi-modules.

Quels microcontrôleurs sont compatibles avec le module d’affichage TM1638 ?

Le module TM1638 peut être interfacé avec divers microcontrôleurs, y compris les plus populaires comme Arduino, Raspberry Pi, et ESP8266. Tant que le microcontrôleur supporte l’I/O numérique et la communication série, il peut être utilisé avec ce module.

Un aspect important est de vérifier la compatibilité de tension entre le microcontrôleur et le module TM1638.

Existe-t-il des bibliothèques pour programmer le module d’affichage TM1638 ?

Oui, plusieurs bibliothèques sont disponibles pour différentes plateformes et langages de programmation afin de simplifier l’intégration du module TM1638.

Ces bibliothèques fournissent des fonctions et abstractions pour contrôler l’affichage, lire les entrées des boutons, et gérer d’autres fonctionnalités du module. Veuillez consulter la section Code Arduino pour trouver des bibliothèques utiles.

Puis-je utiliser le module d’affichage TM1638 pour des projets autres que l’affichage principal et la saisie par boutons ?

Absolument ! Le module TM1638 est polyvalent et peut être utilisé au-delà des fonctions principales d’affichage et de boutons pour de nombreux projets.

Conclusion

Cet article a couvert toutes les informations essentielles pour utiliser le TM1638 avec l’Arduino UNO.

L’article était-il facile à suivre ? Si vous avez des suggestions pour l’améliorer, n’hésitez pas à partager vos retours.

J’aimerais beaucoup avoir de vos nouvelles ! Faites-nous savoir si vous souhaitez que je traite d’autres sujets dans de futurs articles.