Arduino augmenter le nombre de sortie avec un registre à décalage 74HC595

10243

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.

Registre Decalage Circuit

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

}

En matériel il nous faut :

  • 1 arduino
  • 8 led et résistances
  • 1 registre a décalage 74HC595

Pour le montage :

  • 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.

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.

Registre Decallage Doc

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:

Tuto Registre Decalage

N’hésitez pas à poser vos questions sur les réseaux sociaux de la chaîne instagramtwitter , 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