38浏览
查看: 38|回复: 0

[入门教程] Arduino入门教程18--敲击电子鼓「DFR0100」

[复制链接]
本帖最后由 zoey不种土豆 于 2024-11-20 17:15 编辑

在这个项目中,我们将制作一个敲击电子鼓,探索Arduino如何捕捉敲击产生的信号,并控制蜂鸣器发出不同频率的声音。通过改变按压力度大小,你将能亲身体验到声音频率的实时变化,感受电子世界的奇妙与乐趣。

元件清单
Arduino入门教程18--敲击电子鼓「DFR0100」图1
图 1 元件清单

硬件连接
蜂鸣器我们已经连接过很多次了,只要在此基础上加入压电陶瓷相关电路即可,压电陶瓷部分的电路还包含一个1M的电阻和一个5.1V的稳压二极管,请注意稳压二极管的连接方向(如图1)。
因为当压电陶瓷受到敲击时,会产生非常高的电压,足以对Arduino造成损坏。稳压二极管可以保护Arduino免受高电压的损坏,而电阻的作用是泄放来自压电陶瓷的高电压。
Arduino入门教程18--敲击电子鼓「DFR0100」图3
图 2 敲击电子鼓连线图

示例代码
样例代码:
  1. //项目 - 敲击电子鼓
  2. // 这些常量不会改变。它们用于为所使用的引脚命名:  
  3. const int analogInPin = A0;  // 模拟输入引脚,压电陶瓷连接到此引脚  
  4. const int analogOutPin = 8;  // 模拟输出引脚,蜂鸣器连接到此引脚
  5.   
  6. int sensorValue = 0;  // 从压电陶瓷读取的值  
  7. int outputValue = 0;  // 输出到PWM(模拟输出)的值  
  8.   
  9. void setup() {  
  10.   // 初始化串行通信,波特率为9600:  
  11.   Serial.begin(9600);  
  12. }  
  13.   
  14. void loop() {  
  15.   // 读取模拟输入值:  
  16.   sensorValue = analogRead(analogInPin);  
  17.   // 将其映射到模拟输出的范围:  
  18.   outputValue = map(sensorValue, 0, 1023, 0, 5000);  
  19.   /* 改变模拟输出值(但注意,Arduino 8号引脚为数字输出,这里使用tone函数模拟发声)*/
  20.   tone(analogOutPin, outputValue, 100);
  21.   /* 使用tone函数在8号引脚(数字输出)上发声,频率为outputValue,持续时间为100毫秒  */
  22.   // 将结果打印到串行监视器:  
  23.   Serial.print("sensor = ");  
  24.   Serial.println(sensorValue);
  25. }
复制代码
当压电陶瓷受到击打时,蜂鸣器会发出带有音调变化声音。同时,观察你的串口监视器,sensor这个数值会快速攀升到最大值,然后跌落回0。不同的数值反映了压电陶瓷受到挤压或击打的强烈程度,值越大说明其受到的挤压越猛烈。如果什么都没观测到,请检查你的连接,尤其注意检查压电陶瓷和稳压二极管连接的方向。

代码回顾
在代码的开始阶段就出现了一种我们没有使用过的数据类型,在之前的项目中,我们接触了几种常见的数据类型(比如int,long等)。在这个项目中,将引入一种新的数据类型:const,也就是常量。

  1. const int analogInPin = A0;  
  2. const int analogOutPin = 8;  
  3.   
  4. int sensorValue = 0;  
  5. int outputValue = 0;
复制代码

在上段代码中,analogInPin 和 analogOutPin 被定义为常量,分别表示压电陶瓷的连接的模拟输入引脚和蜂鸣器连接的模拟输出引脚。
接着声名了两个整数类型的变量sensorValue和outputValue。前者用于存储从压电陶瓷读取到的原始模拟数值,后者用于存储经过映射处理后的值(转化为蜂鸣器可以发出的声音范围内的值)。
接下来初始化setup()函数就非常简单了,只要设置一个串口波特率就可以了,这使得我们可以监控和调试压电陶瓷的输入信号。
在loop()函数中,首先从analogInPin读取压电陶瓷产生的模拟信号值,并将其存储在sensorValue变量中。
接着,使用下方的语句,将 sensorValue 的值从0到1023的范围映射到0到5000的范围内。

  1. outputValue = map(sensorValue, 0, 1023, 0, 5000);
复制代码

这是因为压电陶瓷的输出范围通常是0到1023,而 tone 函数的频率参数需要在Arduino可以发出的频率范围内(通常是31Hz到65535Hz,但实际效果受硬件限制)。
  1. tone(analogOutPin, outputValue, 100);
复制代码

在 analogOutPin 引脚上生成一个频率为 outputValue(由压电陶瓷控制)的声音,持续时间为100毫秒。tone()函数来驱动蜂鸣器发出不同频率的声音,是基于PWM(脉冲宽度调制)技术实现的。PWM技术允许数字引脚输出模拟信号的效果,通过快速切换数字信号的高低电平(即开和关),并以特定的速率重复这一过程,可以模拟出不同频率的信号。更多PWM技术相关知识详见项目【呼吸灯】。
  1. Serial.print("sensor = ");  
  2. Serial.println(sensorValue);
复制代码

最后,为了方便程序的调试和观察压电陶瓷的实时值使用,将sensorValue的值打印出来。

硬件回顾
压电陶瓷

压电陶瓷,也叫压电换能器,术语压电的意思就是“由压力产生电流”。当一个压电设备受到挤压时,它就会产生一个电荷,如图2所示。换能器在与Arduino一起使用时的一个典型应用就是将其作为敲击传感器。
当换能器受到击打或碰撞时,Arduino就可以检测到,并触发相应的动作,在这个项目中就是发出与敲击力度相关的声音。
相反地,当一个电荷施加到压电换能器上时,它就会发生形变,如图3所示。如果你对其施加一个以一定频率变化的电压,换能器的振动就会使其发出声音或者旋律。
Arduino入门教程18--敲击电子鼓「DFR0100」图5
图 2 当压电换能器发生形变时就会产生一个电荷,挤压和松开换能器,就会产生一个变换的电压

Arduino入门教程18--敲击电子鼓「DFR0100」图4
图 3 当对压电换能器施加一个变化的电压时,换能器就会发生形变

正如上面图2和图3展示的那样,一个压电换能器既可以作为输入设备,也可以作为输出设备。就是说它既能将敲击信号转变为电信号,也能将电信号转变为震动频率。
在使用压电陶瓷的时候,要特别注意它的极性,极性是通过由低熔点焊料焊接在上面的一红一黑两条线来区分。黑线连接到电路中的GND部分,红色连接到Arduino的模拟输入引脚。

稳压二极管
在项目【闪烁第一个LED】中,我们介绍了发光二极管-LED。
这个项目中的稳压二极管是一种特殊的二极管,它被设计成在超过击穿电压(膝点电压)时允许电流反向通过。
稳压二极管需要以正确的方式连接才能保护Arduino的模拟输入端电压不超过5 V。按照惯例,在二极管的阴极或者负极,一般会设计有一条黑色的条纹,这一极会被连接到GND,但在这个项目的电路中,你要将二极管反向偏置,也就是将二极管的阴极连接到电路的正极。稳压二极管的工作原理是,只在超过反向击穿电压的时候导通,在本例中击穿电压是5.1 V。任何超过5.1 V的电压都会导致二极管反向导通并与GND短路,从而保护Arduino的输入端。

课后练习
在硬件回顾中,我们了解到压电陶瓷既可以作为输入设备使用,也可以作为输出设备使用。请尝试使用tone()函数向电压陶瓷写入信号,使其发出指定的频率(赫兹)。并通过组合发出一段旋律吧!(注意:压电陶瓷发出的声音要比蜂鸣器小很多,请注意聆听!

示例代码
下载附件第18课时示例代码.rar


下一课Arduino入门教程19--手势控制灯「DFR0100」
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail