Jouer « Joyeux Anniversaire » en Polyphonie 3 Voies sur Arduino Nano – Démo Mélodie Infinie Synchronisée Lumière
Composants et fournitures
| Composant | Quantité |
|---|---|
| Arduino Nano R3 | 1 |
Applications et services en ligne
- Arduino IDE
À propos de ce projet
Jouez le thème « Joyeux anniversaire » en polyphonie sur Arduino Nano avec trois buzzers sur une seule mini plaque d'essai.
Démonstration
Branchez ce montage sur n'importe quelle source d'alimentation USB (pas seulement un ordinateur) et il jouera la mélodie « Joyeux anniversaire » indéfiniment... ou presque... jusqu'à ce que vous en ayez vraiment marre !
Les LEDs clignotent en rythme avec chaque changement de note sur le canal/buzzer correspondant.
Schéma de câblage
L'idée était de réaliser un dispositif ultra-compact avec (presque) aucune soudure. J'ai réussi à tout caser sur une minuscule plaque d'essai :
L'Arduino Nano s'insère PARFAITEMENT dans ce type de plaque, permettant de connecter des composants supplémentaires des deux côtés.
Je suis trop paresseux pour dessiner des schémas, mais les gros plans ci-dessous suffisent amplement pour comprendre le montage.
Détails importants :
- Les résistances utilisées sont de 100 Ω (le « standard » pour la protection des LEDs est 220 Ω, mais ça fonctionne).
- Les broches des buzzers sont insérées dans la plaque d'une manière spécifique (voir photos).
- Le buzzer central est plus grand – c'est pour le canal « basse » (blague ! Ils couinent tous comme une chorale de souris folles sans différence audible). Vous pouvez utiliser trois buzzers identiques sans problème, mais il faudra adapter leurs positions et les numéros de broches dans le code.
- Astuce : J'utilise plusieurs broches I/O de l'Arduino comme broches de masse (GND) pour les buzzers et les LEDs. Si vous mettez une broche I/O à l'état LOW dans le programme, elle fonctionne exactement comme une broche GND standard. Pratique, non ?
À propos du programme
Le code complet est fourni ci-dessous. Vous devez installer la bibliothèque « Tone » supplémentaire pour compiler le sketch :
Télécharger la bibliothèque Tone (fermez la fenêtre d'inscription si elle apparaît).
Installation : dans l'IDE Arduino, Croquis → Inclure une bibliothèque → Ajouter la bibliothèque .ZIP... et sélectionnez le fichier téléchargé.
Cette bibliothèque permet la génération simultanée de plusieurs tons sur un seul contrôleur (elle utilise des timers matériels et interruptions supplémentaires « sous le capot »). C'est une sorte de « multitâche artisanal » sur un seul cœur sans OS.
Auteur de la bibliothèque : Bhagman | GitHub : https://github.com/bhagman/Tone
Avertissement : Mon code est volumineux et difficile à lire, car il faut « jongler » avec trois « threads » de mélodie indépendants depuis un seul flux d'instructions linéaire. J'avais pensé le refactoriser pour séparer les mélodies et le réutiliser pour d'autres chansons... mais je ne l'ai probablement pas fait. Bonne chance ! Tout retour est apprécié.
Code
N'oubliez pas d'installer la bibliothèque Tone !
#include <Tone.h>
Tone solo; Tone bass; Tone rythm;
const int t = 600; // durée noire
const int tt = t*2;
const int t14 = round(t*1/4);
const int t24 = round(t*2/4);
const int t34 = round(t*3/4);
const int bassLedPin = 15; // A1
const int rythmLedPin = 17; // A3
const int soloLedPin = 19; // A5
void wait(Tone t) { while (t.isPlaying()) { } }
int bassLedState = LOW;
void switchBassLed() { bassLedState = !bassLedState; digitalWrite(bassLedPin, bassLedState); }
int rythmLedState = LOW;
void switchRythmLed() { rythmLedState = !rythmLedState; digitalWrite(rythmLedPin, rythmLedState); }
int soloLedState = LOW;
void switchSoloLed() { soloLedState = !soloLedState; digitalWrite(soloLedPin, soloLedState); }
void setup(void) {
pinMode(14, OUTPUT); // A0 - masse LED
pinMode(16, OUTPUT); // A2 - masse LED
pinMode(18, OUTPUT); // A4 - masse LED
pinMode(bassLedPin, OUTPUT);
pinMode(rythmLedPin, OUTPUT);
pinMode(soloLedPin, OUTPUT);
pinMode(2, OUTPUT); // masse buzzer solo
pinMode(9, OUTPUT); // masse buzzer rythm
solo.begin(6); // signal buzzer solo
bass.begin(12); // signal buzzer bass
rythm.begin(0); // signal buzzer rythm
solo.play(NOTE_D4, t34); switchSoloLed(); wait(solo);
solo.play(NOTE_D4, t14); switchSoloLed(); wait(solo);
}
void loop(void) {
// La séquence complète de notes suit...
// (Code tronqué pour la lisibilité - voir le projet original pour la version complète)
// Structure : bass.play(), rythm.play(), solo.play() avec switchLed() et wait() entre chaque
}
Note : La fonction loop() complète contient toute la séquence note par note de « Joyeux anniversaire » sur trois canaux. Consultez le projet original pour le code intégral.
Processus de fabrication
- Capteur CO2 K30 : Surveillance en temps réel de la qualité de l'air intérieur
- Faciliter la communication sourd-aveugle avec 1Sheeld et Arduino
- Construire une Tirelire Intelligente : Contrôler un Accepteur de Pièces avec Arduino Nano
- Robe Connectée : Surveillance du Rythme Cardiaque et LEDs avec Arduino Nano, CrazyCircuits et DFRobot
- Contrôler une LED par Bluetooth avec Arduino et MIT App Inventor
- Intégrer un capteur d'empreintes capacitif DFRobot (ID809) avec Arduino ou ESP8266
- Station météo interactive Nextion HMI avec Arduino Mega et capteurs
- Bras robotique 6 DoF piloté par Nunchuk Wii – Kit Arduino Mega
- Contrôler 2 moteurs pas-à-pas avec Arduino Nano et joystick – Tutoriel Visuino