2nde : Produire un son à l’aide d’un microcontrôleur.

Ressource proposée par : F. GUERINET

Démarche pédagogique choisie :

1ère étape : Déterminer la fréquence des notes à partir de la représentation temporelle de la mélodie
  • mesure de la période de chaque note à partir d’un fichier au format wav avec Audacity
  • calcul de la fréquence
2ème étape : Programmation de la mélodie
  • appropriation du programme (commenter les lignes du programme)
  • programmation du reste de la mélodie
  • modification de la mélodie (pauses, durée des notes)

Matériel nécessaire

Carte Arduino
Haut-parleur

Fil de connexion Microcontrôleur (carte ArduinoTM)

 


Cablage

 

On utilise une des sorties numériques de la carte à microcontrôleur, par exemple la n°6 dans le montage ci-contre.

Dans le cas de l’utilsation d’un shield, le câble reliera la haut-parleur et la borne D6.

 

 


Proposition n°1 : Construire un signal périodique via l’IDE du microcontrôleur

Une sortie numérique ne connaît que deux états possibles : HIGH (tension maximale) ou LOW (tension minimale). Pour produire un signal sonore périodique, il faut donc programmer la sortie numérique pour qu’elle soit 50 % de la période à la valeur HIGH et 50 % de la période à la valeur LOW.

void setup() {
   pinMode(6,OUTPUT); //on prépare le pin 6 en mode sortie
}

// La boucle (loop) est parcourue indéfiniment
void loop() {
  digitalWrite(6, HIGH);   // Met la sortie numérique 6 au niveau haut
  delayMicroseconds(1150); // attend 1150 µs, soit une demi-période
  digitalWrite(6, LOW);    // Met la sortie numérique 6 au niveau bas
  delayMicroseconds(1150); // attend 1150 µs, soit une demi-période
}

Si on souhaite jouer plusieurs notes d’une mélodie, il faut introduire une boucle « for » pour chaque note afin de déterminer la durée de chaque note et une pause entre celles-ci :

void setup() {
   pinMode(6,OUTPUT); //on prépare le pin 6 en mode sortie
}

// La boucle (loop) est parcourue indéfiniment
void loop() {
  for (int i=0 ; i<217 ; i++) {
    digitalWrite(6, HIGH);   // Met la sortie numérique 6 au niveau haut
    delayMicroseconds(1150); // attend 1150 µs, soit une demi-période
    digitalWrite(6, LOW);    // Met la sortie numérique 6 au niveau bas
    delayMicroseconds(1150); // attend 1150 µs, soit une demi-période
  }
  delay(100); // attend 100 ms avant de jouer la note suivante
  for (int i=0 ; i<244 ; i++) {
    digitalWrite(6, HIGH);   // Met la sortie numérique 6 au niveau haut
    delayMicroseconds(1025); // attend 1025 µs, soit une demi-période
    digitalWrite(6, LOW);    // Met la sortie numérique 6 au niveau bas
    delayMicroseconds(1025); // attend 1025 µs, soit une demi-période
  }
  delay(100); // attend 100 ms avant de jouer la note suivante
}

Proposition n°2 : Produire un son avec la fonction tone

La fonction tone(x,f,t) génère un signal de fréquence f > 31 Hz sur la broche x pendant la durée t en millisecondes. Cependant, cette fonction ne peut gérer qu’une broche à la fois.

void setup() 
{
  pinMode(6, OUTPUT);  //La broche 6 est la sortie utilisée
}

void loop() 
{
  tone(6,435,500);
  delay(500);
  tone(6,488,500);
  delay(500);
}

L’enchaînement de notes devient beaucoup plus simple.

Proposition n°3 : Produire un son avec la fonction tone et un pilotage via un programme Python.

Il est également possible de piloter la carte à microcontrôleur ArduinoTM en langage Python.

Le code python fait appel aux modules time et microcontrôleurs qui contiennent respectivement les fonctions sleep et son.

Le programme pour jouer deux notes donne :

from microcontroleurs import arduino
import time

macarte = arduino("/dev/ttyACM1")      #nom du port à adapter

###Creation d'un son

for i in range(5):
    macarte.son(6,435,0.75)
    time.sleep(1)

    macarte.son(6,488,0.75)
    time.sleep(1)

macarte.fermer()

Propositions d’activité expérimentale :

Situations inspirées de ressources issues de l’académie de Nantes

TP production d’un son (version Arduino)
TP production d’un son (version Python)