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é.
- Ligne 13 : association de la fonction d'interruption bouton_cb avec la broche GP16 du bouton. Le paramètre trigger indique que l'appel se fait sur le flan descendant du signal (quand il passe du niveau haut au niveau bas).
- Lignes 15 et 16 : création d'un objet RingTonePlayer associé à la broche du buzzer et chargement d'une bibliothèque de mélodie RTTTL (voir le tutoriel musique).
- Lignes 17 et 18 : obtention de la liste des mélodies disponibles et affichage de cette liste sur la sortie REPL. Ce qui produit l'affichage ci-dessous. Il est donc possible de sélectionner n'importe quel nom de la liste avec l'expression song_names[index] avec index variant de 0 à len(song_names)-1.
['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']
- Ligne 20 : définition de la variable index utilisée pour la sélection de la mélodie à jouer lorsque le bouton sera presser. La valeur 0 est assigné à cette variable pour sélectionner la première mélodie.
- Ligne 21 : boucle infinie exécutant le corps du script entre les lignes 22 à 34. Ce corps du script effectue les tâches suivantes:
- Vérifie si le bouton est pressé,
- jouer la mélodie (si le bouton a été pressé)
- Sélectionne la mélodie suivante (si le bouton a été pressé)
- introduire une petite pause de 1/5 secondes (pour ne pas surcharger le microcontrôleur)
- Ligne 22 : si le bouton à été pressé alors jouer une mélodie sinon passer directement à la ligne 34.
- Ligne 23 : capture du nom de la mélodie stockée dans la liste song_names à la position index.
- Ligne 24 : afficher les informations relatives à la mélodie sur la sortie REPL.
- Ligne 26 : jouer la mélodie de song.py identifiée par son nom.
- Lignes 28 à 30 : incrémenter l'index de 1 pour sélectionner la prochaine mélodie. Si l'index dépasse la grandeur de la liste alors réinitialiser l'index à la première position (zero).
- Ligne 32 : la dernière opération effectuée après avoir joué une mélodie est de réinitialiser le compteur counter à zéro pour attendre la prochaine pression sur le bouton.
- Ligne 34 : petite pause de 200 ms pour ne pas garder le microcontrôleur occupé à 100% juste pour tester la variable counter
Ressources
- Amplifier une sortie audio PWM
Explique comment transformer le signal PWM pour pouvoir l'injecter dans un amplificateur audio... de quoi avoir une sonnette plus audible. - Machine.Pin : cette ressource de MicroPython reprend, entre autre, la documentation sur les interruption et les broches.
- Développement avec interruption : cette ressource de MicroPython reprend de nombreuses recommandations concernant le développement de routines d'interruption avec MicroPython.
Traduction augmentée réalisée par Meurisse. D pour shop.MCHobby.be - Licence CC-BY-SA.