1、蜂鸣器
蜂鸣器是一种能够发出连续高频蜂鸣声的装置。它通常由永磁铁和一个振动膜组成,当电流通过蜂鸣器时,永磁铁会产生磁场,将振动膜吸引过来并使其振动,从而产生声音。
蜂鸣器广泛应用于各种电子设备中,如闹钟、手机、电脑等。它可以用来作为报警、提醒、提示等功能的声音装置。蜂鸣器的声音频率通常在2kHz到5kHz之间,具有较高的音频穿透力,能够使人们更容易听到和注意到。
2、蜂鸣器分类
有源蜂鸣器(Active Buzzer):有源蜂鸣器内部集成驱动电路,可以直接连接到电源上,发出固定频率的声音。通常需要外部提供一定的工作电压才能正常工作。
无源蜂鸣器(Passive Buzzer):无源蜂鸣器需要外部提供频率信号才能产生声音。它相对简单,没有驱动电路,只需要提供适当的频率信号,蜂鸣器就会发出对应频率的声音。
有源蜂鸣器一般有贴纸,无源的没有。无源蜂鸣器上面有个+号,上图为无源蜂鸣器,通过改变频率可以发出特殊的声音
3、与树莓派连接
VCC:接树莓派的 3.3V 输出
GND:接树莓派的 Ground(地)
DQ:接树莓派的 GPIO21(BOARD 物理引脚编号40)
本文蜂鸣器与继电器内容比较简单,关于编号我这边多写一点,树莓派4B开发板编号比较多,理一下。C编程中使用的是wPi编号。Python中有两种编号,一种是BOARD对应功能引脚图的Physical编号。另一种是BCM,对应引脚图的BCM。
4、控制蜂鸣器鸣叫时间代码
import RPi.GPIO as GPIO
import time
beeper = 40
def Beeper_init():
global beeper
# 指定编号规则为BOARD
GPIO.setmode(GPIO.BOARD)
# 将第40个引脚设置为输出模式
GPIO.setup(beeper, GPIO.OUT)
def beep(seconds):
Beeper_init()
# 根据模块高低电平触发条件调正输出信号
GPIO.output(beeper, GPIO.LOW)
time.sleep(seconds)
GPIO.output(beeper, GPIO.HIGH)
def beepAction(secs, sleepsecs, times):
for i in range(times):
beep(secs)
time.sleep(sleepsecs)
def main():
# (鸣叫时间,停顿间隔时间,总时长)
beepAction(0.1,0.2,15)
# 结束进程,释放GPIO引脚
GPIO.cleanup()
# 程序入口
if __name__ == '__main__':
main()
本代码Python结构应该比较规范了,前面的代码主要实现功能,很多细节没有规范。
(1)Python代码文件要有个程序入口,if __name__ == '__main__': 这样在其他文件调用该文件的函数时,if __name__ == '__main__': 后面的内容不会被执行。否则,凡是可以执行的部分将运行。
(2)如果多个函数都需要同一个变量,可以将变量定义为全局变量,定义时不能同时赋值,分开。
(3)本程序的目的是蜂蜜器响0.1S,间隔0.2S,响15次。
5、蜂鸣器播放音乐
import RPi.GPIO as GPIO
import time
Buzzer = 40
# 定义频率
CL = [0, 131, 147, 165, 175, 196, 211, 248] # Frequency of Low C notes
CM = [0, 330, 350, 393, 441, 495, 556, 624] # Frequency of Middle C notes
CH = [0, 525, 589, 661, 700, 786, 882, 990] # Frequency of High C notes
song_1 = [ CM[3], CM[5], CM[6], CM[3], CM[2], CM[3], CM[5], CM[6], # Notes of song1
CH[1], CM[6], CM[5], CM[1], CM[3], CM[2], CM[2], CM[3],
CM[5], CM[2], CM[3], CM[3], CL[6], CL[6], CL[6], CM[1],
CM[2], CM[3], CM[2], CL[7], CL[6], CM[1], CL[5] ]
beat_1 = [ 1, 1, 3, 1, 1, 3, 1, 1, # Beats of song 1, 1 means 1/8 beats
1, 1, 1, 1, 1, 1, 3, 1,
1, 3, 1, 1, 1, 1, 1, 1,
1, 2, 1, 1, 1, 1, 1, 1,
1, 1, 3 ]
song_2 = [ CM[1], CM[1], CM[1], CL[5], CM[3], CM[3], CM[3], CM[1], # Notes of song2
CM[1], CM[3], CM[5], CM[5], CM[4], CM[3], CM[2], CM[2],
CM[3], CM[4], CM[4], CM[3], CM[2], CM[3], CM[1], CM[1],
CM[3], CM[2], CL[5], CL[7], CM[2], CM[1] ]
beat_2 = [ 1, 1, 2, 2, 1, 1, 2, 2, # Beats of song 2, 1 means 1/8 beats
1, 1, 2, 2, 1, 1, 3, 1,
1, 2, 2, 1, 1, 2, 2, 1,
1, 2, 2, 1, 1, 3 ]
song_3 = [ CM[1],CM[1],CM[5],CM[5],CM[6],CM[6],CM[5],CM[4],CM[4],CM[3],
CM[3],CM[2],CM[2],CM[1],CM[5],CM[5],CM[4],CM[4],CM[3],CM[3],
CM[2],CM[5],CM[5],CM[4],CM[4],CM[3],CM[3],CM[2],CM[1],CM[1],
CM[5],CM[5],CM[6],CM[6],CM[5],CM[4],CM[4],CM[3],CM[3],CM[2],
CM[2],CM[1],]
beat_3 = [ 0.5,0.5,0.5,0.5,0.5,0.5,1,0.5,0.5,0.5,0.5,0.5,0.5,1,0.5,0.5,0.5,0.5,0.5,0.5,1,
0.5,0.5,0.5,0.5,0.5,0.5,1,0.5,0.5,0.5,0.5,0.5,0.5,1,0.5,0.5,0.5,0.5,0.5,0.5,1,]
def setup():
"""初始化"""
# 指定编号规则为BOARD
GPIO.setmode(GPIO.BOARD)
# 将第40个引脚设置为输出模式
GPIO.setup(Buzzer, GPIO.OUT)
global Buzz
# 在第8个引脚上创建一个频率为440HZ的PWM实例
Buzz = GPIO.PWM(Buzzer, 440)
# 按50%工作定额启动蜂鸣器引脚
Buzz.start(50)
def loop():
"""循环"""
while True:
print('Playing song 1...\n')
for i in range(1, len(song_1)): # Play song 1
Buzz.ChangeFrequency(song_1[i]) # Change the frequency along the song note
time.sleep(beat_1[i] * 0.5) # delay a note for beat * 0.5s
time.sleep(1) # Wait a second for next song.
print('Playing song 2...\n')
for i in range(1, len(song_2)): # Play song 1
Buzz.ChangeFrequency(song_2[i]) # Change the frequency along the song note
time.sleep(beat_2[i] * 0.5) # delay a note for beat * 0.5s
print('Playing song 3...\n')
for i in range(1, len(song_3)):
Buzz.ChangeFrequency(song_3[i])
# 延迟一个节拍* 0.2秒的音符
time.sleep(beat_3[i])
def destory():
"""释放资源"""
Buzz.stop()
GPIO.output(Buzzer, 1)
GPIO.cleanup()
if __name__ == '__main__':
setup()
try:
loop()
except KeyboardInterrupt:
destory()
通过PWM改变输出频率,从而产生不同的方波驱动蜂鸣器。但是音乐效果不行啊,我只能听出来第二首歌是新年好。