Aujourd’hui on va apprendre à comment augmenter le nombre de sortie d’un arduino avec un registre à décalage 74HC595.
Le nombre de sortie logique d’un arduino est limité et souvent on peut avoir besoin de beaucoup de sorties (relais, led, afficheurs …), nous allons voir comment avec 3 fils commander de 8 à X sorties logique.
Matériel Nécessaire
- 1 arduino
- 8 led et résistances
- 1 registre a décalage 74HC595
Câblage
- Pin DS (14) au pin 8 de l’arduino
- Pin OE (13) au Gnd
- Pin STCP (12) au pin 9 de l’arduino
- Pin SHCP (11) au pin 10 de l’arduino
- Pin MR (10) au 5V
- Pin Vcc (16) au 5V
- Pin Gnd (8) au Gnd
- Les pin Q0 à Q7 aux led
Nous allons augmenter le nombre de pin de notre arduino avec 3 fils, il est possible de mettre en série plusieurs registre à décalage, pour cela on devra connecter le pin Q7′ sur le pin DS du registre a décalage suivant.
Schéma de Fonctionnement du Registre à Décalage
Rapidement le fonctionnement du registre à décalage, le pin SHCP permet un décalage de pin (0,1,2,3,4,5 etc….).
Le pin DS définit la valeur du pin dans lequel on est positionné (0 ou 1) et le pin STCP permet de valider les valeurs appliquées aux registres ( valide à 1).
Le pin MR remet tout à 0 ( à l’état bas pour reset) , le pin OE active ou non le registre à décalage.
Partie code on commence par déclarer nos pin, on va ensuite définir le nombre de registre à décalage avec “#define numberOf74hc595 ” .
Je calcule le nombre de “pin” en sortie des registre à décalage avec “#define numOfRegisterPins numberOf74hc595 * 8”.
Je crée un tableau de boolean qui aura la taille du nombre de pin pour les registres “boolean registers[numOfRegisterPins];”.
Partie setup je définis tous mes pin en sortie , j’appelle la fonction “clearRegisters()” qui met a 0 les valeurs du registres et “writeRegisters()” qui se charge décrire sur le(s) registre(s).
La fonction “clearRegisters()” boucle sur toutes les valeurs du tableau de registre et le met à l’état LOW.
La fonction “writeRegisters()” sert à appliquer les valeurs au registre, en premier on met le pin STCP à l’état pour ensuite boucler sur tous les pin des registres.
Dans cette boucle je met SHCP à l’état bas car c’est à l’état haut que l’on décale le registre, je récupère la valeur contenu dans registers et je l’affecte à val “int val = registers[i];”.
On applique ensuite cette valeur au pin du registre avec “digitalWrite(PIN_DS, val);” , cela va appliquer la valeur à la position on l’on est.
On change ensuite de position avec “digitalWrite(PIN_SHCP, HIGH);” et une fois que la boucle for est terminée on va demander au registre d’appliquer les valeurs envoyées avec “digitalWrite(PIN_STCP, HIGH);”.
J’ai ensuite une autre fonction pour enregistrer les valeurs dans les registres (array registers), cette fonction est “setRegisterPin(int index, int value)” dans laquelle on y envoie l’index du “pin” et la valeur souhaitée. Et avec ces valeurs on affecte le tableau registers avec “registers[index] = value;”.
Pour finir on a notre boucle loop ou je définis les valeurs des pin que je souhaite modifier avec “setRegisterPin(0, HIGH);” pour le “pin 0” etc …
Une fois que j’ai modifié les pin souhaité pour appliquer mes valeurs il me suffit d’appeller “writeRegisters();”.
A la fin du programme je n’ai besoin que de modifier que 2 pin donc j’appelle “setRegisterPin” seulement pour ceux affectés.
Le code est terminé tu peux télécharger mon exemple.
Télécharger:
Conclusion
Avec ce tutoriel, vous savez maintenant comment augmenter le nombre de sorties de votre Arduino en utilisant un registre à décalage 74HC595. Ce projet peut être étendu en ajoutant plusieurs registres à décalage en série pour contrôler encore plus de sorties.
Exemple de Code registre décalage 74hc595 et arduino
// Made by https://retroetgeek.com
#define PIN_DS 8 //pin 14 75HC595
#define PIN_STCP 9 //pin 12 75HC595
#define PIN_SHCP 10 //pin 11 75HC595
//Nombre de registre a decalage utilise
//How many shift register
#define numberOf74hc595 1
// nombre total de pin de registre a decalage
// number of total register pin
#define numOfRegisterPins numberOf74hc595 * 8
// cree un array contenant des booleen de la taille du nombre de pin 74hc595
// Create an array with boolean, size of pin of 74hc595
boolean registers[numOfRegisterPins];
void setup(){
pinMode(PIN_DS, OUTPUT);
pinMode(PIN_STCP, OUTPUT);
pinMode(PIN_SHCP, OUTPUT);
// remise a 0 des registres
//reset all register pins
clearRegisters();
// on applique les valeurs au registre a decalage
// write value on shift register
writeRegisters();
}
// Mettre toutes les valeurs a 0 pour le resigtre
//set all register pins to LOW
void clearRegisters(){
for(int i = numOfRegisterPins - 1; i >= 0; i--){
registers[i] = LOW;
}
}
// affectation des valeurs engregistrés dans le tableau "registers" et application (visualisation) des valeurs a la fin
// set value recorded in array "registers" and display on the end
void writeRegisters(){
// Tant que LOW les modifications ne seront pas affectés
// Until LOW modification will not be apply
digitalWrite(PIN_STCP, LOW);
// boucle pour affecter chaque pin des 74hc595
// loop for aplly all value for each pin 74hc595
for(int i = numOfRegisterPins - 1; i >= 0; i--){
//doit etre a l'etat bas pour changer de colonne plus tard
//need to be low for change column soon
digitalWrite(PIN_SHCP, LOW);
// recuperation de la valeur dans le tableau registers
// catch value insinde array registers
int val = registers[i];
//affecte la valeur sur le pin DS correspondant a un pin du 74hc595
//apply the value to a pin of 74hc595
digitalWrite(PIN_DS, val);
//colonne suivante
// next column
digitalWrite(PIN_SHCP, HIGH);
}
//applique toutes les valeurs au 74hc595
// apply value to all pin of 74hc595
digitalWrite(PIN_STCP, HIGH);
}
// enregistre une valeur pour un registre etat haut ou bas
//set an individual pin HIGH or LOW
void setRegisterPin(int index, int value){
registers[index] = value;
}
void loop(){
setRegisterPin(0, HIGH);
setRegisterPin(1, HIGH);
setRegisterPin(2, HIGH);
setRegisterPin(3, HIGH);
setRegisterPin(4, HIGH);
setRegisterPin(5, HIGH);
setRegisterPin(6, HIGH);
setRegisterPin(7, HIGH);
// appelle la fonction pour appliquer les valeurs
// call function to apply value
writeRegisters();
delay(500);
setRegisterPin(0, HIGH);
setRegisterPin(1, HIGH);
setRegisterPin(2, HIGH);
setRegisterPin(3, LOW);
setRegisterPin(4, LOW);
setRegisterPin(5, HIGH);
setRegisterPin(6, HIGH);
setRegisterPin(7, HIGH);
writeRegisters();
delay(500);
setRegisterPin(0, HIGH);
setRegisterPin(1, HIGH);
setRegisterPin(2, LOW);
setRegisterPin(3, LOW);
setRegisterPin(4, LOW);
setRegisterPin(5, LOW);
setRegisterPin(6, HIGH);
setRegisterPin(7, HIGH);
writeRegisters();
delay(500);
setRegisterPin(0, HIGH);
setRegisterPin(1, LOW);
setRegisterPin(2, LOW);
setRegisterPin(3, LOW);
setRegisterPin(4, LOW);
setRegisterPin(5, LOW);
setRegisterPin(6, LOW);
setRegisterPin(7, HIGH);
writeRegisters();
delay(500);
setRegisterPin(1, HIGH);
setRegisterPin(6, HIGH);
writeRegisters();
delay(200);
setRegisterPin(2, HIGH);
setRegisterPin(5, HIGH);
writeRegisters();
delay(200);
}📌 FAQ – Utiliser un registre à décalage 74HC595 avec Arduino
Q : À quoi sert le 74HC595 avec un Arduino ?
R : Ce composant permet de contrôler 8 sorties numériques en utilisant seulement 3 broches de l’Arduino, ce qui est idéal lorsque tu manques de GPIO disponibles.
Q : Peut-on chaîner plusieurs 74HC595 ?
R : Oui, tu peux en chaîner plusieurs pour obtenir 16, 24, 32 sorties ou plus, toujours en utilisant les mêmes 3 broches de contrôle (Data, Clock, Latch).
Q : Quels types de périphériques peut-on piloter avec ce registre ?
R : Principalement des LEDs, afficheurs 7 segments, relais basse tension, ou tout autre composant nécessitant un simple signal ON/OFF.
Q : Quelle bibliothèque utiliser pour le 74HC595 ?
R : Tu peux utiliser la bibliothèque Arduino standard shiftOut() ou des bibliothèques comme ShiftRegister74HC595.h pour une gestion plus simple et plus claire dans le code.
Q : Peut-on faire varier l’intensité lumineuse des LEDs avec ce module ?
R : Non, le 74HC595 ne gère pas le PWM (modulation de largeur d’impulsion). Pour contrôler la luminosité, il faut combiner avec des transistors ou des modules PWM externes.
🔗 À découvrir aussi sur Retro&Geek
👉 Comment utiliser un moteur pas à pas 28BYJ-48 avec ULN2003A
Gère plusieurs moteurs grâce aux sorties étendues avec le 74HC595.
👉 Fabriquer un distributeur d’étain automatique (Solder Feeder 2000)
Un projet utile intégrant du contrôle moteur avec Arduino.
👉 Créer une étoile lumineuse en 3D – Arduino + LEDs
Parfait pour expérimenter le 74HC595 si tu veux allumer plusieurs LEDs avec des effets variés.
👉 Créer une télécommande infrarouge Arduino
Contrôle tes sorties décalées à distance via IR.
N’hésitez pas à poser vos questions sur les réseaux sociaux de la chaîne instagram , twitter , facebook ,youtube ; si vous ne comprenez pas certaines parties du tutoriel n’hésitez pas , me dire ce que vous aimeriez que je crée pour en faire des vidéos tutoriel et à partager les projets que vous aimeriez créer etc…
Comme toujours allez sur la page de C’est quoi Retro et Geek pour connaître tout ce que je recherche à faire sur la chaîne.
Merci les RetroGeeker et RetroGeekeuse







