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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/TonyIOT/article/details/81510521

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

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引脚输出高低电平来让有源蜂鸣器发声。

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

扫码加入微信公众号

猜你喜欢

转载自blog.csdn.net/TonyIOT/article/details/81510521