Projet 3 – Activité 5

”Régler la fréquence d’une onde sonore
avec deux potentiomètres

 

 

Objectif

Dans cette dernière activité, l’appui sur le premier bouton-poussoir produit une onde sonore dont la fréquence est réglée à l’aide de 2 potentiomètres :

        – le premier potentiomètre permet un réglage rapide de la fréquence entre 0 et 4080 Hz,

        – le deuxième potentiomètre effectue un réglage fin de la fréquence sur une plage de 255 Hz,

        – l’émission sonore est arrêtée en appuyant de nouveau sur le bouton poussoir.

Le potentiomètre de réglage rapide est connecté sur la broche A1 de l’Arduino.
La tension de cette broche varie donc entre 0 et 5 V (voir le principe de fonctionnement du potentiomètre) en fonction de la position du curseur du potentiomètre.
La lecture de la valeur de la broche A1 convertie par le convertisseur analogique numérique de l’Arduino donne donc un nombre entier entre 0 et 1023.

Ce nombre est divisé par 4 de façon à obtenir un nombre entier compris entre 0 et 255 qui sera convertie en nombre binaire (sur 8 bits) :

0 en décimal = 00000000 en binaire

255 en décimal = 11111111 en binaire

Ce nombre binaire sur 8 bits est convertie en nombre binaire sur 12 bits en ajoutant 4 bits de poids faibles, 0000, à sa fin. On obtient donc un nombre binaire (sur 12 bits) compris entre 000000000000 et 111111110000, soit en décimal, un nombre entier entre 0 et 4080.

Le potentiomètre de réglage fin est connecté sur la broche A2 de l’Arduino. Selon le même principe que précédemment, la lecture de la broche A2 donne une valeur comprise entre 0 et 1023.

Ce nombre est également divisé par 4 et convertie en nombre binaire sur 12 bits. On obtient donc un nombre binaire compris entre 0000000000 et 00001111111111 (entre 0 et 255 en décimal).

La conversion en décimal de l’addition des deux nombres binaires (issus de A1 et A2) nous donnent la valeur de la fréquence en Hz de l’onde sonore, soit entre 0 et 4335 Hz avec un pas de réglage de 1 Hz.

 

. Rappels

En informatique, outre la base 10, on utilise très fréquemment le système binaire (base 2) puisque la logique booléenne est à la base de l’électronique numérique. Deux symboles suffisent : 0 et 1. Cette unité élémentaire ne pouvant prendre que les valeurs 0 et 1 s’appelle un bit (de l’anglais binary digit). Une suite de huit bits s’appelle un octet.

Le tableau ci-dessous montre la représentation des nombres de 0 à 15 dans les bases 10 et 2 :

. Conversion du décimal en binaire :

La méthode de conversion la plus simple est celle de la division euclidienne par 2. Elle est facile à utiliser en programmation (il est facile d’en faire un algorithme). Voilà comment on fait :

. On a notre nombre en décimal, par exemple : 77

. On le divise par 2 et on note le reste de la division (c’est soit un 1 soit un 0).

. On refait la même chose avec le quotient précédent, et on met de nouveau le reste de côté.

. On réitère la division, et ce jusqu’à ce que le quotient soit égale à 0.

Le nombre en binaire apparaît alors.  le premier bit à placer est le dernier reste non nul. Ensuite, on remonte en plaçant les restes que l’on avait. On les place à droite du premier 1 :

77 s’écrit donc en base 2 : 1001101

. Conversion du binaire en décimal :

Le nombre binaire 1001101 est composé de 7 bits et chaque bit correspond à une puissance de 2. Le premier (en partant de la droite) est le bit de la puissance 0, le deuxième celui de la puissance 1, le troisième celui de la puissance 3, etc…

Pour le convertir un nombre binaire en décimal, on procède de la manière suivante :

On multiplie par 20 la valeur du premier bit, par 21 la valeur du deuxième bit, par 22 la valeur du troisième bit , […], par 210 la valeur du onzième bit, etc… et on fait la somme des résultats :

Le nombre binaire 1001101 en base 10 est :

26 + 23 + 22 + 20 = 64 + 8 + 4 + 1 = 77


Le programme

. Programme en Python (”Projet3/Activity5/PY/Activity5.py”)


Déroulement du programme
 :

Importation des librairies et définition de fonctions :

. Le module ”ConnectToArduino.py”, contenant les fonctions de connexion à l’Arduino via le protocole ”Firmata Express”,

. Le module PymataExpressDef.Py” regroupant toutes les fonctions utiles à l’utilisation de Pymata-express” (fonction de déclaration des entrées et sorties, de lectures, d’écritures…) ,

. La bibliothèque time” pour la gestion des temps de pause,

. La fonction dec2bin pour convertir un nombre décimal en nombre binaire,

. La fonction ”bin2dec” pour convertir un nombre binaire en nombre décimal,

. La fonction ”CalculFreq” pour calculer la valeur de la fréquence de l’onde sonore en fonction de la valeur des broches des potentiomètres.

Déclaration des constantes et variables :

. PinTone = 3 (constante correspondant au n° de la broche sur laquelle le buzzer est connecté)

. PinButton = 12 (cst correspondant au n° de la broche sur laquelle le bouton poussoir est connecté)

. ValButton = 0 (variable pour stocker la valeur de l’état logique de la broche du bouton poussoir)

. OldValButton = 0 (variable pour stocker la valeur précédente de l’état logique de la broche du bouton poussoir)

. State=0 (variable correspondant à l’action à effectuer)

. PinPot = [1,2] (liste de constantes correspondant au n° des broches des potentiomètres : A1 et A2)

. ValPot=[0,0] (liste de variables pour stocker la valeur des broches des potentiomètres)

. FreqWave=0 (variable pour stocker la fréquence en Hz de l’onde sonore)

. PortComArduino (port COM sur lequel l’Arduino est connecté)

Connexion à l’Arduino :

. Détection du port COM, tentative d’ouverture du port COM sélectionné et connexion à l’Arduino:

PortComArduino = SelectPortCOM()

board = OpenPortCom(PortComArduino)

. Si la connexion à l’Arduino est réussie :

– Déclaration de la broche du buzzer en mode ”Tone” :

Set_Tone_Pin(board, PinTone)

– déclaration de broche du bouton-poussoir en entrée digitale :

Set_DigitalInput_Pin(board, PinButton)

– déclaration des broches des potentiomètres en entrée analogique :

Set_AnalogInput_Pin(board, PinPot[0])

Set_AnalogInput_Pin(board, PinPot[1])

Boucle principale du programme (boucle ”while True”) :

 

. Programme en langage Arduino (”Projet3/Activity5/INO/Activity5.ino)

Déroulement du programme :