Modifications

Sauter à la navigation Sauter à la recherche
2 437 octets ajoutés ,  20 février 2016 à 22:47
Ligne 34 : Ligne 34 :     
== Le code ==
 
== Le code ==
xxx
+
Voici un script élémentaire qui permet de jouer une mélodie.
 +
 
 +
La mélodie est encodée dans une chaîne de caractère.
 +
 
 +
<nowiki>from pyb import Pin, Timer, udelay
 +
 
 +
# Configurer les broches PWM pour la sortie sur buzzer
 +
p2 = Pin("Y2") # Broche Y2 avec timer 8 et Channel 2
 +
tim = Timer(8, freq=3000)
 +
ch = tim.channel(2, Timer.PWM, pin=p2)
 +
 
 +
# Notes/tonalite simple avec frequence correspondantes
 +
notes = { ' ' : 0,  # silence,
 +
          'c' : 261, # Do
 +
          'd' : 294, # Ré
 +
          'e' : 329, # Mi
 +
          'f' : 349, # Fa
 +
          'g' : 392, # Sol
 +
          'a' : 440, # La
 +
          'b' : 493, # Si
 +
          'C' : 523 # Do
 +
        }
 +
 
 +
# Jouer une mélodie:
 +
#  Liste de Note + Rythme (separe par des virgules)
 +
#  Premier caractere = la note/tonalite
 +
#  Second caractere = rythme (manquant=defaut=1)
 +
tune = "c,c,g,g,a,a,g2,f,f,e,e,d,d,c2, 4"
 +
tune2 = "c2,c,d3,c3,f3,e3,c2,c,d3,c3,g3,f3, 4"
 +
tempo = 300
 +
 
 +
# Jouer une frequence donnee (donc une note)
 +
def play_freq( freq ):
 +
    if freq == 0:
 +
        ch.pulse_width_percent( 0 )
 +
    else:
 +
        tim.freq( freq )
 +
        ch.pulse_width_percent( 30 )
 +
 
 +
# jouer les notes abcdef... pendant une duree donnee
 +
def play_note( note, duration ):
 +
    # Transforme la note en frequence
 +
    freq = notes[ note ]
 +
    play_freq( freq )
 +
    # Transforme la duree en temp (1=1000micros, 2=2000micros, etc)
 +
    udelay( duration * 1000 ) # temps en micro-second
 +
 
 +
# Joue toutes les notes connues (du dictionnaire, test play_tone)
 +
def test_notes():
 +
    note_duration = 2
 +
    for note, freq in notes.items():
 +
        print(note)
 +
        play_note( note, tempo * note_duration )
 +
        pyb.delay(300)
 +
 
 +
# Joue une mélodie encodée dans une chaine de caractere
 +
def play_tune( tune_string ):
 +
    tune_list = tune_string.split( ',' )
 +
    duration = 1
 +
    for tune_item in tune_list:
 +
        # print( tune_item )
 +
        if len( tune_item )>1:
 +
            try:
 +
                duration = int( tune_item[1:] )
 +
            except:
 +
                raise ValueError( 'Invalid duration %s for note %s' % (tune_item[1:], tune_item[0]) )
 +
        else:
 +
            duration = 1
 +
 
 +
        # Jouer la note
 +
        play_note( tune_item[0], tempo * duration )
 +
        # Pause entre 2 notes
 +
        play_freq( 0 )
 +
        udelay( (tempo * 1000) // 2 ) 
 +
 
 +
# test_notes()
 +
play_tune( tune ) # A vous dirais-je maman
 +
# play_tune( tune2 ) # Joyeux anniversaire
 +
 
 +
# Pour forcer le silence
 +
# play_note( ' ', 1 )</nowiki>
    
== Cela ne fonctionne pas? ==
 
== Cela ne fonctionne pas? ==
29 837

modifications

Menu de navigation