6 avril 2024

Gérer des 74HC595 sous Arduino

Le circuit intégré 74HC595 est un Serial-in / Parallel-Out ou SIPO qui permet d’économiser énormément de sorties sur votre micro-contrôleur, puisque seulement 3 sorties de votre Arduino sont nécessaires pour le contrôler.

Il possède un pin d’entrée sur lequel on enverra 8 bits (le Serial In), pour 8 pins de sortie sur lesquels seront distribués les 8 bits (les Parallel Out).

Et ce n’est pas le plus beau ! Les SIPO peuvent être mis en cascade et offrir des dizaines de sorties parallèles !

Pour info, il existe aussi l’inverse : des circuits intégrés PISO, pour Parallel-In / Serial-Out, qui possèdent par exemple 8 pins d’entrée pour un pin de sortie, et permettent donc d’ajouter des entrées à votre Arduino. Mais ce n’est pas le sujet ici. Bien que comprendre l’un peut permettre d’imaginer des applications pour l’autre. Si les PISO vous intéressent vous pouvez vous renseigner sur le 74HC165.


Synopsis

Ici nous allons voir comment monter un SIPO 74HC595 sur un Arduino Uno (Atmega328p) pour contrôler 8 LED 3mm, puis nous mettrons deux 74HC595 en cascade pour contrôler 16 LED ! Le tout dans un niveau tout à fait débutant, car c’est le mien ! Cela dit il y aura tout ce qui faut pour vous mettre dans la bonne voie 😀

 


Concernant le courant

Attention, d’un point de vue intensité électrique le 74HC595 n’est pas fait pour contrôler des LED du tout ! L’intensité traversant le chip ne doit pas dépasser 70mA au total, ni 30mA par sortie. Sinon il fera n’importe quoi ou sera détruit !

De mon côté mes LED ne consomment que 0,37mA, elles brilleront faiblement mais au moins je ne prends pas de risque.

Si vous souhaitez contrôler des LED avec ce chip, vous devrez utiliser des transistors. Le SIPO contrôlera donc les transistors et l’alimentation des LED sera séparée.

D’un point de vue tension il peut être alimenté de 2 à 6V. Dans mon montage il sera en 3.3V.

Ce n’est pas le sujet de cet article donc je vous laisse faire votre tambouille en prenant compte de ces indications.

Condo

Vous aurez besoin d’un petit condensateur de 100nF tel que celui de la photo ci-dessous (ne prenez pas note des inscriptions).

Attention, vous trouverez beaucoup de tutos qui ne mentionnent pas ce condensateur, mais pour ma part il s’est avéré obligatoire car sans lui le SIPO se comportait n’importe comment ! J’ai donc envie de vous dire, mettez-en un vous gagnerez du temps. On verra plus bas où il faut le mettre.

Personnellement, je n’avais pas de 100nF sous la main, j’ai mis un 300nF et ça marche bien, mais un 100nF est conseillé un peu partout.


Le Circuit intégré 74HC595

Si je ne me trompe pas il existe plusieurs variantes du 74HC595, ceux que j’utilise ici sont des SN74HC595N. Sur d’autres modèles, les pins peuvent être différents donc faites attention.

SN74HC595N :

Pins 16 et 8 : Le VCC et la masse. Ce CI peut être alimenté en 3.3V. Je vais donc alimenter mes breadboard avec le pin 3.3V de mon arduino.

Pin 14 : DS ou Data Serial Input. C’est sur ce pin qu’on enverra les bits permettant d’activer les sorties du chip. Il devra donc être connecté à l’arduino.

Pin 13 : OE ou Output Enable. Celui-là il faut le mettre à la masse si on veut activer les sorties du chip.

Pin 12 : ST_CP, ou Storage Register Clock Input ou encore Latch Pin. C’est via ce pin que l’on ordonnera d’effectivement envoyer les bits sur les sorties du chip. Nous verrons plus bas à quoi ça sert en gros. Ce pin sera donc connecté à l’Arduino.

Pin 11 : SH_CP, ou Shift Register Clock Input. Le pin de l’horloge. Cela sert à synchroniser la communication entre le contrôleur et le SIPO. Il sera connecté à l’Arduino.

Pin 10 : MR pour Master Reset. Permet de reset le chip. Nous on le mettra sur le +3.3V car on ne souhaite pas utiliser le reset.

Pin 9 : Q7′ ou Serial Data Output. Celui-là est une sortie série. Il permet de chainer un autre 74HC595. On verra comment s’en servir.

Pins 1 à 7 et 15 : Parallel Data Output : Ce sont les sorties du SIPO. Ces pins seront connectés à nos LED. Les sorties sont appelées Q0 à Q7.


Montage 1 – Un seul SIPO

Voila mon montage sur breadboard.

J’ai donc posé 8 LED, soit L0 à L7, respectivement connectées aux sorties du SIPO Q0 à Q7 de façon à rationaliser et faciliter la gestion.

Mon SIPO sera connecté aux pins 0, 1, et 2 de l’Arduino.


Schéma 1 – Un seul SIPO

Voila le câblage que vous devez respecter.

Constatez que le pin Q7′ n’est pas connecté. Il sert à mettre des SIPO en série, on l’utilisera donc dans le deuxième exemple.

Vous pouvez utiliser n’importe quel Pin de l’Arduino car il n’y a pas, à ma connaissance, de restrictions pour les SIPO. Attention cependant, pour utiliser les pins A0 – A5, il faudra les déclarer comme sorties numériques (sujet non abordé ici).

Une fois branché, nous allons faire un petit point sur le vocabulaire, puis passer à des tests (très) sommaires sous Arduino IDE.


Vocabulaire

Sans vouloir trop compliquer les choses, il faut quand même les nommer pour savoir ce qu’on fait. Lisez ce paragraphe afin qu’on soit bien sur la même longueur d’onde pour la suite de cet article.

Je suis loin d’être un connaisseur en électronique ou en programmation. Je vais donc vous expliquer ce que j’ai compris avec des mots de débutant. Le but étant de ne pas être exhaustif, afin de seulement comprendre la base, et d’éventuellement orienter vos propres recherches.

Octet / Bit

Un 74HC595 peut gérer 8 bits. Ce qui est cohérent puisqu’il a 8 sorties. On va donc lui envoyer des séries de huit 0 ou 1. Chaque bit dira quelle sortie du SIPO sera en HIGH ou en LOW. Un octet, c’est une suite de 8 bits. Voila, c’est tout.

Clock

Littéralement Horloge, elle permet à un contrôleur de communiquer avec un contrôlé. Ça permet de synchroniser une communication numérique quoi. Elle est associée au pin SH_CP, ou Clock pin. Pas besoin de se prendre plus la tête que ça ici.

Registre

Un registre, c’est un espace destiné à enregistrer une donnée, d’où le nom. Le 74HC595 possède deux registres de 8 bits :

  • Shift register : C’est là où vont les bits que l’on envoie. Le chip les reçoit un à un à la vitesse de l’horloge. Il est associé au pin DS, ou Data pin.
  • Storage Register : Une fois que le Shift register à reçu ses 8 bits, il peut les envoyer au Storage register qui active ou non effectivement les sorties du chip. En clair il ne suffit pas d’envoyer les bits au chip, il faut lui dire aussi « ok tu peux les valider », et c’est là que les sorties sont effectivement affectées (vous avez un beau petit GIF ici vers le début si vous voulez.) Il est associé au pin ST_CP, ou Latch pin. En mettant ce pin à l’état HIGH, on « relâche » les bits et les sorties du chip sont alors affectées.

MSBFIRST / LSBFIRST 

Cette directive permet de préciser dans quel sens les 8 bits seront envoyés au SIPO.

  • Most Significant Bit First : (littéralement, le bit le plus significatif en premier) Si j’envoie 10000000 en indiquant MSBFIRST, c’est la dernière LED qui sera allumée.
  • Least Significant Bit First(littéralement, le bit le moins significatif en premier) Si j’envoie toujours 10000000 mais en indiquant LSBFIRST, c’est la première LED qui s’allumera.

->En gros, quel sera le premier bit envoyé ? Le 1 ou le dernier 0 ? Dans quel sens le programme va t’il envoyer au SIPO le code 10000000 ? Voila, c’est tout en fait. Ça deviendra clair quand on passera à la pratique.


Le Code 1 – Un seul SIPO

Passons maintenant au code avec Arduino IDE.

Alors je vous préviens tout de suite, étant une quiche, ce sera la base de chez LA base. Cela dit vous y trouverez peut-être votre bonheur justement. Pour un néophyte les exemple qu’on peut trouver ça et là peuvent être déconcertants, et si c’est aussi votre cas, alors je vous aurais pré-mâché le boulot.

->Le code Arduino prend en charge nativement les SIPO, ce qui veut dire qu’il n’y a pas besoin de librairie pour ça, bien qu’il en existe qui prétendent faciliter les choses.

A noter avant de commencer : Si vous effectuez de nombreux tests à la suite en uploadant très souvent des nouveaux bouts de codes différents, vous pouvez éventuellement obtenir des résultats erratiques. Si cela vous arrive, débranchez tout bonnement votre Arduino et rebranchez-le pour repartir à zéro.
Le Pin MR (Master Reset) peut d’ailleurs tout à fait être connecté à l’Arduino afin d’en tirer parti si vous le souhaitez. Si vous le mettez en LOW, le chip sera reset.

->Ouvrez Arduino IDE, connectez correctement votre Arduino et c’est parti.

Constantes

  • On déclare d’abord nos constantes, comme toujours, pour indiquer quels pins de l’arduino seront utilisés :
const int dataPin = 0; // Pin DS du chip
const int clockPin = 1; // Pin SHCP du chip
const int latchPin = 2; // pin STCP du chip
 

  • Ensuite dans void setup, on déclare ces pins comme des sorties :
void setup() {

pinMode (dataPin, OUTPUT);
pinMode (clockPin, OUTPUT);
pinMode (latchPin, OUTPUT);
}

  • Puis dans void loop on commence à titiller la bête.
void loop() {
 
-Il convient en premier lieu, avant d’envoyer des bits au registre, de mettre le Latch pin en LOW. On ferme le verrou de sortie en quelques sortes :
 
digitalWrite(latchPin, LOW);
 
-Ensuite on utilise shiftOut qui est la fonction qui permet d’écrire dans le registre. On lui donne le pin du registre dataPin, le pin d’horloge clockPin, et enfin la séquence binaire qu’on veut transmettre, soit 10000000.
-LSBFIRST indique que la séquence est envoyé à partir du dernier zéro. A l’envers en somme :

shiftOut(dataPin, clockPin, LSBFIRST, B10000000);
 
-A ce stade, le shift register contient nos 8 bits, mais il ne sont pas encore envoyé vers les sorties. Il faut maintenant dire au latchPin de « relacher » les bits vers les sorties :
 
digitalWrite(latchPin, HIGH); //Et paf, ça fait des chocapic
 
-Ça y est, les bits ont atteint les sorties du SIPO, la LED L0 est allumée.
-Je rajoute un delay car sinon le « latchPin Low » s’exécutant à chaque début de boucle très rapidement, l’allumage des LED peut apparaitre buggé.
 
delay(3000);
 
}

  • Code complet :
const int dataPin = 0; // DS
const int clockPin = 1; // SHCP
const int latchPin = 2; // STCP (latch)
void setup() {

pinMode (dataPin, OUTPUT);
pinMode (clockPin, OUTPUT);
pinMode (latchPin, OUTPUT);
}
 
void loop() {
 
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, B10000000);
digitalWrite(latchPin, HIGH);
delay(3000);
}
 
  • C’est bien la LED L0 qui est branchée sur Q0 qui brille :

  • Maintenant, changez LSBFIRST par MSBFIRST et uploadez le code :
shiftOut(dataPin, clockPin, MSBFIRST, B10000000);

  • C’est cette fois la dernière LED L7, qui est branchée sur Q7, qui brille ! En fait on a tout simplement envoyé le code dans l’autre sens. Pour en avoir le coeur net, vous pouvez tester avec un autre octet du genre 10100000.

->Voila qui illustre bien la fonction de MSB et LSB FIRST. Moi je vais garder LSBFIRST à partir de maintenant car je veux gérer mes LED dans le sens respectifs de mes sorties Q0 à Q7.


  • Aller, cette fois, on va afficher une combinaison pendant 3 secondes, puis éteindre tout pendant 3 secondes. Vous constaterez que avant d’envoyer un nouvel octet, je dois remettre le latch pin à LOW :
shiftOut(dataPin, clockPin, LSBFIRST, B10101010); //J'envoie l'octet au registre.
digitalWrite(latchPin, HIGH); //J'active les sorties en fonction de l'octet.
delay(3000);

digitalWrite(latchPin, LOW); //Je désactive les sorties.
//delay(3000);

shiftOut(dataPin, clockPin, LSBFIRST, B0000000); //J'envoie mon nouvel octet (tout à zéro donc tout éteint).
digitalWrite(latchPin, HIGH); //J'active les sorties en fonction du nouvel octet.
delay(3000);

digitalWrite(latchPin, LOW); //Je re-désactive les sorties, et ainsi de suite.
 
->Vous obtenez des LED qui clignotent avec un interval de 3 secondes.
 
  • Faites le test sans mettre le latch pin à LOW, vous verrez que les LED ne s’éteignent pas. Au lieu de ça elles s’affaiblissent un petit peu pendant 3 secondes.

Vous avez maintenant les bases (de chez bases) pour envoyer des octets à votre 74HC595. En y ajoutant vos compétences en programmation vous pourrez atteindre vos objectifs.

A noter que étant le donné le fonctionnement de ce circuit intégré, vous n’avez pas d’autre choix que de travailler par octets. On ne peut pas, par exemple, envoyer seulement 1 bit à la sortie Q4. Il faudra obligatoirement remplir le registre avec 8 bits avant de « latch » sur les sorties. C’est une caractéristique matérielle. Cependant, en créant des fonctions avec void nom_de fonction(){} vous pouvez vous faciliter la tâche. Egalement, vous pouvez utiliser un tableau de 8 bits avec int tableau[8]; pour ranger votre octet.

Je vous rappelle que si l’anglais n’est pas un problème vous pouvez trouver de la documentation chez Arduino ou encore ici.


Montage 2 – Deux SIPO en série

Il ne reste plus qu’à voir comment monter et gérer deux 74HC595 en série !

On va mettre deux 74HC595 en cascade, et chacun contrôlera 8 LED.

C’est là que le pin Q7′ de SIPO1 va devenir utile. En effet, on va le relier au pin DS (Data) de SIPO2, et c’est par là que les octets transiteront d’un SIPO à l’autre !

Dans le même principe que tout à l’heure, les LED L0 à L7 sont connectées aux sorties Q0 à Q7.

Il faut bien sûr également alimenter SIPO2 de la même façon que SIPO1, puis mettre OE sur la masse et MR sur le VCC.

La connexion de SIPO1 ne change pas, on va juste ajouter 3 fils entre SIPO1 et SIPO2 comme dans le shéma ci-dessous.


Schéma 2 – Deux SIPO en série


Le Code 2 – SIPO en cascade !

Au niveau du code, ce n’est pas beaucoup plus compliqué. On va simplement utiliser deux fois de suite la fonction shiftOut. La seule différence est que le premier octet envoyé ira au bout de la chaine, soit sur SIPO 2. Une fois que le registre de SIPO2 est plein, l’octet suivant ira dans le prochain registre libre, celui de SIPO1.

Essayez avec ce code :


void loop() {

digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, B11111111); // Vers SIPO 2
shiftOut(dataPin, clockPin, LSBFIRST, B00000000); // Vers SIPO 1
digitalWrite(latchPin, HIGH);
delay(3000);
}
  • C’est bien les LED de SIPO2 qui reçoivent le premier octet.

  • Aller, un dernier test pour la route :
 
void loop() {

digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, B11111111); // Vers SIPO 2
shiftOut(dataPin, clockPin, LSBFIRST, B00000000); // Vers SIPO 1
digitalWrite(latchPin, HIGH);
delay(3000);

digitalWrite(latchPin, LOW);

shiftOut(dataPin, clockPin, LSBFIRST, B10101010); // Vers SIPO 2
shiftOut(dataPin, clockPin, LSBFIRST, B11011011); // Vers SIPO 1
digitalWrite(latchPin, HIGH);
delay(3000);

digitalWrite(latchPin, LOW);
}

Pins OE et MR

A savoir également, les pins Output Enable et Master Reset du 74HC595 peuvent très bien être connectés à l’Arduino afin d’en faire utilisation. Moi je les ai connectés respectivement à la masse et au VCC, mais ce n’est pas une obligation ! Je ne voulais juste pas m’en servir ici.

Output Enable

Comme son nom l’indique, ce pin permet d’activer ou désactiver les sorties du chip. Cela peut être très utile pour éviter les activations intempestives des sorties, par exemple, lorque vous démarrez votre circuit.
OE = LOW : les sorties sont actives.
OE = HIGH : les sorties sont inactives.
Il peut donc être intéressant de mettre OE en LOW seulement lorsque votre programme devra commencer à utiliser le SIPO.

Master Reset

Permet de réinitialiser le SIPO pour X raison.
MR = HIGH : Le chip ne se reset pas.
MR = LOW : Le chip se reset.

Merci pour votre moment passé sur Infotrucs.fr ! J’espère que cela vous aura été utile. L’objectif était vraiment d’aborder le sujet du point de vue du grand débutant, et d’apporter peut-être une vulgarisation qui pourra aider. C’est simple j’ai répondu aux questions que moi-même je me posais, avec mon regard d’extrême profane 🙂 C’est un peu un recueil résumé de tout ce que j’ai pu trouvé.
A bientôt !

Share

You may also like...

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *


The reCAPTCHA verification period has expired. Please reload the page.