美文网首页互联网科技FabAcademy 学习汇
数字制造讲义08-Arduino声音应用2

数字制造讲义08-Arduino声音应用2

作者: Kidult | 来源:发表于2019-04-23 22:00 被阅读56次

    数字制造讲义01-成为数字世界的建造者
    数字制造讲义02-Arduino入门
    数字制造讲义03-电路基础
    数字制造讲义04-负责输入和输出的智能元件
    数字制造讲义05-软硬件数据通信
    数字制造讲义06-MIDI 和 OSC 数据传输练习
    数字制造讲义07-Arduino声音应用

    (本系列为 00 在星海音乐学院的课程讲义)

    回顾

    还记得上一周 完成的三个练习吗:

    • 让蜂鸣器发声
    • 蜂鸣器发出交替的报警声
    • 用按键触发声音
    image

    这一周我们继续来完善,做出一个简单的旋律控制器。

    挑战4:用电位计控制音高

    既然蜂鸣器可以发出不同的音高,那我们可不可以用旋钮控制音高,做一个 mini 的极简控制器呢?

    在之前第四周的课程中,我们已经建立起比较完整的输入输出元件的概念。在项目练习时就可以慢慢养成习惯:在动手之前,先构想出输入部分是什么、输出部分是什么、从输入到输出要完成什么样的转换。

    这里,输入部分是电位计(的位置),输出部分是蜂鸣器(的音高),中间的连接就是电位计的数值转换为蜂鸣器的音高。

    接线部分,使用的元件包括:蜂鸣器,电位计。

    image

    当我们还是编程新手,每次要开始自己写代码时,容易两眼一抹黑,不知道该从哪里下手。

    其实,每次写代码时,并不是直接打开 Arduino IDE 就开始噼里啪啦敲代码了。在这之前,我们需要现在脑子里构思这个代码要做什么,怎么做到

    大家会想一下,怎么把大象放进冰箱里呢?

    不要笑,这就是所谓的「算法」:做一件事情的步骤。

    所以在还没有清晰思路的时候,我们可以先把程序要完成的大致步骤写下来:

    • 需要用一个模拟端口读取电位计的数值
    • 需要用一个数字(输出)端口给蜂鸣器发出指令
    • 找一个办法让蜂鸣器发出不同音高
    • 将电位计数值控制音高

    接着,我们再想办法把每一个步骤都转化成对应的变量、语法、库。所以学会搜索和查看官方文档就很重要的了。

    代码如下:

    // connect a potentiometer to pin A0
    
    int buzzerPin=8; 
    int potPin=A0;
    
    void setup() {  
      pinMode(buzzerPin, OUTPUT);
    }
    
    void loop() {
      int freq = analogread(A0);
      freq = map (freq,0,1023,20,20000); //map the value read from the potentiometer into the audible range
      tone (buzzerPin,freq); 
    }
    

    上面的代码中,最核心的一行,是把从电位计读取的模拟信号数值(范围是 01023),映射到人耳可感知的声音的频率范围(2020000):freq = map (freq,0,1023,20,20000); 其中 map() 函数的作用就是数值映射。

    挑战5:播放连续音高

    这个挑战一定会更吸引你:用蜂鸣器播放一段旋律。

    这个挑战的难度主要在代码上,从这里开始,我们会开始接触并深入理解函数、循环、头文件、库等概念。

    比较复杂的代码不可能一下子就能写出来。所以我们要经历一个重要的练习:看懂别人的代码。

    我们在官方网站上找到教程 Arduino - ToneMelody。仔细研读它给出的代码,尤其是代码的注释:

    /*
      Melody
    
      Plays a melody
    
      circuit:
      - 8 ohm speaker on digital pin 8
    
      created 21 Jan 2010
      modified 30 Aug 2011
      by Tom Igoe
    
      This example code is in the public domain.
    
      http://www.arduino.cc/en/Tutorial/Tone
    */
    
    #include "pitches.h"
    
    // notes in the melody:
    int melody[] = {
      NOTE_C4, NOTE_G3, NOTE_G3, NOTE_A3, NOTE_G3, 0, NOTE_B3, NOTE_C4
    };
    
    // note durations: 4 = quarter note, 8 = eighth note, etc.:
    int noteDurations[] = {
      4, 8, 8, 4, 4, 4, 4, 4
    };
    
    void setup() {
      // iterate over the notes of the melody:
      for (int thisNote = 0; thisNote < 8; thisNote++) {
    
        // to calculate the note duration, take one second divided by the note type.
        //e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc.
        int noteDuration = 1000 / noteDurations[thisNote];
        tone(8, melody[thisNote], noteDuration);
    
        // to distinguish the notes, set a minimum time between them.
        // the note's duration + 30% seems to work well:
        int pauseBetweenNotes = noteDuration * 1.30;
        delay(pauseBetweenNotes);
        // stop the tone playing:
        noTone(8);
      }
    }
    
    void loop() {
      // no need to repeat the melody.
    }
    

    把注释部分全部替换成自己的理解,这个代码看起来就不再那么复杂和难懂了。但是这个过程一定要自己完成。

    当在代码里看到不熟悉的函数,例如 delay() , noTone() ,就可以到官方文档中搜索并阅读,一般文档都会给出例子,这些例子就是最好的学习材料。

    最后,留给大家的作业,是用两个压电片触发两段不同的旋律,大家动手试试吧!

    <iframe frameborder="0" src="https://v.qq.com/txp/iframe/player.html?vid=p08632k4vzj" allowFullScreen="true"></iframe>

    Arduino Melody_腾讯视频


    00 的文集

    相关文章

      网友评论

        本文标题:数字制造讲义08-Arduino声音应用2

        本文链接:https://www.haomeiwen.com/subject/yuqigqtx.html