查看: 2087|回复: 0

【赚周年币】技术贴Week 3-Day6---Arduino 蜂鸣器实验

[复制链接]
  • TA的每日心情
    难过
    2021-2-27 22:16
  • 签到天数: 1568 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    发表于 2017-1-17 21:36:53 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 feixiang20 于 2017-1-17 21:40 编辑

    一、本次实验所需器材
    1、Arduino板
    2、无源蜂鸣器:一种一体化结构的电子讯响器,分为有源蜂鸣器与无源蜂鸣器。这里的“源”不是指电源,而是指震荡源,有源蜂鸣器内部带震荡源,所以只要一通电就会响,而无源内部不带震荡源,所以如果仅用直流信号无法令其鸣叫,必须用2K-5K的方波去驱动它。从外观上看,两种蜂鸣器区别不大,但将两种蜂鸣器的引脚都朝上放置时,可以看出有绿色电路板的一种是无源蜂鸣器,没有电路板而用黑胶封闭的一种是有源蜂鸣器。如图:
    3、LED:一个
    4、杜邦线:若干
    5、面包板:一个

    1.png

    二、无源蜂鸣器发声实验
        通过上网查询参数,得到其工作电压为5V,和arduino控制板数字端口输出电压一致,所以不需要接电阻,于是其与arduino的布线图和原理图如下:

    2.png

    把下面的代码上传到arduino控制板上:

    int  tonepin=6;//设置控制蜂鸣器的数字6脚
        void setup()
        {
          pinMode(tonepin,OUTPUT);//设置数字IO脚模式,OUTPUT为输出
        }
        void loop()
        {
          unsigned char i,j;
          while(1)
          {
            for(i=0;i<80;i++)//输出一个频率的声音
            {
              digitalWrite(tonepin,HIGH);//发声音
              delay(1);//延时1ms
              digitalWrite(tonepin,LOW);//不发声音
              delay(1);//延时ms
            }
            for(i=0;i<100;i++)//输出另一个频率的声音,这里的100与前面的80一样,用来控制频率,可以自己调节
            {
              digitalWrite(tonepin,HIGH);
              delay(2);
              digitalWrite(tonepin,LOW);
              delay(2);
            }
          }
        }
    从上面的代码可以看出,for语句中的80、100控制了频率,delay控制了时长,类似与音乐中的节拍。

    三、无线蜂鸣器演奏音乐
        从上面的实验看,如果我们能够控制好频率和节拍,那就有可能演奏出动听的音乐。因此,我们首先需要搞清楚各音调的频率,具体见下表:

    3.png

    4.png

    6.png

    我们知道了音调的频率后,下一步就是控制音符的演奏时间。每个音符都会播放一定的时间,这样才能构成一首优美的曲子,而不是生硬的一个调的把所有的音符一股脑的都播放出来。音符节奏分为一拍、半拍、1/4拍、1/8拍,我们规定一拍音符的时间为1;半拍为0.5;1/4拍为0.25;1/8拍为0.125……,所以我们可以为每个音符赋予这样的拍子播放出来,音乐就成了。

    5.png

    从简谱看,该音乐是D调的,这里的各音符对应的频率对应的是上表中D调的部分。另外,该音乐为四分之四拍,每个对应为1拍。几个特殊音符说明如下:
    第一,普通音符。如第一个音符3,对应频率350,占1拍。
    第二,带下划线音符,表示0.5拍。
    第三,有的音符后带一个点,表示多加0.5拍,即1+0.5
    第四,有的音符后带一个—,表示多加1拍,即1+1
    第五,有的两个连续的音符上面带弧线,表示连音,可以稍微改下连音后面那个音的频率,比如减少或增加一些数值(需自己调试),这样表现会更流畅,其实不做处理,影响也不大。
    下面,看具体代码:

    #define NTD0 -1
    #define NTD1 294
    #define NTD2 330
    #define NTD3 350
    #define NTD4 393
    #define NTD5 441
    #define NTD6 495
    #define NTD7 556


    #define NTDL1 147
    #define NTDL2 165
    #define NTDL3 175
    #define NTDL4 196
    #define NTDL5 221
    #define NTDL6 248
    #define NTDL7 278


    #define NTDH1 589
    #define NTDH2 661
    #define NTDH3 700
    #define NTDH4 786
    #define NTDH5 882
    #define NTDH6 990
    #define NTDH7 112
    //列出全部D调的频率
    #define WHOLE 1
    #define HALF 0.5
    #define QUARTER 0.25
    #define EIGHTH 0.25
    #define SIXTEENTH 0.625
    //列出所有节拍
    int tune[]=                 //根据简谱列出各频率
    {
      NTD3,NTD3,NTD4,NTD5,
      NTD5,NTD4,NTD3,NTD2,
      NTD1,NTD1,NTD2,NTD3,
      NTD3,NTD2,NTD2,
      NTD3,NTD3,NTD4,NTD5,
      NTD5,NTD4,NTD3,NTD2,
      NTD1,NTD1,NTD2,NTD3,
      NTD2,NTD1,NTD1,
      NTD2,NTD2,NTD3,NTD1,
      NTD2,NTD3,NTD4,NTD3,NTD1,
      NTD2,NTD3,NTD4,NTD3,NTD2,
      NTD1,NTD2,NTDL5,NTD0,
      NTD3,NTD3,NTD4,NTD5,
      NTD5,NTD4,NTD3,NTD4,NTD2,
      NTD1,NTD1,NTD2,NTD3,
      NTD2,NTD1,NTD1
    };
    float durt[]=                   //根据简谱列出各节拍
    {
      1,1,1,1,
      1,1,1,1,
      1,1,1,1,
      1+0.5,0.5,1+1,
      1,1,1,1,
      1,1,1,1,
      1,1,1,1,
      1+0.5,0.5,1+1,
      1,1,1,1,
      1,0.5,0.5,1,1,
      1,0.5,0.5,1,1,
      1,1,1,1,
      1,1,1,1,
      1,1,1,0.5,0.5,
      1,1,1,1,
      1+0.5,0.5,1+1,
    };
    int length;
    int tonepin=6;   //得用6号接口
    void setup()
    {
      pinMode(tonepin,OUTPUT);
      length=sizeof(tune)/sizeof(tune[0]);   //计算长度
    }
    void loop()
    {
      for(int x=0;x<length;x++)
      {
        tone(tonepin,tune[x]);
        delay(500*durt[x]);   //这里用来根据节拍调节延时,500这个指数可以自己调整,在该音乐中,我发现用500比较合适。
        noTone(tonepin);
      }
      delay(2000);
    }

    四、LED灯伴随音乐闪烁
            结何入门笔记(3)做一个LED灯伴随音乐进行闪烁。实验布线图和原理图如下:

    7.png

    实验代码为:

    #define NTD0 -1
    #define NTD1 294
    #define NTD2 330
    #define NTD3 350
    #define NTD4 393
    #define NTD5 441
    #define NTD6 495
    #define NTD7 556

    #define NTDL1 147
    #define NTDL2 165
    #define NTDL3 175
    #define NTDL4 196
    #define NTDL5 221
    #define NTDL6 248
    #define NTDL7 278

    #define NTDH1 589
    #define NTDH2 661
    #define NTDH3 700
    #define NTDH4 786
    #define NTDH5 882
    #define NTDH6 990
    #define NTDH7 112
    //c pinlv
    #define WHOLE 1
    #define HALF 0.5
    #define QUARTER 0.25
    #define EIGHTH 0.25
    #define SIXTEENTH 0.625

    int tune[]=
    {
      NTD3,NTD3,NTD4,NTD5,
      NTD5,NTD4,NTD3,NTD2,
      NTD1,NTD1,NTD2,NTD3,
      NTD3,NTD2,NTD2,
      NTD3,NTD3,NTD4,NTD5,
      NTD5,NTD4,NTD3,NTD2,
      NTD1,NTD1,NTD2,NTD3,
      NTD2,NTD1,NTD1,
      NTD2,NTD2,NTD3,NTD1,
      NTD2,NTD3,NTD4,NTD3,NTD1,
      NTD2,NTD3,NTD4,NTD3,NTD2,
      NTD1,NTD2,NTDL5,NTD0,
      NTD3,NTD3,NTD4,NTD5,
      NTD5,NTD4,NTD3,NTD4,NTD2,
      NTD1,NTD1,NTD2,NTD3,
      NTD2,NTD1,NTD1
    };
    float durt[]=
    {
      1,1,1,1,
      1,1,1,1,
      1,1,1,1,
      1+0.5,0.5,1+1,
      1,1,1,1,
      1,1,1,1,
      1,1,1,1,
      1+0.5,0.5,1+1,
      1,1,1,1,
      1,0.5,0.5,1,1,
      1,0.5,0.5,1,1,
      1,1,1,1,
      1,1,1,1,
      1,1,1,0.5,0.5,
      1,1,1,1,
      1+0.5,0.5,1+1,
    };
    int length;
    int tonepin=6;
    int ledp=1;
    void setup()
    {
      pinMode(tonepin,OUTPUT);
      pinMode(ledp,OUTPUT);
      length=sizeof(tune)/sizeof(tune[0]);
    }
    void loop()
    {
      for(int x=0;x<length;x++)
      {
        tone(tonepin,tune[x]);
        digitalWrite(ledp, HIGH);
        delay(400*durt[x]);//与前一代码不同之处,这里将原来的500分为了400和100,分别控制led的开与关,对于蜂鸣器来说依然是500.
        digitalWrite(ledp, LOW);
        delay(100*durt[x]);
        noTone(tonepin);

      }
      delay(2000);
    }

    评分

    参与人数 1 +105 收起 理由
    EEboard爱板网 + 105 3周发帖养成记 奖励

    查看全部评分

    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-4-20 05:36 , Processed in 0.126253 second(s), 19 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.