树莓派控制无源蜂鸣器,树莓派有源蜂鸣器实验
用草莓派B 5控制蜂鸣器播放音乐
bbs.pediy.com
步进电机和无源蜂鸣器都需要脉冲信号驱动。这次尝试用GPIO的PWM接口驱动无源蜂鸣弹《一闪一闪亮晶晶》。
1个无源蜂鸣器和有源蜂鸣器
主要是没意识到蜂鸣器是无源蜂鸣器和有源蜂鸣器,买回来就没声音了。第一次发现买的蜂鸣器是无源蜂鸣器。
无源蜂鸣器:
1无源内部振荡源,DC信号下无振铃。必须由非振荡电流驱动。2K-5KHZ方波脉宽调制(PWM)。5KHZ电流的方波是什么意思?每秒振荡5K次,完整周期占用200us,高点平均占用部分时间,低位占用部分时间。
声音的频率可以控制,可以发出不同的声音。
活动蜂鸣器:
1内部有振荡电路,通电后会立即发出蜂鸣声。所以和前面的LED一样,只要提供高电平就能发出哔哔声。编程比被动方便。
比主动便宜。被动是20美分,主动是40美分。我买了一个无源蜂鸣器。这个蜂鸣器的阻抗是42欧姆,可以用3V,5V的东西驱动。草莓派的高电平正好是3.3V
在此之前,我并不知道主动蜂鸣器和被动蜂鸣器的区别,只是有了后来的曲折和摸索。
这蜂鸣器清楚地显示积极和消极。
2 PWM和输出模式
青秀瓜不能像上次一样通过操作GPIO口高低设置输出PWM。还好草莓派的几个PIN口都有这个模式。这是引脚12。可以通过控制PIN12口的PWM模式来实现。请理解为方波。因为pygpio暂时不支持操作硬件的PWM。这里使用的是wiringpi库。
WiringPi pinmode(1,PWM_OUT)可以设置模式。PIN12是wiringpi的第一名。
图中的T(PWM)是一个周期的时间长度。对于2K频率,周期为1S/2K=500us。图中的d称为占空比。指高层时间占整个周期时间的比例。第一个周期,D=50%,高电平和低电平的时间各占一半。下一个D为33%,开机时间为33%,剩余非开机时间为67%。
占空比确实会影响频率,但没有关于它如何影响频率的具体调查。我在测试中使用了50%的占空比,也就是说高低电平各占一半时间。
因为可供借鉴的例子太少了。只能翻翻芯片手册找相关资料。具体信息参见BCM2835芯片手册第9章。看完这一章,我得到了以下几点。
PWM的频率由时钟管理器控制。(草莓派的基础时钟频率是19.2MHZ)。
PWM输出占空比有两种模式:平衡模式和MS模式。
首先观察占空比中的平衡模式和MS模式,把你要输出的占空比设置为N/M。
平衡模式是根据一种算法来计算什么时候发送低电平和高电平,这种算法尽量使任意时刻的占空比最接近N/m,显然下图是【4/8的几种发送方式】,好的算法即使花任意时间也更接近4/8。
所谓M/S模式,在整个S周期内,首先传输M时间的高电平,其余S-M时间为低电平。
因此,如果是4/8的占空比。
11110000在M/S模式8小时内发出(周期长8小时)。另一方面,平衡模式是10101010(最小周期可以说是2个时间长度,大周期可以说是8个时间长度。
也许你不懂也没关系。插图更有说服力。
如果所需频率为5KHZ,则周期时间为1s/5000hz=200us。如果占空比设为0.5,即高电平必须为100us,低电平必须为100us。
处于平衡模式。一个周期(200us)的波形图如下。
也就是说,在这个大周期内,即使取任意时间,占空比也接近0.5,实际频率比5K大好几倍。
在MS模式下。好像在下面。
很明显,这就是我们需要的标准5K频率。因为这种模式的最低频率是200us。
wiringPi的PWMsetmode(PWM_mode_ms)可以设置为ms模式。
首先草莓派的基本时钟频率是19.2MHZ,pwm也是控制在这个基频。即最小基本周期为1/19200000 S,这个周期太小了。控制蜂鸣器需要2-5K的频率。先提高基频吧。使用PWMsetclock(intclock),时钟的基频可以设置为19.2M/clock。然后根据这个频率,在pwmsetrange(in trange)中设置最终频率。范围是2-4095。
带PWMset时钟和PWM se
t range(范围)将最终频率控制在19.2 MHz/时钟/范围。
在这里,我将时钟设置为32,并将时钟的基频设置为19.2MHZ/32=600khz。
所以我们只要设置300到120的范围就可以得到2k-5k的频率。
你如何设置占空比?还有一个函数pwmWrite(值)。值指定在范围指定的时间内发送高电平的基本周期数(由时钟的基本频率计算)。因此,值/范围就是占空比。写入(范围/2)可以获得50%的占空比。范围/5给出20%的占空比。如果该值设置为0,则在此期间始终为低电平。没有任何高电平,蜂鸣器不会鸣响。
验证下图。
50%(范围/2)
20%(范围/5)
所以我们可以初始化它。它是这样说的
void初始化()
{
if (wiringPiSetup ()==-1)
出口(1);
//将引脚设置为pwm输出模式
pinMode (1,PWM _ OUTPUT);
//将pwm信号模式设置为ms模式
PWM setmode(PWM _ MODE _ MS);
//设置时钟基频为19.2M/32=600KHZ
PWM setclock(32);
}
以便以后弹奏不同频率的音阶。封装了一个哔哔声函数和哔哔声的持续时间。
无效蜂鸣音(int freq,int t_ms)
{
int范围;
中频(频率2000 频率5000)
{
printf(无效频率);
返回;
}
//将范围设置为600KHZ/freq。也就是说,频率的周期由1/600KHZ的范围组成。
范围=600000/频率.
pwmSetRange(范围);
//将占空比设置为50%。
pwmWrite(1,range/2);
if(t_ms0)
{
延时(t _ ms);
}
}
延迟由延迟控制。
通过pwmWrite(1,0)关闭输出。
剩下的就是找到闪烁星的乐谱了。设置相应的频率和持续时间。然后循环播放。
这里只是截图。具体代码下载pwm.c。
接线图如下。标签BCM 1(针脚12)连接到无源蜂鸣器的正极。为了接线方便,将负极连接到GND。我买的是加长版和排线。(第一次买错了树莓派2的40 PIN,第二次卖家发错货了。只买了第三次,也是颠簸)。
编译并执行
gcc -o pwm pwm.c -lwiringpi
须藤。/pwm
你可以听到音乐在播放。
建议不要多听。因为2K-5K的频率对人的耳朵来说有点高,听着太刺耳心慌。
学会pwm后,可以控制一些需要脉冲波控制的外部设备。
有人会说,把GPIO设置成输出模式。
pin write(1);
睡眠(100u s);
pin write(0);
睡眠(100u s);
这不是很好吗?
这是可能的,但是CPU占用了很多资源。如果用python,时间控制就更不准确了,所以既然有硬件PWM模块,就用这个函数吧。
实际上,我并不认为这一部分如此复杂。以为接上电源蜂鸣器就会响。然而,我省了20美分,学到了更多。有时候网上找不到的东西,就需要仔细查相关资料。而且硬件比软件麻烦多了。
下一部分是人体传感器。感应到人体后,配合蜂鸣器报警。
上传的附件:
fb.png
(24.77kb,4次下载)
beep.png
(192.63kb,4次下载)
pwm.png
(20.49kb,10次下载)
balance.png
(14.79kb,2次下载)
msmode.png
(6.40kb,3次下载)
pic_ms.png
(3.04kb,2次下载)
pic_bal.png
(1.89kb,2次下载)
50perc.png
(1.03kb,2次下载)
20perc.png
(1.81kb,2次下载)
notation2.png
(94.92kb,4次下载)
notation1.png
(16.81kb,4次下载)
main.png
(22.99kb,9次下载)
result.png
(540.95kb,7次下载)
脉冲宽度调制
(1.53kb,152次下载)