使用香蕉派M3驱动无源蜂鸣器

使用香蕉派M3驱动无源蜂鸣器

还记得我费尽周折用PRI.GPIO通过香蕉派M3点亮一个LED嘛?好吧,其实我家里并不缺灯泡,LED手电筒这种家用电器我也有好几个,况且现在手机啥的都有手电筒功能,所以点亮个LED其实并没有什么大用。

其实我是初衷是弄一个蜂鸣器当作报警器,我明明记得我有好几个那种一通电就哇哇响的蜂鸣器,可是找了半天没找到,只好先用LED代替了。

然而问题来了,当我成功点亮LED后,我还是没有找到那种通电哇哇响的蜂鸣器,这下可麻爪了。还好最终我找到一大堆所谓的无源蜂鸣器,看看如何用这个凑合吧。

原理

百度一下无源蜂鸣器:

无源蜂鸣器利用电磁感应现象,为音圈接入交变电流后形成的电磁铁与永磁铁相吸或相斥而推动振膜发声,接入直流电只能持续推动振膜而无法产生声音,只能在接通或断开时产生声音。

百度一下声音的频率:

声音作为一种波,频率在20 Hz~20 kHz之间的声音是可以被人耳识别的。

所以要想让无源蜂鸣器的发声就得以20 Hz~20 kHz的频率通断电。

代码一

要做到这点也挺简单,只要用之前文章种控制GPIO的代码改改就可以实现了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/env python

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BOARD)
GPIO.setup(11, GPIO.OUT)

def beep(pin, frq, duty):
c = 1 / frq
h = c / 100 * duty
l = c - h
GPIO.output(pin, GPIO.HIGH)
time.sleep(h)
GPIO.output(pin, GPIO.LOW)
time.sleep(l)

while True:
beep(11, 60000, 50)
#time.sleep(1)
#beep(11, 12000, 50)
#time.sleep(1)

代码2 PWM

如果就是驱动蜂鸣器,我们已经成功了,上述代码运行后,蜂鸣器会发出哔哔的声音。

可是如何我们想多做一些工作,比如说打开上述代码中注释掉的部分,发现代码并不如我们意料的那样工作,这是因为我们发出beep声音的是通过sleep控制周期实现的,而并非单独的硬件或者单独的线程

那么如果想实现类似上述功能该怎么办呢?我不知道香蕉派有没有硬件PWM,即便有我也不知道咋控制,我也懒得去写多线程代码,来实现复杂控制。

好在RPI.GPIO中实现了一个PWM功能(我不确定是软件方式还是硬件方式),使用PWM功能重新实现上述代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/env python

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BOARD)
GPIO.setup(11, GPIO.OUT)

Buzz = GPIO.PWM(11, 6000)
Buzz.start(50)
while True:
Buzz.ChangeFrequency(6000)
time.sleep(1)
Buzz.ChangeFrequency(12000)
time.sleep(1)

不但功能好用了,代码也简洁不少呢!

补充说明

因为不是硬件PWM(我猜测的),所以估计精度不是那么准确,声音不太正。

如果去研究香蕉派M3的硬件PWM,先不说硬件是否支持,如何控制学起来估计也挺费劲的。

考虑直接用Arduino控制蜂鸣器,然后香蕉派通过GPIO给Arduino控制信号来决定关闭还是打开蜂鸣器,不过这样又多了一些工作量,纠结呀。

参考资料


Vote For Me As Witness
https://steemit.com/~witnesses type in oflyhigh and click VOTE

Vote @oflyhigh via Steemconnect
Thank you!

This page is synchronized from the post: ‘使用香蕉派M3驱动无源蜂鸣器’

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×