mercredi 14 juillet 2021

Jouer une mélodie avec le Raspberry Pi Pico (MicroPython)

Une façon simple de jouer une mélodie au moyen d'un microcontrôleur consiste à modifier la fréquence d'un signal modulé en largeur d'impulsion (PWM). Il en résulte un son très synthétique qui rappelle les jeux vidéo des années 1980.

Pour transformer le signal électrique de la broche GP2 en vibration sonore, vous pouvez utiliser un haut-parleur ou un buzzer piézoélectrique.

Connexion d'un haut-parleur

Un haut-parleur offre une excellente qualité sonore,  mais il est hors de question de le brancher directement à une broche du Raspberry Pi Pico (ou de tout autre microcontrôleur): le courant traversant la broche serait beaucoup trop intense à cause de la faible résistance du haut-parleur. 

Le signal PWM généré par la broche GP2 du Raspberry Pi Pico est plutôt reliée à la base d'un transistor par l'entremise d'une forte résistance (1 kΩ, par exemple). Le haut-parleur est branché au collecteur du transistor, en série avec une résistance d'au moins 100 Ω (pour plus d'infos, voir cet article)


Un buzzer piézoélectrique est beaucoup plus facile à brancher, mais la qualité sonore risque d'en souffrir. Ça peut être une bonne idée d'ajouter une résistance de 100 Ω ou 220 Ω en série avec le piézo.


Script en MicroPython

Chaque fois qu'on désire jouer une note, il faut s'assurer de jouer la bonne fréquence (hauteur de la note) et la bonne durée. La fréquence est réglée au moyen de la méthode freq().

Pour que les notes soient bien distinctes les unes des autres, on ajoute un court silence (d'une durée de 50 millisecondes) entre deux notes successives. Le rapport cyclique est alors réglé à 0% (alors qu'il est de 50% lorsqu'on désire générer un son).

-

'''
On joue une mélodie en modifiant la fréquence
du signal PWM de la broche GP2 (Raspberry Pi Pico).
Plus d'infos:
https://electroniqueamateur.blogspot.com/2021/07/jouer-une-melodie-avec-le-raspberry-pi.html
'''
from machine import Pin,PWM
from utime import sleep_ms
# fréquence en Hz des notes utiles
NOTE_G4 = 392
NOTE_A4 = 440
NOTE_B4 = 494
NOTE_C5 = 523
NOTE_D5 = 587
NOTE_E5 = 659
NOTE_F5 = 698
NOTE_G5 = 784
# les notes (hauteur et durée) de la mélodie à jouer
melodie = [ [NOTE_G4,1], [NOTE_G4,2], [NOTE_G4,1], [NOTE_C5,3],
[NOTE_C5,3], [NOTE_D5,3], [NOTE_D5,3], [NOTE_G5,5],
[NOTE_E5,1], [NOTE_C5,2], [NOTE_C5,1], [NOTE_E5,2],
[NOTE_C5,1], [NOTE_A4,3], [NOTE_F5,6], [NOTE_D5,2],
[NOTE_B4,1], [NOTE_C5,4] ]
pwm = PWM(Pin(2,Pin.OUT))
for i in melodie:
duree = (i[1] * 200) - 50; # durée de la note, en milliseconde
pwm.freq(i[0]) # réglage de la fréquence (hauteur de la note)
pwm.duty_u16(32512) # rapport cyclique 50% (production d'un son)
sleep_ms(int(duree)) # on attend la durée requise
pwm.duty_u16(0) # rapport cyclique nul (silence)
sleep_ms(50) # silence pendant 50 ms (pour bien séparer les notes)

-

À lire également


Yves Pelletier (Facebook)


Aucun commentaire:

Enregistrer un commentaire