P2E-MELODIC-BELL
Sonnette
Chez MCHobby, nous avons une sonnette de porte pour le moins originale.
A chaque fois qu'une personne presse le bouton, une piste audio bien rythmée est jouée sur une paire de haut-parleur PC (réglé sur un volume assez élevé).
Ce qu'il y a d'intéressant, c'est que la mélodie est différente d'une fois à l'autre (parmi une sélection de "titre").
C'est une idée assez originale donc nous ne nous lassons pas depuis de nombreuses années.
Alors pourquoi ne pas réaliser quelque-chose de similaire avec notre pico-explorer.
En effet:
- Le Pico Explorer dispose d'un Buzzer amplifié
- La bibliothèque RTTTL permet de jouer des mélodies.
- Le fichier songs.py contient déjà un ensemble de mélodie (voir le détail dans la bibliothèque micropython-rtttl )
Cet exemple se propose jouer un mélodie différente à chaque fois que le bouton est pressé.
Brancher
Pico | Pico-2-Explorer |
GP16 | Btn 3 (ou bouton volant) |
GP13 | Buzzer (cavalier place) |
Le bouton de sonnette sera simulée par l'un des 3 boutons qui sera branché sur le GPIO 16. Ce bouton peut très bien être remplacé par un "bouton volant" pour placer la sonnette à l'entrée de votre chambre.
Sur le Pico-2-Explorer, le piezo buzzer est branché directement sur GP13 par l'intermédiaire d'une électronique d'amplification.
Le cavalier Buzzer doit être en place.
Code
Le script doorbell.py est disponible dans le dépôt dédié au Pico-2-Explorer.
1 import micropython, time
2 from machine import Pin
3 from rtplay import *
4 micropython.alloc_emergency_exception_buf(100)
5
6 counter = 0
7
8 def bouton_cb( obj ):
9 global counter
10 counter += 1
11
12 btn = Pin( Pin.board.GP16, Pin.IN, Pin.PULL_UP )
13 btn.irq( handler=bouton_cb, trigger=Pin.IRQ_FALLING )
14
15 buzzer = RingTonePlayer( Pin.board.GP13 )
16 buzzer.load_songs( 'songs.py' )
17 song_names = buzzer.dir_songs()
18 print( song_names )
19
20 index = 0
21 while True:
22 if counter>0:
23 song_name = song_names[index]
24 print( 'Ring the bell! %i %s' % (index,song_name) )
25
26 buzzer.play_song( song_name )
27
28 index += 1
29 if index >= len(song_names):
30 index = 0
31
32 counter=0
33
34 time.sleep_ms( 200 )
Une fois le script lancé, presser sur bouton joue l'une des mélodies disponibles.
- Lignes 1 à 3 : chargement des bibliothèques nécessaires dont rtplay permettant de jouer des mélodies RTTTL (voir le tutoriel musique
- Ligne 4 : étant donné que cet exemple utilisera le mécanisme d'interruption, il est nécessaire d'allouer un espace mémoire permettant la transmission des messages d'erreurs.
- Ligne 6 : déclaration de la variable globale counter. Cette dernière sera incrémentée de 1 par une routine d'interruption à chaque fois que le bouton de sonnette sera enfoncé. Par conséquent, l'expression counter>0 sera vraie lorsque le bouton de sonnette aura été enfoncé.
- Lignes 8 à 10 : déclaration de la fonction de rappel bouton_cb (cb pour "CallBack" signifiant "Rappel"). Cette fonction sera appelée à chaque pression du bouton dès que le mécanisme d'interruption sera mis en place. Le script utilisateur étant interrompu pendant l'exécution d'une routine d'interruption, il est impératif que celle-ci soit la plus courte possible. L'opération ici est simple, le compteur est incrémenté de 1 à chaque exécution.
- Ligne 12 : déclaration de l'entrée bouton avec activation de la résistance pull-up (de tirage à 3.3V). La potentiel de la broche passe du niveau Haut au niveau Bas lorsque le bouton est pressé.
['Super Mario - Main Theme', 'Super Mario - Title Music', 'SMBtheme', 'SMBwater', 'SMBunderground', 'Picaxe', 'The Simpsons', 'Indiana', 'TakeOnMe', 'Entertainer', 'Muppets', 'Xfiles', 'Looney', '20thCenFox', 'Bond', 'MASH', 'StarWars', 'GoodBad', 'TopGun', 'A-Team', 'Flinstones', 'Jeopardy', 'Gadget', 'Smurfs', 'MahnaMahna', 'LeisureSuit', 'MissionImp']
Ressources
https://docs.micropython.org/en/latest/library/machine.Pin.html
https://docs.micropython.org/en/latest/reference/isr_rules.html
Traduction augmentée réalisée par Meurisse. D pour shop.MCHobby.be - Licence CC-BY-SA.