硬件:树莓派zero+无源蜂鸣器
将树莓派的GPIO管脚接到蜂鸣器的控制脚,利用PWM震荡频率来播放不同频率的音乐
直接看代码,所有的内容都在代码里了,比较简单。
import time
import RPi.GPIO as GPIO
#速度设置为5左右
speed = 5
GPIO.setmode(GPIO.BOARD)
# 设置11口为IO输出,然后通过PWM控制无缘蜂鸣器发声
GPIO.setup(11, GPIO.OUT)
# 定义音调频率
# 低音的以键盘的数字键下面对应的字母表示,高音以数字键上面的字符表示
# 例如,q在1下面,表示低音的1(do);!在1键上,表示高音的1(do),以此类推.
tones = {
'q':131, 'w':147, 'e':165, 'r':175, 't':196, 'y':211, 'u':248,
'1': 262, '2': 294, '3': 330, '4': 349, '5': 392, '6': 440, '7': 494,
'!':525, '@':589, '#':661, '$':700, '%':786, '^':882, '^':990,
'-': 0
}
# 定义小星星旋律,这里没有低音和高音
melody = "1155665-4433221-5544332-5544332-1155665-4433221"
# 设置11口输出频率0.1hz,不能设置为0,会出错
beeper = GPIO.PWM(11, 0.1)
# 占空比为50%
beeper.start(50)
for tone in melody:
freq = tones[tone]
if freq:
#调整PWM的频率,使其发出指定的音调
beeper.ChangeDutyCycle(50)
beeper.ChangeFrequency(freq)
else:
#调整占空比为0,相当于不发音,不能设置频率为0 ,会报错
beeper.ChangeDutyCycle(0)
# 每个音符的时长
time.sleep(0.05*speed)
# 每个音符之间的停顿
beeper.ChangeDutyCycle(0)
time.sleep(0.025*speed)
beeper.stop()
GPIO.cleanup()
最后来一段听听