嵌入式人工智能(11-基于树莓派4B的蜂鸣器)

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改变输出频率,从而产生不同的方波驱动蜂鸣器。但是音乐效果不行啊,我只能听出来第二首歌是新年好。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值