4、驱动蜂鸣器实验
About 4 min
例程代码
from machine import Timer, PWM
import time
from fpioa_manager import fm
from maix import GPIO
# 创建定时器 0 的通道 0,并设置为 PWM 模式
tim = Timer(Timer.TIMER0, Timer.CHANNEL0, mode=Timer.MODE_PWM)
# 配置 PWM ,设置频率为 500,初始占空比为 100,引脚为 9
ch = PWM(tim, freq=500, duty=100, pin=9)
# CanMV 开发板引脚配置
fm.register(11, fm.fpioa.GPIOHS11, force=True)
fm.register(12, fm.fpioa.GPIOHS12, force=True)
fm.register(13, fm.fpioa.GPIOHS13, force=True)
fm.register(16, fm.fpioa.GPIOHS16, force=True)
# 配置引脚为输入
key1 = GPIO(GPIO.GPIOHS11, GPIO.IN)
key2 = GPIO(GPIO.GPIOHS12, GPIO.IN)
key3 = GPIO(GPIO.GPIOHS13, GPIO.IN)
key4 = GPIO(GPIO.GPIOHS16, GPIO.IN)
# 定义四种不同的声音频率
freq1 = 500
freq2 = 1000
freq3 = 1500
freq4 = 2000
def play_sound(frequency):
ch.freq(frequency)
ch.duty(10) # 调整占空比以控制音量
while True:
# 检查按键 1 是否按下
if not key1.value():
play_sound(freq1)
time.sleep_ms(100) # 适当延迟,避免频繁检测
# 检查按键 2 是否按下
elif not key2.value():
play_sound(freq2)
time.sleep_ms(100) # 适当延迟,避免频繁检测
# 检查按键 3 是否按下
elif not key3.value():
play_sound(freq3)
time.sleep_ms(100) # 适当延迟,避免频繁检测
# 检查按键 4 是否按下
elif not key4.value():
play_sound(freq4)
time.sleep_ms(100) # 适当延迟,避免频繁检测
实验准备
- 通过usb线将K210也与电脑连接。
- 打开CanMV IDE,IDE连接K210,执行上面的例程代码。
实验结果
- 运行之后,摁下K210顶部四个按键中的任意一个,K210会持续发出指定的声音。四个按键对应不同声音。结束程序请摁一下复位键。
例程代码讲解
- 导入必要的模块。其中Timer 和 PWM 来自 machine 模块,用于创建定时器并配置脉宽调制(PWM)功能,PWM 常用于控制电机转速、调节灯光亮度、生成音频信号等场景,通过改变信号的占空比来实现不同的控制效果。
from machine import Timer, PWM
import time
from fpioa_manager import fm
from maix import GPIO
- 创建定时器和配置 PWM。通过 Timer 类创建了一个定时器对象 tim。这里指定了使用定时器 TIMER0 的 CHANNEL0 通道,并将其模式设置为 MODE_PWM,即脉宽调制模式。这个定时器将用于生成具有特定频率和占空比的 PWM 信号。使用创建好的定时器对象 tim 来创建一个 PWM 对象 ch。在创建 PWM 对象时,设置了频率为 500Hz,初始占空比为 100%(占空比表示高电平时间在一个周期内所占的比例),并且指定了该 PWM 信号输出到开发板的引脚 9。这个 PWM 信号后续可用于驱动一些需要模拟信号控制的设备,比如蜂鸣器发出声音等。
tim = Timer(Timer.TIMER0, Timer.CHANNEL0, mode=Timer.MODE_PWM)
ch = PWM(tim, freq=500, duty=100, pin=9)
- 开发板引脚配置。此处与按键实验一致就不过多介绍了。
fm.register(11, fm.fpioa.GPIOHS11, force=True)
fm.register(12, fm.fpioa.GPIOHS12, force=True)
fm.register(13, fm.fpioa.GPIOHS13, force=True)
fm.register(16, fm.fpioa.GPIOHS16, force=True)
key1 = GPIO(GPIO.GPIOHS11, GPIO.IN)
key2 = GPIO(GPIO.GPIOHS12, GPIO.IN)
key3 = GPIO(GPIO.GPIOHS13, GPIO.IN)
key4 = GPIO(GPIO.GPIOHS16, GPIO.IN)
- 定义了四个变量 freq1、freq2、freq3 和 freq4,分别用来表示四种不同的声音频率值,单位为 Hz。这些频率值后续将用于改变 PWM 信号的频率,从而使连接到 PWM 输出引脚(这里是引脚 9)的设备(比如蜂鸣器)发出不同频率的声音,实现类似播放不同音调声音的效果。
freq1 = 500
freq2 = 1000
freq3 = 1500
freq4 = 2000
- 定义了一个函数 play_sound,它接受一个参数 frequency,用于指定要播放的声音频率。在函数内部,首先通过 ch.freq(frequency) 来设置之前创建的 PWM 对象 ch 的频率为传入的 frequency 值,这样就可以改变输出到引脚 9 的 PWM 信号的频率,进而使连接的设备发出对应频率的声音。然后,通过 ch.duty(10) 将 PWM 信号的占空比设置为 10%,占空比的改变可以在一定程度上控制声音的音量大小,这里将占空比降低到 10% 可能是为了让发出的声音音量适中,避免过大或过小。
def play_sound(frequency):
ch.freq(frequency)
ch.duty(10)
- 进入一个无限循环 while True,在循环内部不断地检测四个按键(通过 key1.value()、key2.value()、key3.value() 和 key4.value() 来获取对应按键引脚的电平值)是否被按下。
当某个按键被按下时(比如按键 1 被按下,此时 key1.value() 返回 False,因为按键按下时通常对应引脚电平为低电平),就会调用 play_sound 函数并传入对应的声音频率值(如按键 1 按下时传入 freq1),这样就会使连接到 PWM 输出引脚的设备(如蜂鸣器)发出对应频率的声音。
- 进入一个无限循环 while True,在循环内部不断地检测四个按键(通过 key1.value()、key2.value()、key3.value() 和 key4.value() 来获取对应按键引脚的电平值)是否被按下。
while True:
# 检查按键1是否按下
if not key1.value():
play_sound(freq1)
time.sleep_ms(100)
# 检查按键2是否按下
elif not key2.value():
play_sound(freq2)
time.sleep_ms(100)
# 检查按键3是否按下
elif not key3.value():
play_sound(freq3)
time.sleep_ms(100)
# 检查按键4是否按下
elif not key4.value():
play_sound(freq4)
time.sleep_ms(100)