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); }
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