vendredi 30 novembre 2018

boite à musique réalisée avec un PIC10F202

Ce projet est en réponse à une question publié sur l'entrée Busy Bee partie 5, boite à musique.

Boite à musique

Une boite à musique réalisée avec un µC PIC10F202 et quelques composants.

Description

Le PIC10F202 est le plus simple et limité des µC. Comme périphérique il ne possède qu'une minuterie de 8 bits. Donc presque tout doit-être fait en logiciel. La minuterie est utilisée pour contrôler la fréquence de la note. La durée de la note ainsi que la durée du soutenu de la note sont contrôlées par des compteurs logiciels de 24 bits avec une résolution de 8µSec.

Le PIC10F202 possède seulement 512 octets de mémoire flash. De plus les appels de sous-routines sont limités aux adresse 0 à 255 (page 0). Cette limitation impose 2 contraintes au projet. La première est que toutes les tables de données doivent-être situées entre les adresses 0 et 255. Les entrées de sous-routines doivent aussi être situées dans l'espace d'adressage entre 0 et 255. Ce qui m'a obligé à utiliser un artifice pour placer les sous-routines après l'adresse 255. L'instruction GOTO est là seule qui permet de couvrir les 512 mots d'adressage. Donc je place les entrées de sous-routines dans la page 0 mais ces entrées ne contiennent qu'un GOTO vers le vrai code de la sous-routine qui est après l'adresse 256 (page 1). Ceci permet de conserver l'espace de la page 0 pour les tables de données.

Considérant la mémoire flash limitée du PIC10F202, il n'y a que 4 mélodies d'enregistrées. Celle-ci sont jouées une après l'autre en boucle à chaque pression du bouton SW2. Après chaque mélodie le µC entre en mode SLEEP et ne se réveille que lorsqu'on pèse sur le bouton SW2 pour jouer la mélodie suivante.

En mode SLEEP le PIC10F202 consomme moins de 1µA de sorte que le commutateur d'alimentation SW1 est facultatif.

Circuit

La sortie GP0 est utilisée pour la tonalité. Ce signal audio est envoyé au collecteur du transistor Q1 qui fonctionne comme un amplificateur en base commune avec la sortie sur l'émetteur qui alimente un petit haut-parleur de 135 ohm. Le gain est contrôlé par la polarisation de la base qui dépend du voltage aux bornes du condensateur C2. Donc en faisant varier ce voltage on fait varier l'amplitude du signal audio.

Au début de la note la sortie GP1 est mise à Vdd pour charger C2 à travers R3. Lorsque le délais de soutenance de la note est expiré. la sortie GP1 est mise en haute impédance et cesse donc de garder la charge sur C2. Donc le condensateur commence à se décharger à travers R4 et la base de Q1. Le gain du transistor diminue en même temps que le voltage aux bornes de C2 et ainsi le signal audio. On a donc un signal audio qui monte et descend progressivement plutôt que de débuter et terminer brutalement ce qui est plus plaisant pour l'oreille.

La LED sur GP2 suis le signal sur GP1 elle s'allume donc au rythme de la musique.

Le bouton SW2 permet de faire jouer la mélodie suivante.

Sur cette capture d'écran de l'oscilloscope on aperçoit en bleu la forme du voltage sur C2 et en jaune le voltage aux bornes du haut-parleur.

Table de mélodie

Les macros suivantes aide à créer les tables de mélodies.

  • MELODY nom, cré l'entête de la table avec le nom de la mélodie comme point d'entré. nom doit être un nom d'étiquette valide pour l'assembleur.
  • NOTE n, d, ajoute une note à la table n est le nom de la notes tel que défini dans les EQU qui associent un nom symbolique à chaque note de la gamme. d est la durée de la note tel que définie dans les EQU qui associent les durées à un nom symbolique
  • PMODE m, détermine le mode phrasé des notes qui suivent. Le phrasé musical demeure constant tant qu'il n'est pas remplacé par un autre. Il y a 3 phrasé. PHRASE_NORMAL, PHRASE_STACCATO et PHRASE_LEGATO. Ce paramètre détermine la portion de la note qui est soutenue. Ce paramètre peut apparaître plusieurs fois dans la même mélodie. STACCATO correspond aux notes pointées. LEGATO corresponds aux notes reliées par un arc de cercle.
  • MELODY_END, indique la fin de la mélodie.

code source

L'ensemble du projet est disponible ici

Avec un PIC10F322 c'est mieux

Le PIC10F202 est très limité et même Microchip conseille d'utiliser le PIC10F322 à la place. Au niveau du brochage et de la quantité de mémoire flash c'est indique. J'ai donc remplacé le PIC10F202 sur la plaquette et réécris le code pour tirer avantage du PIC10F322.

Le PIC10F322 possède 2 périphériques PWM j'utilise le premier pour générer les tonalités ce qui simplifie le code. Le TMR0 lui est utilisé pour contrôler la durée de la note et du soutenu. Contrairement au PIC10F202 le PIC10F322 supporte les interruptions donc le TMR0 est configuré pour générer une interruption à interval d'une milliseconde. C'est à l'intérieur de la routine de service d'interruption que les compteurs duration_ctnr et sustain_ctnr sont décrémentés.

J'ai ajouté une fonctionnalité supplémentaire. En effet cette version permet de commuter la gamme entre 2 octaves ce qui m'a permis d'ajouter la mélodie korobeiniki qui chevauche 2 octaves.

Grâce aux périphériques disponibles sur le PIC10F322 le code machine prend moins d'espace et de plus les tables de données peuvent chevauchées entre la page 0 et la page 1 . J'ai modifié la macro MELODY pour qu'on est pas à se soucier du chevauchement de page lors de la saisie des mélodies.

Cette version m'a permis d'enregistrer 6 mélodies au lieu de 4 pour la version sur PIC10F202. La mémoire programme est utilisée à 98%. Il ne reste que 8 locations de libres.

Ce vidéo a été filmé avec la version PIC10F322.