🛠 Jouer une mélodie avec un buzzer passif et le PWM

RP2040 (carte / puce générique) · debutant · Schéma : IMG-rp2040-generic-debutant-3-rp2040-buzzer-pwm-melodie.svg — buzzer passif relié à GP8 et GND d'une carte RP2040 générique, forme d'onde carrée 440 Hz annotée, portée avec les notes

Objectifs

Fabriquer un petit synthé : un buzzer passif n'est rien d'autre qu'une membrane qu'on fait vibrer avec un signal carré. Le RP2040 fournit l'horloge idéale : 16 canaux PWM (8 tranches × 2 canaux) alimentés par le clock de 125 MHz (datasheet RP2040). Tu calculeras période et rapport cyclique pour jouer des notes justes, puis une mélodie complète.

Matériel

Code complet

# melodie.py — GP8, PWM 50 % de rapport cyclique, gamme ~31 Hz..62 kHz
from machine import Pin, PWM
import time

buz = PWM(Pin(8))
buz.duty_u16(32768)          # 50 % = son le plus fort (16 bits)

NOTE = {                       # fréquences tempérées (LA4 = 440 Hz)
    'C4': 262, 'D4': 294, 'E4': 330, 'F4': 349, 'G4': 392,
    'A4': 440, 'B4': 494, 'C5': 523, ' ': 0,
}

def note(nom, duree_ms):
    f = NOTE.get(nom, 0)
    if f:
        buz.freq(f)
        buz.duty_u16(32768)
    else:                      # silence
        buz.duty_u16(0)
    time.sleep_ms(duree_ms)
    buz.duty_u16(0)
    time.sleep_ms(20)          # petite articulation entre notes

# « Au clair de la lune » (début)
partition = [('C4',400),('C4',400),('C4',400),('D4',400),
             ('E4',800),('D4',800),('C4',1200),(' ',400)]
while True:
    for n, d in partition:
        note(n, d)
    time.sleep_ms(800)

Vérification attendue

La mélodie sonne juste (compare le LA4 au diapason de ton téléphone). En changeant buz.freq(440) en direct dans le REPL, le son monte/descend en continu : tu contrôles la hauteur. Un duty_u16 plus bas (ex. 8000) baisse le volume sans changer la note — le PWM sert aussi d'amplitude.

Erreurs fréquentes

Autres tutoriels pour cette carte

Exemples de code pour cette carte

← Retour à la fiche 🛠 Tous les tutoriels