Site icon AranaCorp

Utilisation d’un registre à décalage avec Arduino

Le registre à décalage est un circuit intégré constitué de circuits logique en série permettant de garder en mémoire des états haut ou bas. Il peut permettre de piloter des LED ou encore de récupérer l’état de plusieurs capteurs.

Matériel

Principe de fonctionnement

Le registre à décalage (ou shift register) est un composant électronique contenant des bascules synchrones. Ce sont des circuits logiques qui gardent en mémoire un état haut ou bas (comme un bit) relié par une même horloge. Le principe de décalage vient du fait que l’on vient écrire ou lire dans chaque mémoire bit par bit.
Dans le cas du registre à décalage 74HC595, les sorties parallèles délivreront une tension de 5V à l’état haut et 0V à l’état bas.

Schéma

Le registre à décalage nécessite 3 broches de sortie d’un microcontrôleur. Il est possible de gérer plusieurs registres montés en série.

Code

Pour communiquer avec le registre à décalage, nous allons jongler avec ses broches d’entrée. Afin d’écrire dans le registre, il faut mettre la broche RCLK à bas. Pour écrire dans les bascules, il faut passer l’horloge de stockage à bas. A chaque impulsion d’horloge, on passe à la bascule suivante. Pour simplifier notre code, nous allons définir cette procédure dans la fonction writeRegister().
Pour montrer le principe du registre à décalage, un exemple courant est de brancher des leds à ses sorties que nous allons faire clignoter les unes à la suite des autres.

//Constants
#define number_of_74hc595s 1
#define numOfRegisterPins number_of_74hc595s * 8
#define SER_Pin D1
#define RCLK_Pin D2
#define SRCLK_Pin D3

//Variables
boolean registers [numOfRegisterPins] ={0, 0, 0};

void setup(){
//Init Serial USB
Serial.begin(115200);
Serial.println(F("Initialize System"));
//Init register
 pinMode(SER_Pin, OUTPUT);
pinMode(RCLK_Pin, OUTPUT);
pinMode(SRCLK_Pin, OUTPUT);
}

void loop(){
writeGrpled();
}

void clearRegisters(){/* function clearRegisters */ 
//// Clear registers variables 
for(int i = numOfRegisterPins-1; i >=  0; i--){
  registers[i] = LOW;
}}

void writeRegisters(){/* function writeRegisters */ 
//// Write register after being set 
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);
}

void setRegisterPin(int index,int value){/* function setRegisterPin */ 
////Set register variable to HIGH or LOW
registers[index] = value;
}

void writeGrpled(){/* function writeGrpled */ 
//// blink leds 
for(int i = numOfRegisterPins-1; i >=  0; i--){
   Serial.print(F("LED "));Serial.print(i);Serial.println(F(" HIGH"));
   setRegisterPin(i, HIGH);
   writeRegisters();
   delay(200); 
   Serial.print(F("LED "));Serial.print(i);Serial.println(F(" LOW"));
   setRegisterPin(i, LOW);
   writeRegisters();

      
}
}

Résultats

Applications

Sources

Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie

Quitter la version mobile