MicroPython动手做(19)——掌控板之蜂鸣器与音乐
掌控板板载无源蜂鸣器
其声音主要是通过高低不同的脉冲信号来控制而产生。声音频率可控,频率不同,发出的音调就不一样,从而可以发出不同的声音,还可以做出“Do、Re、Mi、Fa、So、La、Si”的效果。
1、蜂鸣器
是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。蜂鸣器在电路中用字母“H”或“HA”(旧标准用“FM”、“ZZG”、“LB”、“JD”等)表示。
电压式蜂鸣器 压电式蜂鸣器主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成。有的压电式蜂鸣器外壳上还装有发光二极管。多谐振荡器由晶体管或集成电路构成。当接通电源后(1.5~15V直流工作电压),多谐振荡器起振,输出100~500HZ的音频信号,阻抗匹配器推动压电蜂鸣片发声。压电蜂鸣片由锆钛酸铅或铌镁酸铅压电陶瓷材料制成。在陶瓷片的两面镀上银电极,经极化和老化处理后,再与黄铜片或不锈钢片粘在一起。
2、有源蜂鸣器和无源蜂鸣器
有源蜂鸣器直接接上额定电源(新的蜂鸣器在标签上都有注明)就可连续发声;而无源蜂鸣器则和电磁扬声器一样,需要接在音频输出电路中才能发声。有源蜂鸣器与无源蜂鸣器的区别:这里的“源”不是指电源,而是指震荡源。
也就是说,有源蜂鸣器内部带震荡源,所以只要一通电就会叫。有源蜂鸣器往往比无源的贵,就是因为里面多个震荡电路。有源蜂鸣器的优点是:程序控制方便。
而无源内部不带震荡源,所以如果用直流信号无法令其鸣叫。必须用2K-5K的方波去驱动它。无源蜂鸣器的优点是:
1. 便宜
2. 声音频率可控,可以做出“多来米发索拉西”的效果
3. 在一些特例中,可以和LED复用一个控制口
3、最简单的警报器
#MicroPython动手做(19)——掌控板之蜂鸣器与音乐
#最简单的警报器
from mpython import *
import music
import time
while True:
music.pitch(784, 500)
time.sleep_ms(100)
mPython 图形编程
4、光电火灾报警器
#MicroPython动手做(19)——掌控板之蜂鸣器与音乐
#光电火灾报警器
from mpython import *
import time
import music
while True:
if light.read() > 3000:
rgb.fill((int(255), int(0), int(0)))
rgb.write()
time.sleep_ms(1)
oled.fill(0)
oled.DispChar('火警! 火警!', 35, 22, 1)
oled.show()
music.pitch(698, 500)
music.pitch(988, 500)
else:
rgb.fill((int(0), int(153), int(0)))
rgb.write()
time.sleep_ms(1)
oled.fill(0)
oled.DispChar('小心火烛!', 38, 22, 1)
oled.show()
music.stop()
mPython 图形编程
5、持续变调警笛声(磁感应触发)
#MicroPython动手做(19)——掌控板之蜂鸣器与音乐
#持续变调警笛声(磁感应触发)
from mpython import *
import time
import music
while True:
oled.fill(0)
oled.DispChar('磁力报警', 0, 0, 1)
oled.DispChar((str(magnetic.get_field_strength())), 0, 16, 1)
oled.show()
magnetic.peeling()
if magnetic.get_field_strength() > 3:
rgb.fill((int(255), int(0), int(0)))
rgb.write()
time.sleep_ms(1)
for freq in range(880, 1760, 16):
music.pitch(freq, 50)
for freq in range(1760, 880, 16):
music.pitch(freq, 50)
else:
rgb.fill( (0, 0, 0) )
rgb.write()
time.sleep_ms(1)
rgb = (int(0), int(153), int(0))
rgb.write()
time.sleep_ms(1)
music.stop()
可以通过频率设置来制作一些非音符的音调。 例如,创建警笛效果。使用 music.pitch 方法,它需要一个频率。 其中range函数用于生成数值范围。这些数字用于定义音调的高低。 range函数有三个参数,分别是起始值,结束值和步长。因此,range的第一次使用是“以16的步长创建880到1760之间的数字范围”; 第二个次是“以-16”的步长创建1760到880之间的一系列值,持续频率为50毫秒。因此获得像警报器一样在频率上升和下降的频率范围而制作出警笛效果。
mPython 图形编程
音乐控制类指令
music.pitch()
描述: 播放一定时长的频率
music.pitch(frequency, duration=-1, pin=6, wait=True)
frequency - 频率
duration - 毫秒数,如果为负,则连续播放频率,直到阻塞或者被中断,或者在后台呼叫的情况下,设置或调用新频率stop
pin - 默认是掌控板的P6引脚,一次只能在一个引脚上播放频率
wait - 阻塞,如果为 True 则阻塞,反之则不
range()
描述: 创建一个整数列表,一般用在 for 循环中
range(start, stop[, step])
start - 计数从 start 开始,默认是从 0 开始,例如range(5)等价于range(0, 5)
stop - 计数到 stop 结束,但不包括 stop,例如:range(0, 5) 是没有5
step - 步长,默认为1,例如:range(0, 5) 等价于 range(0, 5, 1)
6、按键A、B来控制蜂鸣器播放ENTERTAIER,OLED显示歌曲名
#MicroPython动手做(19)——掌控板之蜂鸣器与音乐
#按键A、B来控制蜂鸣器播放ENTERTAIER,OLED显示歌曲名
from mpython import *
import time
import music
while True:
rgb.fill( (0, 0, 0) )
rgb.write()
time.sleep_ms(1)
if button_a.value() == 0:
rgb = (int(0), int(153), int(0))
rgb.write()
time.sleep_ms(1)
oled.fill(0)
oled.DispChar('播放:ENTERTAIER', 0, 16, 1)
oled.show()
music.play(music.ENTERTAINER, wait=True, loop=False)
if button_b.value() == 0:
oled.fill(0)
oled.show()
rgb = (int(255), int(0), int(0))
rgb.write()
time.sleep_ms(1)
music.stop()
time.sleep(1)
音乐控制类指令之二
music.play()
描述: 播放音乐
music.play(music, pin=6, wait=True, loop=False)
music - 内置音乐,如music.PYTHON;音符,如’c1:4’;音符列表,如[‘r4:2’, ‘g’, ‘g’, ‘g’, ‘eb:8’, ‘r:2’, ‘f’, ‘f’, ‘f’, ‘d:8’]
pin - 默认是掌控板的P6引脚
wait - 阻塞,如果为 True 则阻塞,反之则不
loop - 如果 loop 设置为 True ,则重复调整直到stop被调用或阻塞调用被中断
music.set_tempo()
描述: 设置播放节拍
music.set_tempo(ticks=4, bpm=120)
ticks - 一定数量的ticks(整数)构成单个节拍
bpm - 每分钟节拍数
music.get_tempo()
描述: 获取当前速度作为整数元组: (ticks, bpm)
music.reset()
描述: 以下列方式重置以下属性的状态
ticks = 4
bpm = 120
duration = 4
octave = 4
music.stop()
描述: 停止给定引脚上的所有音乐播放
music.stop(pin=6)
pin - 默认是掌控板的P6引脚
mPython 图形编程
7、触摸按键点播六首曲子
#MicroPython动手做(19)——掌控板之蜂鸣器与音乐
# 触摸按键点播六首曲子
from mpython import *
import time
import music
from machine import Timer
def on_button_a_down(_):
time.sleep_ms(10)
if button_a.value() == 1: return
music.stop()
_status_p = _status_y = _status_t = _status_h = _status_o = _status_n = 0
def on_touchpad_P_pressed():pass
def on_touchpad_P_unpressed():pass
def on_touchpad_Y_pressed():pass
def on_touchpad_Y_unpressed():pass
def on_touchpad_T_pressed():pass
def on_touchpad_T_unpressed():pass
def on_touchpad_H_pressed():pass
def on_touchpad_H_unpressed():pass
def on_touchpad_O_pressed():pass
def on_touchpad_O_unpressed():pass
def on_touchpad_N_pressed():pass
def on_touchpad_N_unpressed():pass
tim12 = Timer(12)
def timer12_tick(_):
global _status_p, _status_y, _status_t, _status_h, _status_o, _status_n
try:
touchPad_P.read();pass
except:
return
if touchPad_P.read() < 400:
if 1 != _status_p:_status_p = 1;on_touchpad_P_pressed()
elif 0 != _status_p:_status_p = 0;on_touchpad_P_unpressed()
if touchPad_Y.read() < 400:
if 1 != _status_y:_status_y = 1;on_touchpad_Y_pressed()
elif 0 != _status_y:_status_y = 0;on_touchpad_Y_unpressed()
if touchPad_T.read() < 400:
if 1 != _status_t:_status_t = 1;on_touchpad_T_pressed()
elif 0 != _status_t:_status_t = 0;on_touchpad_T_unpressed()
if touchPad_H.read() < 400:
if 1 != _status_h:_status_h = 1;on_touchpad_H_pressed()
elif 0 != _status_h:_status_h = 0;on_touchpad_H_unpressed()
if touchPad_O.read() < 400:
if 1 != _status_o:_status_o = 1;on_touchpad_O_pressed()
elif 0 != _status_o:_status_o = 0;on_touchpad_O_unpressed()
if touchPad_N.read() < 400:
if 1 != _status_n:_status_n = 1;on_touchpad_N_pressed()
elif 0 != _status_n:_status_n = 0;on_touchpad_N_unpressed()
tim12.init(period=100, mode=Timer.PERIODIC, callback=timer12_tick)
def on_touchpad_P_pressed():
music.play(music.DONG_FANG_HONG, wait=False, loop=False)
def on_touchpad_Y_pressed():
music.play(music.BIRTHDAY, wait=False, loop=False)
def on_touchpad_T_pressed():
music.play(music.MO_LI_HUA, wait=False, loop=False)
def on_touchpad_H_pressed():
music.play(music.ODE, wait=False, loop=False)
def on_touchpad_O_pressed():
music.play(music.PRELUDE, wait=False, loop=False)
def on_touchpad_N_pressed():
music.play(music.CAI_YUN_ZHUI_YUE, wait=False, loop=False)
button_a.irq(trigger=Pin.IRQ_FALLING, handler=on_button_a_down)
while True:
oled.fill(0)
oled.DispChar("A键:停止", 35, 0, 1)
oled.DispChar("P:东方红Y:生日快乐", 6, 20, 1)
oled.DispChar("T:茉莉花H:欢乐颂", 11, 35, 1)
oled.DispChar("O:婚宴 N:彩云追月", 13, 50, 1)
oled.show()
mPython X 图形编程
视频:触摸按键点播六首曲子
https://v.youku.com/v_show/id_XNDY1Mzc0MTc0OA==.html?spm=a2h0c.8166622.PhoneSokuUgc_1.dtitle
https://v.youku.com/v_show/id_XNDY1Mzc0MTc0OA==.html?spm=a2h0c.8166622.PhoneSokuUgc_1.dtitle
掌控板有很多内置的旋律,完整的清单如下:
music.DADADADUM
music.ENTERTAINER
music.PRELUDE
music.ODE
music.NYAN
music.RINGTONE
music.FUNK
music.BLUES
music.BIRTHDAY
music.WEDDING
music.FUNERAL
music.PUNCHLINE
music.PYTHON
music.BADDY
music.CHASE
music.BA_DING
music.WAWAWAWAA
music.JUMP_UP
music.JUMP_DOWN
music.POWER_UP
music.POWER_DOWN
GE_CHANG_ZU_GUO - 歌唱祖国
DONG_FANG_HONG - 东方红
CAI_YUN_ZHUI_YUE - 彩云追月
ZOU_JIN_XIN_SHI_DAI - 走进新时代
MO_LI_HUA - 茉莉花
YI_MENG_SHAN_XIAO_DIAO - 沂蒙山小调
我们可以播放一些内置旋律:
import music
music.play(music.BIRTHDAY)
提示
music.BIRTHDAY指内置旋律的名称,如若播放其它旋律,只需把music.BIRTHDAY更换为想要播放的旋律即可。
8、自编乐谱——生日快乐
我们可以通过设置音调来自编乐谱。
每个音符都有一个名字(比如C#或F),一个八度和一个持续时间。八度用数字表示〜0表示最低八度,4表示中央C,8表示您需要的高度。持续时间也表示为数字。 持续时间的值越高,持续时间越长。例如,持续时间4将持续两倍于持续时间2(依此类推)。 每个音符都表示为一串字符,如下所示:
NOTE[:duration]
例如,C4:4指的是八度音阶4中的音符“C”,持续4个音阶。如果使用音符名称R,则将其视为休息(静音)。
#MicroPython动手做(19)——掌控板之蜂鸣器与音乐
# 自编乐谱——生日快乐
from mpython import *
import music
while True:
oled.fill(0)
oled.DispChar(" 编曲:生日快乐", 0, (2-1)*16, 1)
oled.show()
music.pitch(392, 250);
music.pitch(392, 250);
music.pitch(440, 500);
music.pitch(392, 500);
music.pitch(523, 500);
music.pitch(494, 500);
music.pitch(0, 500);
music.pitch(392, 250);
music.pitch(392, 250);
music.pitch(440, 500);
music.pitch(392, 500);
music.pitch(587, 500);
music.pitch(523, 1000);
music.pitch(392, 250);
music.pitch(392, 250);
music.pitch(784, 500);
music.pitch(659, 500);
music.pitch(523, 500);
music.pitch(494, 500);
music.pitch(440, 1000);
music.pitch(440, 500);
music.pitch(0, 500);
music.pitch(698, 250);
music.pitch(698, 250);
music.pitch(659, 500);
music.pitch(523, 500);
music.pitch(587, 500);
music.pitch(523, 1000);
Mind+ 图形编程
页:
[1]
2