找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4065|回复: 0
打印 上一主题 下一主题
收起左侧

Arduino教程-动人的歌喉

[复制链接]
跳转到指定楼层
楼主
Hi,大家好!经过之前的几次学习,Arduino一直保持沉默,任意听从我们的摆布。从今天开始,我们将来点儿不一样的!这一次,让我们听一听Arduino那动人的歌喉!好!直奔主题,还是先看一看我们需要做一些什么样的准备吧!
硬件方面
图片来源:Arduino电路配件
具体包括如下:
  • Arduino UNO电路板(1块)
  • 面包板(1块)
  • 10kΩ电阻(1个)
  • 100Ω电阻(1个)
  • 8Ω扬声器(1个)
  • 压力传感器(1个)
  • 面包线(若干)
这一次出现了两个新面孔,一个是压力传感器,另一个是8Ω的扬声器。别担心,虽然都是新面孔,上手还是超级简单的。一般来说,压力传感器输出的信号为连续模拟信号,所以要想接收压力传感器发出的信号变化,需要将其连接到模拟信号引脚上。压力传感器的数值变化范围一般为0~1023之间。
普通的8Ω扬声器就是一个数字输出设备,所以需要将其连接到数字信号引脚上。通过这个扬声器,马上我们就将可以感受到Arduino那美丽而动人的歌喉!
软件方面Arduino官方提供的IDE。
好的!下面来连接电路。
连接电路
图片来源:Arduino电路连接
这里我们要简单的提醒一下,与扬声器进行串联的电阻使用的是数值为100Ω的那个,另一个10kΩ的电阻是与压力传感器进行串联的。另外,注意在连接时,压力传感器的负级与连接到Arduino上的信号线是分开的两根线,而且信号线是连接在压力传感器的负极上,也就是说呢,连接压力传感器一共需要四根面包线,嗯!扬声器的连接就比较简单了,只是期间串联了一个100Ω的电阻。
好!最后一步!
添加几行代码首先,还是新建一个项目窗口。

图片来源:Arduino官方IDE
接下来我们向其中添加如下代码:



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

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

图片来源:Arduino官方IDE的文件编辑菜单选项
好的!最后点击上图中标有向右指向的箭头图标,将编写好的代码烧入Arduino UNO电路板。然后单击上图中最右侧的放大镜图标,打开串口调试窗口,如下图所示。

图片来源:Arduino串口调试窗口
在上图窗口中,你将会看到每隔1秒钟打印一条描述信息。如果电路连接一切正常,此时用手去按压连接好的压力传感器,立刻就会听到Arduino那动人的歌喉!压力传感器会根据按压的力道,会从歌喉里传出不同的美妙音律!
总结我们通过这次学习,碰到了两个新的硬件,一个是扬声器,另一个是压力传感器。压力传感器的电路连接,一开始可能看起来有些复杂,不过思路想清楚之后也还是比较简单的。扬声器的连接,期间串联了一个电阻。软件方面,为了让扬声器发声,程序中我们遇到了一个新面孔,那就是tone()方法。对于这个方法的使用,我们在实例代码的注释中也已经详细说明。嗯,差不多这次主要就是这些!
下期预告
既然我们可以借助压力传感器让扬声器发出不同的声音,那我们可不可以抛弃压力传感器,直接让扬声器发出声音呢?答案当然是可以!好!下一次,就让我们把Arduino的动人歌喉变成跨时代的留声机!


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表