Electronique > Réalisations > Affichage / Mesure > Compteur-indicateur tempo 001 (BPM)

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).

compteur_tempo_001_pcb_3d_front

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.

compteur_tempo_001

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.

compteur_tempo_001_proto_001a

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.
   
compteur_tempo_001_pcb_3d_components_top

   

Historique

14/01/2024
- Ajout dessin du circuit imprimé (PCB).

18/10/2009
- Première mise à disposition.