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

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


|

  阅读本文大概需要6分钟。

|


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

1. 了解蜂鸣器

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

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

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

Arduino基础入门篇08—播放音乐
有源蜂鸣器
  • 无源蜂鸣器:内部不带震荡源,需要使用2KHz到5KHz的脉冲信号驱动发声,声音频率可变。

Arduino基础入门篇08—播放音乐
无源蜂鸣器

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

2. 实验材料

  • Uno R3开发板

  • 配套USB数据线

  • 面包板及配套连接线

  • 有源蜂鸣器

  • 无源蜂鸣器

3. 实验步骤

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

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

    电路原理图如下图所示:

    Arduino基础入门篇08—播放音乐
    电路原理图

    实物连接图如下图所示:

    Arduino基础入门篇08—播放音乐
    实物连接图
  2. 新建sketch,拷贝如下代码替换自动生成的代码并进行保存。

     1/*
    2  *  BUZZER1
    3  *  有源蜂鸣器控制
    4  */

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

    Arduino基础入门篇08—播放音乐
    程序下载
  4. 下载后有源蜂鸣器发出声音频率固定的声音。

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

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

      5
      6//对应音符和频率值
      7#define  NOTE_D0  -1
      8#define  NOTE_D1  294
      9#define  NOTE_D2  330
    10#define  NOTE_D3  350
    11#define  NOTE_D4  393
    12#define  NOTE_D5  441
    13#define  NOTE_D6  495
    14#define  NOTE_D7  556
    15
    16#define  NOTE_DL1  147
    17#define  NOTE_DL2  165
    18#define  NOTE_DL3  175
    19#define  NOTE_DL4  196
    20#define  NOTE_DL5  221
    21#define  NOTE_DL6  248
    22#define  NOTE_DL7  278
    23
    24#define  NOTE_DH1  589
    25#define  NOTE_DH2  661
    26#define  NOTE_DH3  700
    27#define  NOTE_DH4  786
    28#define  NOTE_DH5  882
    29#define  NOTE_DH6  990
    30#define  NOTE_DH7  112
    31
    32#define  WHOLE  1
    33#define  HALF  0.5
    34#define  QUARTER  0.25
    35#define  EIGHTH  0.25
    36#define  SIXTEENTH  0.625
    37
    38//整首曲子的音符部分
    39int  tune[]  =
    40{
    41    NOTE_DH1,  NOTE_D6,  NOTE_D5,  NOTE_D6,  NOTE_D0,
    42    NOTE_DH1,  NOTE_D6,  NOTE_D5,  NOTE_DH1,  NOTE_D6,  NOTE_D0,  NOTE_D6,
    43    NOTE_D6,  NOTE_D6,  NOTE_D5,  NOTE_D6,  NOTE_D0,  NOTE_D6,
    44    NOTE_DH1,  NOTE_D6,  NOTE_D5,  NOTE_DH1,  NOTE_D6,  NOTE_D0,
    45
    46    NOTE_D1,  NOTE_D1,  NOTE_D3,
    47    NOTE_D1,  NOTE_D1,  NOTE_D3,  NOTE_D0,
    48    NOTE_D6,  NOTE_D6,  NOTE_D6,  NOTE_D5,  NOTE_D6,
    49    NOTE_D5,  NOTE_D1,  NOTE_D3,  NOTE_D0,
    50    NOTE_DH1,  NOTE_D6,  NOTE_D6,  NOTE_D5,  NOTE_D6,
    51    NOTE_D5,  NOTE_D1,  NOTE_D2,  NOTE_D0,
    52    NOTE_D7,  NOTE_D7,  NOTE_D5,  NOTE_D3,
    53    NOTE_D5,
    54    NOTE_DH1,  NOTE_D0,  NOTE_D6,  NOTE_D6,  NOTE_D5,  NOTE_D5,  NOTE_D6,  NOTE_D6,
    55    NOTE_D0,  NOTE_D5,  NOTE_D1,  NOTE_D3,  NOTE_D0,
    56    NOTE_DH1,  NOTE_D0,  NOTE_D6,  NOTE_D6,  NOTE_D5,  NOTE_D5,  NOTE_D6,  NOTE_D6,
    57    NOTE_D0,  NOTE_D5,  NOTE_D1,  NOTE_D2,  NOTE_D0,
    58    NOTE_D3,  NOTE_D3,  NOTE_D1,  NOTE_DL6,
    59    NOTE_D1,
    60    NOTE_D3,  NOTE_D5,  NOTE_D6,  NOTE_D6,
    61    NOTE_D3,  NOTE_D5,  NOTE_D6,  NOTE_D6,
    62    NOTE_DH1,  NOTE_D0,  NOTE_D7,  NOTE_D5,
    63    NOTE_D6,
    64 };
    65
    66//曲子的节拍,即音符持续时间
    67float  duration[]  =
    68{
    69    110.50.51,
    70    0.50.50.50.510.50.5,
    71    0.510.510.50.5,
    72    0.50.50.50.511,
    73
    74    111  +  1,
    75    0.511  +  0.51,
    76    110.50.51,
    77    0.511  +  0.51,
    78    0.50.50.50.51  +  1,
    79    0.511  +  0.51,
    80    1  +  10.50.51,
    81    1  +  1  +  1  +  1,
    82    0.50.50.5  +  0.250.250.5  +  0.250.250.5  +  0.250.25,
    83    0.510.511,
    84    0.50.50.5  +  0.250.250.5  +  0.250.250.5  +  0.250.25,
    85    0.510.511,
    86    1  +  10.50.51,
    87    1  +  1  +  1  +  1,
    88    0.510.51  +  1,
    89    0.510.51  +  1,
    90    1  +  10.50.51,
    91    1  +  1  +  1  +  1
    92 };
    93
    94int  length; //定义一个变量用来表示共有多少个音符
    95int  tonePin  =  8;   //蜂鸣器的pin
    96
    97void  setup()
    98
    {
    99    pinMode(tonePin,  OUTPUT);   //设置蜂鸣器的pin为输出模式
    100    length  =  sizeof(tune)  /  sizeof(tune[0]);   //这里用了一个sizeof函数,查出数组里有多少个音符
    101 }
    102
    103void  loop()
    104
    {
    105    for  (int  x  =  0;   x  <  length;   x++)  //循环音符的次数
    106    {
    107        tone(tonePin,  tune[x]);   //依次播放tune数组元素,即每个音符
    108        delay(400  *  duration[x]);   //每个音符持续的时间,即节拍duration,400是调整时间的越大,曲子速度越慢,越小曲子速度越快
    109        noTone(tonePin); //停止当前音符,进入下一音符
    110    }
    111    delay(5000); //等待5秒后,循环重新开始
    112 }
  6. 下载完毕后,无源蜂鸣器就会播放「葫芦娃」神曲了。

4. 函数介绍

tone()

  • 描述:在指定引脚产生指定频率的方波,可用于蜂鸣器或扬声器播放音调。

  • 函数原型:

    • tone(pin, frequency)

    • tone(pin, frequency, duration)

  • 参数:

    • pin:产生音调的引脚。

    • 音调频率,单位赫兹。

    • 音调持续时间(毫秒单位),此参数可选。

  • 返回值:没有

noTone()

  • 描述:停止产生方波。

  • 函数原型: noTone(pin)

  • 参数:需要停止产生音调的引脚。

  • 返回值:没有。

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

5. 程序分析

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

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

Arduino基础入门篇08—播放音乐
扫码加入微信公众号:TonyCode





原文始发于微信公众号(

TonyCode

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

|

发表评论