Utiliser le composant 74HC595 8 Bit Shift Register avec un Arduino

Introduction

Aujourd’hui j’ai fait des recherches sur les matrices de LED afin de pouvoir faire un LED cube 3D de 512 leds (8x8x8) en me basant sur un Arduino.

Tout de suite je me suis aperçu d’un probème: comment controler 512 Leds individuellement lorsqu’un arduino ne possède que 54 pins au maximum (pour la version Mega2560 par exemple) ?

La première astuce consiste à lier les différentes anodes entre elles par couche. Par contre on est toujours bloqué concernant les cathodes qui sont au nombre de 64 (8×8).

C’est là que j’ai découvert qu’il existe des composants Bit Shift Register et plus particulièrement le composant 74HC595 8-bit Shift Register qui a la particularité d’être pas cher et assez simple à utiliser.

Crédits: je tiens à préciser que l’ensemble des informations ont été trouvée sur le site anglais bildr (dont certains exemples) donc merci à eux.

Qu’est ce que le Shift Register ?

Avant même d’essayer d’utiliser des 74HC595 pour multiplexer des leds, il faut comprendre ce qu’est le Shift Register et comment il fonctionne.

Et ben c’est simple: un composant Shift Register permet tout simplement d’étendre le nombre de sortie digitales d’un microcontrôleur tel qu’un RaspberryPi ou un Arduino.

Ainsi un composant comme les 74HC595 vont permettre de contrôler 8 sorties digitales avec en plus la possibilité de lier plusieurs composants 74HC595 les uns aux autres.

Pour mon cube led 3d de 8x8x8, je vais ainsi pouvoir lier 8 composants 74HC595 entre eux afin de disposer de 64 sorties digitales.

Comment fonctionne le Shift Register ?

Pour comprendre le fonctionnement d’un Shift Register (et notamment le 74HC595), le plus simple est d’imaginer que l’on a une ligne de 8 chaises.

Ces 8 chaises sont soit vides (valeur 0), soit occupées (valeur 1).

Maintenant considérons que toutes les 5 secondes une sonnerie retentit et les personnes assises doivent se déplacer d’une chaise sur leur droite.

Si la chaise la plus à droite était occupée, alors on considère que la personne s’en va. Pour la chaise la plus à gauche, elle peut soit rester vide soit quelqu’un vient y prendre place.

Prenons un cas concret, celui de notre Shift Register 74HC595.

Shift Register

Le composant 74HC595 dispose de 8 pins de sortie (Qa, Qb, Qc, Qd, Qe, Qf, Qg, Qh) qui peuvent soit avoir la valeur 0 (Low) soit la valeur 1 (High).

Lorsque l’on met le pin SRCLK (Serial Clock) en valeur 1 (High, qui est l’équivalent du retentissement d’une sonnerie), alors les 8 pins de sorties se décalent vers la droite.

Alors le dernier Pin (Qh) est supprimé et une nouvelle valeur est définie dans le pin Qa lorsque le pin SER (Serial) a une valeur de 1 (High). Si SER a une valeur de 0 (Low) alors Qa reste à 0.

Exemple de fonctionnement du Shift Register 74HC595

Essayons d’appliquer l’utilisation d’un Shift Register sur 8 Leds.
Imaginons que l’on souhaite allumer les leds 1, 3 et 8.

Tout d’abord, nous allons éteindre toutes les leds (Clear, via le pin SRCLR) en passons tous les registres à 0.

Ensuite, on passe la première valeur en High puis on décale de 4.  Ensuite on passe de nouveau la première valeur en High puis on décale de 1. Enfin on passe de nouveau la première valeur en High.

L’image ci-dessous illustre parfaitement cet exemple

74HC595 Shift Register

Un des avantages des Shift Registers est qu’ils disposent d’un pin appelé RCLK (Register Clock) qui permet de n’effectuer aucune modification tant qu’il est maintenu en LOW.

Ainsi tant que RCLK sera a LOW vous pourrez affecter les valeurs que vous souhaitez aux 8 pins de sortie sans que l’affichage ne change.
Une fois que vous avez mis les bonnes valeurs pour vos pins de sortie, il ne vous reste plus qu’à passer RCLK en High et le Shift Register 74HC595 affichera les modifications.

On peut ainsi modifier nos différents registres plusieurs fois (en 8 étapes par exemple), mais l’on ne verra qu’une seule modification, ce qui laissera penser que tout s’est fait en une seule étape.

Comment connecter le Shift Register 74HC595 ?

Après avoir regardé la documentation technique du 74HC595 disponible ici, il s’avère que le composant 74HC595 est relativement simple à connecter.

Voici le détail de connections des pins:

  • Vcc : alimentation jusqu’à 6V qui doit être la même que celle du microcontroleur.
  • QA à QH: sorties Shift Register.
  • SER (Serial): entrée pour le prochain pin qui sera déplacé.
  • SRCLK (Serial Clock): déplace le registre lorsqu’il est mis à 1 (High).
  • RCLK (Register Clock): doit être mis en High pour valider les nouveaux shifts register.
  • SRCLR (Serial Clear): vide complètement le Shift Register sil est mis en Low. Doit être passé en High pour être activé.
  • OE (Output Enable): ce pin permet d’activer la sortie lorsqu’il est sur la masse (GND) et la désactive lorsqu’il est en High.

Utiliser les Shift Register 74HC595 avec un Arduino

Le schéma suivant vous montre comment connecter un Shift Register 74HC595 à un Arduino Uno.

Connecting 74HC595 Arduino

Quand le signal sur le pin SERCLK devient High, toutes les valeurs sont déplacées vers la droite et les nouvelles valeurs sont settées (si le pin SER est activé).

Après avoir affecté les nouvelles valeurs, il faut passer le pin RCLK en High pour que la mise à jour soit affichée sur les sorties.

Cascade de Shift Register 74HC595 avec un Arduino

Un des points forts des Shift Register 74HC595 est qu’ils peuvent se monter en cascade.

Ainsi l’on peut chainer autant de Shift Register 74HC595 que l’on souhaite.

Comme on l’on vu, le Shift Register 74HC595 supprime la dernière valeur (Qh) lorsque l’on déplace les registres vers la droite. Pour chainer un second Shift Register, il suffirait donc d’utiliser cette valeur dans le registre suivant qui serait le premier registre d’un second composant 74HC595.

On aurait alors 2 composants 74HC595 chainés.

Pour faire cela, on va relier les pins SERCLK entre eux, les pins RCLK entre eux et le pins Qh’ du premier 74HC595 au pins Qa du second 74HC595. Simple non ?

Le schéma suivant illustre parfaitement cela:

Cascading 74HC595 Arduino

Code Arduino pour utiliser les Shift Register 74HC595

Maintenant que la connectique est faite, voici un exemple de code pour utiliser les Shift Register 74HC595 avec votre Arduino Uno :

int SER_Pin = 8;   //pin 14 on the 75HC595
int RCLK_Pin = 9;  //pin 12 on the 75HC595
int SRCLK_Pin = 10; //pin 11 on the 75HC595
 
//How many of the shift registers - change this
#define number_of_74hc595s 1 
 
//do not touch
#define numOfRegisterPins number_of_74hc595s * 8
 
boolean registers[numOfRegisterPins];
 
void setup(){
  pinMode(SER_Pin, OUTPUT);
  pinMode(RCLK_Pin, OUTPUT);
  pinMode(SRCLK_Pin, OUTPUT);
 
  //reset all register pins
  clearRegisters();
  writeRegisters();
}               
 
//set all register pins to LOW
void clearRegisters(){
  for(int i = numOfRegisterPins - 1; i >=  0; i--){
     registers[i] = LOW;
  }
} 
 
//Set and display registers
//Only call AFTER all values are set how you would like (slow otherwise)
void writeRegisters(){
 
  digitalWrite(RCLK_Pin, LOW);
 
  for(int i = numOfRegisterPins - 1; i >=  0; i--){
    digitalWrite(SRCLK_Pin, LOW);
 
    int val = registers[i];
 
    digitalWrite(SER_Pin, val);
    digitalWrite(SRCLK_Pin, HIGH);
 
  }
  digitalWrite(RCLK_Pin, HIGH);
 
}
 
//set an individual pin HIGH or LOW
void setRegisterPin(int index, int value){
  registers[index] = value;
}
 
void loop(){
 
  setRegisterPin(2, HIGH);
  setRegisterPin(3, HIGH);
  setRegisterPin(4, LOW);
  setRegisterPin(5, HIGH);
  setRegisterPin(7, HIGH);
 
  writeRegisters();  //MUST BE CALLED TO DISPLAY CHANGES
  //Only call once after the values are set how you need.
}

Vous noterez que cet exemple gère le cascading (le chainage des 74HC595). Il vous suffit d’éditer la ligne:

#define number_of_74hc595s 1

J’espère que cet article vous aura aidé. Rendez-vous dans un prochain poste pour la construction du cube 3D.

 

67 Responses to Utiliser le composant 74HC595 8 Bit Shift Register avec un Arduino

  1. Idleman says:

    Article très intéressant !! Ca vas me permettre de comprendre un peu mieux mon bout de code pour écran nokia sur raspberry PI, qui, je le pense, fonctionne sur le même principe.

    A noter qu’arduino semble nous mâcher le travail pour la gestion des shift register avec la fonction shiftOut (http://arduino.cc/en/Tutorial/ShiftOut) mais j’ignore si c’est utilisable sur les montages en cascades, j’ai encore un peu de mal a m’habituer au principe…

    hs : Tu utilise quoi comme logiciel de schéma ? Je les trouve super sympa !!

    • jhd says:

      J’ai 2 gros projets en cours (Cube 3D 8x8x8) et une Imprimante 3D que je détaillerai prochainement ici sur ZeM. J’attends mes leds pour démarrer le prototypage 🙂

      Pour les logiciels de schéma j’utilise Fritzing.

      • Idleman says:

        Ha,n une reprap ? Ils en font une au lab, elle est pas mal avancée mais depuis quelques semaines elle stagne un peu :), tu te base sur quels plans?

        Ca a l’air sympa fritzing, je teste ça tout de suite 😀

        Dans ton article tu dis :

        “toutes les valeurs sont déplacées vers la droite et les nouvelles valeurs sont settées (si le pin SER est activé).”

        Ne serait ce pas plutôt un curseur qui changerait de position à chaque SERCLK et dont la cible deviendrais 1 ou 0 en fonction de SER?

        J’ai encore un peu de mal a comprendre le principe.

  2. jhd says:

    Non seule la valeur la plus a gauche est settée.

    Ma reprap c est une prusa mendel v2

  3. jhd says:

    Sur la matrice de led 3d je vais faire un tutoriel.

    Sinon pour la reprap je vais faire un retour d’expérience assez complet je dirai (c’est en cours).

  4. […] coup je me suis dis mais pourquoi ne pas utiliser un Shift Register 74HC595 pour ne plus avoir qu’à utiliser 3 pins au lieu des 6 […]

  5. […] comme le composant Shift Register 74HC595, le circuit intégré TLC5940 peut être connecté en cascade, ce qui permet d’étendre […]

  6. Stark says:

    Salut,

    Merci pour ces informations précieuses, grâce à toi je viens de faire pareil avec mon raspberry Pi en adaptant à peine ton exemple en C, ça marche nickel !

  7. phil says:

    hi,

    how can you make this work for a long time ?
    i used 100 ohms, then 200 ohms, i always end up frying the 595
    5V/200 ohms = 0.025A
    0.025*5V = 0.125W
    0.125W*8 leds = 1W
    the 595 only suports 500mW

    • g-goessel says:

      In a LED Cube just a single LED is powered one in the same time. This uses POV (Persistence Of Vision) to make you think they are all lighted up 😉

    • Zeboss says:

      Your calculation is wrong.
      Most of this power is dissipated in both the LEDs and the current limiting resistors.
      With a 200 ohms resistor each output sinks ~ 15 mA.
      A typical LED has a forward voltage around 2V : 5V – 2V = 3V. 3 V and a 200 ohms resitor = 15 mA.
      Your issue is explained in the component datasheet.
      Each output can source/sink 35 mA but the total current for all the outputs MUST NOT EXCEED 70 mA, around 10 mA for each output.
      15 mA x 8 = 120 mA, a value far beyond the 70 mA limit.

      • jhd says:

        En effet, mais c’est des préconisations j’ai essayé et ça passe. Evidemment c’est expérimental et je ne suis pas électronicien donc je prends tous les conseils

        • Zeboss says:

          Euh…
          non, la limite de 70 mA n’est pas une préconisation.
          C’est une limite absolue.
          La dépasser peut passer avec certains lots et selon le fabricant, mais il n’y a aucune garantie.
          Par définition on ne dépasse jamais les limites absolues si on veut un montage fiable.
          Même si ça passe, une détérioration lente du composant se produira et entaînera un manque de fiabilité à long terme.

  8. Idleman says:

    Sur le montage en cascade, le qh du premier n’est pas relié au qa du second ce qui contredit les explications textuelles, c’est moi qui ai rien compris ou bien ? 😀

    • xav says:

      commentaire un peu tardif, mais bon…
      “Pour faire cela, on va relier les pins SERCLK entre eux, les pins RCLK entre eux et le pins Qh’ du premier 74HC595 au pins Qa du second 74HC595. Simple non ?”
      En fait, sur le schéma le Qh’ est poussé vers le SER, ce qui est plus logique.
      Il y en a un qui a tout lu et compris. 😉

      Hormis cette coquille, excellent boulot ! Merci

  9. oran.outan says:

    bonjour

    Je suis novice dans ce genre de montage d’où une question “bête”, mais peut-on utiliser n’importe qu’elle sortie ? genre 2/4/8 ?
    j’utilise un shield ethernet et des pwm du coup j’ai plus trop de choix…

  10. oran.outan says:

    en écrivant et relisant, j’ai eu ma réponse…
    le 74HC595 fonctionne simplement par variation tension (low/high) donc n’importe qu’elle sortie digitale de l’arduino peut convenir.

  11. Jukar says:

    Ca fait beaucoup de temps que j’essaie de comprendre le fonctionnement du 74hc595. J´ai lu deceaines de webs et celle ci c´est, sans doute, le meilleur tutoriel que j’ai trouve (a travers arduino.cc)

    Très bien expliqué et facile à comprendre.

    J’ajoute ton blog à mes favoris.

    Merci beaucoup!

    (excuse-moi pour mon mauvais francais, ca fait des annes que je practique pas ;))

    • jhd says:

      Ca fait plaisir que ca sert à quelqu’un. Si tu as besoin d’autres infos sur d’autres composants dis le moi et je ferai un article.

      • jukar says:

        Je te remercie.

        Si ce n’est pas trop derranger ca serait fantastique avoir un article sur le 74HC574.

        J’ai l’intention de construire un cube 8×8 conduit (c´est pour ca que je chercahis info sur le 74HC595N). J’ai vu q´un de tes projets pour cette année 2013 c´est de construire un, t´as déjà commencé?

  12. dbe8f says:

    Bonjour,

    Merci pour l’article fort intéressant. J’aimerais commencer à programmer avec Arduino et utiliser le Leonardo.
    J’aimerais commander mon réseau de train et j’aimerais savoir s’il existe quelque chose de similaire pour commander les entrées et si oui quel composant ?
    Une deuxième question, j’ai environ 130 entrées et 250 sorties, est-ce possible avec un Arduino Leonardo ?

    Merci pour vous réponses et bonne soirée.
    Dbe8f.

    • jhd says:

      Bonjour, je n’ai pas la chance d’avoir d’arduino leonardo mais avec les multiplexeurs et d’autres composants cela ne devrait pas poser de souci. Par contre cela signifie penser à l’alimentation, à l’espace et au refroidissement des composants

      • dbe8f says:

        Bonjour et merci pour votre réponse.

        N’étant pas très expert en électronique, pourriez-vous me dire quel type de CI pourrait être utilisé pour multiplexer les entrées ?

        Merci pour la réponse.
        Dbe8f

        • jhd says:

          Je ne suis pas électronicien. Je vais regarder sur le net et si je trouve des infos je vous tiendrai informé

          • dbe8f says:

            Bonjour jhd,

            Merci pour de regarder. J’ai également regardé et j’ai trouvé le CI 4021 qu’en pensez-vous ?

            Encore merci et bonne fin d’après-midi.
            Cordialement
            Dbe8f.

          • jhd says:

            Je ne connais pas le composant, je vais essayer d’en commander pour jouer un peu avec mais je n’ai pas trop de temps en ce moment. Vos retours m’intéressent concernant ce composant électronique.

      • camzilla1050 says:

        j suis peut être pas en avance pour la réponse, mais pour multiplexer le “4051” fait l’affaire

  13. Titi06 says:

    Bonjour,
    Bravo pour tes explications j ajoute ton forum a mes favoris :).

    Par contre moi j ai un schéma de 32 leds mais mes shift register sont branché en parallèle,c est a dire sur 3 entrés de plus de mon arduino. (en gros, ton premier schéma en 2 fois si je me suis mal exprimé ^^)

    Quel serait le code pour différencier les 2 shift registrer

    ton code int:
    int SER_Pin = 8; //pin 14 on the 75HC595
    int RCLK_Pin = 9; //pin 12 on the 75HC595
    int SRCLK_Pin = 10; //pin 11 on the 75HC595

    faudrait il mettre ???

    int SER_Pin = 8; //pin 14 on the 75HC595
    int RCLK_Pin = 9; //pin 12 on the 75HC595
    int SRCLK_Pin = 10; //pin 11 on the 75HC595
    int SER_Pin = 12; //pin 14 on the 75HC595
    int RCLK_Pin = 13; //pin 12 on the 75HC595
    int SRCLK_Pin = 14; //pin 11 on the 75HC595

    Ne va t il pas se mélanger ou actionner les 2 shift en meme temps ? ou ce code serai juste ?
    dsl je suis novice ^^

    • Titi06 says:

      (sachant que mes leds doivents s allumer une par une grace a un switch jusqu a ce qu elle soit toute allumer)

      merci pour ton aide.

      Thiery

    • jhd says:

      je n’ai jamais fait ce genre de montage parallele. N’etant pas electronicien de formation je pense que le mieux est d’essayer et de voir comment cela reagit

    • Zeboss says:

      En fait, une seule sortie supplémentaire est requise, celle qui va émettre les bits de donnée.
      Les deux horloges peuvent être communes.
      Il suffit juste de positionner deux bits de données au lieu d’un sans changer la gestion des horloges.

    • Zeboss says:

      J’ajouterais que je ne vois aucun intérêt pratique à utiliser ce mode “parallèle” qui en plus bouffe une sortie pour rien.

        • Zeboss says:

          Bah, quel intérêt d’utiliser une sortie supplémentaire pour faire du “parallèle” alors qu’il suffit d’envoyer 16 bits de données au lieu de huit en mettant les 2 595 en mode série ?
          Gagner quelques µS ?
          Pour allumer des LEDs ça n’a aucun intérêt.
          Pour des applications ou le temps serait très critique ça pourrait éventuellement être intéressant et encore faudrait-il écrire les deux codes et les analyser en détail pour vérifier que la méthode parallèle est réellement plus rapide, ce qui n’a rien de certain compte tenu du fait qu’à chaque bit il faut décaler et masquer deux variables de 8 bits (type unsigned char) au lieu d’une seule de 16 bits (type short).

        • Zeboss says:

          Un petit complément, on peut mettre en série autant de 595 que l’on veut.
          Il suffit juste d’envoyer le bon nombre de bits pour les remplir tous (16 bits pour 2, 24 bits pour 3, 32 bits pour 4, etc.).
          Attention à bien envoyer toujours un nombre de bits correct, sinon gare aux décalages des sorties.

  14. Chester says:

    Enorme blog il faut continuer dans cette voie

  15. cyberez says:

    Merci pour ce tuto très clair.

    J’ai trouvé ce composant sur un schéma que je souhaite adapter. Maintenant je comprends comment ca fonctionne. Merci beaucoup, ca rafraichit mes notions d’électronique appris à l’école.

  16. Johann L says:

    Bonjour
    On m’a offert un kit sainsmart uno. Le pdf associé propose un montage et un programme mais pas très commenté et en anglais.
    Du coup je me suis retrouvé sur ce sujet super bien fait et clair.
    Je pense y avoir décelé deux coquilles dans le passage sur la cascade : “Pour faire cela, on va relier les pins SERCLK entre eux, les pins RCLK entre eux et le pins Qh’ du premier74HC595 au pins Qa du second 74HC595. ”
    Ne serait ce pas plutôt : “Pour faire cela, on va relier les pins SRCLK entre eux, les pins RCLK entre eux et le pins Qh’ du premier74HC595 au pins SER du second 74HC595. ”
    Encore merci pour cet article.

    • Zescientist says:

      L’article de l’auteur date…
      Mais je pense pouvoir confirmer sans me tromper qu’il y a bien une coquille et que tu as raison. Dans le tuto ci-dessus, Qa est une sortie, alors lui appliquer la sortie Qh’ ne me semble pas conseillé 😉

  17. Gil87 says:

    Merci pour cet article!
    Enfin un article trés bien expliqué et de plus en francais!!!
    Merci d’avoir fait le traduction de l’anglais.
    C’est tellement rare,car de nos jours les tutos électronique en francais c’est en option lol !!

  18. Faloula says:

    Bonsoir , merci pour cet article ca m’a trop aidé !
    J’ai eu recourt a l’utilisation de ces registres ( Mon projet consiste a la réalisation d’un LED GLOBE et non pas un CUBE LED ) , et j’aurai une question a vous poser : Il existe des registres a 16 sorties ( le double des sorties du 7HC595 ) et je voulais savoir si ce code fonctionnerai pour ce type de registres ? Merci de me répondre et je vous en suis vraiment reconnaissante 🙂

  19. Norman FELTZ says:

    Hello,

    Tu me conseil quel site pour acheter des compostants électroniques ?
    Du style LED, shift register ??

    Cordialement

    Norman FELTZ

  20. Renardfeu says:

    si j’utilise le code comme tel pour 64 LED et que je l’alimente par mon PC et que je cherche a allumer toute les LED d’un coup, sa va pas me griller mon pc a cause de la demande provoqué par toute les LEDs ?

  21. Poyoman says:

    Article intéressant. Par contre ya une sacré coquille selon moi :

    “Pour faire cela, on va relier les pins SERCLK entre eux, les pins RCLK entre eux et le pins Qh’ du premier 74HC595 au pins Qa du second 74HC595. Simple non ?”

    Ca serait pas plutot au pin SER plutot ?

  22. […] Vous trouverez toute une doc vraiment bien faite sur zem.fr. Je vous invite à la consulter (ici). […]

  23. ANDRIANARIVO says:

    Merci.pour le tuto ! Super bon travail et en français en plus !!!!!!!!!

  24. f4b1 says:

    Merci pour ce super tuto, je débute avec ce 74hc595 et j’ai encore un peu de mal. Du coup les explications sont claires et j’ai pu enfin m’y mettre !

Leave a Reply

Your email address will not be published. Required fields are marked *