Dernière mise à jour :
14/01/2024
Présentation
Ce montage permet d'indiquer le tempo d'un morceau, en BPM (
Beats Per
Minute, battements par minute).
La valeur est affichée via trois
afficheurs sept
segments à led, ce qui permet une très bonne visibilité même en
pénombre.
Un système plus élaboré a vu le jour 14 ans après, voir
Compteur-indicateur tempo 001b.
Schéma
Pour ce montage, j'ai eu recours à un PIC de type 16F628A. On peut
bien entendu réaliser ce type de montage en logique
traditionnelle (sans composant programmé) mais pour faire aussi
simple d'un point de vue matériel, je pense qu'il faut se lever tôt.
Principe général
Le principe général repose sur la mesure du nombre
d'impulsions générées entre deux tops de marquage.
Dans la version de base (schéma proposé), ces tops de marquage sont provoqués par
appui manuel sur un bouton poussoir. Mais il est parfaitement
envisageable d'ajouter un filtre BF passe-bas suivi d'un
détecteur de niveau, pour extraire les coups de basse d'un
morceau de musique "rythmé" (
exemple de filtre passe-bas). La base de temps principale est la minute, mais il va de soi qu'on ne
va pas utiliser le nombre d'impulsions mesurées sur une telle
période pour afficher la valeur du tempo, car c'est bien trop
long. On choisi donc une base de temps bien plus rapide, mais qui
conserve toutefois un rapport direct avec la minute, afin de faciliter
les calculs. Mon choix s'est porté sur une base de temps de 1
ms, soit une fréquence de 1 KHz. 60000 impulsions d'horloge sont
donc produites par minute (mille impulsions par seconde,
multipliées par 60). En procédant ainsi, il suffit de
compter le nombre d'impulsions qui se sont écoulées entre
deux "tops", et de diviser 60000 par ce nombre. Prenons deux exemples
pour illustrer l'idée.
Exemple 1
Le bouton poussoir permettant de marquer les tops (SW1 sur le
schéma) est actionné deux fois par secondes, c'est
à dire à une fréquence de 2 Hz. Comme l'horloge
interne fonctionne à 1000 Hz, nous allons avoir un marquage
toutes les 500 ms, c'est à dire toutes les 500 impulsions
d'horloge. La valeur du tempo (BPM) est alors égale à :
60000 / 500 = 120 BPM (rythme "disco" normal)
Exemple
2
Le bouton poussoir permettant de marquer les tops (SW1 sur le schéma)
est actionné cinq fois par secondes, c'est à dire à une fréquence de 5
Hz. Comme l'horloge interne fonctionne à 1000 Hz, nous allons avoir un
marquage toutes les 200 ms, c'est à dire toutes les 200 impulsions
d'horloge. La valeur du tempo (BPM) est alors égale à :
60000 / 200 = 300 BPM (c'est plutôt rapide !)
Schéma
Afin de pouvoir utiliser un PIC bon marché et de limiter le
câblage au maximum,
l'affichage est multiplexé.
Cela signifie
que les trois afficheurs sont allumés à tour de
rôle, jamais en même temps. Cela se fait à une
vitesse suffisement élevée pour que la persistance
rétinienne aide au leure et que l'on ait l'impression que tous
sont allumés en même temps. En procédant ainsi, on
peut se contenter de 10 lignes de câblage (7 pour l'ensemble des
segments et trois pour la sélection de l'afficheur à
activer) au lieu de 22 lignes. Outre ces dix lignes de sortie, il nous faut
une ligne
d'entrée pour indiquer au programme qui tourne en boucle, qu'un
top de marquage vient d'arriver. Le PIC 16F628A dispose de
suffisement de lignes d'entrées / sorties pour notre
application, c'est pourquoi (en partie) je l'ai choisi. Que dire de
plus ? Comme vous pouvez le constater, il y a vraiment peu de
composants, le principal est dans le coeur du programme, que vous
trouverez en libre téléchargement quelques lignes plus
loin.
Important !
Le condensateur placé en parallèle sur le poussoir Tap
permet d'absorber les rebonds mécaniques du poussoir, en
association avec la résistance de pullup interne au PIC, sur
l'entrée RB7. Ce condensateur est impératif si on ne veut
pas que les calculs de tempo se fassent lors de chaque rebond du
poussoir (devinez voir un peu ce qui m'est arrivé au
début). La valeur de ce condensateur convenait dans mon cas,
mais vous pourrez être amené à la réduire ou
à l'augmenter légèrement, en fonction de votre
"coup de main" (force et durée d'appui sur le poussoir). Une
meilleur solution consisterait, en cas de soucis d'affichage seulement,
à intercaler un
monostable (CD4528 ou CD4538 par exemple) entre le poussoir et l' entrée du PIC. Dans tous les cas, il faut choisir un
bon bouton poussoir, pas un modèle à 50 centimes qui lachera au bout de cent petites tappes amicales.
Prototype
Réalisé en partie sur
plaque d'expérimentations sans soudure, en association avec mon petit bout de circuit
Afficheur led sept segments 003.
Après
quelques tests, je me suis rendu compte qu'il était préférable de
moyenner les dernières valeurs calculées, afin de limiter les
fluctuations de l'affichage. Pour ce faire, on mémorise les quatre
dernières mesures et on fait la moyenne des quatre, avant affichage. A
chaque nouvelle valeur calculée, on élimine la plus ancienne et on fait
glisser les trois autres pour lui laisser de la place.
// BPM switch pressed ?
if bTap then
begin
bTap := false;
iTaps[0] := iTaps[1];
iTaps[1] := iTaps[2];
iTaps[2] := iTaps[3];
iTaps[3] := word(60000 / iPulses);
dTap := dword(iTaps[0] + iTaps[1] + iTaps[2] + iTaps[3]);
if InCalc then
iBPM := word(dTap / 4)
else
iBPM := iTaps[3];
iPulses := 0;
PORTA.4 := PORTA.4 xor 1; // show tap action toggle led on / off
end;
L'affichage est ainsi plus stable, mais avec comme contrepartie la
nécessité
d'attendre au moins quatre appuis du poussoir SW1 pour avoir une
valeur représentative. Cela n'est en pratique pas vraiment
pénalisant, mais comme cette fonction de moyennage peut
être désactivée via le cavalier JP1 (qui "joue" sur
la variable InCalc)...
Entrée RA5 à la masse : affichage dernière mesure
Entrée RA5 au +5 V : affichage moyenné
Remarque
: je trouve très intéressante l'utilisation de l'affichage du rythme
sans moyennage, quand on veut s'entraîner à une grande régularité. Cela
peut même devenir un jeu, où le gagnant est celui qui arrive à "taper"
10 coups de suite à un tempo donné en restant dans une plage définie à
l'avance (par exemple 110 BPM sans sortir de la plage 105-115
BPM).
Logiciel du PIC
Fichier compilé pour PIC (binaire *.hex) et codes sources complets
(mikroPascal Pro V2.50)
Compteur tempo 001 - 16F628A (18/10/2009)
Si
vous souhaitez recevoir par la poste un PIC préprogrammé
et prêt à utiliser, merci de consulter la page
PIC - Sources.
Circuit imprimé (PCB)
Réalisé en double face.
Historique
14/01/2024
- Ajout dessin du circuit imprimé (PCB).
18/10/2009
- Première mise à disposition.