Matériel
- Ordinateur
- Arduino UNO
- Câble USB A Mâle/B Mâle
- Shift Register 74HC595
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.
- GND masse du circuit intégré
- Vcc broche d’alimentation. Généralement connecté à 5V
- SH_CP ou RCLK shift register clock input. Le signal d’horloge du registre qui détermine si on écrit dans la mémoire
- ST_CP ou SRCLK storage register clock input. Le signal d’horloge de stockage qui définit dans quel mémoire on vient lire ou écrire.
- DS ou SER serial data input. Signal contenant la données à enregistrer (HAUT ou BAS)
- Q0-Q7 parallel data output. Broches de sorties du registre à décalage
- OE Output enable, active LOW. Broche connectée à GND pour activer les sorties
- MR Master reset, active LOW. Broche de remise à zéro. Connectée au 5V
- Q7′ serial data output (broche utilisée seulement si plusieurs registres sont 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
- Gérer jusqu’à 8 LEDS ou capteur avec trois broches d’un microcontrôleur
- Gérer un afficheur 7 segments ou plus