Oh!Coder

Coding Life

好玩的Arduino-动人的歌喉

| Comments

Hi,大家好!经过之前的几次学习,Arduino一直保持沉默,任意听从我们的摆布。从今天开始,我们将来点儿不一样的!这一次,让我们听一听Arduino那动人的歌喉!好!直奔主题,还是先看一看我们需要做一些什么样的准备吧!

硬件方面

arduino-beautiful-voice-parts

图片来源:Arduino电路配件

具体包括如下:

  • Arduino UNO电路板(1块)
  • 面包板(1块)
  • 10kΩ电阻(1个)
  • 100Ω电阻(1个)
  • 8Ω扬声器(1个)
  • 压力传感器(1个)
  • 面包线(若干)

这一次出现了两个新面孔,一个是压力传感器,另一个是8Ω的扬声器。别担心,虽然都是新面孔,上手还是超级简单的。一般来说,压力传感器输出的信号为连续模拟信号,所以要想接收压力传感器发出的信号变化,需要将其连接到模拟信号引脚上。压力传感器的数值变化范围一般为0~1023之间。

普通的8Ω扬声器就是一个数字输出设备,所以需要将其连接到数字信号引脚上。通过这个扬声器,马上我们就将可以感受到Arduino那美丽而动人的歌喉!

软件方面

Arduino官方提供的IDE。

好的!下面来连接电路。

连接电路

arduino-beautiful-voice

图片来源:Arduino电路连接

这里我们要简单的提醒一下,与扬声器进行串联的电阻使用的是数值为100Ω的那个,另一个10kΩ的电阻是与压力传感器进行串联的。另外,注意在连接时,压力传感器的负级与连接到Arduino上的信号线是分开的两根线,而且信号线是连接在压力传感器的负极上,也就是说呢,连接压力传感器一共需要四根面包线,嗯!扬声器的连接就比较简单了,只是期间串联了一个100Ω的电阻。

好!最后一步!

添加几行代码

首先,还是新建一个项目窗口。

arduino-ide-new

图片来源:Arduino官方IDE

接下来我们向其中添加如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
// 为了在程序中方便对音调进行变更,
// 我们提前在程序的最顶部预定义了
// 四个宏变量,每个宏变量代表一个
// 音调,可以让扬声器发出不同的声音。
// 宏变量在程序运行中不得更改,
// 其使用方式可以简单理解成常量。
#define NOTE_B0  31
#define NOTE_AS2 117
#define NOTE_AS3 233
#define NOTE_D6  1175
// 定义压力传感器的输入针脚号为0
int forceSensorPin = 0;
// 对Arduino电路板或相关状态进行初始化方法
void setup(void) {
  // 开启串行通信,并设置其频率为9600。
  // 如果没有特别要求,此数值一般都为9600。
  Serial.begin(9600);
}
// 系统调用,无限循环方法
void loop(void) {
  // 从模拟引脚号为0的接口,读取压力传感器的数值。
  int forceSensorState =analogRead(forceSensorPin);
  // 向调试窗口打印字符串"Analog reading = "
  Serial.print("Analog reading = ");
  // 紧接着上一行字符串的后面,
  // 输出当前读取到的压力传感器的数值状态。
  Serial.print(forceSensorState);
  // 简单根据压力传感器所受力的大小,
  // 划分了五个不同的等级。
  if(forceSensorState < 10) {
    // 当压力数值小于10时,不发出声音,
    // 并向调试窗口打印" - No pressure"字符串。
    Serial.println(" - No pressure");
  }else if(forceSensorState < 200) {
    // 当压力大于10小于200时,发出声音,
    // 同时向调试窗口打印" - Light touch"字符串。
    Serial.println(" - Light touch");
    // tone()方法是让歌喉发出动人声音的方法。
    // 此方法共有三个参数,
    // 从左边算起,第一个参数为针脚号,此处为8,
    // 也即数字信号引脚的8号引脚。
    // 第二个参数为音调数值,此处为程序顶部预定义的
    // 宏变量之一,例如此处为NOTE_B0。
    // 第三个参数为音调的发声时间长度,单位为毫秒,
    // 此处为100毫秒。
    tone(8, NOTE_B0, 100);
  }else if(forceSensorState < 500) {
    // 当压力大于200小于500时,发出声音,
    // 同时向调试窗口打印" - Light squeeze"字符串。
    Serial.println(" - Light squeeze");
    // tone()方法向扬声器发送信号,让其发出动人的声音。
    // tone()方法详细解释同上。
    tone(8, NOTE_AS2, 100);
  }else if(forceSensorState < 800) {
    // 当压力大于500小于800时,发出声音,
    // 同时向调试窗口打印" - Medium squeeze"字符串。
    // tone()方法向扬声器发送信号,让其发出动人的声音。
    // tone()方法详细解释同上。
    Serial.println(" - Medium squeeze");
    tone(8, NOTE_AS3, 100);
  }else{
    // 当压力大于800时,发出声音,
    // 同时向调试窗口打印" - Big squeeze"字符串。
    // tone()方法向扬声器发送信号,让其发出动人的声音。
    // tone()方法详细解释同上。
    Serial.println(" - Big squeeze");
    tone(8, NOTE_D6, 100);
  }
  // 延迟1000毫秒(也即1秒钟)进入下一次程序循环。
  // 实际效果就是,每两次发声之间有1秒钟的时间间隔。
  delay(1000);
}

完工!作为学习的实例,猛然看起来好像很麻烦,其实删除中间的文字注释,一共也不到三十行的代码!而其中真正的新面孔说实话也就一个tone()方法而已,此方法中三个参数的解释已经在代码的注释中说过,这里就不重复解释了。

arduino-menu

图片来源:Arduino官方IDE的文件编辑菜单选项

好的!最后点击上图中标有向右指向的箭头图标,将编写好的代码烧入Arduino UNO电路板。然后单击上图中最右侧的放大镜图标,打开串口调试窗口,如下图所示。

arduino-serial-beautiful-voice

图片来源:Arduino串口调试窗口

在上图窗口中,你将会看到每隔1秒钟打印一条描述信息。如果电路连接一切正常,此时用手去按压连接好的压力传感器,立刻就会听到Arduino那动人的歌喉!压力传感器会根据按压的力道,会从歌喉里传出不同的美妙音律!

总结

我们通过这次学习,碰到了两个新的硬件,一个是扬声器,另一个是压力传感器。压力传感器的电路连接,一开始可能看起来有些复杂,不过思路想清楚之后也还是比较简单的。扬声器的连接,期间串联了一个电阻。软件方面,为了让扬声器发声,程序中我们遇到了一个新面孔,那就是tone()方法。对于这个方法的使用,我们在实例代码的注释中也已经详细说明。嗯,差不多这次主要就是这些!

下期预告

既然我们可以借助压力传感器让扬声器发出不同的声音,那我们可不可以抛弃压力传感器,直接让扬声器发出声音呢?答案当然是可以!好!下一次,就让我们把Arduino的动人歌喉变成跨时代的留声机!

Comments