Affichage avec Arduino et décodeur BCD

a marqué ce sujet comme résolu.

Tout d’abord bonjour à tous et merci pour ce forum où je viens de m’inscrire. Suis-je dans la bonne section ? Je ne sais mais je vous remercie de votre compréhension. J’ai fait un peu le tour de plusieurs sujets avant de soumettre le problème qui suit. J’essaie de réaliser le petit projet proposé avec le lien suivant : https://zestedesavoir.com/tutoriels/686/arduino-premiers-pas-en-informatique-embarquee/743_gestion-des-entrees-sorties/3424_afficheurs-7-segments/ J’utilise un Arduino UNO, un afficheur 7 segments 1 digit à cathode commune, 7 résistances 220 ohms et un décodeur CD4543BE. L’assemblage une fois réalisé et le code transféré sur l’Arduino, l’afficheur s’allume au complet (tous les segments), mais il s’éteint aussitôt. J’ai utilisé le premier code fourni et je l’ai modifié pour ne retenir que A, B, C, D pour tester le décodeur. Comme j’ai vérifié le montage physique, je pense que c’est un problème de code. Pourrais-je avoir un peu d’aide ? Je n’en suis qu’au début et je souhaite ensuite afficher un nombre sur 4 digits. Merci

[code]
[code]
// source : https://zestedesavoir.com/tutoriels/686/arduino-premiers-pas-en-informatique-embarquee/743_gestion-des-entrees-sorties/3424_afficheurs-7-segments/
// Test de découverte d'un afficheur à cathode commune avec un décodeur BCD MC14543B

// initialisation des broches de sortie vers le décodeur BCD
const int A = 8;
const int B = 9;
const int C = 10;
const int D = 11;


void setup()
{
    // définition des broches en sortie
    pinMode(A, OUTPUT);
    pinMode(B, OUTPUT);
    pinMode(C, OUTPUT);
    pinMode(D, OUTPUT);

    // mise à l'état HAUT de ces sorties pour éteindre les LED de l'afficheur
    digitalWrite(A, HIGH);
    digitalWrite(B, HIGH);
    digitalWrite(C, HIGH);
    digitalWrite(D, HIGH);

}

void loop()
{
    // allumage des segments selon la table de vérité du décodeur BCD 14543B
    digitalWrite(A, LOW);
    digitalWrite(B, HIGH);
    digitalWrite(C, LOW);
    digitalWrite(D, HIGH);

}
[/code]
+0 -0

Bonjour Romantik et merci de ton message, Le schéma que j’ai monté est celui ci-joint, mais avec un seul digit et sans transistor. C’était un premier essai. Après avoir terminé le montage, j’ai téléversé le code. A la fin du téléversement les 7 segments se sont allumés puis éteints au bout de quelques secondes. Ensuite j’ai alimenté le montage avec une autre source en 5 volts, donc sans branchement sur le PC, même résultat.

image.png
image.png
+0 -0

Peux tu plutôt dessiner le schéma de ce que tu as réellement fait ? Car si tu n’as pas les transistors, qu’est-ce que tu as fait ? Dans ce montage, ils sont justement là pour couper l’affichage sur commande.

Par ailleurs, sur ce montage, l’entier à afficher semble être sur les pins 2, 3, 4 et 5. Or ton code les décrit sur 8, 9, 10 et 11. La correction du code serait alors de corriger les valeurs de A, B, C et D par 2, 3, 4 et 5.

+0 -0

Ok, j’avais espéré que ce soit juste une erreur de numero de pin

En supposant que le renvoi GND renvoi au GND de la carte arduino, je vois quand m 3 erreurs dans ton schéma :

  • La cathode commune de l’afficheur 7 segments doit être branché au +5V, sinon ça peut pas marcher, les LEDs sont branché à l’envers.
  • la pin 6, la phase, du décodeur doit être à +5V
  • la pin 8, Vss, du décodeur doit être sur GND (j’ai l’impression que le lien est raturé sur ton dessin)

En fait la LED de l’afficheur reçoit son alimentation de la cathode commune et continue son circuit sur la broche de led, c’est pour ça que tu vas piloter la led en mettant ta sortie à 0, en faisant ainsi tu fermes le circuit et la LED s’allume.
La phase du décodeur va te permettre de lui indiquer s’il doit piloter les sorties avec un 0 ou avec un 1, ça va inverser la réaction des sorties par rapport aux entrées en gros.
Le Vss est simplement la tension correspondant au niveau logique 0.

+0 -0

Bonjour Romantik C’est toujours un peu difficile de contredire quelqu’un qui cherche à nous aider, mais je vais quand même me le permettre. En effet, si j’ai branché l’afficheur avec cathode commune aux 5 volts, c’est après avoir fait un essai en direct. J’ai branché l’un après l’autre chaque segment muni de sa résistance au GND de l’Arduino, le point commun étant branché sur le 5 V et rien ne se passait. J’ai donc inversé et ça fonctionnait. J’en ai déduit qu’il fallait continuer comme ça. Pour la broche 6 du décodeur, elle est bien au GND selon les indications de la datasheet.

image.png
image.png

Pour la broche 8, elle est bien reliée au GND.

J’ai commandé d’autres afficheurs et un Arduino neuf car je me dis que c’est peut-être un problème matériel si le code est bon et le montage aussi. Merci de tes remarques

+0 -0

D’accord, alors il y a des chances que tu te sois procuré un afficheur en anode commune au lieu de cathode commune. Quelle est la référence de l’afficheur ? Où l’as tu acheté ?
Dans ce cas, je suis d’accord que la pin 6 doit être à GND. Dans la datasheet, ce sont des montages typiques, à titre d’exemple, donc s’il mets en oeuvre un afficheur en anode commune, la pin 6 sera effectivement à GND dans la datasheet.

Pardon, j’avais pas remarqué parce que le code n’est pas faux en soit, sauf les commentaires, mais je viens de capter que tu essaies d’écrire 1010 soit 10, or le décodeur veut traduire un chiffre 0–9, donc j’ai regardé la datasheet voir ce qu’il faisait et d’après la doc, quand le nombre est supérieur à 9, il n’affiche rien, ce qui pourrait donc expliquer pourquoi tout s’éteint. Quant à pourquoi tout s’allume pendant une seconde, ça peut être juste le temps du transfert, où les états ne sont pas bien défini, je sais pas vraiment. Mais du coup en correction je suggère d’inverser les états dans le loop pour écrire 0101 soit 5 et conserver l’alternance d’état qui peut être utile pour debug.

void loop()
{
    // Afficher 5
    digitalWrite(A, HIGH);
    digitalWrite(B, LOW);
    digitalWrite(C, HIGH);
    digitalWrite(D, LOW);
}
+0 -0

Les afficheurs dont je dispose viennent de chez Gotronic. Ils sont référencés SMA42056 ou 5161AS. J’ai eu aussi un 5161BS. Je crois que je fais une confusion en ce qui concerne les états Haut et BAS. Je pars du principe que 0 = BAS donc = nul, soit 0 v ou négatif alors que 1 = HAUT = positif, soit 5 v. Est-ce exact ? N’ayant installé qu’un afficheur (1 digit), je cherche à écrire un seul chiffre pour l’instant, mais surtout à comprendre comment ça fonctionne.

Bon je suis un gros tocard, je suis vraiment désolé, je "fais la leçon" en confondant la seule chose qu’il ne faut pas confondre, la cathode est bien à connecter au GND et l’anode au +5V, et le cours l’explique bien en plus.

Direct de wikipedia :

Donc c’est bien des afficheur à cathode commune et tu les as bien branché.


Oui c’est exact, le niveau logique BAS représente un bit à 0, c’est la tension la moins élevée (elle pourrait aussi être positive), ici sur l’arduino c’est 0V, et le niveau logique HAUT représente un bit à 1, c’est la tension la plus élevée (de même elle pourrait être négative, ce sont un peu des conventions), ici sur l’arduino 5V.

Donc quand tu écris digitalWrite(A, HIGH);, l’arduino impose une tension 5V sur la broche 8 ( et digitalWrite(A, LOW); impose une tension 0V sur cette même broche). Ensuite le décodeur reçoit ces tensions sur ses entrées, et son rôle c’est de les considérer comme un entier encodé sur 4 bits, avec D pour bit de poids fort et A bit de poids faible, et piloter les segments de l’afficheur pour afficher cet entier.

+0 -0

Cool si ça t’aide. Tu pourras confirmer si c’était bien simplement la valeur communiquée qui posait problème et que tu arrives bien à afficher 5 ?
Je parlais du cours que tu as lié : https://zestedesavoir.com/tutoriels/686/arduino-premiers-pas-en-informatique-embarquee/743_gestion-des-entrees-sorties/3424_afficheurs-7-segments/#cathode-commune-ou-anode-commune

+0 -0

OK pour le lien du cours, je n’avais pas perçu à quel point c’était complet. Je vais y retourner. Je viens de tout refaire le montage. J’avais une interversion sur l’afficheur entre les segments f et g. Tous les chiffres s’affichent maintenant correctement. Par contre, entre les téléversements ou pendant une seconde environ si j’appuie sur l’interrupteur qui se trouve sur la plaquette de l’Arduino, les segments s’allument mais faiblement. Il doit manquer un composant quelque part dans mon mmontage.

Je ne sais pas de quel interrupteur il s’agit mais je pense que ce que tu décrit n’est pas inquietant. Pendant le televersement, l’arduino se déconfigure surement dans une position de haute impédance et donc ton circuit n’est pas correctement configuré jusqu’à ce qu’il aie reçu le programme et exécuté le setup() qui va lui reconfigurer les broches en sorties.

+0 -0

Parfait, j’en reste là et je te remercie de cet échange constructif. Je vais essayer maintenant de passer à un afficheur à 4 digits. Je ne sais pas si je dois rester sur ce fil ou en créer un autre. J’ai réalisé un petit montage sur plaque à trous pour m’aider à comprendre et un tableau pour les tables de vérité. Je joins au cas où cela pourrait intéresser quelqu’un. Encore un grand merci… L’aventure continue. Table de vérité d’un décodeur BCD Table de vérité d’un afficheur 7S broches C B D A segments a b c d e f g caractères codage 0 0 0 0 codage 1 1 1 1 1 1 0 0 0 0 0 1 0 1 1 0 0 0 0 1 0 1 0 0 1 1 0 1 1 0 1 2 0 1 0 1 1 1 1 1 0 0 1 3 1 0 0 0 0 1 1 0 0 1 1 4 1 0 0 1 1 0 1 1 0 1 1 5 1 1 0 0 1 0 1 1 1 1 1 6 1 1 0 1 1 1 1 0 0 0 0 7 0 0 1 0 1 1 1 1 1 1 1 8 0 0 1 1 1 1 1 1 0 1 1 9

				Source : datasheet du décodeur CD4543B								
												

IMG_4520.JPG

Je pense que tu pourras ouvrir un autre sujet, les problématiques seront différentes.
Pour faire des retours à la ligne, des tableaux, des extraits de code etc… ce forum suit la syntaxe markdown. Pour connaitre l’essentiel, tu peux suivre le lien qui est normalement sous la zone d’édition de message : https://zestedesavoir.com/tutoriels/221/rediger-sur-zds/

Pour ton tableau de vérité je te conseille d’aligner DCBA plutôt que CBDA. ça apparaitra beaucoup plus clairement qu’il s’agit d’un entier sur 4 bits.

+0 -0

Tu écris : "Pour ton tableau de vérité je te conseille d’aligner DCBA plutôt que CBDA. ça apparaitra beaucoup plus clairement qu’il s’agit d’un entier sur 4 bits."

Peux-tu m’expliquer pourquoi l’ordre des lettres change quelque chose ? Cela m’a semblé plus simple de reprendre l’ordre dans lequel elles se trouvent dans la datasheet du composant.

En fait chacune de ces entrées représente 1 bit et ces 4 bits forment l’entier à afficher. Le format pour encoder un entier c’est de multiplier chaque bit par une puissance de 2, ici on multiplie D par 8, C par 4, B par 2 et A par 1 puis on fait la somme de tout ça.
Ainsi quelqu’un sachant compter en binaire devrait s’apercevoir d’un coup d’œil qu’il s’agit simplement d’un entier sur 4 bits à qui s’incrémente à chaque ligne.

D C B A entier sur 4 bits D23+C22+B21+A20D\cdot2^3+C\cdot2^2+B\cdot2^1+A\cdot2^0 chiffre affiché
0 0 0 0 023+022+021+020=00\cdot2^3+0\cdot2^2+0\cdot2^1+0\cdot2^0 = 0 0
0 0 0 1 023+022+021+120=10\cdot2^3+0\cdot2^2+0\cdot2^1+1\cdot2^0 = 1 1
0 0 1 0 023+022+121+020=20\cdot2^3+0\cdot2^2+1\cdot2^1+0\cdot2^0 = 2 2
0 0 1 1 023+022+121+120=2+1=30\cdot2^3+0\cdot2^2+1\cdot2^1+1\cdot2^0 = 2 + 1 = 3 3
0 1 0 0 023+122+021+020=40\cdot2^3+1\cdot2^2+0\cdot2^1+0\cdot2^0 = 4 4
0 1 0 1 023+122+021+120=4+1=50\cdot2^3+1\cdot2^2+0\cdot2^1+1\cdot2^0 = 4 + 1 = 5 5
0 1 1 0 023+122+121+020=4+2=60\cdot2^3+1\cdot2^2+1\cdot2^1+0\cdot2^0 = 4 + 2 = 6 6
0 1 1 1 023+122+121+120=4+2+1=70\cdot2^3+1\cdot2^2+1\cdot2^1+1\cdot2^0 = 4 + 2 + 1 = 7 7
1 0 0 0 123+022+021+020=81\cdot2^3+0\cdot2^2+0\cdot2^1+0\cdot2^0 = 8 8
1 0 0 1 123+022+021+120=8+1=91\cdot2^3+0\cdot2^2+0\cdot2^1+1\cdot2^0 = 8 + 1 = 9 9
1 0 1 0 123+022+121+020=8+2=101\cdot2^3+0\cdot2^2+1\cdot2^1+0\cdot2^0 = 8 + 2 = 10 rien
1 0 1 1 123+022+121+120=8+2+1=111\cdot2^3+0\cdot2^2+1\cdot2^1+1\cdot2^0 = 8 + 2 + 1 = 11 rien
1 1 0 0 123+122+021+020=8+4=121\cdot2^3+1\cdot2^2+0\cdot2^1+0\cdot2^0 = 8 + 4 = 12 rien
1 1 0 1 123+122+021+120=8+4+1=131\cdot2^3+1\cdot2^2+0\cdot2^1+1\cdot2^0 = 8 + 4 + 1 = 13 rien
1 1 1 0 123+122+121+020=8+4+2=141\cdot2^3+1\cdot2^2+1\cdot2^1+0\cdot2^0 = 8 + 4 + 2 = 14 rien
1 1 1 1 123+122+121+120=8+4+2+1=151\cdot2^3+1\cdot2^2+1\cdot2^1+1\cdot2^0 = 8 + 4 + 2 + 1 = 15 rien

EDIT : Je ne sais pas à quelle datasheet tu fais référence, mais celle sur laquelle je suis tombé présente la table dans l’ordre que je te recommande : https://html.alldatasheet.com/html-pdf/26916/TI/CD4543BE/130/5/CD4543BE.html

+0 -0

" Cela m’a semblé plus simple de reprendre l’ordre dans lequel elles se trouvent dans la datasheet du composant. " Je voulais dire l’ordre des broches sur le composant. J’ai d’ailleurs remarqué que cet ordre n’est pas toujours le même. Merci pour ce tableau très explicite, même si mes souvenirs de mathématiques sont bien anciens…

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte