Le registre à décalage PISO

Le registre à décalage PISO

Le registre à décalage entrées parallèles => sortie série (ou en anglais shift register Parallel In Serial Out) est un petit circuit intégré très pratique pour augmenter le nombre d’entrée d’un Arduino.

 

A quoi ça sert?

Imaginons un tableau de bord avec ses touches (boutons poussoirs) et trop de touches pour les entrées de l’Arduino. Il existe plusieurs façons de connecter pleins de boutons poussoir à un Arduino sans utiliser trop de fil (et donc d’entrées). Dans ces façons, il y a la matrice et pour une matrice il faut gérer plusieurs ligne et plusieurs colonnes, les activer et les désactiver pour scanner l’ensemble du clavier (c’est généralement ce qui est utilisé pour des claviers 3×3 ou 3×4). Il y a aussi l’utilisation d’un multiplexeur (plusieurs entrées, une sortie) qui permet de lire une de ses entrées, sélectionnée par commande, sur sa sortie. Et nous avons aussi la possibilité d’utiliser un registre à décalage et c’est cette solution qui est expliquée plus bas.

 

Comment ça marche?

Comme son nom l’indique, ce circuit possède plusieurs entrées en parallèle et une sortie série. Bien pratique pour avoir plusieurs entrées séparées, les sérialiser dans le temps, et les présenter sur une seul pin de l’Arduino. Le principe est simple, le circuit récupère les valeurs qu’il y a sur les entrées parallèles grâce à un ordre qui lui est envoyé et les restitue une à une sur la sortie série en fonction d’un signal de commande (une horloge).

L’enchainement des étapes pour récupérer un octet

Étape 1 : charger les valeurs présentes sur les entrées parallèles dans le registre interne

Étape 2 : lire 8 fois la valeur sur la sortie série en envoyant à chaque lecture un coup d’horloge pour faire décaler les données. Ceci permet de lire l’entrée 8 puis l’entrée 7 ainsi de suite.

Étape 3 : faire ce qu’on veut avec les 8 bits (l’octet) récupérés

La mécanique interne d’un registre PISO :

Des registres à décalage, il en existe quelques uns avec le même principe de base mais avec quelques fonctionnalités différentes. Nous allons voir le CD4021BE (mais vous auriez pu tout a fait prendre un 74HC165, attention le câblage n’est pas le même).

 

Comment brancher un CD4021E?

Le CD4021E se présent sous la forme d’un composant à 16 broches en boitier DIP (traversant en photo) ou en version CMS (composant de surface).

Voici la correspondance des pins.

-- pin out du CD4021
        1___o___16    
PI-8 ->  |     | <- Vcc (+5v)
  Q6 <-  |  C  | <- PI-7
  Q8 <-  |  D  | <- PI-6
PI-4 ->  |  4  | <- PI-5
PI-3 ->  |  0  | -> Q7
PI-2 ->  |  2  | <- entrée série (provenant par exemple de la sortie Q8 d'un autre CD4021)
PI-1 ->  |  1  | <- entrée de l'horloge (CLOCK)
 GND ->  |_____| <- chargment des 8 inputs paralelles (LOAD)
        8       9
Q8 est la sortie série
Q6-7 sont des sorties intermédiaires 

L’alimentation se fait avec les pin 8  GND et pin 16 Vcc (+5v).

les pins de contrôles sont :

  • la pin 9 Load qui permet de charger les données sur front haut et de les figer dans le registre interne sur front bas
  • la pin 10 Clock, chaque front montant décale les valeurs dans le registre interne et présente la nouvelle valeur sur la sortie série de PI 1 vers PI 8

les pins d’entrée sont les pins PI 1 à PI 8 et la pin de sortie série est la sortie Q8 (la pin 3).

 

Comment utiliser le CD4021E avec une carte Arduino?

Au moment du chargement des valeurs dans le registre interne, celles-ci ne seront plus perturbées par un changement d’état sur les pins jusqu’au nouveau chargement. Il faut donc charger une fois et récupérer les 8 bits avant de charger à nouveau.

Dès le chargement, la première valeur, (celle de l’entrée Pi8, soit la pin 1) devient disponible sur la sortie série Q8 (pin 3). Puis ensuite il faut envoyer un coup d’horloge pour mettre le prochain bit (soit celui présent sur la PI7 au moment du chargement) sur la sortie Q8. Et ainsi de suite pour récupérer les bits restants.

Voici un exemple de code qui permet de récupérer l’octet d’un CD4021E. Attention à la façon dont vous enregistrez les bit LSB (Less Significant Bit) ou MSB (Most Significant Bit), l’exemple de code enregistre le premier bit lu comme le MSB et le dernier lu comme le LSB.

// définition des pin
#define CLOCK   10
#define LOAD    9
#define IN      3
#define BLINK   13

byte serieVal = 231;  //mettre un valauer non nulle
bool blinkStatus=true;


void setup() {
  //initialisation de la liaison série
  Serial.begin(9600);

  //définition du mode des pin
  pinMode(BLINK, OUTPUT);
  pinMode(CLOCK, OUTPUT);
  pinMode(LOAD, OUTPUT); 
  pinMode(IN, INPUT);

}

void loop() {

  // clignotement de la led pin 13 à chaque lecture de données
  digitalWrite(BLINK,blinkStatus);
  blinkStatus=!blinkStatus;

  // mise à un du pin LOAD pour le chargment de chaque PI
  digitalWrite(LOAD,1);
  // attente du chargement des données
  delayMicroseconds(20);
  // verrouillage des données avant de les transmettre par la liaison série
  digitalWrite(LOAD,0);

  serieVal= shiftSerialInChar(CLOCK,IN);

  Serial.println(serieVal, BIN);//affichage de la valeur en binaire => 10110010
  Serial.println("-------------------");
  //delay pour chaque récupération de données 
  delay(1000);
}

byte shiftSerialInChar(int pinClock, int pinData){
  byte temp=0;
  byte valTemp=1;
  // décalage de 8 fois pour récupérer les 8 bits du registre
  for(int i=0;i<8;i++){
    // l'horloge est mise à zéro
    digitalWrite(pinClock, 0);
    // lecture de la valeur sur le port série du CD4021
    temp = digitalRead(pinData);
    valTemp = valTemp << 1; // décalage pour le nouveau bit qui arrive
    valTemp = valTemp | temp; // ajout du nouveau bit dans l'octet en dernière position
    // l'horloge est mise à 1 pour décaler les données du registre
    digitalWrite(pinClock, 1);
  }
  return valTemp;
}

 

Utiliser plusieurs CD4021E

Le principe est assez simple, comme il s’agit d’une liaison série avec un décalage, il suffit de mettre les CD4021E en série. Pour se faire on raccorde la sortie Q8 du premier sur l’entrée série (pin 11) du deuxième et on lit la sortie Q8 du deuxième. Il faut également relier les LOAD et CLOCK de chacun des éléments. Au bout du 8eme top d’horloge c’est les données du premier élément qui seront accessibles.

Ce montages série est très intéressant car il permet toujours de n’utiliser que 3 pins de la carte Arduino quelque soit le nombre de registres en série. En revanche, plus il y a de registres en série plus il faudra de temps pour récupérer les données.

Vous trouverez des informations complémentaires sur le site Arduino (voir lien en fin d’article).

 

Note

Il existe aussi plus simplement la fonction shiftIn d’Arduino 🙂

https://www.arduino.cc/en/Tutorial/ShiftIn

Et il doit y avoir un ou 2 sites dont j’ai pu m’inspirer mais j’ai oublié lesquels (merci à eux quand même).

Posted in arduino, Projet terminé, Technique.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Time limit is exhausted. Please reload CAPTCHA.