jeudi 15 février 2018

Jouer une mélodie avec le MPLAB Xpress Evaluation Board

L'activité d'aujourd'hui consiste à faire jouer une mélodie de votre choix à travers un petit haut-parleur branché à une carte MPLAB Xpress Evaluation Board (cette carte utilise un microcontrôleur PIC 16F18855 mais notre méthode pourra s'appliquer à bien d'autres microcontrôleurs de la série PIC).

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'ATTiny85Bip bip: 5 circuits qui produisent un son.


Yves Pelletier   (TwitterFacebook)

samedi 10 février 2018

Jouer une mélodie avec l'ATTiny85

Si, tout comme moi, vous programmez l'ATTiny85 avec l'IDE Arduino et le noyau ATtiny par David A. Mellis, vous avez peut-être été frustré par l'absence de support pour la fonction "tone()" qui permet, sur une carte Arduino, de produire un son dont on peut contrôler la fréquence à volonté.


Il existe toutefois un remède, proposé par David Johnson-Davies dans son excellent blog Technoblogy: dans un sketch qu'il a baptisé "TinyTone", il utilise le timer/counter1 de l'ATtiny85 pour produire l'équivalent de ce que fait la fonction tone() sur l'Arduino.

Programmation de l'ATTiny

Au besoin, référez-vous à ce billet pour la façon d'installer le noyau ATtiny de David A. Mellis et programmer l'ATTiny au moyen d'une carte Arduino.

Sketch

Le sketch ci-dessous est celui publié par David Johnson-Davies, dans lequel je me suis contenté de modifier la mélodie (il s'agit d'À la Claire Fontaine) de la fonction playTune().  Le contenu de la fonction TinyTone() peut vous sembler obscur si vous n'êtes pas familier avec la manipulation des registres de l'ATTiny, mais vous n'aurez probablement pas besoin de la modifier.



Circuit

Après avoir programmé l'ATTiny85, il ne reste plus qu'à lui ajouter un haut-parleur sur la broche physique numéro 6 (également nommée broche 1 pour l'IDE Arduino), tel qu'illustré ci-dessous.


Vidéo du résultat


Aller plus loin

Pour générer des sons plus sophistiqués, vous pouvez également jeter un oeil sur le Tiny Synth, également développé par David Johnson-Davies et présenté dans son blog Technoblogy.  De plus, David vient tout juste de publier une version améliorée de sa fonction "TinyTone()".

Yves Pelletier   (TwitterFacebook)

vendredi 12 janvier 2018

Télémètre ultrasonore HC-SR04 et MPLAB Xpress Evaluation Board

Aujourd'hui, je vous explique comment procéder pour mesurer la distance d'un obstacle au moyen d'un télémètre HC-SR04 branché à une carte de développement MPLAB Xpress Evaluation Board de la compagnie Microchip.  La distance mesurée sera transmise à un ordinateur par communication série (via USB).

Même si j'ai utilisé une carte MPLAB Xpress Evaluation Board de première génération (celle qui est munie d'un microcontrôleur PIC 16F18855), je suppose que cet article pourrait vous être utile même si vous utilisez un autre microcontrôleur PIC.

Le module HC-SR04 est un sonar: lorsque sa broche "Trig" est brièvement soumise à un signal logique haut, une brève impulsion ultrasonore est émise.  La broche "Echo" prend ensuite l'état logique haut pendant une durée égale à la durée du trajet aller-retour de l'ultrason.  Si on connaît la vitesse du son (environ 340 m/s), on peut  utiliser cette durée pour calculer la distance qui sépare le module HC-SR04 de l'obstacle qui a réfléchi l'impulsion ultrasonore.  (Dans d'autres articles de ce blog, je vous indique comment utiliser un HC-SR04 avec un Arduino, un Raspberry Pi, un STM32 Nucleo et un ATTiny: ce n'est pas le choix qui manque...).

Connexions

Le module HC-SR04 est branché à la carte de la façon suivante:

Broche Vcc du HC-SR04 : sortie 5V du MPLAB Xpress Evaluation Board
Broche Trig du HC-SR04: broche RC5 du MPLAB Xpress Evaluation Board
Broche Echo du HC-SR04: broche RC6 du MPLAB Xpress Evaluation Board
Broche Gnd du HC-SR04: broche GND du MPLAB Xpress Evaluation Board



À moins que j'aie interprété la fiche technique de travers, les entrées du 16F18855 tolèrent les tensions de 5 V; je n'ai donc pas jugé utile d'abaisser le signal de sortie du HC-SR04 (broche "Echo") avant de l'acheminer à la carte.

Configuration avec MCC

Nous allons maintenant créer un nouveau projet dans l'IDE en ligne MPLAB Xpress, puis effectuer quelques configurations au moyen du MPLAB Xpress Code Configurator (si vous n'êtes pas familiers avec ces deux outils, je vous réfère à cet article).

Tout d'abord, dans le "System Module" de MCC, les valeurs par défaut "HFINTOSC" avec une fréquence d'horloge de 4_MHz sont tout à fait appropriés, mais il faut régler l'option "Clock Divider" à la valeur 1.



Nous aurons besoin de communiquer par UART et de chronométrer la durée de l'impulsion produite par le HC-SR04.  Dans la liste "Device Resources", nous allons donc choisir "EUSART" et "TMR1", qui vont ensuite apparaître dans la zone "Project Resources".

Réglages des paramètres de l'EUSART:  il faut cocher les cases "Enable Transmit" et "Redirect STDIO to USART".  La valeur par défaut des autres paramètres devrait être correcte.


Les changements à effectuer dans les paramètres du timer sont assez nombreux: d'abord, régler "Clock Source" à FOSC. Ensuite, cocher les cases "Enable Gate" et "Enable Gate Single-Pulse Mode", puis régler "Gate Polarity" à high.

Il est bon de régler "Timer Period" à une valeur se situant entre le maximum et le minimum indiqués (en fait, cette valeur ne semble avoir aucun effet sur le fonctionnement de notre programme, mais MCC vous affichera un message d'erreur si vous laisser ce champ à une valeur qui ne se situe pas dans la plage admise).


Dans la grille où on retrouve plusieurs petits cadenas, il faut décocher le cadenas qui lie par défaut RC6 au TX de l'EUSART, puisque nous voulons utiliser cette entrée pour une autre fonction (l'icône devrait devenir un cadenas ouvert).  Nous cliquons RC0 pour le TX de l'EUSART, et RC1 pour le RX de l'EUSART (ces deux broches sont liées à l'USB de la carte MPLAB Xpress Evaluation Board).

Réglez RC5 comme GPIO output, et liez RC6 au timer (TMR1 - T1G input).


Finalement, dans "Pin Module", rebaptisez la broche RC5 "Trig_pin" et décochez la case "Analog" qui lui a été attribuée par défaut.


Maintenant que la configuration est terminée, il ne faut pas oublier de cliquer sur le bouton "Generate" afin que les fichiers soient crées dans notre projet MPLAB Xpress.

Script

Voici le code à placer dans le fichier "main.c" de votre projet.




Il s'agit de démarrer sur votre ordinateur un logiciel de communication série (j'ai utilisé le moniteur série de l'IDE Arduino), et de déplacer un obstacle devant le module HC-SR04 pour voir la distance en centimètres s'afficher à l'écran.



Yves Pelletier   (TwitterFacebook)


Related Posts Plugin for WordPress, Blogger...