Raspberry Pi Pico
Using A Buzzer
I wanted to recreate the functionality with the buzzer that I had managed with MicroPython. That meant writing a library to play tunes. I delieberately chose not to look for one before trying to do a simple conversion of my MicroPython library. CircuitPython plays tunes in a very similar way. Clearly, you could look to download a better one or make some improvements to what I have done here.
The idea was to have a notation that I could use for describing a tune. I loosely based it on the way that it is done for the micro:bit.
The buzzer has two pins. One of them is connected to GND (directly in this photograph). The other pin is connected to GP16.
This is the library that I saved to the libraries folder as music.py
from pwmio import PWMOut from time import sleep # the duty cycle to use when the note is on on = 32768 # the silence after a note is played artic = 0.01 # dictionary of notes notes = { "B0": 31, "C1": 33, "CS1": 35, "D1": 37, "DS1": 39, "E1": 41, "F1": 44, "FS1": 46, "G1": 49, "GS1": 52, "A1": 55, "AS1": 58, "B1": 62, "C2": 65, "CS2": 69, "D2": 73, "DS2": 78, "E2": 82, "F2": 87, "FS2": 93, "G2": 98, "GS2": 104, "A2": 110, "AS2": 117, "B2": 123, "C3": 131, "CS3": 139, "D3": 147, "DS3": 156, "E3": 165, "F3": 175, "FS3": 185, "G3": 196, "GS3": 208, "A3": 220, "AS3": 233, "B3": 247, "C4": 262, "CS4": 277, "D4": 294, "DS4": 311, "E4": 330, "F4": 349, "FS4": 370, "G4": 392, "GS4": 415, "A4": 440, "AS4": 466, "B4": 494, "C5": 523, "CS5": 554, "D5": 587, "DS5": 622, "E5": 659, "F5": 698, "FS5": 740, "G5": 784, "GS5": 831, "A5": 880, "AS5": 932, "B5": 988, "C6": 1047, "CS6": 1109, "D6": 1175, "DS6": 1245, "E6": 1319, "F6": 1397, "FS6": 1480, "G6": 1568, "GS6": 1661, "A6": 1760, "AS6": 1865, "B6": 1976, "C7": 2093, "CS7": 2217, "D7": 2349, "DS7": 2489, "E7": 2637, "F7": 2794, "FS7": 2960, "G7": 3136, "GS7": 3322, "A7": 3520, "AS7": 3729, "B7": 3951, "C8": 4186, "CS8": 4435, "D8": 4699, "DS8": 4978 } # buzzer, frequency, duration def tone(buzzer, frequency, duration): buzzer.duty_cycle = on buzzer.frequency = frequency sleep(duration) buzzer.duty_cycle = 0 # buzzer, frequency - until stopped def note_on(buzzer, frequency): buzzer.duty_cycle = on buzz.frequency = frequency # stop the noise def note_off(buzzer): buzzer.duty_cycle = 0 def play_tune(buzzer, melody): for itm in melody: n,d = tuple(itm.split(":")) d = float(d) n = notes.get(n,0) if n==0: sleep(d) else: tone(buzzer,n,d) sleep(artic)
And here is a short program defining a tune to play.
import board from time import sleep from pwmio import PWMOut from music import play_tune # set up buzzer with variable frequency buzzer = PWMOut(board.GP16, variable_frequency = True) tune = [ 'FS4:0.2','G4:0.2','A4:0.2','B4:0.6','A4:0.2','B4:0.2','E5:0.2', 'D5:0.2','B4:0.2','A4:0.2','G4:0.2','E4:0.6','G4:0.2','B4:0.2', 'C5:0.2','D5:0.6','E5:0.2','D5:0.2','B4:0.2','G4:0.2','B4:0.2', 'A4:0.8','R:0.2','FS4:0.2','G4:0.2','A4:0.2','B4:0.6','A4:0.2', 'B4:0.2','E5:0.2','D5:0.2','B4:0.2','A4:0.2','G4:0.2','E4:0.6', 'FS4:0.2','G4:0.2','A4:0.2','B4:0.6','C5:0.2','B4:0.2','A4:0.2', 'G4:0.2','A4:0.2','G4:0.8','R:0.2','D5:0.2','E5:0.2','FS5:0.2', 'G5:0.6','FS5:0.2','FS5:0.2','E5:0.2','D5:0.2','E5:0.2','D5:0.2', 'B4:0.2','G4:0.6','D5:0.2','E5:0.2','FS5:0.2','G5:0.6','FS5:0.2', 'FS5:0.2','E5:0.2','D5:0.2','B4:0.2','A4:0.8','R:0.2','D5:0.2', 'D5:0.2','D5:0.2','B5:0.6','A5:0.2','A5:0.2','G5:0.2','E5:0.2', 'G5:0.2','D5:0.2','B4:0.2','G4:0.6','FS4:0.2','G4:0.2','A4:0.2', 'B4:0.2','E5:0.2','D5:0.2','B4:0.2','A4:0.2','G4:0.2','E4:0.2', 'FS4:0.2','G4:0.8','R:0.2'] play_tune(buzzer, tune)