74HC595 pour du chenillard a led

Bonjour

Je suis nouveau forum, je m'excuse par avance si je ne post pas dans la bonne rubrique

Je possède donc une arduino uno et deux 74HC595, jai cabler sa en cascade donc deux fil qui vont de l'arduino a chacun des 74HC595 et un fil qui va de l'arduino pour aller a la premiere puce et un fil qui resort de la puce 1 pour aller a la puce 2

Maintenat je bloque sur le code

Dans des tuto j'ai trouver les lignes pour definir les broche pour fair de la com. avec les puces

Mais je ne trouve rien pour définir les sortie des puces

Donc si une personne a des infos sa serait cool

Le but est de fair le plus simple possible

Genre

Ont allume la led 1
Delai de X
Ont etiend la led 1
Delai X
Ont allume la led 2
Ect ........

Merci par avance

Bonjour,

T'as pas du chercher bien loin pour pas trouver ce lien :

Salut,

Tu as besoin de 3 sorties de l'arduino + alim (5V et GND)

Alimente les 2 74HC595.

Ensuite tu as à cabler sur 3 pins différentes :

  • LATCH sur une pin (LATCH des 2 circuits sont connectés ensemble)
  • CLOCK sur une autre pin (CLOCK des 2 circuits sont connectés ensemble)
  • DATA du premier circuit est relié à une 3eme broche de l'arduino.
  • Q7' du premier circuit est connecté à DATA du deuxieme circuit.

pour charger des données tu peux utiliser la fonction shiftout() qui envoie 8 bits au registre. Dans ton cas tu en as deux, donc tu devras faire deux shiftout(). une fois les registres chargés il faut envoyer un niveau haut sur le LATCH pour activer les sorties. Ca c'est pour envoyer une première série de données (par exemple allumer ta première LED). ensuite tu charges ta deuxieme donnée et ainsi de suite.

Par exemple tu peux utiliser un nombre binaire pour définir tes position de leds à allumer : b0000000000000001 (tu peux aussi envoyer une série de 2 octets l'un à la suite de l'autre si tu préfères : b00000000 et b00000001)

Dans ta fonction shiftout() tu as un paramètre à préciser :

  • LSBFIRST : envoyer le bit de poids faible d'abord
  • MSBFIRST : envoyer le bit de poids fort d'abord

Merci de vos reponces rapides

@skywodd

Merci pour le lien il ma permi de verifier mon cablage qui etait deja ok

@SMarty

J'ai compri que la premiere partie de ton post ...

Mais pour le reste je suis perdu :confused: commander en binaire me plait beaucoup car sa fait tres visuel sur la prog

Je comprend juste cette partie la

int latchPin = 8;

int clockPin = 12

int dataPin = 11

binaire ça veut dire utiliser des 0 ou des 1.

0 = valeur basse (0V)
1 = valeur haute (5V)

Si tu places un 0 sur une broche d'un 74HC595 cette broche est en état bas, un 1 et elle est en état haut.

Je te conseille de commencer avec un seul circuit pour comprendre le mécanisme (soit 8 leds)

Autrement dit, si on réfléchit sur 8 bits, qui correspond à 8 valeurs donc un seul circuit 74HC595, si tu envoie b00000000 toutes tes sorties sont à 0 (Leds éteintes). Si tu envoies b11111111 toutes tes sorties sont à l'état haut (Leds allumées). Si tu envoies b00000001 (une seule led allumée) mais tout dépend du type d'envoi.

L'importance du paramètre MSBFIRST ou LSBFIRST se situe ici. Si tu envoies en MSBFIRST ton 1 se retrouve en broche 1 du 74HC595. Si tu envoie en LSBFIRST ton 1 se retrouve en broche 8. Regarde le lien de Skywodd pour voir comment fonctionne shiftout()

merci pour cette reponces

bon j'ai fait quelle que recherche et es que ceci fonctionnerai ?

j'évite de brancher car j'ai deja cramer une arduino a force de jouer a " tien je vais essayer pour voir si sa marche "

int latchPin = 9;
int clockPin = 10;
int dataPin = 8;
 
void setup() 
{
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);  
  pinMode(clockPin, OUTPUT);
}
 
void loop() {
  
  
   digitalWrite(latchPin, LOW);                                     
   shiftOut(dataPin, clockPin, MSBFIRST, B0000000000000001);       
   digitalWrite(latchPin, HIGH);

    delay(100); 

   digitalWrite(latchPin, LOW);                                     
   shiftOut(dataPin, clockPin, MSBFIRST, B0000000000000010);       
   digitalWrite(latchPin, HIGH);

   delay(100); 

   digitalWrite(latchPin, LOW);                                     
   shiftOut(dataPin, clockPin, MSBFIRST, B0000000000000100);       
   digitalWrite(latchPin, HIGH);

}

ect ...

et pour brancher une alim supplémentaire pour les puces ?
si j'envoie du 5V sur les puces et je fait juste une masse commune entre l'arduino et mes puces histoire d'avoir un point de référence sa fonctionne ?

Salut,

comme je te disais dans une réponse plus haut, shiftout() envoie un octet, soit 8 bits.
pour envoyer la donnée que tu mentionne il faut donc le faire en deux fois :

  • soit en divisant ta donnée en deux série de 8 bits
shiftOut(dataPin, clockPin, MSBFIRST, b00000000);
shiftOut(dataPin, clockPin, MSBFIRST, b00000001);
  • soit en créant une variable pour ta donnée et en décalant les bits avant la deuxième salve :
int myData = b0000000000000001;
shiftOut(dataPin, clockPin, MSBFIRST, myData); // myData = b0000000000000001
myData = myData << 8;
shiftOut(dataPin, clockPin, MSBFIRST, myData); // myData = b0000000100000000

et note aussi l'utilisation du "b" dans l'utilisation des données binaires et pas "B"

Hello

Bon j'ai de nouveau des petit pb
J'ai mi 10 74hc595 a la suite donc 80leds

Quant je met que 2 registres sa marche au poil en envoyant 2 serie de bits

Avec 3 registre si j'envoie 3 series de bit ... Les sortie du 3eme registre ne fonctionne pas sauf si je rajoute un delay apres le latch ......

Et avec 10 registre cela fait n'inporte quoi .... Pas les bonne sortie qui sont activer

Fait nous un petit schéma de ton câblage :wink:

Ps: as tu mis des condensateurs de découplage (100nF) entre chaque GND/VCC de chaque CI ?

Merci de la reponce rapide

J'ai suivi le shemat de cette pages avec le fil des data en cascade de registre en registre

Et non pas mi de condo .... Ont le voie jamais sur les schemat il sert a quoi ?

Pour faire simple le condensateur de découplage évite que le circuit sur lequel il est câblé ne perturbe un autre circuit proche de lui sur le montage lorsque qu'il fonctionne.
(oui je sait cette définition n'est pas du tout réglementaire :P)

Voici une exemple de montage "correct" :

80 leds ça commence à faire beaucoup de milliampères .
Chaque 595 peut débiter jusqu'à 70mA.
Une alimentation externe ne serait pas superflue !
En plus des conensateurs de découplage de 100 nano, un bon gros chimique de qq dizaines de µF en bout de ligne ne ferait pas de mal.

alienboats:
80 leds ça commence à faire beaucoup de milliampères .
Chaque 595 peut débiter jusqu'à 70mA.
Une alimentation externe ne serait pas superflue !

A 15mA par led (on va dire que c'est des leds classique) ça fait 1.2A ...
Donc une alimentation externe 5v régulé est obligatoire.

alienboats:
En plus des condensateurs de découplage de 100 nano, un bon gros chimique de qq dizaines de µF en bout de ligne ne ferait pas de mal.

+1 pour le condensateur de lissage de 10µF en fin de ligne.

Bonjour a tous

Bon mon probleme a disparue enfaite j'avait une sortie qui touchai un cable de bus
Tout fonctionne au top :slight_smile:

J'ai commander des condo pour le system

Sinon pour l'alim externe : si j'alimante mes led et registre via l'alim et mon arduino par le port usb avec juste une masse commune sa irai ?

Merci beaucoup de votre aide

SMarty:
Salut,

comme je te disais dans une réponse plus haut, shiftout() envoie un octet, soit 8 bits.
pour envoyer la donnée que tu mentionne il faut donc le faire en deux fois :

  • soit en divisant ta donnée en deux série de 8 bits
shiftOut(dataPin, clockPin, MSBFIRST, b00000000);

shiftOut(dataPin, clockPin, MSBFIRST, b00000001);




- soit en créant une variable pour ta donnée et en décalant les bits avant la deuxième salve :


int myData = b0000000000000001;
shiftOut(dataPin, clockPin, MSBFIRST, myData); // myData = b0000000000000001
myData = myData << 8;
shiftOut(dataPin, clockPin, MSBFIRST, myData); // myData = b0000000100000000




et note aussi l'utilisation du "b" dans l'utilisation des données binaires et pas "B"

Moi ça ne marche pas avec le "b" mais plutôt le "B".

Est ce que c'est possible d'utiliser un for afin d’éviter la répétition de plein de shiftout?

C'est pas b mais 0b qu'il faut utiliser.

Gilles8700:
Est ce que c'est possible d'utiliser un for afin d’éviter la répétition de plein de shiftout?

Plus vague tu meurs ... J'ai envie de répondre oui mais éviter quelle répétition ? Pour faire quoi ?

Gilles8700:
Moi ça ne marche pas avec le "b" mais plutôt le "B".

Et cela fonctionne aussi en employant la notation classique (c'est à dire non limité à l'univers Arduino) pour écrire un nombre en binaire
--> 0b10010010
C'est l'équivalent de 0xFA52 pour l'écriture en hexadécimal

Gilles8700:
Est ce que c'est possible d'utiliser un for afin d’éviter la répétition de plein de shiftout?

Oui et si modifier la fonction shiftout() ne te déranges pas, tu peux créer ta propre fonction, par exemple shiftout32(), pour transmettre 4 octets d'un coup et éviter ainsi la boucle "for".
C'est assez simple. Tu commence par récupérer le code de shiftout() [--> fichier wiring_shift.c dans l'IDE].

void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val)
{
	uint8_t i;

	for (i = 0; i < 8; i++)  {
		if (bitOrder == LSBFIRST)
			digitalWrite(dataPin, !!(val & (1 << i)));
		else	
			digitalWrite(dataPin, !!(val & (1 << (7 - i))));
			
		digitalWrite(clockPin, HIGH);
		digitalWrite(clockPin, LOW);		
	}
}

Tu t'en inspire pour écrire ta propre fonction en faisant les modifications suivantes :

  • Nom : différent de l'original. Bien que Skywodd dira qu'à partir du moment où la définition d'une variable change le compilateur se débrouillera tout seul pour choisir le bon code entre deux fonctions qui portent le même nom (j'ai retenu la leçon :grin: ) mais avec nos esprits moins aguerris je pense qu'il est plus simple de changer le nom.

  • changer "uint8_t val" en "uint32_t val"

  • changer la limite de "i" dans la boucle for--> " i < 8 " en " i < 32 "

  • et bien sûr dans ton programme définir sur 32 bits la variable contenant les datas : (uint32_t nom_de_la_variable )
    et lui donner la bonne valeur.

NB :tant qu'à modifier il est même possible d'adapter au fonctionnement du 74HC595 en incluant dans la fonction l'activation du latch en fin de ransmission.

Edit : je viens de vérifier sur le projet Wiring et ils ont déjà réalisé un shiftout() de longueur variable
fichier : Wshift.cpS

/* $Id: WShift.cpp 1156 2011-06-07 04:01:16Z bhagman $
|| @author         Hernando Barragan <b@wiring.org.co>
|| @url            http://wiring.org.co/
|| @contribution   Brett Hagman <bhagman@wiring.org.co>
|| @contribution   Alexander Brevig <abrevig@wiring.org.co>
|| @description
|| | Bit shifting methods.
|| | Wiring Common API
|| @license Please see cores/Common/License.txt.
*/
void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint16_t val, uint8_t count, uint8_t delayTime)
{
  int i;

  for (i = 0; i < count; ++i)
  {
    if (bitOrder == LSBFIRST)
      digitalWrite(dataPin, !!(val & (1 << i)));
    else
      digitalWrite(dataPin, !!(val & (1 << ((count - 1) - i))));

    digitalWrite(clockPin, HIGH);
    delayMicroseconds(delayTime);
    digitalWrite(clockPin, LOW);
    delayMicroseconds(delayTime);
  }
}

Il n'ont pas encore de version avec la gestion du Latch

B@tto:
C'est pas b mais 0b qu'il faut utiliser.

Plus vague tu meurs ... J'ai envie de répondre oui mais éviter quelle répétition ? Pour faire quoi ?

Lol bon voici mon code ,en faite je me suis inspirer sur l'exemple de SMarty et du grand livre d'Arduino

digitalWrite(storagePin, LOW);
  shiftOut(dataPin, shiftPin, MSBFIRST, seq10);
  digitalWrite(storagePin, HIGH);
  delay(delai1);
  
  digitalWrite(storagePin, LOW);
  shiftOut(dataPin, shiftPin, MSBFIRST, seq11);
  digitalWrite(storagePin, HIGH);
  delay(delai1);
  
  digitalWrite(storagePin, LOW);
  shiftOut(dataPin, shiftPin, MSBFIRST, seq12);
  digitalWrite(storagePin, HIGH);
  delay(delai1);
  
  digitalWrite(storagePin, LOW);
  shiftOut(dataPin, shiftPin, MSBFIRST, seq13);
  digitalWrite(storagePin, HIGH);
  delay(delai1);
  
  digitalWrite(storagePin, LOW);
  shiftOut(dataPin, shiftPin, MSBFIRST, seq14);
  digitalWrite(storagePin, HIGH);
  delay(delai1);
  
  digitalWrite(storagePin, LOW);
  shiftOut(dataPin, shiftPin, MSBFIRST, seq15);
  digitalWrite(storagePin, HIGH);
  delay(delai1);
  
  digitalWrite(storagePin, LOW);
  shiftOut(dataPin, shiftPin, MSBFIRST, seq16);
  digitalWrite(storagePin, HIGH);
  delay(delai1);
  
  digitalWrite(storagePin, LOW);
  shiftOut(dataPin, shiftPin, MSBFIRST, seq17);
  digitalWrite(storagePin, HIGH);
  delay(delai1);
  
  digitalWrite(storagePin, LOW);
  shiftOut(dataPin, shiftPin, MSBFIRST, seq18);
  digitalWrite(storagePin, HIGH);
  delay(delai2);
  
  digitalWrite(storagePin, LOW);
  shiftOut(dataPin, shiftPin, MSBFIRST, seq19);
  digitalWrite(storagePin, HIGH);
  delay(delai1);
  }

Je voulais savoir s'il était possible de le faire avec un tableau et une boucle for,pas seulement pour envoyé juste un bit,mais pour faire un chenillard,dû coup on aurai juste à modifier la séquence sur le tableau au lieu de déclaré autant de variable (byte seq10,seq11.....) est ce que c'est possible??

Mon but serai d'utiliser un inter DIL 8 INTERS DILS UNIPOLAIRES 8T - Holdelec - ElecDif-Pro pour modifier la séquence avec les combinaisons d'inters.

Par contre merci 68tjs pour l'explication,justement je cherchais cette fonction pour voir comment elle se fesait mais je ne savais pas ou la chercher,et pour les autres fonction (digitalWrite,delay,pinMode,.....) elles se trouvent où?

et pour les autres fonction (digitalWrite,delay,pinMode,.....) elles se trouvent où?

Pas compliqué : au même endroit. :grin:

Tu fouilles dans le répertoire de l'IDE et tu verras aussi plein d'autres choses intéressantes.
-> je ne précise pas plus car j'ai un IDE repaquagé par Linux Debian et si tu es sous win$ il peut y avoir des différences.
Les fichiers qui commence par wiring**** ou W***** sont à la base les fichiers de l'IDE original Wiring qui a été forké par Arduino.

Je ne l'ai jamais fait mais tu peux tout aussi bien utiliser l'un ou l'autre des deux IDE pour programmer une carte Arduino : les noms des fonctions sont les mêmes ainsi que les entrées/sorties même si le code Wiring des fonctions à évolué plus que celui d'Arduino , shiftout() en est un des nombreux exemples.

Ah oui pas mal j'ai même trouvé le bootloader,c'est intéressant,merci pour le renseignement. :slight_smile:

Donc si je modifie le shiftout() je l'enregistre dans un autre fichier.c ou j’écrase l'original?

Et c'est juste la fonction "void (shifOut)" que je modifie ou alors tout le fichier?

#include "wiring_private.h"

uint8_t shiftIn(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder) {
	uint8_t value = 0;
	uint8_t i;

	for (i = 0; i < 8; ++i) {
		digitalWrite(clockPin, HIGH);
		if (bitOrder == LSBFIRST)
			value |= digitalRead(dataPin) << i;
		else
			value |= digitalRead(dataPin) << (7 - i);
		digitalWrite(clockPin, LOW);
	}
	return value;
}

void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val)
{
	uint8_t i;

	for (i = 0; i < 8; i++)  {
		if (bitOrder == LSBFIRST)
			digitalWrite(dataPin, !!(val & (1 << i)));
		else	
			digitalWrite(dataPin, !!(val & (1 << (7 - i))));
			
		digitalWrite(clockPin, HIGH);
		digitalWrite(clockPin, LOW);		
	}
}

J'ai bien relus ton message précédent,mais je ne voit pas comment faire pour le système d'un chenillard
Par contre l'histoire d'envoyé 4 octets d'un coup,très intéressant!