Arduino+蜂鸣器制作有趣的小音乐

2023-05-16

Arduino相关姿势

Arduino是一个开源的硬件平台,包括开发套组(开发板和相关的模块以及连线)和IDE,开发语言基于C。核心是一块8位ATmega328的处理器,这块处理器是AVR单片机系列的高档产品。Arduino提供了数字接口和模拟信号口,还有扩展口便于进行设计。开发板通电后可以产生5V和3.3V电压。

蜂鸣器

根据发声原理不同分为电压式蜂鸣器和电磁式蜂鸣器。我们使用的是电磁式蜂鸣器,接通电源后,振动膜片周期性的振动发声。需要注意的一点是,发声是在内部有电流产生磁场,使得膜片振动的一瞬间。 如果内部一直是直流电的话我们只能听到很小的一下的声音,如果需要持续的声音(就像我萌以前过生日的那种唱生日快乐歌的小玩意)应该怎么办呢?BINGO!需要一个交流的驱动电路就行。最简单的方波就可以驱动。 这里我们使用的是无源蜂鸣器, 这里的源指的是振荡源,自带BUFF的就是有源,也就是直接同直流电就可以发声,无源则需要外部送入方波信号用于驱动才行。

硬件连线

连线很简单,直接将正负极分别接入数字IO和GND就可以。如果觉得声音太大的话可以串联一个1K左右的电阻(具体取决于你的蜂鸣器额定电压)。

连线图

让蜂鸣器响起来

前面我们已经把数字IO连接到了蜂鸣器的正极,让蜂鸣器响起来只需要在数字IO上放入方波即可。

digitalWrite(buzzerPin,HIGH); //高电平
delay(100);
digitalWrite(buzzerPin,LOW);  //低电平
delay(100);

其中的100指的是发声后延时100ms。

不同的旋律

原理

如果只是这样的话,只能简单的发出警报一类的声音吧?如果要发出精确的不同频率的乐音怎么办?难道还要算?

一个人算

好吧,那我萌肯定知道不同的乐音有着不同的频率,这里贴一张乐音频率图。

音符表

在Arduino中我们使用tone()函数就可以实现发出乐音的效果,可以参考这个链接。

方法

实现音乐有两个基本的要素,第一是音符,刚才我萌已经搞定了;第二是节奏,也就是拍子,或者说音符时值。之前的delay()函数可以用于延长这个音,因此我们如果规定四分音符的时延,编写一个时延数组就可以控制延长的时间。

值得注意的是,delay()函数的参数是unsigned long,因此四分音符的时延基数不妨设置为偶数,这样其他的音符就可以减半和加倍。如果没有太多连音和更小时值的音符,那么这样做就很方便。

Code

演奏小星星大家都会啦,这里放一曲我很喜欢的CLANNAD的**《潮鸣》**的段落代码,算作这一次小项目的礼物~(~ ̄▽ ̄)~

/**
 * 使用Buzzer演奏潮鸣
 * @author Mr.Bubbles
 * 1=C
 */
#include "music_note.c" //音符表

int buzzer=3; //蜂鸣器口,PWM
int scale[]={G,A,EE,A,G,A,G,A,EE,A,G,
             A,EE,A,G,A,E,
             G,D,E,G,A,B,
             A,EE,A,G,A,G,
             A,EE,B,CC,B,CC,B,A,E,
             D,E,G,A,B,A,EE,A,G,A,
             G,A,EE,A,G,A,EE,A,G,A,
             E,G,D,E,G,A,B,A,EE,A,G,A,
             G,A,EE,B,CC,B,CC,DD,EE,AA};  //旋律
float duration[]={2,1,1,1,1,7,1,1,1,1,1,
                  1,1,1,1,3,1,
                  3,1,1,1,1,1,
                  1,1,1,1,7,1,
                  1,1,1,1,1,1,1,1,6,
                  1,1,1,1,1,1,1,1,1,7,
                  1,1,1,1,1,1,1,1,1,3,
                  1,3,1,1,1,1,1,1,1,1,1,7,
                  1,1,1,1,1,1,1,1,1,4}; //音符时值 
int len=0;  //该变量后面用于统计音符个数               
void setup() {
  pinMode(buzzer,OUTPUT);
  len=sizeof(scale)/sizeof(scale[0]);
}

void loop() {
  for(int i=0;i<len;i++){ 
    tone(buzzer,scale[i]);
    delay(250*duration[i]);
    noTone(buzzer);
    delay(100);
  }
  delay(1000);
}

Git Repository

我的Arduino地址~

Reference

  1. 关于Arduino Uno的一切(open source hardware)
  2. Arduino的tone函数
  3. 蜂鸣器输出基本音阶
  4. 用Arduino播放音乐
  5. Arduino演奏小星星
  6. 详细原理阐述,使用Arduino演奏葫芦娃
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Arduino+蜂鸣器制作有趣的小音乐 的相关文章

  • Arduino 错误:无法将参数 '1' 的 'String' 转换为 'char*' 到 'char* strtok(c​​har*, const char*)'

    我正在研究一个 arduino 分配 它分割传入的字符串并将字符串的术语放入 6 个不同的变量中 分割时的示例输入字符串有 6 个术语 我弹出以下错误 无法将参数 1 的 String 转换为 char 到 char strtok c ha
  • GSM SM5100B C M E E R R O R:4 错误

    我正在使用 Arduino 来控制 SM5100B GSM 设备 除了当我想在收到另一条短信后发送短信时 一切正常 我明白了 错误代码 确定 gt C M G S 2 5 确定 C M E E R O R 4 我处理上述收到的短信的代码 i
  • VSCode 上的 PlatformIO 未编译:collect2.exe:错误:ld 返回 1 退出状态

    我最近不得不擦拭我的计算机 在一切准备就绪并运行之后 是时候打开我之前正在处理的一些 ESP32 程序了 发现 VSCode 上的 Platform IO 将不再编译 运行编译器后 我收到以下错误 Compiling pio build e
  • android BluetoothChat 使用来自另一个类的发送接收方法

    您好 我使用 BluetoothChat 示例来与 arduino 进行通信 到目前为止 一切正常 现在我想访问 sendMessage 方法 以便能够不从主类发送数据 而是从我创建的另一个类发送数据 这是BluetoothChat jav
  • 将 Arduino RGB LED 从一种颜色渐变为另一种颜色?

    目前 我已成功让 LED 灯循环显示我选择的八种颜色 一切都工作正常 除了我想要一种更自然的感觉 并且想要从一种颜色褪色 过渡到下一种颜色 而不是让它们互相替换 到目前为止 这是我的代码 int redPin 11 int greenPin
  • 如何使用 PHP 读取串口 [重复]

    这个问题在这里已经有答案了 如何使用 php 从连接到我的服务器 运行 kali linux 的旧笔记本电脑 上的 COM 端口的 arduino 读取串行数据 以便我可以在网页上显示数据 我读过有关同一问题的其他问题 所有这些问题要么超级
  • 如何在观察者中处理具有不同状态值类型的 Observables

    首先是上下文和问题 框架代码在帖子底部 我们正在创建并实现一个 C 框架 以便在 Arduino 等环境中使用 为此 我想使用观察者模式 其中任何对传感器状态变化感兴趣的组件 Observables 可以注册自己 并且它将通过 Observ
  • Mac OS 10.9 不显示 Arduino 的 USB 调制解调器

    我正在尝试选择 dev tty usbmodem on my Arduino Lenardo设备 操作系统是Mac OSX 10 9 问题是它没有显示 我什至尝试安装FTDI http www ftdichip com Drivers VC
  • 读取串行端口 - 忽略在一定时间内写入串行端口的部分数据

    我想定期读取串行端口上的数据和Arduino 所以本质上是这样的 读一读 Wait 读一读 Wait Take etc 我面临的问题是端口将缓冲其信息 因此一旦我调用等待函数 串行端口上的数据就会开始缓冲 等待函数完成后 我尝试再次读取数据
  • Arduino I2S 正弦波

    我正在开发一个项目 我想通过组合不同的正弦波来生成 简单 声音 我使用的是 arduino mkrZero 因为它内置了 I2S 接口 并且似乎有足够的处理能力来满足我的需求 I have wired my system exactly l
  • Arduino:使用串口和软件串口与蓝牙模块

    我的目的是使用 Arduino 通过 HC 05 蓝牙模块在 PC 和 Android 设备之间建立通信 我使用 PC 和 Arduino 串行监视器 之间的 USB 通信以及 SoftwareSerial 来连接到 HC 05 我的问题是
  • Arduino从SD卡读取最后一行

    我对 Arduino 业务还很陌生 如何从 SD 卡读取最后一行 通过以下代码片段 我可以读取第一行 n 之前的所有字符 现在我想添加一个 向后 声明 或其他内容 到目前为止我的代码 include
  • 终止导致设备或资源繁忙的进程:“/dev/ttyUSB0”?

    我使用以下 Python 代码连接到我的 Arduino 板 device glob glob dev ttyUSB 0 time sleep 1 arduino serial Serial device 115200 timeout 5
  • 使用串口通过 Arduino 将多个值发送到 Raspberry

    我有一个关于 Arduino 和 Raspberry Pi 之间串行通信的问题 事实上 我想使用 Arduino 将 2 个变量发送到 Raspberry Pi 并以不同的方式使用它们 这是我的 Arduino 草图 int one 1 i
  • 为什么使用 libnfc 和 PN532 SHIELD 时“找不到 NFC 设备”

    我在 ArchLinux 上安装了 libnfc 并通过我的 Adafruit PN532 arduino SHIELD 使用它 nfc list返回消息 未找到 NFC 设备 我在 etc nfc devices d pn532 conf
  • 使用 Java 控制 Arduino

    我正在寻找一个LED http en wikipedia org wiki Light emitting diode用Java程序打开和关闭 我用 C 完成了这个项目大约 5 分钟 但用 Java 似乎更具挑战性 我让 Arduino 等待
  • SIM900 GSM/GPRS 未获得正确的 AT+CREG?回答

    我使用的是带有 IComsat SIM900 GSM GPRS 扩展板的 Arduino UNO 使用以下教程 Arduino 实时 GPS 追踪器 http www samaria me uk 2011 12 arduino live g
  • Arduino C++ 析构函数?

    我知道在Arduino中你不能使用delete 那么什么时候调用 C 类中定义的析构函数呢 同样 如果我想创建一个指向数组的指针 我必须使用malloc and free 当对象被销毁时 析构函数被调用 对于自动 堆栈上 变量 它在离开其作
  • Arduino串口数据解析

    我正在编写一个应用程序 通过蓝牙用我的 Android 手机控制我的机器人 一切都很顺利 数据得到回显和验证 但我在协议方面遇到了一些问题 特别是我希望我的机器人的轮子在我发送时转动一个命令 例如s 10 100 or s 30 10 数值
  • Arduino 错误:未命名类型?

    我已经编写了一个库 但遇到错误未命名类型的问题 我已经尝试了一切 搜索了几个小时 但没有运气 库放置在arduino sketch文件夹的 libraries 文件夹中 请帮忙 我使用的是 OSX 但 Windows 上也出现同样的问题 这

随机推荐

  • 阿里研发一面经历

    人生第一次找工作笔试 面试 xff0c 都碰上了阿里 9月暑假来了 xff0c 才开始准备找工作 xff0c 今年的宣讲来的早 所以现在有点措手不及 xff0c 只能边准备边找 废话不多了 xff0c 进入正题 笔试题 xff0c 下期再论
  • 腾讯2014校园招聘软件后台开发类笔试题

    转http www itmian4 com forum php mod 61 viewthread amp tid 61 3572
  • 2014暴风影音校招技术笔试题(长春站)

    转http www itmian4 com forum php mod 61 viewthread amp tid 61 3622 1 升序排列下列数值 xff1a 2 写出下列函数的返回值 int func int x 61 300 in
  • 计算100以内的素数的个数

    以下代码是用来计算100以内的素数的个数 xff0c 请把相应的空填上 struct prime number node int prime number prime number node next int calc prime numb
  • C语言除法运算符“/”和求余运算符“%”

    看似两个很简单的运算符 xff0c 却也真要掌握用好它也不容易 xff0c 本文作为关于此类运算符的各方面的问题的汇总 xff0c 希望对你我都有一些帮助 除法运算符 二元运算符 xff0c 具有左结合性 参与运算的量均为整型时 xff0c
  • 生成二维码之后,给二维码 上方添加文字(二)

    生完二维码之后 获取因为需求 我们需要 给二位吗上方添加 一些文字之类的提示信息 如果 座位号什么的 int fontStyle 61 1 字体风格 int font 61 24 字体大小 用来存放带有logo 43 文字的二维码图片 St
  • 冒泡排序

    include lt stdio h gt define LENGTH 8 void main int tmp number LENGTH 61 95 45 15 78 84 51 24 12 for i 61 0 i lt LENGTH
  • 金山词霸C++笔试(北邮11月23号)

    金山词霸笔试题 xff08 北邮11月23号 xff09 xff08 一 xff09 以下输出什么 xff1f char ptr 61 34 hello world 34 cout lt lt ptr h ptr指向字符串的首地址 xff0
  • 关于计算机研究和写作的链接收集

    研究相关的资源 What is Research in Computer Science 计算科学的研究是什么 xff1f 翻译 Basic Research Skills in Computer Science 计算科学的基本研究方法 R
  • 环境问题-无外接显示屏(虚拟显示屏)远程控制Ubuntu

    参考 更新 xff1a 后来向日葵推出SSH远程连接 xff0c 一个月挺便宜的 使用Ubuntu内置的vino VNC提供远程桌面访问 安装vino xff1a sudo apt install vino 配置屏幕共享 配置Ubuntu在
  • spring-boot的三种启动方式

    有段时间没有写博客了 xff0c 也在努力的从传统单机开发向分布式系统过度 xff0c 所以再次做一些笔记 xff0c 以方便日后查看 直接进入正题吧 xff0c 今天记录spring boot项目的三种启动方式 spring boot的启
  • 程序员做一辈子?

    首先 xff0c 程序员真有必要干一辈子吗 xff1f 如果你是个搬砖的 xff0c 你会考虑一辈子搬砖吗 xff1f 你肯定会想着过几年挣钱了 xff0c 买个车跑运输 xff0c 或者自己做工头 对程序员来说 xff0c 真心没有必要干
  • linux 远程桌面

    文章目录 linux 远程桌面服务端tigervnc设置VNC设置开机自启VNC设置开机自启修改防火墙配置 客户端使用MobaXterm连接 linux 远程桌面 使用tigervnc实现远程桌面 服务端 tigervnc设置 1 安装ti
  • vxWorks学习笔记

    vxWorks学习笔记 1 xff0e VxWorks开发方式 xff1a 交叉开发 xff0c 即将开发分为主机 xff08 host xff09 和目标机 xff08 target xff09 两部分 类似于dos下C语言程序的开发 合
  • android:stateNotNeeded="true"的作用

    这个属性默认情况为false xff0c 若设为true xff0c 则当Activity重新启动时不会调用onSaveInstanceState xff08 xff09 方法 xff0c 同样 xff0c onCreate xff08 x
  • 三种文件分配方式的区别

    文件分配方式分为三种 xff1a 连续分配 链接分配 索引分配 其中链接分配又分为隐式链接分配和显式链接分配 xff1b 索引分配又分为单级索引分配 两级 xff08 多级 xff09 索引分配 xff0c 混合索引分配 这里要说的是显式链
  • java 读取文件的几种方式和通过url获取文件

    public class ReadFromFile 以字节为单位读取文件 xff0c 常用于读二进制文件 xff0c 如图片 声音 影像等文件 public static void readFileByBytes String fileNa
  • C语言常见英文词汇表

    前言 今天整理资料的时候发现了大一的好玩的资料 xff0c 就放出来吧 xff01 词汇表 int integer 整性 xff08 数 xff09 auto automatic 自动的 float float 浮点 xff08 数 xff
  • WIFI安全测试之WPS(PIN)加密暴力破解

    前言 无线AP的接入验证有很多种方式 xff0c 家用无线路由器的验证方式包括OPEN WEP WPA WPA2 xff0c WPS的出现降低了接入验证的复杂度 xff0c 但是这种方式却隐含带来许多问题 同时由于很早就入手了第一批WIFI
  • Arduino+蜂鸣器制作有趣的小音乐

    Arduino相关姿势 Arduino是一个开源的硬件平台 xff0c 包括开发套组 xff08 开发板和相关的模块以及连线 xff09 和IDE 开发语言基于C 核心是一块8位ATmega328的处理器 xff0c 这块处理器是AVR单片