Pour produire le signal sonore, nous allons utiliser une fonction du microcontrôleur qui se nomme NCO, pour Numerically Controlled Oscillator; il s'agit d'un oscillateur qui produit un signal en créneaux dont la fréquence peut être contrôlée à volonté par notre programme.
Le circuit
Le signal produit par l'oscillateur sera accessible par la sortie RC0 du microcontrôleur. Il est fortement déconseillé de brancher un haut-parleur de 8 Ω directement sur la sortie d'un microcontrôleur, car les courants générés dépassent largement les limites permises. Je vous suggère plutôt de piloter indirectement le haut-parleur en utilisant un transistor: le faible courant qui circulera dans la base du transistor contrôlera un courant plus intense qui circulera dans le haut-parleur.
Il existe plusieurs variantes (on peut utiliser un transistor bipolaire ou un transistor à effet de champ), voici le circuit que j'ai utilisé:
Même circuit, en version Fritzing:
Si vous désirez vous simplifier la vie, vous pouvez aussi utiliser un buzzer piézo qui, compte tenu de sa grande impédance, peut sans problème être branché directement à la sortie RC0. Mais la qualité sonore sera moins bonne.
Configuration du projet avec MCC
Nous allons d'abord créer un nouveau projet dans MPLAB Xpress, et ensuite effectuer quelques réglages au moyen du MPLAB Xpress Code Configurator (MCC). Si vous n'êtes pas familier avec ces outils, il pourrait s'avérer utile de jeter un oeil sur cet article.
Dans MCC, vous localisez "NCO" dans la liste intitulée "Device Resources". Vous cliquez deux fois sur "NCO1" afin de l'ajouter à votre projet :
NCO1 apparaît maintenant dans la liste "Project resources":
Je rappelle que NCO signifie Numerically Controlled Oscillateur: il s'agit d'un oscillateur dont nous pourrons contrôler la fréquence à volonté.
Les paramètres par défaut de NCO1 sont adéquats: vous n'avez pas à modifier quoi que ce soit: "NCO mode" est réglé à "FDC_mode", "Output polarity" est à "active_io" et "Clock Source" est réglé à "FOSC".
Notez qu'avec ces réglages, la fréquence maximale de l'oscillateur sera de 500 000 Hz (cette information sera utile lors de la rédaction de notre programme).
Nous allons associer la broche RC0 à l'oscillateur NCO1, en cliquant le cadenas approprié dans le bas de l'écran (sur la ligne NCO1 - ouput), puisque c'est là que nous avons branché notre haut-parleur:
Ne pas oublier de cliquer sur le bouton "Generate" afin que nos réglages soient exportés vers le projet que nous avons créé dans MPLAB Xpress.
Calcul des fréquences
Chaque note musicale de la gamme est associée à une fréquence bien précise. Par exemple, une fréquence de 130,81 Hz donne un do.
Pour choisir la fréquence à laquelle vibrera notre oscillateur, nous devons régler la valeur du registre d'incrémentation ("increment register") qui est un nombre à 16 bits réparti sur deux octets: NCO1INCH (haute valeur) et NCO1INCL (basse valeur). Plus cette valeur est grande, plus la fréquence d'oscillation sera élevée.
Puisque la valeur maximale du timer est de 1 048 575 et que la fréquence maximale de l'oscillateur est de 500 000 Hz, nous calculons la valeur du registre d'incrémentation de la façon suivante:
Par exemple, pour produire une fréquence de 130,81 Hz correspond à un do, l'équation nous donne une valeur décimale de 549 qui se traduit par le nombre binaire 1000100101. Il reste à placer les 8 derniers bits (00100101) dans le registre NCO1INCL et les bits excédentaires (10) dans le registre NCO1INCH. Dans le script présenté ci-dessous, c'est ainsi que j'ai défini la note "C3":
const int NoteC3[2] = {0b00000010, 0b00100101};
Le script
J'ai cherché à faire un programme qui rendrait facile l'écriture d'une mélodie. J'ai donc défini toutes les notes de la gamme sur 3 octaves (ces constantes portent des noms de la forme "NoteA3", "NoteC2", etc. Il s'agit de la convention dans laquelle "A" correspond à un LA, "B" correspond à un SI, etc.
Pour chaque note qu'on désire jouer, il s'agit d'utiliser la commande "Playnote" en donnant comme argument le nom de la note (comme par exemple "NoteC2" pour le do le plus grave) et la durée (1 pour une noire, 2 pour une blanche, 4 pour une ronde...).
Vous pouvez modifier la valeur de la variable globale "tempo" pour changer la vitesse à laquelle la mélodie sera jouée.
Voici, pour terminer, une courte vidéo permettant d'entendre le résultat.
D'autres articles du même genre
J'ai déjà publié plusieurs articles impliquant le MPLAB Xpress Evaluation Board: programmation des entrées/sorties, communication série par USB, utilisation d'une entrée analogique, contrôle d'un moteur à courant continu.
Si vous désirez jouer une mélodie en utilisant autre chose que le MPLAB Xpress Evaluation Board, ces articles pourraient vous intéresser: brancher un haut-parleur à l'Arduino, jouer une mélodie avec le STM32 Nucleo, jouer une mélodie avec l'ATTiny85, Bip bip: 5 circuits qui produisent un son.
Yves Pelletier (Twitter, Facebook)
Aucun commentaire:
Enregistrer un commentaire