Un petit test aujourd’hui d’un composant que j’ai piqué à Benoit 🙂 : un buzzer.

En fait mon robot roulant va avoir besoin d’un klaxon pour alerter les chats de sa présence.

Dans cet article, je vais me contenter d’expliquer comment le faire fonctionner (du mois ce que j’en ai compris cet après-midi).

Le composant

Le composant a 3 broches :

  • SIG : à connecter à une broche GPIO du raspberry
  • VCC : à connecter à l’alimentation (5V)
  • GND : à connecter à une broche GND du Raspberry

Le code

Maintenant le plus intéressant : le code pour faire fonctionner tout ça.

#!/usr/bin/env python
import RPi.GPIO as GPIO
import time

BuzzerPin = 10    # pin10

SPEED = 1 

# Les notes de musique (en fait ce sont des fréquences)
TONES = {
        "do1":131,
        "re1":147,
        "mi1":165,
        "fa1":175,
        "sol1":196,
        "la1":221,
        "si1":248,        
        "do2":262,
        "re2":294,
        "mi2":330,
        "fa2":350,
        "sol2":393,
        "la2":441,
        "si2":495,
        "do3":525,
        "re3":589,
        "mi3":661,
        "fa3":700,
        "sol3":786,
        "la3":882,
        "si3":990,        
        "c6":1047,
	"b5":988,
	"a5":880,
	"g5":784,
	"f5":698,
	"e5":659,
	"eb5":622,
	"d5":587,
	"c5":523,
	"b4":494,
	"a4":440,
	"ab4":415,
	"g4":392,
	"f4":349,
	"e4":330,
	"d4":294,
	"c4":262}

# La chanson
SONG =	[
	["re3",16],["re3",16],["mi3",16],["mi3",16],
	["si2",16],["si2",16],["re3",8],
	["re3",16],["re3",16],["mi3",16],["mi3",16],
	["si2",16],["si2",16],["re3",8],
        ["re3",16],["re3",16],["mi3",16],["mi3",16],
        ["sol3",16],["sol3",16],["fa3",8],["fa3",8],
        ["mi3",8],["re3",8],["do3",8]
        
	]

def setup():
	GPIO.setmode(GPIO.BOARD) 
	GPIO.setup(BuzzerPin, GPIO.OUT)

def playTone(p,tone):
        # Calcul de la durée de la note
	duration = (1./(tone[1]*0.25*SPEED))

	if tone[0] == "p": # p => pause
		time.sleep(duration)
	else: # 
		frequency = TONES[tone[0]]
		p.ChangeFrequency(frequency)
		p.start(0.5)
		time.sleep(duration)
		p.stop()

def run():
	p = GPIO.PWM(BuzzerPin, 440)
	p.start(0.5)
	for t in SONG:
		playTone(p,t)

def destroy():
	GPIO.output(BuzzerPin, GPIO.HIGH)
	GPIO.cleanup()                     

if __name__ == '__main__':     
	setup()
	try:
		run()
		GPIO.cleanup()
	except KeyboardInterrupt:  
		destroy()

Démo

Et pour rigoler un peu, une démo.

Voyons qui reconnaîtra la chanson 🙂 (Je sais c’est un peu faux, mais c’est pas un blog sur la musique ici)