14244| 21
|
[MP动手做] MicroPython动手做(19)——掌控板之蜂鸣器与音乐 |
1、蜂鸣器 是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。蜂鸣器在电路中用字母“H”或“HA”(旧标准用“FM”、“ZZG”、“LB”、“JD”等)表示。 电压式蜂鸣器 压电式蜂鸣器主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成。有的压电式蜂鸣器外壳上还装有发光二极管。多谐振荡器由晶体管或集成电路构成。当接通电源后(1.5~15V直流工作电压),多谐振荡器起振,输出100~500HZ的音频信号,阻抗匹配器推动压电蜂鸣片发声。压电蜂鸣片由锆钛酸铅或铌镁酸铅压电陶瓷材料制成。在陶瓷片的两面镀上银电极,经极化和老化处理后,再与黄铜片或不锈钢片粘在一起。 |
2、有源蜂鸣器和无源蜂鸣器 有源蜂鸣器直接接上额定电源(新的蜂鸣器在标签上都有注明)就可连续发声;而无源蜂鸣器则和电磁扬声器一样,需要接在音频输出电路中才能发声。有源蜂鸣器与无源蜂鸣器的区别:这里的“源”不是指电源,而是指震荡源。 也就是说,有源蜂鸣器内部带震荡源,所以只要一通电就会叫。有源蜂鸣器往往比无源的贵,就是因为里面多个震荡电路。有源蜂鸣器的优点是:程序控制方便。 而无源内部不带震荡源,所以如果用直流信号无法令其鸣叫。必须用2K-5K的方波去驱动它。无源蜂鸣器的优点是: 1. 便宜 2. 声音频率可控,可以做出“多来米发索拉西”的效果 3. 在一些特例中,可以和LED复用一个控制口 |
4、光电火灾报警器 [mw_shl_code=applescript,false]#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() [/mw_shl_code] |
5、持续变调警笛声(磁感应触发) [mw_shl_code=applescript,false]#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[1] = (int(0), int(153), int(0)) rgb.write() time.sleep_ms(1) music.stop() [/mw_shl_code] 可以通过频率设置来制作一些非音符的音调。 例如,创建警笛效果。使用 music.pitch 方法,它需要一个频率。 其中range函数用于生成数值范围。这些数字用于定义音调的高低。 range函数有三个参数,分别是起始值,结束值和步长。因此,range的第一次使用是“以16的步长创建880到1760之间的数字范围”; 第二个次是“以-16”的步长创建1760到880之间的一系列值,持续频率为50毫秒。因此获得像警报器一样在频率上升和下降的频率范围而制作出警笛效果。 |
音乐控制类指令 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) 是[0, 1, 2, 3, 4]没有5 step - 步长,默认为1,例如:range(0, 5) 等价于 range(0, 5, 1) |
6、按键A、B来控制蜂鸣器播放ENTERTAIER,OLED显示歌曲名 [mw_shl_code=applescript,false]#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[1] = (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[1] = (int(255), int(0), int(0)) rgb.write() time.sleep_ms(1) music.stop() time.sleep(1)[/mw_shl_code] |
音乐控制类指令之二 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引脚 |
7、触摸按键点播六首曲子 [mw_shl_code=python,false]#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()[/mw_shl_code] |
掌控板有很多内置的旋律,完整的清单如下: 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更换为想要播放的旋律即可。 |
[mw_shl_code=python,false]#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);[/mw_shl_code] |
© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed