Arduino et shift register

Fermé
windows7. Messages postés 140 Date d'inscription samedi 1 décembre 2012 Statut Membre Dernière intervention 18 mai 2015 - 30 juin 2014 à 21:31
windows7. Messages postés 140 Date d'inscription samedi 1 décembre 2012 Statut Membre Dernière intervention 18 mai 2015 - 2 juil. 2014 à 09:47
Bonjour,

combien de shift register 74HC595n peur on mettre au maximum en chaine.

Mais ne peut on pas les mettre en parallèle, soit deux séparés donc on utilise 6 pin au lieu de 3 pour optimiser les shift register.

3 réponses

Bonjour

Tu peux en mettre autant que tu veux en série, tant que tu respectes les caractéristiques des signaux. Je pense en particulier aux vitesses des fronts, car quand tu utilises une seule porte logique pour piloter par exemple les horloges de 50 boîtiers simultanément, tu as intérêt à bufferiser le signal. Et il ne faut pas oublier que le temps de mise à jour de toute la chaîne augmente avec le nombre de boîtiers en série.
Tu aussi peux donc faire plusieurs chaînes parallèles de boîtiers : tu utilises les mêmes clock et load pour tout le monde, mais une data par chaîne. Ça ne change rien au problème de sortance, mais le temps de chargement des boîtiers est divisé par le nombre de chaînes en parallèle.
Par expérience, il ne faut pas mélanger de boîtiers de fabricants différents, il y souvent des incompatibilités de timing.
0
windows7. Messages postés 140 Date d'inscription samedi 1 décembre 2012 Statut Membre Dernière intervention 18 mai 2015 1
1 juil. 2014 à 09:59
Voici mon code pour contrôler chaque pin séparément des autres.
il y a t-il des choses qui peuvent être supprimé mais surtout comment le modifié.
j'ai essayé plusieurs combinaisons différentes pour mettre deux jeux de deux shift register en parallèle mais ça n'a pas fonctionné.


int data = 10; //pin 14 on the 75HC595
int verrou = 11; //pin 12 on the 75HC595
int horloge = 12; //pin 11 on the 75HC595

#define number_of_74hc595s 2 //How many of the shift registers - change this
#define numOfRegisterPins number_of_74hc595s * 8 //do not touch

boolean registers[numOfRegisterPins];

void setup(){
pinMode(data, OUTPUT);
pinMode(verrou, OUTPUT);
pinMode(horloge, OUTPUT);
}

//set all register pins to LOW
void clearRegisters(){
for(int i = numOfRegisterPins - 1; i >= 0; i--){
registers[i] = LOW;
}
}

void writeRegisters(){

digitalWrite(verrou, LOW);
for(int i = numOfRegisterPins - 1; i >= 0; i--){
digitalWrite(horloge, LOW);
int val = registers[i];
digitalWrite(data, val);
digitalWrite(horloge, HIGH);
}
digitalWrite(verrou, HIGH);

}
//set an individual pin HIGH or LOW
void setRegisterPin(int index, int value){
registers[index] = value;
}

void loop(){


setRegisterPin(0, HIGH);
setRegisterPin(1, LOW);
setRegisterPin(2, HIGH);
setRegisterPin(3, LOW);
setRegisterPin(4, HIGH);
setRegisterPin(5, LOW);
setRegisterPin(6, HIGH);
setRegisterPin(7, LOW);

setRegisterPin(8 , HIGH);
setRegisterPin(9 , LOW);
setRegisterPin(10, HIGH);
setRegisterPin(11, LOW);
setRegisterPin(12, LOW);
setRegisterPin(13, HIGH);
setRegisterPin(14, HIGH);
setRegisterPin(15, HIGH);




writeRegisters();
}
0
Utilisateur anonyme
1 juil. 2014 à 10:27
Ce code marche-t-il ?
En première lecture, ça a l'air correct, pour deux boîtiers en série
0
windows7. Messages postés 140 Date d'inscription samedi 1 décembre 2012 Statut Membre Dernière intervention 18 mai 2015 1
1 juil. 2014 à 12:27
Ce code marche très bien pour deux Boitier en série, il est même idéal pour contrôler chaque led

Le bémols c'est que soit j'utilise 45 shift register branché en série soit j'utilise 3*15 branché en parallèle, ce qui me parait mieux pour contrôler un grand nombre de led RGB.

Comment modifier ou utiliser ce programme pour les 3 broches de la led RGB
0
Utilisateur anonyme
1 juil. 2014 à 15:45
Sans trop connaître ton langage, et en supposant que tu utilises 3 data différentes, mais un seul verrou, une seule horloge :
 int dataR = 10; //pin 14 on the 75HC595 R
int dataG = xx; // pin 14 on the 75HC595 G
int dataB = yy; //pin 14 on the 75HC595 B
int verrou = 11; //pin 12 on the 75HC595
int horloge = 12; //pin 11 on the 75HC595

#define number_of_74hc595s 15 //How many shift registers IN EACH BRANCH
#define numOfRegisterPins number_of_74hc595s * 8 //do not touch

boolean registers[numOfRegisterPins][3];

void setup(){
  pinMode(dataR, OUTPUT);
  pinMode(dataB, OUTPUT);
  pinMode(dataB, OUTPUT);
  pinMode(verrou, OUTPUT);
  pinMode(horloge, OUTPUT);
}

//set all register pins to LOW
void clearRegisters(){
  for(int i = numOfRegisterPins - 1; i >= 0; i--){
    registers[i][0] = LOW; // R
    registers[i][1] = LOW; // G
    registers[i][2] = LOW; // B
  }
}

void writeRegisters(){

  digitalWrite(verrou, LOW);
  for(int i = numOfRegisterPins - 1; i >= 0; i--){
    digitalWrite(horloge, LOW);
    digitalWrite(data, registers[i][0]);  // R
    digitalWrite(data, registers[i][1]);  // V
    digitalWrite(data, registers[i][2]);  // B
    digitalWrite(horloge, HIGH);
  }
  digitalWrite(verrou, HIGH);
}

//set an individual pin HIGH or LOW

void setRegisterPin(int index, int valueR,int valueG,int valueB) {
  registers[index][0] = valueR;
  registers[index][1] = valueG;
  registers[index][2] = valueB;
}

void loop(){


setRegisterPin(0, HIGH,HIGH,HIGH);
setRegisterPin(1, LOW,HIGH,HIGH);
setRegisterPin(2, HIGH,LOW,HIGH);
/* bon courage pour tout remplir */



writeRegisters();
}

Sans aucune garantie sur les détails de syntaxe, mais le principe est là.
0
windows7. Messages postés 140 Date d'inscription samedi 1 décembre 2012 Statut Membre Dernière intervention 18 mai 2015 1
1 juil. 2014 à 16:50
Merci c'est exactement ce qu il me fallait tes génial
0
windows7. Messages postés 140 Date d'inscription samedi 1 décembre 2012 Statut Membre Dernière intervention 18 mai 2015 1
Modifié par windows7. le 2/07/2014 à 09:54
est ce que avec des shift register, un code dans ce style pourrait marcher.


// variation de rouge
for (int i=0; i<=255; i++) { // défile valeur 0 à 255
ledRVBpwm(i,0,0); // génère impulsion largeur voulue pour la couleur
delay(10); //pause
}

en mettant i dans "setRegisterPin(0, HIGH,HIGH,HIGH);"
0