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

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

1. 了解蜂鸣器

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

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

  • 有源蜂鸣器: 内部带有震荡源,只要一通电就会发出固定频率的声音。
有源蜂鸣器
  • 无源蜂鸣器:内部不带震荡源,需要使用2KHz到5KHz的脉冲信号驱动发声,声音频率可变。
无源蜂鸣器

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

2. 实验材料

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

3. 实验步骤

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

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

    电路原理图如下图所示:

    电路原理图

    实物连接图如下图所示:

    实物连接图
  2. 新建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
     }
    
  3. 连接开发板,设置好对应端口号和开发板类型,进行程序下载。

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

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

     /*
        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秒后,循环重新开始
     }
    
  6. 下载完毕后,无源蜂鸣器就会播放「葫芦娃」神曲了。

4. 函数介绍

tone()

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

noTone()

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

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

5. 程序分析

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容