3.2 压电换能器
Arduino实战
你是否收到过一种生日贺卡,在它打开时就会播放一段有点走调的Pointer Sisters的《I'm So Excited》旋律。压电换能器还应用于很多其他的设备,比如移动电话、门铃以及水下声呐。
图3-6展示了一个典型的可以用于发声的压电换能器,它与那些在音乐贺卡中使用的类似。
它们是如何工作的?术语压电的意思就是“由压力产生电流”。当一个压电设备受到挤压时,它就会产生一个电荷,如图3-7所示。换能器在与Arduino一起使用时的一个典型应用就是将其作为敲击传感器。
当换能器受到击打或碰撞时,Arduino就可以检测到,并触发相应的动作,比如点亮一个LED或者用扬声器发出一个声响。
相反地,当一个电荷施加到压电换能器上时,它就会发生形变,如图3-8所示。如果你对其施加一个以一定频率变化的电压,换能器的振动就会使其发出声音或者旋律。用在音乐贺卡或者蜂鸣器中的压电换能器正是在这种模式下工作。
正如你所看到的那样,一个压电换能器既可以作为输入设备,也可以作为输出设备。以压电换能器为核心的声呐设备,就以这样的方式发出一个声音信号并接收回声。这就是潜艇电影中最让人熟悉的经典探测音。通过测定探测音从发出到接收到回声的时间,就可以计算出距离目标有多远。我们将在第6章讲解另外一个示例,那时会将Devantech SRF05作为测距仪。
现在你已经对压电换能器有了一个大概的了解,并知道了它如何工作,下面就要将压电换能器作为一个敲击传感器了。当Arduino检测到敲击传感器受到击打或者碰撞时,它就会点亮一个LED。
3.2.1 电路图
对于这个项目,你需要下列元件:
1片Arduino
1块面包板和一些跳线
1个稳压二极管,0.5 W 5.1 V(我们使用的是BZX55C5V)
1个无外壳的压电换能器(我们使用了一个在eBay上购买的27 mm的型号)
1个1 MΩ电阻
你要使用一个不带外壳的压电换能器,这会比带外壳的效果更好。
受到敲击时,压电换能器会产生非常高的电压,足以对Arduino造成损坏。稳压二极管可以保护Arduino免受高电压的损坏,而电阻的作用是泄放来自换能器的高电压。
图3-9展示了完整的电路图。注意稳压二极管的的方向,还有如何将其与电阻和压电换能器并联。
图3-9 一个压电换能器连接到A0模拟输入引脚。当换能器受到敲击时,稳压二极管可以保护Arduino以免其受到换能器产生的高电压的损坏
现在你已经看过了电路图,可以在面包板上组装这个电路了。
3.2.2 连接硬件
电路除了Arduino以外还有3个主要元件:一个5.1 V的稳压二极管,一个1 MΩ的电阻和一个压电换能器。
如前文所述,稳压二极管和电阻都并联在压电换能器上。
下面就可以将器件安放到面包板上了,要特别注意压电换能器的极性,极性可以通过由低熔点焊料焊接在上面的一红一黑两条线来区分。黑线连接到电路中的GND部分,红色连接到Arduino的模拟输入引脚A0。
稳压二极管需要以正确的方式连接才能保护Arduino的模拟输入端电压不超过5 V。按照惯例,在二极管的阴极或者负极,一般会设计有一条黑色的条纹,这一极会被连接到GND,但在你的电路中,你要将二极管反向偏置,也就是将二极管的阴极连接到电路的正极。稳压二极管的工作原理是,只在超过反向击穿电压的时候导通,在本例中击穿电压是5.1 V。任何超过5.1 V的电压都会导致二极管反向导通并与GND短路,从而保护Arduino的输入端。
当这三个元件都连接到面包板上之后,你最终就可以连接Arduino的GND和模拟输入端A0了。图3-10展示了组装完成后的电路,包括到Arduino的连接。
当所有器件组装完毕并连接到Arduino之后,你就可以开始写程序来让Arduino与压电换能器协作了。
二极管
二极管是一种双端器件,电流沿一个方向流过时电阻很小,而沿另一个方向流过时电阻很大(理想情况下是无穷大)。稳压二极管是一种特殊的二极管,它被设计成在超过击穿电压(膝点电压)时允许电流反向通过。
3.2.3 用于测定压电换能器输出的程序
首先,你要使用如代码清单3-1所示的程序。如果你没有保存之前的程序,请创建一个新的程序文件并输入这些代码。
接着,你将Arduino连接到USB接口,烧写你的程序并启动串口监视器。最初,串口监视器应该只输出0值。现在,尝试着轻轻敲打或挤压换能器,然后观察传感器的数值如何改变。一个典型的输出如图3-11所示。
当换能器受到击打时,这个数值会快速攀升到最大值,然后跌落回0。不同的数值反映了换能器受到挤压或击打的强烈程度,值越大说明其受到的挤压越猛烈。如果什么都没观测到,请检查你的连接,尤其注意检查换能器和稳压二极管的方向。
下面你要修改程序,只把超过一个既定阈值的数据打印出来。可以在现有的电位器程序上修改,也可以创建一个新的程序。新版的程序见下列代码清单,将这个程序保存并命名为threshold。
代码清单3-2 压电换能器的阈值
在代码清单3-2中,将阈值设定为200。在程序的循环中,只会输出高于阈值的传感器数值。
接下来让我们来测试这个程序。
3.2.4 烧写和测试
在输入程序清单3-2中的代码后,校验使其通过编译,然后将它写入到Arduino中。打开串口监视器,然后以不同的力度敲击换能器。你会发现敲击的力度越大,返回的传感器数值越高。图3-12给出了一些示例输出。
现在你已经有一个程序检测模拟输入端A0的数值,并在其超过一个既定的阈值时输出这个数值。接下来,你要让它做一些更有意义的事情,而不仅仅是报告一个数值。如果你将一个扬声器添加到电路中,你就可以让Arduino在压电换能器受到敲击时播放一个音符或者音阶,这就是你接下来要做的事情。
3.2.5 添加一个扬声器的电路
在本节中,你需要添加以下两个器件:
1个8Ω的小型扬声器
1个1 kΩ的电阻
图3-13所示的电路在图3-9的基础上添加了扬声器和电阻。
现在就把电路组装到一块面包板上吧。
3.2.6 连接硬件
将扬声器通过一个1 kΩ电阻连接到8号数字引脚,这就完成了硬件连接。组装完成后的电路如图3-14所示。
我们需要在扬声器上焊接两根跳线,因为扬声器原来的线太软,以至于无法直接插入到面包板上。如果你没有焊接设备,可以用一些绝缘胶带将导线固定在跳线上,也可以使用鳄鱼夹。
当所有的元件都连接好后,就可以编写程序了。
3.2.7 产生一个音阶的程序
代码清单3-3给出了新程序的代码,其中定义了3个新变量。
toneDuration指定每个音阶持续的时间,单位是毫秒(ms)。
toneFrequency设定了所播放音阶的频率,单位是赫兹(Hz)(中央C的频率是262 Hz)。
speakerPin指定了扬声器所连接到的引脚。
代码清单3-3 用扬声器产生一个音阶
在这个程序中,使用的是Arduino内置的库函数,tone,它接受3个参数。
tone (pin, frequency, duration)
pin是输出音阶的引脚;frequency是输出音阶的频率;duration是一个音阶播放的时间的毫秒数。如果没有给定duration参数,这个音阶就会一直播放,直到发出noTone指令:
noTone(pin)
在这个程序中,只有当sensorValue大于阈值时才会播放一个音阶。现在让我们来试一下吧。
3.2.8 烧写和测试
当程序顺利通过编译之后,将Arduino连接到计算机并为它写入程序。尝试着敲击压电换能器,然后听扬声器是否发出了声响。如果没有发出声音,请检查所有的连接。
提示:如果检查了所有的连接,而扬声器始终没有发出任何声音,请尝试将toneDuration从40增大到1000,或者改变toneFrequency的值。
当一切都正常工作后,你可以修改变量toneFrequency的值来让扬声器演奏不同的音符。频率越高,音调越高;频率越低,音调越低。你还可以尝试修改变量threshold的值。这个值越小,就可以用越轻柔的力量敲击换能器,来让扬声器播放一个音阶。
在下一节中,将会给电路添加更多的压电换能器,这样就可以制作一架电子琴,而换能器则作为琴键。