当前位置: 首页 > article >正文

用树莓派+Python玩转无源蜂鸣器:手把手教你编一首《欢乐颂》(代码可调)

用树莓派Python玩转无源蜂鸣器手把手教你编一首《欢乐颂》代码可调在创客圈里树莓派一直被誉为万能小板而Python则是入门门槛最低的编程语言之一。当这两者相遇再搭配上一个简单的无源蜂鸣器你就能开启一段奇妙的音乐编程之旅。不同于普通的电子实验这次我们要做的不是让蜂鸣器简单地滴滴响而是要用代码谱写完整的旋律——比如经典名曲《欢乐颂》。无源蜂鸣器之所以适合音乐创作是因为它需要外部提供方波信号才能发声。这意味着我们可以通过精确控制频率来产生不同的音高通过控制方波的持续时间来决定音符的长短。这种底层控制带来的自由度正是音乐编程的魅力所在。1. 硬件准备与基础原理1.1 所需材料清单树莓派任何型号均可推荐3B或4B无源蜂鸣器注意区分有源和无源面包板及跳线若干220Ω电阻保护电路用注意有源蜂鸣器内部自带振荡电路通电就会发声无法控制音高所以必须使用无源蜂鸣器。1.2 电路连接示意图将蜂鸣器正极通过220Ω电阻连接到树莓派的GPIO18引脚物理引脚12负极直接接地。电阻的作用是限制电流防止损坏蜂鸣器或树莓派。# 引脚连接示意图 # GPIO18 ──[220Ω]── 蜂鸣器 # GND ───────────── 蜂鸣器-1.3 无源蜂鸣器工作原理无源蜂鸣器本质上是一个电磁铁加振动膜的结构。当给线圈通以交变电流时电磁铁会产生交变磁场吸引和释放振动膜从而产生声音。声音的音高由输入方波的频率决定频率越高音调越高频率越低音调越低常见的音乐音符对应的频率如下表所示中央C调音符频率(Hz)音符频率(Hz)C4261.63G4392.00D4293.66A4440.00E4329.63B4493.88F4349.23C5523.252. Python控制蜂鸣器的基础代码2.1 安装必要库树莓派默认已安装RPi.GPIO库如果没有可以通过以下命令安装sudo apt-get update sudo apt-get install python3-rpi.gpio2.2 最简单的发声程序先让蜂鸣器发出一个固定频率的声音import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM) buzzer_pin 18 GPIO.setup(buzzer_pin, GPIO.OUT) def buzz(frequency, duration): period 1.0 / frequency delay period / 2 cycles int(duration * frequency) for i in range(cycles): GPIO.output(buzzer_pin, True) time.sleep(delay) GPIO.output(buzzer_pin, False) time.sleep(delay) try: buzz(440, 1) # 播放A4音1秒钟 finally: GPIO.cleanup()这段代码的核心是buzz()函数它通过快速切换GPIO引脚的高低电平来产生指定频率的方波。每个周期分为两部分先输出高电平等待半个周期的时间然后输出低电平再等待半个周期的时间。2.3 优化后的PWM控制使用PWM脉冲宽度调制可以简化代码并提高精度def buzz_pwm(frequency, duration): pwm GPIO.PWM(buzzer_pin, frequency) pwm.start(50) # 50%占空比 time.sleep(duration) pwm.stop()3. 从简谱到Python代码的转换3.1 《欢乐颂》简谱分析《欢乐颂》开头部分的简谱如下3 3 4 5 | 5 4 3 2 | 1 1 2 3 | 3 2 2 - |这表示的音符序列是E4 E4 F4 G4 | G4 F4 E4 D4 | C4 C4 D4 E4 | E4 D4 D4 (延长)3.2 创建音符频率映射首先建立一个字典将简谱数字映射到对应的频率notes { 1: 261.63, # C4 2: 293.66, # D4 3: 329.63, # E4 4: 349.23, # F4 5: 392.00, # G4 6: 440.00, # A4 7: 493.88, # B4 1.: 523.25 # C5 }3.3 节拍控制每个音符的持续时间由节拍决定。假设四分音符为0.5秒beats { 1: 0.5, # 四分音符 2: 0.25, # 八分音符 4: 1.0, # 二分音符 -: 0.5 # 延长符号 }4. 完整演奏《欢乐颂》4.1 将简谱转换为数据结构把《欢乐颂》前四小节转换为两个列表song [3, 3, 4, 5, 5, 4, 3, 2, 1, 1, 2, 3, 3, 2, 2, -] beat [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1]4.2 完整演奏代码结合前面的定义完整的演奏程序如下import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM) buzzer_pin 18 GPIO.setup(buzzer_pin, GPIO.OUT) notes {1:261.63, 2:293.66, 3:329.63, 4:349.23, 5:392.00, 6:440.00, 7:493.88, 1.:523.25} beats {1:0.5, 2:0.25, 4:1.0, -:0.5} song [3,3,4,5,5,4,3,2,1,1,2,3,3,2,2,-] beat [1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1] def play(): try: for i in range(len(song)): note song[i] duration beats[beat[i]] if note -: # 延长符号 time.sleep(duration) else: buzz_pwm(notes[note], duration) time.sleep(0.05) # 音符间短暂间隔 finally: GPIO.cleanup() def buzz_pwm(frequency, duration): pwm GPIO.PWM(buzzer_pin, frequency) pwm.start(50) time.sleep(duration) pwm.stop() if __name__ __main__: play()4.3 效果优化技巧调整速度修改beats字典中的值可以改变整体演奏速度添加休止符在song列表中加入0表示休止并在play函数中处理多音轨使用多线程可以模拟简单的和声效果音量控制通过改变PWM的占空比可以调节音量但无源蜂鸣器效果有限5. 扩展创作编写自己的电子音乐5.1 如何查找其他歌曲的简谱网上有很多经典歌曲的简谱资源搜索歌曲名简谱通常能找到。选择简单的曲子开始尝试比如《小星星》1 1 5 5 6 6 5 - | 4 4 3 3 2 2 1 - |《生日快乐》5 5 6 5 1 7 - | 5 5 6 5 2 1 - |5.2 简谱转换技巧将简谱转换为Python列表时可以用空格或竖线分隔小节用数字表示音符用符号表示节拍遇到连音线如5 -可以表示为[5,-]5.3 进阶项目创意音乐盒用按钮触发不同的歌曲电子琴将多个GPIO引脚连接到按键实现简单电子琴节奏游戏配合LED灯制作音乐节奏游戏物联网门铃通过网页触发不同的门铃音乐第一次成功让蜂鸣器播放出可辨认的旋律时那种成就感是难以言表的。我记得调试《欢乐颂》时因为一个节拍错误导致旋律完全走样排查了半天才发现是一个beat值设成了0.25而不是0.5。这种看似简单的项目其实蕴含着电子音乐制作的基本原理。

相关文章:

用树莓派+Python玩转无源蜂鸣器:手把手教你编一首《欢乐颂》(代码可调)

用树莓派Python玩转无源蜂鸣器:手把手教你编一首《欢乐颂》(代码可调) 在创客圈里,树莓派一直被誉为"万能小板",而Python则是入门门槛最低的编程语言之一。当这两者相遇,再搭配上一个简单的无源蜂…...

一文搞定!Robot Framework自动化测试从入门到实战(全栈)

1. Robot Framework初探:为什么选择它? 第一次接触Robot Framework(简称RF)是在五年前的一个企业测试项目中。当时团队需要快速搭建一套支持Web、API和移动端测试的自动化方案,而RF凭借其零编码门槛和全栈支持能力成为…...

R语言数据导入全指南:从CSV到SPSS的底层原理与工程实践

1. 项目概述:为什么数据导入是R语言真正的第一道门槛刚接触R的人,十有八九会在读取第一个文件时卡住。不是报错“cannot open the connection”,就是加载出来全是NA,再或者干脆卡死在进度条不动——这根本不是你手生,而…...

ComfyUI图像修复终极指南:5个高效技巧解决安装与使用难题

ComfyUI图像修复终极指南:5个高效技巧解决安装与使用难题 【免费下载链接】comfyui-inpaint-nodes Nodes for better inpainting with ComfyUI: Fooocus inpaint model for SDXL, LaMa, MAT, and various other tools for pre-filling inpaint & outpaint areas…...

轻量级规则流引擎实践:基于DAG的业务流程编排与解耦

1. 项目概述与核心价值 最近在梳理一些遗留系统的业务流程时,我又一次被那些硬编码在代码里的“if-else”逻辑链折磨得够呛。一个简单的审批流,因为业务规则的细微调整,就需要在多个服务里翻找、修改、测试,牵一发而动全身。这让我…...

告别手工账!用SAP自动记账处理采购价差与发票价差(附MIRO/MIGO操作截图)

SAP自动记账实战:采购价差与发票价差的智能处理方案 1. 采购业务中的价格差异痛点 财务部门每月最头疼的莫过于月底对账时发现采购订单价格、收货价格和发票价格三者不一致。传统手工记账模式下,财务人员需要反复核对采购订单、收货单和发票,…...

PyTorch模型保存加载避坑指南:从state_dict到checkpoint,这5种场景你都会了吗?

PyTorch模型保存加载避坑指南:从state_dict到checkpoint,这5种场景你都会了吗? 在深度学习项目的实际开发中,模型保存与加载看似简单,却隐藏着无数"坑点"。我曾见过团队因一个错误的map_location参数导致生…...

CoverM深度解析:如何高效配置PacBio HiFi宏基因组数据覆盖率分析的完整指南

CoverM深度解析:如何高效配置PacBio HiFi宏基因组数据覆盖率分析的完整指南 【免费下载链接】CoverM Read alignment statistics for metagenomics 项目地址: https://gitcode.com/gh_mirrors/co/CoverM CoverM作为一款专业的宏基因组读长覆盖率计算工具&…...

CES 2012启示录:移动互联、生态连接与硬件创新的产业转折点

1. 从CES看消费电子行业的真实脉搏:一次资深记者的现场笔记 每年一月,拉斯维加斯都会成为全球科技界的风暴眼,CES(国际消费电子展)如期而至。对于像我这样跑了几十年科技线的老记者来说,CES早已超越了“展会…...

免费LLM API实战指南:从选型到架构设计,低成本构建AI应用

1. 项目概述与核心价值 最近在折腾一些AI应用原型,或者想给现有产品加个智能对话功能,第一反应往往是去找OpenAI的API。但说实话,对于个人开发者、学生,或者只是想低成本验证想法的小团队来说,GPT-4级别的API调用费用&…...

Icarus Verilog终极指南:3分钟掌握开源Verilog仿真工具

Icarus Verilog终极指南:3分钟掌握开源Verilog仿真工具 【免费下载链接】iverilog Icarus Verilog 项目地址: https://gitcode.com/gh_mirrors/iv/iverilog 你是否正在寻找一个完全免费、跨平台的Verilog仿真解决方案?Icarus Verilog(…...

Uvicorn搭配FastAPI实战:5分钟从安装到部署一个高性能API接口

Uvicorn搭配FastAPI实战:5分钟从安装到部署一个高性能API接口 在Python生态中构建高性能API从未如此简单。当开发者需要快速搭建一个既能处理高并发请求又具备优雅代码结构的服务时,FastAPI与Uvicorn的组合正成为越来越多技术团队的首选方案。这套组合拳…...

Tetgen网格剖分结果怎么看?.node/.ele/.face文件详解与在ParaView中的可视化

Tetgen网格剖分结果解析与ParaView可视化实战指南 当你第一次运行Tetgen并看到那些.node、.ele和.face文件时,可能会感到困惑——这些看似简单的文本文件如何转化为直观的三维网格?本文将带你深入理解这些文件的内部结构,掌握网格质量评估的关…...

从Buck电路到逆变器:手把手教你理解SPWM调制的本质与STM32实现误区

从Buck电路到逆变器:手把手教你理解SPWM调制的本质与STM32实现误区 电力电子领域最迷人的地方,在于不同拓扑结构背后隐藏着相通的底层逻辑。当我第一次看到Buck电路的PWM波形与逆变器的SPWM波形同时出现在示波器上时,突然意识到:…...

VoWiFi 核心网元与信令流程全解析

1. VoWiFi技术入门:从Wi-Fi打电话的秘密 第一次用手机连Wi-Fi打电话时,我盯着信号栏的"Wi-Fi Calling"标志愣了半天——这玩意儿居然真能绕过蜂窝网络?后来才知道,这就是VoWiFi(Voice over Wi-Fi&#xff0…...

AI工程化实战:基于Python工具箱构建生产级AI服务

1. 项目概述:一个AI驱动的Python开发工具箱 最近在GitHub上看到一个挺有意思的项目,叫“antarys-ai/python”。光看名字,你可能会觉得这又是一个普通的Python库或者某个AI框架的封装。但当我深入进去,发现它的定位其实相当独特&am…...

PID控温实战:从STM32的PWM输出到加热棒,手把手教你调出稳定曲线

PID控温实战:从STM32的PWM输出到加热棒的温度控制艺术 在工业自动化、智能家居和实验室设备中,精确的温度控制一直是开发者面临的经典挑战。想象一下,当你需要将一块金属加热到200C并保持稳定,或者让培养箱维持在37C0.1C的精度时&…...

LaTeX引用中文文献总出乱码?可能是你的.bib文件编码和编译顺序没搞对(附Overleaf/VSCode解决方案)

LaTeX中文文献引用乱码全解析:从编码原理到实战修复 当你满怀期待地在LaTeX文档中插入精心整理的中文参考文献,按下编译按钮后,看到的却是令人崩溃的乱码或冰冷的[?]标记——这种经历恐怕每个中文LaTeX用户都曾遇到过。不同于英文文献引用的…...

AI智能体核心技能体系解析:从任务分解到工具调用的工程实践

1. 项目概述:从代码仓库到智能体技能库的深度解构 最近在GitHub上看到一个挺有意思的项目,叫“agent-skills”。乍一看,这名字有点抽象,但点进去之后,你会发现它其实是一个关于“智能体技能”的集合或清单。这个项目由…...

明日方舟基建自动化终极方案:Arknights-Mower 智能管理工具完全指南

明日方舟基建自动化终极方案:Arknights-Mower 智能管理工具完全指南 【免费下载链接】arknights-mower 《明日方舟》长草助手 项目地址: https://gitcode.com/gh_mirrors/ar/arknights-mower 还在为《明日方舟》中繁琐的基建管理而苦恼吗?每天需要…...

3个关键功能解锁B站缓存视频的永久保存方案

3个关键功能解锁B站缓存视频的永久保存方案 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾经历过这样的场景:精心收藏的B站…...

告别Surface“幽灵触控”:从现象溯源到一劳永逸的修复指南

1. 什么是Surface"幽灵触控"? 如果你正在使用Surface设备,突然发现屏幕某个区域莫名其妙地自动点击,或者部分触控功能完全失灵,恭喜你遇到了传说中的"幽灵触控"问题。这个现象最早在Surface Pro 4上被大量报告…...

GPU加速向量搜索实战:基于cuvs实现Faiss性能飞跃与大规模向量检索

1. 项目概述:当传统CPU计算成为瓶颈,我们如何加速向量搜索? 如果你最近在折腾大模型应用、推荐系统或者图像检索,大概率会碰到一个绕不开的核心问题:向量相似性搜索。简单来说,就是把文本、图片、音频这些非…...

网易技术岗校招通关秘籍:从需求画像到Offer收割(实战篇)

1. 网易技术岗校招需求画像解析 第一次参加大厂校招的同学,往往会被各种岗位JD绕晕。去年我带过一个浙大的学弟,他同时投了网易的Java和后端开发岗,结果发现笔试题目完全不同。后来才知道,网易不同业务线对"后端开发"的…...

终极指南:如何快速解决Windows应用程序运行库缺失问题

终极指南:如何快速解决Windows应用程序运行库缺失问题 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…...

Inter开源字体优化终极方案:提升300%性能的企业级字体部署架构

Inter开源字体优化终极方案:提升300%性能的企业级字体部署架构 【免费下载链接】inter The Inter font family 项目地址: https://gitcode.com/gh_mirrors/in/inter 在当今数字体验主导的时代,字体性能已成为影响用户体验和业务转化的关键因素。开…...

100+ RPG Maker MV/MZ插件:零代码打造专业级游戏体验的完整指南

100 RPG Maker MV/MZ插件:零代码打造专业级游戏体验的完整指南 【免费下载链接】RPGMakerMV RPGツクールMV、MZで動作するプラグインです。 项目地址: https://gitcode.com/gh_mirrors/rp/RPGMakerMV 你是否曾梦想用RPG Maker制作出媲美商业游戏的视觉效果和…...

英雄联盟Akari助手:5大核心功能解决游戏中的常见痛点

英雄联盟Akari助手:5大核心功能解决游戏中的常见痛点 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 还在为英雄联盟游戏中的繁琐操…...

不使用库函数,实现 strcpy,strcat,strcmp

文章目录 1、strcpy 原型2、strcmp 原型 1、strcpy 原型 char* strcpy(char* des, const char* source) {char* r des;assert((des ! NULL) && (source ! NULL));while((*r *source)!\0);return des; }可以自行实现: char* myStrcpy(char* dest, char* …...

从零搭建私有化大语言模型服务器:Ollama、Docker与Open WebUI全栈指南

1. 项目概述:构建你自己的私有化大语言模型服务器如果你和我一样,对把个人数据交给云端AI服务商这件事始终心存疑虑,同时又渴望拥有一个功能完整、响应迅速、且完全掌控在自己手中的AI助手,那么搭建一个本地私有化的大语言模型&am…...