Arduino基础入门篇08—播放音乐

本文介绍了电子产品中的发声器件——蜂鸣器,包括有源和无源两种类型,并通过实例演示了如何使用Arduino UnoR3开发板控制蜂鸣器播放音乐,具体展示了控制有源蜂鸣器发出固定频率声音及使用无源蜂鸣器播放《葫芦娃》的过程。

本篇介绍电子产品中的发声器件—蜂鸣器,通过控制蜂鸣器播放「葫芦娃」,带你回归美好童年。

1. 了解蜂鸣器

蜂鸣器是一种电子发声元器件,可以发出"beep"的声音。采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。

蜂鸣器分为有源蜂鸣器和无源蜂鸣器两种。

  • 有源蜂鸣器: 内部带有震荡源,只要一通电就会发出固定频率的声音。

有源蜂鸣器

  • 无源蜂鸣器:内部不带震荡源,需要使用2KHz到5KHz的脉冲信号驱动发声,声音频率可变。

无源蜂鸣器

从外观上来看两种蜂鸣器形状相似,有源蜂鸣器底部有密封,无源蜂鸣器底部可看到电路板。两种蜂鸣器都标注有正负极。

2. 实验材料

  • Uno R3开发板
  • 配套USB数据线
  • 面包板及配套连接线
  • 有源蜂鸣器
  • 无源蜂鸣器

3. 实验步骤

  1. 根据原理图搭建电路。

    蜂鸣器正极接开发板数字引脚8,负极接开发板GND,连接非常简单。

    电路原理图如下图所示:

电路原理图

实物连接图如下图所示:
实物连接图

  1. 新建sketch,拷贝如下代码替换自动生成的代码并进行保存。
/*
 * BUZZER1
 * 有源蜂鸣器控制
 */

int buzzer = 8;//设置控制蜂鸣器的数字IO脚
void setup()
{
  pinMode(buzzer, OUTPUT); //设置数字IO脚模式,OUTPUT为输出
}
void loop()
{
  digitalWrite(buzzer, HIGH); //发声音
  delay(300);//延时300ms
  digitalWrite(buzzer, LOW); //不发声音
  delay(300);//延时300ms
}
  1. 连接开发板,设置好对应端口号和开发板类型,进行程序下载。

    程序下载

  2. 下载后有源蜂鸣器发出声音频率固定的声音。

  3. 将有源蜂鸣器替换成无源蜂鸣器,拷贝如下代码进行保存并下载。

/*
   BUZZER2
   使用无源蜂鸣器播放《葫芦娃》
*/

//对应音符和频率值
#define NOTE_D0 -1
#define NOTE_D1 294
#define NOTE_D2 330
#define NOTE_D3 350
#define NOTE_D4 393
#define NOTE_D5 441
#define NOTE_D6 495
#define NOTE_D7 556

#define NOTE_DL1 147
#define NOTE_DL2 165
#define NOTE_DL3 175
#define NOTE_DL4 196
#define NOTE_DL5 221
#define NOTE_DL6 248
#define NOTE_DL7 278

#define NOTE_DH1 589
#define NOTE_DH2 661
#define NOTE_DH3 700
#define NOTE_DH4 786
#define NOTE_DH5 882
#define NOTE_DH6 990
#define NOTE_DH7 112

#define WHOLE 1
#define HALF 0.5
#define QUARTER 0.25
#define EIGHTH 0.25
#define SIXTEENTH 0.625

//整首曲子的音符部分
int tune[] =
{
  NOTE_DH1, NOTE_D6, NOTE_D5, NOTE_D6, NOTE_D0,
  NOTE_DH1, NOTE_D6, NOTE_D5, NOTE_DH1, NOTE_D6, NOTE_D0, NOTE_D6,
  NOTE_D6, NOTE_D6, NOTE_D5, NOTE_D6, NOTE_D0, NOTE_D6,
  NOTE_DH1, NOTE_D6, NOTE_D5, NOTE_DH1, NOTE_D6, NOTE_D0,

  NOTE_D1, NOTE_D1, NOTE_D3,
  NOTE_D1, NOTE_D1, NOTE_D3, NOTE_D0,
  NOTE_D6, NOTE_D6, NOTE_D6, NOTE_D5, NOTE_D6,
  NOTE_D5, NOTE_D1, NOTE_D3, NOTE_D0,
  NOTE_DH1, NOTE_D6, NOTE_D6, NOTE_D5, NOTE_D6,
  NOTE_D5, NOTE_D1, NOTE_D2, NOTE_D0,
  NOTE_D7, NOTE_D7, NOTE_D5, NOTE_D3,
  NOTE_D5,
  NOTE_DH1, NOTE_D0, NOTE_D6, NOTE_D6, NOTE_D5, NOTE_D5, NOTE_D6, NOTE_D6,
  NOTE_D0, NOTE_D5, NOTE_D1, NOTE_D3, NOTE_D0,
  NOTE_DH1, NOTE_D0, NOTE_D6, NOTE_D6, NOTE_D5, NOTE_D5, NOTE_D6, NOTE_D6,
  NOTE_D0, NOTE_D5, NOTE_D1, NOTE_D2, NOTE_D0,
  NOTE_D3, NOTE_D3, NOTE_D1, NOTE_DL6,
  NOTE_D1,
  NOTE_D3, NOTE_D5, NOTE_D6, NOTE_D6,
  NOTE_D3, NOTE_D5, NOTE_D6, NOTE_D6,
  NOTE_DH1, NOTE_D0, NOTE_D7, NOTE_D5,
  NOTE_D6,
};

//曲子的节拍,即音符持续时间
float duration[] =
{
  1, 1, 0.5, 0.5, 1,
  0.5, 0.5, 0.5, 0.5, 1, 0.5, 0.5,
  0.5, 1, 0.5, 1, 0.5, 0.5,
  0.5, 0.5, 0.5, 0.5, 1, 1,

  1, 1, 1 + 1,
  0.5, 1, 1 + 0.5, 1,
  1, 1, 0.5, 0.5, 1,
  0.5, 1, 1 + 0.5, 1,
  0.5, 0.5, 0.5, 0.5, 1 + 1,
  0.5, 1, 1 + 0.5, 1,
  1 + 1, 0.5, 0.5, 1,
  1 + 1 + 1 + 1,
  0.5, 0.5, 0.5 + 0.25, 0.25, 0.5 + 0.25, 0.25, 0.5 + 0.25, 0.25,
  0.5, 1, 0.5, 1, 1,
  0.5, 0.5, 0.5 + 0.25, 0.25, 0.5 + 0.25, 0.25, 0.5 + 0.25, 0.25,
  0.5, 1, 0.5, 1, 1,
  1 + 1, 0.5, 0.5, 1,
  1 + 1 + 1 + 1,
  0.5, 1, 0.5, 1 + 1,
  0.5, 1, 0.5, 1 + 1,
  1 + 1, 0.5, 0.5, 1,
  1 + 1 + 1 + 1
};

int length;//定义一个变量用来表示共有多少个音符
int tonePin = 8; //蜂鸣器的pin

void setup()
{
  pinMode(tonePin, OUTPUT); //设置蜂鸣器的pin为输出模式
  length = sizeof(tune) / sizeof(tune[0]); //这里用了一个sizeof函数,查出数组里有多少个音符
}

void loop()
{
  for (int x = 0; x < length; x++) //循环音符的次数
  {
    tone(tonePin, tune[x]); //依次播放tune数组元素,即每个音符
    delay(400 * duration[x]); //每个音符持续的时间,即节拍duration,400是调整时间的越大,曲子速度越慢,越小曲子速度越快
    noTone(tonePin);//停止当前音符,进入下一音符
  }
  delay(5000);//等待5秒后,循环重新开始
}
  1. 下载完毕后,无源蜂鸣器就会播放「葫芦娃」神曲了。

4. 函数介绍

tone()

  • 描述:在指定引脚产生指定频率的方波,可用于蜂鸣器或扬声器播放音调。
  • 函数原型:
    • tone(pin, frequency)
    • tone(pin, frequency, duration)
  • 参数:
    • pin:产生音调的引脚。
    • 音调频率,单位赫兹。
    • 音调持续时间(毫秒单位),此参数可选。
  • 返回值:没有

noTone()

  • 描述:停止产生方波。
  • 函数原型: noTone(pin)
  • 参数:需要停止产生音调的引脚。
  • 返回值:没有。

noTone(pin)用来停止由tone(pin, frequency)产生的音调。

5. 程序分析

有源蜂鸣器程序比较简单,通过控制数字I/O引脚输出高低电平来让有源蜂鸣器发声。

无源蜂鸣器播放「葫芦娃」程序中,定义了跟乐理相关的知识,音符需要对应频率,拍子就是每个音符播放时间。还可以根据不同简谱来演奏出不同的曲子。

更多内容,欢迎关注我的公众号。 微信扫一扫下方二维码即可关注:
扫码加入微信公众号:TonyCode

<think>好的,用户想学习Arduino基础入门知识,特别是第30篇教程。但根据提供的引用资料,目前只有上篇和基础知识篇,分别是引用1和引用2。看起来用户提到的第30篇教程可能不存在于现有资料中,或者还未被索引。 首先,我需要确认用户的需求。他们可能误以为有第30篇教程,或者在其他地方听说过这个编号。需要礼貌地指出当前资料的限制,并提供现有的资源。同时,根据引用1和引用2,可以提取相关信息来帮助用户入门。 接下来,需要按照用户的要求组织回答结构,确保清晰,分步骤解决问题。引用现有的两篇教程,特别是基础知识篇,里面提到了serial.begin、pinMode等函数,这些是Arduino编程的基础。 用户可能刚接触Arduino,所以需要解释基本概念,比如Arduino是什么,如何安装开发环境,以及基本的函数和电路连接。示例代码会很有帮助,比如点亮LED和读取按钮输入,这些都是入门的关键步骤。 最后,生成相关问题,引导用户深入学习,比如开发环境安装、函数使用、常见问题等。确保问题与基础入门相关,并基于现有引用内容。</think>根据当前可查资料,站内暂未收录完整的《Arduino基础入门教程》第30篇内容,但可基于现有资源为您梳理核心知识点并提供学习路径。以下是基础入门关键内容整理: --- ### **一、Arduino基础框架与核心函数** 1. **程序结构** ```arduino void setup() { // 初始化设置(仅执行一次) pinMode(13, OUTPUT); // 设置13号引脚为输出模式[^2] } void loop() { // 主循环(重复执行) digitalWrite(13, HIGH); // 点亮LED delay(1000); // 延时1秒 digitalWrite(13, LOW); // 关闭LED delay(1000); } ``` 2. **常用函数** - `pinMode(pin, mode)`:设置引脚模式(输入`INPUT`/输出`OUTPUT`) - `digitalWrite(pin, value)`:输出数字信号(`HIGH`/`LOW`) - `digitalRead(pin)`:读取数字输入信号 - `Serial.begin(9600)`:初始化串口通信(波特率9600)[^2] - `Serial.println(data)`:通过串口输出数据 --- ### **二、硬件连接基础** 1. **LED控制电路** - 连接方式:LED正极→电阻→Arduino引脚,负极→GND - 示例代码:通过按钮控制LED ```arduino int buttonPin = 2; int ledPin = 13; void setup() { pinMode(buttonPin, INPUT_PULLUP); pinMode(ledPin, OUTPUT); } void loop() { if (digitalRead(buttonPin) == LOW) { digitalWrite(ledPin, HIGH); // 按下按钮时点亮LED } else { digitalWrite(ledPin, LOW); } } ``` --- ### **三、学习建议** 1. **实践步骤** - 安装Arduino IDE(开发环境) - 从基础电路(LED、按钮)开始尝试 - 逐步学习模拟信号(`analogRead()`/`analogWrite()`) 2. **参考教程** - 《Arduino极速入门教程(上)》:快速上手开发流程[^1] - 《零基础入门学Arduino基础知识篇》:掌握引脚操作与串口通信 ---
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值