myRaspberry

Mes aventures en Raspberry et Arduino

Buzzer

Posted on 27 février 2016  in Composants

Il y a deux types de buzzer, les buzzers ACTIF et PASSIF.

l’ ACTIF fabrique du bruit quand il reçoit une alimentation continue, comme une sonnette.

BuzzerActifBuzzerPassif

le PASSIF n’est, en gros, qu’un haut parleur miniature à qui il faut fournir le signal audio à diffuser.

 

Les Pin

  • Gauche : pin notée S (signal)  sur une des broche d’activation de votre carte. (mon exemple : GPIO 17 pour le passif et 27 pour l’Actif)
  • Centre : 5V
  • Droite : GND

J’ai construit la bibliothèque suivante pour declarer un buzzer.

passifBuzzer.zip (77 téléchargements)
########################################
#  C L A S S : PASSIFBUZZER
#
# HUB.BOSSEUR@GMAIL.COM
# http://aubonsurf.free.fr
#######################################
#!/usr/bin/env python
import RPi.GPIO as GPIO
import time


# Declaration des E/S
# Usage   : moBuzzer=PassifBuzzer(PinUtiliser, ModeDeNumerotation)
# exemple : moBuzzer=PassifBuzzer(4, BCM)
#			monBuzzer.play(pitches, duration)
#			Piches = tableau de fréquences
#			duration = tableau de durees
#			monBuzzer.clean()
class PassifBuzzer:
	
	def __init__(self, pinBZ,typeBoard):
		self.pin_BZ=pinBZ
		print ("Declaration Buzzer sur PIN "+str(self.pin_BZ))
		if typeBoard=='BCM':
			GPIO.setmode(GPIO.BCM) 
			print ("BCM")
		else:
			GPIO.setmode(GPIO.BOARD) 
			print ("BOARD")
		GPIO.setup(self.pin_BZ, GPIO.IN)
		GPIO.setup(self.pin_BZ, GPIO.OUT)
		print("buzzer ready")
		
#Fonction buzz  avec une frequence et une duree)	
	def buzz(self,pitch, duration):   
		if(pitch==0):
			time.sleep(duration)
			return
		period = 1.0 / pitch     #periode=1/frequence
		delay = period / 2        
		cycles = int(duration * pitch)   #nombre de cycle pour la duree avec cette frequence)
		for i in range(cycles):    #jouer un cycle
			GPIO.output(self.pin_BZ, True)   
			time.sleep(delay)   
			GPIO.output(self.pin_BZ, False)    
			time.sleep(delay)    
			



	def play(self, pitches, duration):
		#GPIO.setmode(GPIO.BCM)
		#GPIO.setup(self.buzzer_pin, GPIO.OUT)
		x=0
		for p in pitches:
			print (p, duration[x])
			self.buzz(p, duration[x]/100)  #feed the pitch and duration to the function, “buzz”
			time.sleep(duration[x]/200)
			x+=1
		

	
	def clean(self):
		GPIO.cleanup()  
		print("close "+str(self.pin_BZ))

 

Le programme de test :

import passifBuzzer
import time
import os

#NOTES
c3=763
d3=680
e3=606
f3=571
g3=510
a3=454
b3=404
c4=381
d4=340 
e4=303 
f4=286 
g4=255 
a4=227 
a4s=214
b4=202 
c5=191
d5=170
d5s=160
e5=151
f5=143
g5=127
a5=113
a5s=107
b5=101
c6=95
R=0

        
PIN_PASSIDFBUZZ=17
starWarThemeNote=[  f4,  f4, f4,  a4s,   f5,  d5s,  d5,  c5, a5s, f5, d5s,  d5,  c5, a5s, f5, d5s, d5, d5s,   c5]
starWarThemeTone=[  21,  21, 21,  128,  128,   21,  21,  21, 128, 64,  21,  21,  21, 128, 64,  21, 21,  21, 128 ]

marcehImperialeNote=[a4, R,  a4, R,  a4, R,  f4, R, c5, R,  a4, R,  f4, R, c5, R, a4, R,  e5, R,  e5, R,  e5, R,  f5, R, c5, R,  g5, R,  f5, R,  c5, R, a4, R]
marcehImperialeTone=[50, 20, 50, 20, 50, 20, 40, 5, 20, 5,  60, 10, 40, 5, 20, 5, 60, 80, 50, 20, 50, 20, 50, 20, 40, 5, 20, 5,  60, 10, 40, 5,  20, 5, 60, 40]
 
if __name__ == '__main__':
	buz=passifBuzzer.PassifBuzzer(PIN_PASSIDFBUZZ, 'BCM')
	try:
		buz.play(starWarThemeNote,starWarThemeTone)
		buz.play(marcehImperialeNote,marcehImperialeTone)
	except KeyboardInterrupt: 
		buz.clean()