🛠 Jouer une mélodie avec un buzzer passif et le PWM
Objetivos
Construir un pequeño sintetizador: un zumbador pasivo no es más que una membrana que se hace vibrar con una señal cuadrada. El RP2040 proporciona el reloj ideal: 16 canales PWM (8 segmentos × 2 canales) alimentados por el reloj de 125 MHz (hoja de datos RP2040). Calcularás el periodo y el ciclo de trabajo para tocar notas afinadas, y luego una melodía completa.
Material
- 1 × placa RP2040 genérica
- 1 × zumbador pasivo (5–12 V; los zumbadores «activos» suenan con una simple tensión y no permiten tocar melodías)
- 1 × cable: pin del zumbador a GP8, el otro a GND (algunos zumbadores tienen polaridad: cable + al GPIO)
- Firmware MicroPython rp2
Código completo
# 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)
Verificación esperada
La melodía suena afinada (compara el LA4 con el diapasón de tu teléfono). Cambiando buz.freq(440) en directo en el REPL, el sonido sube o baja de forma continua: controlas la altura. Un duty_u16 más bajo (por ejemplo, 8000) baja el volumen sin cambiar la nota — el PWM también sirve como amplitud.
Errores frecuentes
- Zumbador activo: contiene su propio oscilador, solo se necesita una tensión y el PWM no cambia la altura — compra uno pasivo.
- Olvidar
duty_u16(32768): por defecto, el ciclo de trabajo puede estar en 0, no sale ningún sonido aunque la frecuencia sea correcta. - Frecuencia fuera del rango útil: un zumbador pasivo suena correctamente entre ~100 Hz y 10 kHz; por debajo hace ruido, por encima ya no se oye nada.
- Un solo segmento PWM por frecuencia: si otro periférico (servo, LED) usa el mismo segmento, cambiar la frecuencia lo desajusta — los 8 segmentos están ahí para eso, uno por uso.
- Zumbador que pita continuamente al arrancar: el pin mantiene el estado del programa anterior; añade
buz.duty_u16(0)al inicio.
Otros tutoriales para esta placa
- Piloter la LED RGB embarquée WS2812 d'une carte RP2040 générique
- Avoir une console série sur une carte sans pont USB (UART0)
- Afficher sur un OLED I2C SSD1306 et déboguer le bus
- Logger sur carte microSD en SPI (mode carte)
- Interruptions GPIO et alarmes matérielles avec le Pico SDK
- Transformer la carte en clavier USB HID avec TinyUSB
Ejemplos de código para esta placa
clignotante.pyPythonbouton-interruption.pyPythonpwm-servo.pyPythonlecture-adc.pyPythonneopixel.pyPythonoled-i2c.pyPython