Site icon AranaCorp

Usar um registrador de deslocamento com o Arduino

O registrador de deslocamento (shift register) é um circuito integrado composto por circuitos lógicos em série que permitem salvar estados altos ou baixos na memória. Ele pode ser usado para controlar LEDs ou para obter o estado de vários sensores.

Material

Princípio de funcionamento

O registrador de deslocamento é um componente eletrônico que contém flip-flops síncronos. Estes são circuitos lógicos que guardam na memória um estado alto ou baixo (como um bit), ligados pelo mesmo relógio.

No caso do registrador de deslocamento 74HC595, as saídas paralelas fornecem uma tensão de 5V no estado alto e 0V no estado baixo.

Esquema

O registrador de deslocamento requer 3 pinos de saída de um microcontrolador. É possível gerir vários registradores ligados em série.

Código

Para comunicar com o registrador de deslocamento, faremos um pequeno malabarismo com os seus pinos de entrada. A fim de escrever no registro, precisamos colocar o pino RCLK em baixo. Para escrever nos flip-flops, temos de passar o relógio de armazenamento para baixo A cada pulsação do relógio, passamos para o flip-flop seguinte. Para simplificar o nosso código, vamos definir este procedimento na função writeRegister().

Para mostrar o princípio de um registrador de deslocamento, um exemplo comum é conectar LEDs às suas saídas e fazê-los piscar um após o outro.

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

      
}
}

Resultados

Aplicações

Fontes

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

Exit mobile version