Codage C++ pour interfacage Arduino entre compteur binaire et TM1638

Bonjour à tous,

Je suis novice en matière de programmation C++ Arduino et j’ai un problème…

J’ai fais un montage sur « Breadboard » avec un NE555 en mode astable (impulsions à une seconde environ) et 4 « bascules D Edge-Trigered Flip-Flop » qui constituent un compteur binaire 4 bits : (2)0 (2)1 (2)2 (2)3 qui compte de 0 à 15 par le biais de LED’s qui s’allument en séquence. À gauche la LED de Bit de poids (2)0 faible et à droite la LED de Bit de poids fort (2)3 (voir photo jointe).

J’ai branché les quatre sorties de bascules D (CD4013):

  • (2)0 sur l’entrée digitale 1 de l’Arduino ;
  • (2)1 sur l’entrée digitale 2 de l’Arduino ;
  • (2)2 sur l’entrée digitale 3 de l’Arduino ;
  • (2)3 sur l’entrée digitale 4 de l’Arduino .

Et les entrées du TM1638 sur :

  • VCC / GND sur le 5V et le GND de l’Arduino ;
  • l’entrée STB sur la broche 10 de l’Arduino ;
  • l’entrée CLK sur la broche 9 de l’Arduino ;
  • l’entrée DIO sur la broche 8 de l’Arduino.

À ce stade, mon problème est le suivant, comment coder l’Arduino (via l’IDE) pour que celui-ci prenne en compte les impulsions délivrées par le compteur binaire 4 bits et les transmette au TM1638 afin que celui-ci incrémente son afficheur BCD en conséquence ?

D’avance merci de vos réponses.

ceci n'est pas une bonne idée, la broche 1 de votre uno est le Tx du port Série, ça vous empêchera de debugger. déplacez vos entrées sur 2,3,4 et 5

Pour bien débuter avec l'arduino, un bon point de départ c'est de lire les tutos d'eskimon (et de lire le tuto de base sur le C++ de Zeste de savoir si le C ou le C++ c'est du chinois pour vous)

Regardez comment on gère un bouton, lire une impulsion c'est la même chose.

salut

ton compteur ne délivre pas des impulsions mais un code binaire, résultat de son propre comptage : la valeur va de 0 à 15 (F en hexa).

entièrement d'accord.

quand tu auras déplacé tes 4 bits issus du compteur, tu pourras les lire en un coup de cette façon :

valeurCompteur = ( ( PIND >> 2 ) & 0xF ) ;

c'est bien plus rapide que les multiples

digitalRead(pinMachin)

suivis de la reconstitution du code 4 bits ...

pour le reste, je ne connais pas le TM1638 et sa doc en mélange d'anglais mal traduit et de chinois ne me donne pas envie d'aller plus loin ...

Bonjour, merci pour tous ces conseils techniques qui constituent une très bonne base de travail. Je vais les étudier avec attention et essayer de les mettre en application. C'est comme cela qu'on progresse ;-).
À bientôt.

Même si c'est la bonne approche, attaquer ex abrupto avec les macros de la bibliothèque avr pour un débutant. Même pas peur!

il y a au moins 2 bibliothèques qui permettent de ne pas trop se pencher sur les détails

c'est bien, ça va pouvoir l'aider ... mais comme ce composant ne m'intéresse pas je ne vais pas me farcir l'apprentissage de leur utilisation

absolument pas : mais toi, tu n'es pas comme dans Astérix et les Normands ?

Bonjour yannyeti

Je me suis intéressé à ton problème et t'ai fait un petit exemple.
Pour ce faire, j'ai pris la bibliothèque TM1638plus:


qui va te permettre d'utiliser tout ce qui se trouve sur ton module.

Les connexions du module TM1638:

#include <TM1638plus_Model3.h>

//------------------------------------- Interface TM1638
const int tmPinStrobe = 5;
const int tmPinClock = 6;
const int tmPinDio = 7;

bool tmHighFreq = false; //default false,, If using a high freq CPU > ~100 MHZ set to true.
TM1638plus_model3 tm(tmPinStrobe, tmPinClock , tmPinDio, tmHighFreq);

//------------------------------------- Entrées BCD
const int bcdInputPin[]= {8, 9, 10, 11};

int loopCounter = 0;

void setup()
{
	Serial.begin(115200);
	delay(500);
	
	for (int b = 0; b < 4; b ++)
	{
		pinMode(bcdInputPin[b], INPUT); // Initialisation des entrées BCD
	}

	tm.displayBegin();
}

void loop()
{
	byte bcdLu = bcdGetValue(); // Lecture des entrées
	tmDisplayHex(bcdLu);
	Serial.println("BCD lu: " + String(bcdLu));

	delay(500);
}

void tmDisplayHex(byte value)
{
	tm.displayIntNum(value, false, TMAlignTextRight);
}

byte bcdGetValue() // Lecture des 4 bits d'entrée et retour de leur valeur
{
	byte bcdValue = 0;
	
	for (byte b = 0; b < 4; b++) // Lecture des bits BCD (actif HIGH)
	{
		if (digitalRead(bcdInputPin[b]) == HIGH)
		{
			bcdValue += (1 << b);
		}
	}
	
	return bcdValue;
};

N'hésites pas à poser des questions :wink:

Cordialement
jpbbricole

Merci de l'intérêt que vous portez tous à ce forum. Même si je manque un peu de temps en ce moment, je vais étudier et mettre en application tous vos conseils avisés. Je reviens vers vous dès que posssible. La moindre des choses étant de vous tenir informés de l'évolution de la résolution de mon problème.
Une bonne fin de week-end à vous tous.

Juste une remarque sur ce point

L'écriture utilisée n'est pas très claire.
Une autre fois, utiliser soit:

2^0, 2^1, 2^2, ....

soit:

2<sup>0</sup>, 2<sup>1</sup>, 2<sup>2</sup>, ....

qui s'affichera ainsi

20, 21, 22, ....

ah ben justement je me demandais ce que ça voulait dire !

Bonjour, merci pour le conseil, j'en prends bonne note.
Cordialement.

Bonjour jpb bricole, j'ai bien installé la librairie TM1638plus et téléversé ton programme après avoir connecté le tout en fonction de celui-ci. Quand le compteur binaire n'est pas actif, l'afficheur affiche alternativement 0 et 15. Une fois le compteur binaire lancé celui-ci influence l'afficheur qui affiche de manière aléatoire les chiffres entre 0 et 15 mais sans rapport apparent avec les Leds du compteur 4 bits. Selon toi cela peut venir d'où? J'ai mis le bit de poids faible sur la pin 8 et le fort sur la pin 11. J'ai essayé de manière empirique d'inverser et d'alterner autrement les entrées sur les pin 8 à 11 mais rien n'y fait ;-). En tout cas ton programme est déjà une très bonne avancée dans mon projet. Si tu n'as pas de réponse ce n'est pas grave.
Cordialement.

Bonjour yannyeti

Ceci veut dire problème de GND. Sur ta photo, je me vois pas de liaison GND entre le breadboard et l'Arduino.

A+
Cordialement
jpbbricole

Bonjour jpbbricole, effectivement cela fonctionne mieux...oups désolé!
Il ne reste plus qu'un petit problème, l'afficheur n'affiche que les nombres pairs : 0 - 2 - 4 - 6 - 8 -10 -12 -14 - 0 - 2 etc et ils correspondent bien aux Led's qui s'allument au niveau du compteur 4 Bits!!! Ce qui veut dire que seul mon Bit de poids faible, le 2^0 semble ne pas être pris en compte. J'ai revu toutes les connections, rien à signaler...Qu'en penses tu? On touche au but (enfin, "tu" touches au but).
Merci d'avance de ta réponse.
Cordialement.

Je voulais t'envoyer une vidéos du montage mais malheureusement cela ne passe pas en pièce jointe.

il manque quelquechose

	for (int b = 0; b < 4; b ++)
	{
		pinMode(bcdInputPin , INPUT); // Initialisation des entrées BCD
                           ^
                          ici
	}

ça fonctionne quand-même parce que les broches sont par défaut configurées en entrées, mais dans l'absolu ...

pour ce qui est du bit[0] : que dit le moniteur série ?
cette ligne est faite pour y afficher la valeur lue :

	Serial.println("BCD lu: " + String(bcdLu));

si le moniteur série affiche bien tous les nombres et pas seulement les pairs, ce doit être un souci avec le TM1638 ou sa liaison avec le µC
vérifie aussi (à l'oscillo ou au voltmètre) que ce bit sort bien du µC, on ne sait jamais

Oupsssss! merci @5_cylindres

Il manquait l'indice du tableau [b]

	for (int b = 0; b < 4; b ++)
	{
		pinMode(bcdInputPin[b], INPUT); // Initialisation des entrées BCD
	}

Chez moi, ça fonctionnai :woozy_face:

et chez tout le monde puisque

A quelle fréquence tourne l'horloge du compteur?
A quelle fréquence tu vois la LED du poids faible clignoter (précisément combien de temps est-elle allumée et combien de temps est-elle éteinte)?