Après avoir lu le cours sur Arduino je me suis lancer dans le montage d'un cube 3x3x3.
Toute les anodes sont reliées par colonne et les cathodes par étages. J'utilise deux 74Hc595 en série pour disposé de 9 + 3 sorties, les 3 sorties sont reliées a des transistors pour décidé de l'étage à allumer.
Jusque là je n'est pas eu de problèmes, j'ai crée une fonction affichagePixel(x,y,z); me permettant d'afficher un pixel voulus à la fois pour utilisé la persistance rétinienne et évité de surconsommé.
Quand il y as un délais > 5ms l'éclairement des led est optimum, seulement cette fréquence est insuffisante pour avoir l'illusion que toutes sont allumées en même temps. J'ai donc essayer de supprimer tout bonnement le delay et c'est là que ça coince... Toutes les leds s'allument bel et bien en même temps pour l'oeil cependant leurs brillance chute drastiquement...
Je ne comprend pas ce phénomène car malgré que la fréquence sois élevé , physiquement une seule led consomme du courant à la fois non?
J'ai donc fait quelques recherches et le problème viendrais apparemment du fait que je n'utilise pas de condensateur, j'aimerais votre avis sur la question et connaitre aussi la raison de ce comportement? Serait-il du a des déperdissions d’énergie du à la haute fréquence?
Je vous remercie et je vous donne aussi des photos (désolé si le montage est un peu fouillis :() et le code !
int SER_Pin = 8; //pin 14 on the 75HC595
int RCLK_Pin = 9; //pin 12 on the 75HC595
int SRCLK_Pin = 10; //pin 11 on the 75HC595
//How many of the shift registers - change this
#define number_of_74hc595s 2
//do not touch
#define numOfRegisterPins number_of_74hc595s * 8
boolean registers[numOfRegisterPins];
void setup(){
pinMode(SER_Pin, OUTPUT);
pinMode(RCLK_Pin, OUTPUT);
pinMode(SRCLK_Pin, OUTPUT);
//reset all register pins
clearRegisters();
writeRegisters();
}
//set all register pins to LOW
void clearRegisters(){
for(int i = numOfRegisterPins - 1; i >= 0; i--){
registers[i] = LOW;
}
}
//Set and display registers
//Only call AFTER all values are set how you would like (slow otherwise)
void writeRegisters(){
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);
}
//set an individual pin HIGH or LOW
void setRegisterPin(int index, int value){
registers[index] = value;
}
void loop(){
for(int k=0; k<3; k++)
{
for(int j=0; j<3; j++)
{
for(int i=0; i<3; i++)
{
affichagePixel(i,j,k);
delay(100);
}
}
}
}
void affichagePixel(int x, int y, int z)
{
if(z == 0)
{
setRegisterPin(9, HIGH);
setRegisterPin(10, LOW);
setRegisterPin(11, LOW);
}
else if(z == 1)
{
setRegisterPin(9, LOW);
setRegisterPin(10, HIGH);
setRegisterPin(11, LOW);
}
else if(z ==2)
{
setRegisterPin(9, LOW);
setRegisterPin(10, LOW);
setRegisterPin(11, HIGH);
}
if((x==0) & (y==0))
{
setRegisterPin(0, HIGH);
setRegisterPin(1, LOW);
setRegisterPin(2, LOW);
setRegisterPin(3, LOW);
setRegisterPin(4, LOW);
setRegisterPin(5, LOW);
setRegisterPin(6, LOW);
setRegisterPin(7, LOW);
setRegisterPin(8, LOW);
}
else if((x==1) & (y==0))
{
setRegisterPin(0, LOW);
setRegisterPin(1, HIGH);
setRegisterPin(2, LOW);
setRegisterPin(3, LOW);
setRegisterPin(4, LOW);
setRegisterPin(5, LOW);
setRegisterPin(6, LOW);
setRegisterPin(7, LOW);
setRegisterPin(8, LOW);
}
else if((x==2) & (y==0))
{
setRegisterPin(0, LOW);
setRegisterPin(1, LOW);
setRegisterPin(2, HIGH);
setRegisterPin(3, LOW);
setRegisterPin(4, LOW);
setRegisterPin(5, LOW);
setRegisterPin(6, LOW);
setRegisterPin(7, LOW);
setRegisterPin(8, LOW);
}
else if((x==0) & (y==1))
{
setRegisterPin(0, LOW);
setRegisterPin(1, LOW);
setRegisterPin(2, LOW);
setRegisterPin(3, HIGH);
setRegisterPin(4, LOW);
setRegisterPin(5, LOW);
setRegisterPin(6, LOW);
setRegisterPin(7, LOW);
setRegisterPin(8, LOW);
}
else if((x==1) & (y==1))
{
setRegisterPin(0, LOW);
setRegisterPin(1, LOW);
setRegisterPin(2, LOW);
setRegisterPin(3, LOW);
setRegisterPin(4, HIGH);
setRegisterPin(5, LOW);
setRegisterPin(6, LOW);
setRegisterPin(7, LOW);
setRegisterPin(8, LOW);
}
else if((x==2) & (y==1))
{
setRegisterPin(0, LOW);
setRegisterPin(1, LOW);
setRegisterPin(2, LOW);
setRegisterPin(3, LOW);
setRegisterPin(4, LOW);
setRegisterPin(5, HIGH);
setRegisterPin(6, LOW);
setRegisterPin(7, LOW);
setRegisterPin(8, LOW);
}
else if((x==0) & (y==2))
{
setRegisterPin(0, LOW);
setRegisterPin(1, LOW);
setRegisterPin(2, LOW);
setRegisterPin(3, LOW);
setRegisterPin(4, LOW);
setRegisterPin(5, LOW);
setRegisterPin(6, HIGH);
setRegisterPin(7, LOW);
setRegisterPin(8, LOW);
}
else if((x==1) & (y==2))
{
setRegisterPin(0, LOW);
setRegisterPin(1, LOW);
setRegisterPin(2, LOW);
setRegisterPin(3, LOW);
setRegisterPin(4, LOW);
setRegisterPin(5, LOW);
setRegisterPin(6, LOW);
setRegisterPin(7, HIGH);
setRegisterPin(8, LOW);
}
else if((x==2) & (y==2))
{
setRegisterPin(0, LOW);
setRegisterPin(1, LOW);
setRegisterPin(2, LOW);
setRegisterPin(3, LOW);
setRegisterPin(4, LOW);
setRegisterPin(5, LOW);
setRegisterPin(6, LOW);
setRegisterPin(7, LOW);
setRegisterPin(8, HIGH);
}
writeRegisters(); //MUST BE CALLED TO DISPLAY CHANGES
//Only call once after the values are set how you need.
}
Encore merci de l'attention que vous porterez à mon soucis de débutant !
- Edité par CactusTribe 12 octobre 2013 à 14:56:21
J'ai pas regardé le code mais voici quand même quelques pistes :
Mais un condensateur de découplage sur tes 74HC595 au près de ses bornes d'alimentation. Un 100nF plastique fera l'affaire pour commencer
Peut-être que ta fréquence est vraiment trop élevée. Du coup ta LED s'allume et s'éteint aussitôt, ce qui fait que tu as l'impression qu'elle ne s'allume pratiquement pas (persistence retinienne oblige, si tu es plus éteint que allumé tu as l'impression que l'éclairage est plus faible)
Merci de ta réponse ! Donc je place un condo de l'alim du 595 à la masse? J'ai essayer avec des 10nF et 10uF évidement je n'ai pas la valeur qu'il faut.. Je vais essayer d'en trouver 2 et essayer ça !
Pour la fréquence je ne saurais dire, car j'ai tout simplement enlever le delay ce qui veux dire que c'est la fréquence à la quelle la fonction "loop" fait un tour et je ne sais pas à quoi correspond elle ? La fréquence de l'arduino, 16Mhz?
Sinon est-il possible de fractionné les valeurs que l'ont met dans delay() ? Du genre delay(0.001) histoire d'aller plus vite qu'une milliseconde mais pas trop non plus ?
Bon j'ai essayé avec des 100nF mais toujours pas de changement...
Je les places peut-être pas comme il faut?
Sa me parait vraiment bizzard qu'il n'y est pas de solutions pour ce soucis, car réduire le temps ne m'arrange pas car du coup plus possibilité d'utilisé la persistance rétinienne pour afficher toute les leds...
Sachant que j'ai trouvé ça dans mes recherches : le mec arrive bien à tout allumer avec une intensité lumineuse au top une trentaine de leds malgrès l'alim USB...
- Edité par CactusTribe 12 octobre 2013 à 18:08:08
Ouais, et aucun changements, j'ai essayer aussi d'enlever une résistance sur une des colonnes de leds, et cette colonne éclairais plus fort, mais je comprend pas pourquoi? La fréquence ne devrais pas jouer la dessus non?
eskimon me corrigera surement si je dis une connerie, je vais émettre une HYPOTHESE: il y a un effet capacitif sur les diodes. il y a un "temps de montée" qui peut être vu comme un effet capacitif, et les résistances auraient tendance à allonger les durées de ces effets (augmenter l'impédance de la branche et donc diminuer le courant, et donc diminuer l'afflux d'énergie à la montée).
du coup peut-être que le temps que l'arduino laisse la led allumée est trop court. résultat, essaie de rajouter un délai, uniquement sur le temps "allumé".
je te mets un lien d'un mec qui a fait un cube 8x8x8 et qui poste son programme, on voit qu'il a mis une opération d'attente (il l'a appelée aspetta, comme il est italien,ça colle... et il y accorde 70 000 cycles d'horloge dans la "boucle du milieu". le probleme c'est que je sais pas quelle est son horloge... et comme il a écrit son programme en Visual Basic, ça aide pas.)
C'est vrai que j'avais pas pensé au transitoire de la LED (ah c'est beau de vivre dans le monde merveilleux des modèles théoriques parfait), et du coup ca colle sur le phénomène je pense...
Du coup je réitère, as tu essayé de mettre un delay de quelques microsecondes et de jouer avec en l'augmentant/diminuant pour voir les conséquences ?
Remace : "il y a un effet capacitif sur les diodes. il y a un "temps de montée" qui peut être vu comme un effet capacitif, et les résistances auraient tendance à allonger les durées de ces effets (augmenter l'impédance de la branche et donc diminuer le courant, et donc diminuer l'afflux d'énergie à la montée)."
J'ai bien le sentiment que c'est ce qui se passe vu que si j'enlève les résistances sur les colonnes de leds, à fréquence égale elles éclaires plus forts, ce qui m'amène à pensé qu'il fraudais compensé cette perte avec un condo?
Et pour le delay() sur l'allumage de la led, celà ne change rien (j'ai essayer quand même :p), car si la led est allumée 1sec forcément la boucle ne peut pas allumer celle d'après avant les 1sec, donc que ce sois l'allumage de la led qui dure 1sec ou le changement de led ne change rien.
Eskimon :Oui j'ai essayer, au dessus de 5ms elles retrouves bel et bien la brillance de base, sauf que adieux la persistance rétinienne, en dessous de 5ms, quelque sois le temps de pause même avec 500uS la brillance reste très basse.
Remace : "il y a un effet capacitif sur les diodes. il y a un "temps de montée" qui peut être vu comme un effet capacitif, et les résistances auraient tendance à allonger les durées de ces effets (augmenter l'impédance de la branche et donc diminuer le courant, et donc diminuer l'afflux d'énergie à la montée)."
J'ai bien le sentiment que c'est ce qui se passe vu que si j'enlève les résistances sur les colonnes de leds, à fréquence égale elles éclaires plus forts, ce qui m'amène à pensé qu'il fraudais compensé cette perte avec un condo?
non. (enfin selon moi, eskimon me corrigera encore si je me trompe) ajouter un condensateur reviendrait à ajouter un effet capacitif à un circuit qui retarde déjà, ça ralentirait encore ton systeme
CactusTribe a écrit:
Et pour le delay() sur l'allumage de la led, celà ne change rien (j'ai essayer quand même :p), car si la led est allumée 1sec forcément la boucle ne peut pas allumer celle d'après avant les 1sec, donc que ce sois l'allumage de la led qui dure 1sec ou le changement de led ne change rien.
ha. est-ce que tu as la doc de tes leds?
et est-ce que tu as essayé avec la fonction que t'a donné eskimon, qui permet d'avoir des subdivisions de delay() en microsecondes
Elles ont besoin de 10mA, sachant que j'ai mis des résistances de 220 Ohms, je devrais donc simplement retiré toute les résistances? En faisant ça j'ai un peu peur de leurs réactions quand à l'inverse peu de leds serons allumées....
J'ai également fait un autre test en modifiant la boucle d'affichage :
Le but est d'allumé un étage à la fois avec un delay entre chaque, sauf que voilà le comportement est très étrange et vous aideras peut-être pour trouver une piste
non il ne faut pas retirer tes résistances, c'est un coup à griller des composants. (court circuit entre la tension d'alim et la masse, c'est en général pas cool comme solution, même à relativement court terme)
sinon si tu veux gagner du temps d'allumage, pour faire des pauses plus courtes, tu peux essayer de faire un code "plus intelligent" (une boucle while avec une quantité aussi importante de "else if" c'est pas très beau. je sais pas comment arduino le compile ce code mais ça m'étonnerait pas qu'il fasse un programme beaucoup plus lent d'exécution que le même avec un switch-case unique. (là encore eskimon en sait plus que moi, arduino je connais pas trop moi.)
je ne vois pas de transistor dans ton montage (à part ceux du shift register, mais ça a pas l'air d'être des transistors "de puissance" mais plutôt des transistors "de signal") dans le lien que je t'ai envoyé (le cube 8x8x8 de l'italien) il utilise un transistor pour chaque étage du cube (layer...), ce qui permet d'alimenter directement tes diodes depuis l'alim, et pas au travers de la sortie de ton shift register. il se peut que ce genre d'idée solutionne ton problème. (à adapter bien sûr à ton montage à toi)
EDIT: ton code de test fonctionne et fait exactement ce que tu lui demande. je m'explique: tu balaye une fois tout l'étage, et ensuite tu laisse allumé la led en cours pendant 500ms avant de changer d'étage. je pense que ce n'est pas ça que tu voulais faire
sinon si tu veux gagner du temps d'allumage, pour faire des pauses plus courtes, tu peux essayer de faire un code "plus intelligent" (une boucle while avec une quantité aussi importante de "else if" c'est pas très beau. je sais pas comment arduino le compile ce code mais ça m'étonnerait pas qu'il fasse un programme beaucoup plus lent d'exécution que le même avec un switch-case unique. (là encore eskimon en sait plus que moi, arduino je connais pas trop moi.)
Je suis pas non plus spécialiste optimisation low-level (mais oui, préconiser des structures comme le switch est une bonne idée).
Pour le code je vais essayer de réfléchir à une autre méthode, pour les transistors les 3 que j'ai mis contrôles justement les étages du cube. Je doit quand même pas en mettre un par colonne de leds? Car les anodes composent les colonnes, et les cathodes les layers, donc si je veux alimenté les leds sans passé par le shift je doit placer 9 transistors suplémentaire? C'est quand même étrange...car dans une de mes réponses plus haut j'ai mis une photo d'un mec qui arrive bien à alimenté 32Led avec 4x 74hc595 directement...
Bah l'hypothèse de l'effet capacitif de la LED reste toujours en suspens....
J'ai du mal à comprendre pourquoi une pause en microsecondes à pas vraiment d'effet
Pour le code je vais essayer de réfléchir à une autre méthode, pour les transistors les 3 que j'ai mis contrôles justement les étages du cube. Je doit quand même pas en mettre un par colonne de leds? Car les anodes composent les colonnes, et les cathodes les layers, donc si je veux alimenté les leds sans passé par le shift je doit placer 9 transistors suplémentaire? C'est quand même étrange...car dans une de mes réponses plus haut j'ai mis une photo d'un mec qui arrive bien à alimenté 32Led avec 4x 74hc595 directement...
ha pardon je les avais pas vu les transistors des étages, mille excuses.
en revanche ton code de test ou tu voulais allumer un étage après l'autre, essaye ça, ça marchera (sauf si a sert en variable globale ailleurs, mais dans ce cas il suffit par remplacer a par un nom de variable inutilisé)
Je suis pas non plus spécialiste optimisation low-level (mais oui, préconiser des structures comme le switch est une bonne idée).
oui, mais toi tu as rédigé un tuto sur arduino, moi j'ai jamais ne serait-ce que vu une vraie carte arduino ailleurs que sur internet. du coup, je pars du principe que tu y connais mieux que moi, normal
Ah oui exacte pour le code, je sais pas pourquoi j'ai omis ce détails !
Sa marche, mais le problème de luminosité persiste x) Quelle est la solutions la plus simple pour diminué ou contourner la perte d’énergie du coup?
Déjà je pourrais remplacer les résistance de 220 par des 100 sans prendre trop de risques. Et je me dit aussi que ce sont des leds éco, et de nature elles éclaires pas très fort, donc avec des leds plus lumineuse cette baisse d'intensité serais moins visible. Par contre si je rencontre une baisse visible déjà avec 27led, moi qui comptais reproduire ce shéma avec un cube 8x8 c'est carrément exclus si je comprend bien?
Eskimon : nan avec le delay dans j le comportement est différent, tout s'allume d'un coup sauf que toute les coordonnées x = 2 s'allument légèrement plus oO.. Je deviens fou avec cette histoire
- Edité par CactusTribe 13 octobre 2013 à 17:23:29
Oui tout a fait... le delay doit bien être après la fonction d'affichage
D'ailleurs voici un cadeau, gros refactoring de ta boucle pour l'affichage d'une LED (moins de 10 lignes contre plus de 140 pour toi ) :
void affichagePixel(int x, int y, int z)
{
clearRegisters(); //on commence par mettre tout le monde à 0
setRegisterPin(9 + z, HIGH); //le choix de la couche
setRegisterPin(x+y*3, HIGH); //la led à allumer
writeRegisters(); //met à jour les registres à décalages
@eskimon: oui, mais j'avais pas envie d'aller regarder ton tuto pour savoir comment générer une interruption sur un timer, petit côté ras le bol de mettre des delay partout (les collegues en école d'ingé qui juraient que par ça, moi ça me filait des boutons). et non là c'était pas au mauvais endroit, c'était pour bine différencier les étages d'une seconde à l'autre.
pis tant qu'à faire un code de test, autant qu'il soit moche, comme ça ça donne de quoi dire aux autres.
par contre, doucement les simplifications, le setregisterpin(x+y*3, high) là c'est pas trivial pour tout le monde hein (tout le monde ne compte pas en base 3 non plus^^)
Ah oui effectivement merci ! J'ai pas encore les bon reflex à ce niveau, ça me permet d'apprendre je te remercie !
J'ai essayer sur une colonne de passé par un transistor pour l'alim, et effectivement plus lumineuse, le changement d'états du shift doit bien consommer, mais du coup pas très pratique de devoir mettre autant de transistors...
- Edité par CactusTribe 13 octobre 2013 à 17:43:28
Perso j'aime pas les delays(), c'est bloquant et donc ca me donne des boutons mais c'est bien pratique quand ton programme est monotâche (mais sinon je plussoie les timers, quand j'étais à l'école Arduino existait pas, on codais en tapant dans des registres pour tout paramétrer )
Et comme le tuto est axé débutant, on ne parle pas interruptions sur timer (on évoque juste les interruptions externe).
Pas le temps de rentrer en profondeur dans tout et de quand même couvrir plein de thêmes différents comme les LCD, les moteurs etc...
découpler c'est "rendre indépendant électriquement" en pratique dans ton cas, c'est "mettre des transistors partout où tu sors d'un circuit TTL (comme tes 74hc595)" pour éviter les problemes de résistances internes de sortie et autre. (enfin c'est un peu plus compliqué que ça, on peut découpler avec plein d'autres méthodes suivant ce qu'on veut découpler mais... c'est long à expliquer)
à tout hasard, as-tu fait une alimentation séparée pour l'arduino et le circuit "led + shift register"? parce que je vois pas de régulateur ni d'alimentation de labo ni de pile, ni rien (ceci dit je vois rien moi...), et ça m'étonnerait pas que les sorties de l'arduino aient du mal à alimenter le reste du circuit^^.
à moins que son alimentation soit totalement insuffisante. il faudrait mesurer le courant dans "l'alim côté puissance" (alors là pour être honnête, sur les photos spaghettis, je suis incapable de te dire mieux où peut-être dans le fil rouge qui part de l'arduino pour aller dans la colonne rouge de la plaque d'essais).
avant de t'acheter une boite de 100 transistors pour le 8x8x8 (d'accord, 72 suffiraient, on est d'accord, mais c'est pour l'idée). essaie de faire un bloc d'alimentation (même pas propre, genre l'équivalent de 5V ou plus de piles en série) pour faire une alimentation "led + shift register indépendante de l'arduino, si tu sens que ça te va pas comme modèle, tu peux ajouter un régulateur 7805, 2 capacités, et 2 résistances, à utiliser selon le modèle qu'il y a dans la documentation. t'en as pour moins de 5€, le plus cher étant les piles...)
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !
oui. non. enfin je regarde et je te dis.
Retrouvez moi sur mon blog et ma chaine Youtube !
oui. non. enfin je regarde et je te dis.
oui. non. enfin je regarde et je te dis.
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !
oui. non. enfin je regarde et je te dis.
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !
oui. non. enfin je regarde et je te dis.
Retrouvez moi sur mon blog et ma chaine Youtube !
oui. non. enfin je regarde et je te dis.
Retrouvez moi sur mon blog et ma chaine Youtube !