| Ligne 69 : | Ligne 69 : | ||
|Step_Picture_01=Piano_automate_rrr.JPG | |Step_Picture_01=Piano_automate_rrr.JPG | ||
|Step_Picture_02=Piano_automate_n.JPG | |Step_Picture_02=Piano_automate_n.JPG | ||
| + | }} | ||
| + | {{Tuto Step | ||
| + | |Step_Title=<translate>téléverser le code</translate> | ||
| + | |Step_Content=<translate><syntaxhighlight lang="arduino" line="1"> | ||
| + | #include <Wire.h> // Bibliothèque pour la communication I2C | ||
| + | #include <Adafruit_PWMServoDriver.h> // Bibliothèque pour piloter le PCA9685 (servomoteurs) | ||
| + | |||
| + | // Création d'une instance du module PCA9685 à l'adresse 0x40 | ||
| + | Adafruit_PWMServoDriver pca = Adafruit_PWMServoDriver(0x40); | ||
| + | |||
| + | // Valeurs PWM correspondant aux positions repos et levée des servos | ||
| + | int SERVOMIN = 100; // Position repos | ||
| + | int SERVOMAX = 200; // Position levée complète | ||
| + | |||
| + | // Valeur pour un mouvement plus puissant (~40°) | ||
| + | int SERVO_FRAPPE = SERVOMIN + ((SERVOMAX - SERVOMIN) / 4); // Position intermédiaire pour frapper | ||
| + | |||
| + | // Délais utilisés pour frapper et revenir | ||
| + | #define DELAI_FRAPPE 200 // Durée pour lever le bras du servo | ||
| + | #define DELAI_RETOUR 250 // Durée pour revenir à la position repos | ||
| + | #define DELAI_SECURITE 50 // Petite pause pour éviter chevauchement des frappes | ||
| + | |||
| + | // Durées des notes pour le rythme de la musique | ||
| + | #define NOIRE 350 // Durée d'une noire | ||
| + | #define CROCHE 175 // Durée d'une croche | ||
| + | #define BLANCHE 700 // Durée d'une blanche | ||
| + | |||
| + | // Mapping des notes sur les 15 servos (de DO grave à DO aigu) | ||
| + | #define DO 0 | ||
| + | #define RE 1 | ||
| + | #define MI 2 | ||
| + | #define FA 3 | ||
| + | #define SOL 4 | ||
| + | #define LA 5 | ||
| + | #define SI 6 | ||
| + | #define DO2 7 | ||
| + | #define RE2 8 | ||
| + | #define MI2 9 | ||
| + | #define FA2 10 | ||
| + | #define SOL2 11 | ||
| + | #define LA2 12 | ||
| + | #define SI2 13 | ||
| + | #define DO3 14 | ||
| + | |||
| + | // -------- SETUP -------- | ||
| + | void setup() { | ||
| + | Serial.begin(115200); // Initialisation du port série pour debug | ||
| + | Serial.println("Piano 15 touches - Ne Pleure Pas Jeannette"); | ||
| + | |||
| + | pca.begin(); // Démarrage du module PCA9685 | ||
| + | pca.setPWMFreq(50); // Fréquence standard servomoteur (50Hz) | ||
| + | delay(100); | ||
| + | |||
| + | // Initialisation des servos à la position repos | ||
| + | Serial.println("Initialisation des servos..."); | ||
| + | for (int i = 0; i < 15; i++) { | ||
| + | pca.setPWM(i, 0, SERVOMIN); // Met chaque servo à la position repos | ||
| + | delay(50); // Petite pause pour éviter surcharge I2C | ||
| + | } | ||
| + | |||
| + | delay(1000); | ||
| + | Serial.println("Pret! Demarrage dans 2 secondes..."); | ||
| + | delay(2000); // Pause avant le début | ||
| + | } | ||
| + | |||
| + | // -------- LOOP PRINCIPAL -------- | ||
| + | void loop() { | ||
| + | jouerNePleurePasJeannette(); // Appel de la fonction qui joue la musique complète | ||
| + | delay(3000); // Pause entre les répétitions de la chanson | ||
| + | } | ||
| + | |||
| + | // -------- FONCTIONS DE BASE -------- | ||
| + | |||
| + | // Frapper une touche spécifique | ||
| + | void frapperTouche(int servoNum) { | ||
| + | if (servoNum < 0 || servoNum >= 15) return; // Vérifie que le servo existe | ||
| + | |||
| + | Serial.print("Note: Servo "); | ||
| + | Serial.println(servoNum); // Affiche dans le moniteur série pour debug | ||
| + | |||
| + | pca.setPWM(servoNum, 0, SERVO_FRAPPE); // Lever le bras du servo pour frapper | ||
| + | delay(DELAI_FRAPPE); | ||
| + | |||
| + | pca.setPWM(servoNum, 0, SERVOMIN); // Revenir à la position repos | ||
| + | delay(DELAI_RETOUR); | ||
| + | delay(DELAI_SECURITE); // Pause pour sécurité | ||
| + | } | ||
| + | |||
| + | // Jouer une note avec sa durée | ||
| + | void jouerNote(int note, int duree) { | ||
| + | frapperTouche(note); // Frapper la touche | ||
| + | int tempsRestant = duree - (DELAI_FRAPPE + DELAI_RETOUR + DELAI_SECURITE); | ||
| + | if (tempsRestant > 0) { | ||
| + | delay(tempsRestant); // Attendre le reste de la durée de la note | ||
| + | } | ||
| + | } | ||
| + | |||
| + | // Silence / pause | ||
| + | void silence(int duree) { | ||
| + | delay(duree); // Simple pause pour un silence | ||
| + | } | ||
| + | |||
| + | // -------- MUSIQUE : "Ne pleure pas Jeannette" -------- | ||
| + | void jouerNePleurePasJeannette() { | ||
| + | Serial.println("=== Ne pleure pas Jeannette - Version Etendue ==="); | ||
| + | |||
| + | // Introduction - graves (servos 0 à 4) | ||
| + | jouerNote(DO, CROCHE); | ||
| + | jouerNote(MI, CROCHE); | ||
| + | jouerNote(SOL, CROCHE); | ||
| + | jouerNote(DO2, CROCHE); | ||
| + | |||
| + | // Partie principale - octave moyenne | ||
| + | jouerNote(SOL, CROCHE); | ||
| + | jouerNote(SOL, CROCHE); | ||
| + | jouerNote(LA, CROCHE); | ||
| + | jouerNote(SI, CROCHE); | ||
| + | jouerNote(DO2, NOIRE); | ||
| + | jouerNote(SI, NOIRE); | ||
| + | |||
| + | // "Tra la la" - monte vers aigu | ||
| + | jouerNote(LA, CROCHE); | ||
| + | jouerNote(SOL, CROCHE); | ||
| + | jouerNote(LA, CROCHE); | ||
| + | jouerNote(SI, CROCHE); | ||
| + | jouerNote(DO2, NOIRE); | ||
| + | jouerNote(RE2, NOIRE); | ||
| + | |||
| + | // Octave haute (servos 7-14) | ||
| + | jouerNote(DO2, CROCHE); | ||
| + | jouerNote(RE2, CROCHE); | ||
| + | jouerNote(MI2, CROCHE); | ||
| + | jouerNote(FA2, CROCHE); | ||
| + | jouerNote(SOL2, NOIRE); | ||
| + | jouerNote(FA2, NOIRE); | ||
| + | |||
| + | // Descente rapide | ||
| + | jouerNote(MI2, CROCHE); | ||
| + | jouerNote(RE2, CROCHE); | ||
| + | jouerNote(DO2, CROCHE); | ||
| + | jouerNote(SI, CROCHE); | ||
| + | jouerNote(LA, NOIRE); | ||
| + | jouerNote(SOL, NOIRE); | ||
| + | |||
| + | silence(300); // Petite pause | ||
| + | |||
| + | // Interlude - arpège complet | ||
| + | jouerNote(DO, CROCHE); | ||
| + | jouerNote(RE, CROCHE); | ||
| + | jouerNote(MI, CROCHE); | ||
| + | jouerNote(FA, CROCHE); | ||
| + | jouerNote(SOL, CROCHE); | ||
| + | jouerNote(LA, CROCHE); | ||
| + | jouerNote(SI, CROCHE); | ||
| + | jouerNote(DO2, CROCHE); | ||
| + | jouerNote(RE2, CROCHE); | ||
| + | jouerNote(MI2, CROCHE); | ||
| + | jouerNote(FA2, CROCHE); | ||
| + | jouerNote(SOL2, CROCHE); | ||
| + | jouerNote(LA2, CROCHE); | ||
| + | jouerNote(SI2, CROCHE); | ||
| + | jouerNote(DO3, NOIRE); // Note la plus haute | ||
| + | |||
| + | silence(300); // Petite pause | ||
| + | |||
| + | // Refrain | ||
| + | jouerNote(SI, CROCHE); | ||
| + | jouerNote(SI, CROCHE); | ||
| + | jouerNote(DO2, CROCHE); | ||
| + | jouerNote(RE2, CROCHE); | ||
| + | jouerNote(MI2, NOIRE); | ||
| + | jouerNote(RE2, NOIRE); | ||
| + | |||
| + | // Descente | ||
| + | jouerNote(DO2, CROCHE); | ||
| + | jouerNote(SI, CROCHE); | ||
| + | jouerNote(LA, CROCHE); | ||
| + | jouerNote(SOL, CROCHE); | ||
| + | jouerNote(FA, NOIRE); | ||
| + | jouerNote(MI, NOIRE); | ||
| + | |||
| + | // Finale sur toute l’étendue | ||
| + | jouerNote(SOL2, CROCHE); | ||
| + | jouerNote(FA2, CROCHE); | ||
| + | jouerNote(MI2, CROCHE); | ||
| + | jouerNote(RE2, CROCHE); | ||
| + | jouerNote(DO2, CROCHE); | ||
| + | jouerNote(SI, CROCHE); | ||
| + | jouerNote(LA, CROCHE); | ||
| + | jouerNote(SOL, CROCHE); | ||
| + | jouerNote(FA, CROCHE); | ||
| + | jouerNote(MI, CROCHE); | ||
| + | jouerNote(RE, CROCHE); | ||
| + | jouerNote(DO, NOIRE); // Retour grave | ||
| + | |||
| + | silence(NOIRE); // Petite pause | ||
| + | |||
| + | // Final - accord rapide (3 notes simultanées) | ||
| + | jouerNote(DO, CROCHE); | ||
| + | delay(30); | ||
| + | jouerNote(MI, CROCHE); | ||
| + | delay(30); | ||
| + | jouerNote(SOL, CROCHE); | ||
| + | delay(30); | ||
| + | jouerNote(DO2, NOIRE); | ||
| + | |||
| + | Serial.println("=== Fin ==="); | ||
| + | } | ||
| + | |||
| + | </syntaxhighlight></translate> | ||
}} | }} | ||
{{Tuto Step | {{Tuto Step | ||
Auteur
Enguerrand Justafré | Dernière modification 11/01/2026 par Enguerrand Justafré
Pas encore d'image
Arduino, Piano automatisé, Électronique, Servomoteur, Solénoïde, MIDI, Programmation, DIY, Robotique musicale Technique
Matériel nécessaire
Outils nécessaires
Ouvrez le fichier STL des supports dans un slicer comme Cura, configurez vos paramètres d’impression, générez le G-code et imprimez. Vérifiez que les pièces s’adaptent correctement aux servomoteurs avant le montage.
La forme de votre axe de servomoteurs dépendra du piano donc il vaut mieux prendre une pièce .Stl et la multiplier suivant le nombres de moteurs.
Voir lien pour model 3D en open source ici .
1 #include <Wire.h> // Bibliothèque pour la communication I2C
2 #include <Adafruit_PWMServoDriver.h> // Bibliothèque pour piloter le PCA9685 (servomoteurs)
3
4 // Création d'une instance du module PCA9685 à l'adresse 0x40
5 Adafruit_PWMServoDriver pca = Adafruit_PWMServoDriver(0x40);
6
7 // Valeurs PWM correspondant aux positions repos et levée des servos
8 int SERVOMIN = 100; // Position repos
9 int SERVOMAX = 200; // Position levée complète
10
11 // Valeur pour un mouvement plus puissant (~40°)
12 int SERVO_FRAPPE = SERVOMIN + ((SERVOMAX - SERVOMIN) / 4); // Position intermédiaire pour frapper
13
14 // Délais utilisés pour frapper et revenir
15 #define DELAI_FRAPPE 200 // Durée pour lever le bras du servo
16 #define DELAI_RETOUR 250 // Durée pour revenir à la position repos
17 #define DELAI_SECURITE 50 // Petite pause pour éviter chevauchement des frappes
18
19 // Durées des notes pour le rythme de la musique
20 #define NOIRE 350 // Durée d'une noire
21 #define CROCHE 175 // Durée d'une croche
22 #define BLANCHE 700 // Durée d'une blanche
23
24 // Mapping des notes sur les 15 servos (de DO grave à DO aigu)
25 #define DO 0
26 #define RE 1
27 #define MI 2
28 #define FA 3
29 #define SOL 4
30 #define LA 5
31 #define SI 6
32 #define DO2 7
33 #define RE2 8
34 #define MI2 9
35 #define FA2 10
36 #define SOL2 11
37 #define LA2 12
38 #define SI2 13
39 #define DO3 14
40
41 // -------- SETUP --------
42 void setup() {
43 Serial.begin(115200); // Initialisation du port série pour debug
44 Serial.println("Piano 15 touches - Ne Pleure Pas Jeannette");
45
46 pca.begin(); // Démarrage du module PCA9685
47 pca.setPWMFreq(50); // Fréquence standard servomoteur (50Hz)
48 delay(100);
49
50 // Initialisation des servos à la position repos
51 Serial.println("Initialisation des servos...");
52 for (int i = 0; i < 15; i++) {
53 pca.setPWM(i, 0, SERVOMIN); // Met chaque servo à la position repos
54 delay(50); // Petite pause pour éviter surcharge I2C
55 }
56
57 delay(1000);
58 Serial.println("Pret! Demarrage dans 2 secondes...");
59 delay(2000); // Pause avant le début
60 }
61
62 // -------- LOOP PRINCIPAL --------
63 void loop() {
64 jouerNePleurePasJeannette(); // Appel de la fonction qui joue la musique complète
65 delay(3000); // Pause entre les répétitions de la chanson
66 }
67
68 // -------- FONCTIONS DE BASE --------
69
70 // Frapper une touche spécifique
71 void frapperTouche(int servoNum) {
72 if (servoNum < 0 || servoNum >= 15) return; // Vérifie que le servo existe
73
74 Serial.print("Note: Servo ");
75 Serial.println(servoNum); // Affiche dans le moniteur série pour debug
76
77 pca.setPWM(servoNum, 0, SERVO_FRAPPE); // Lever le bras du servo pour frapper
78 delay(DELAI_FRAPPE);
79
80 pca.setPWM(servoNum, 0, SERVOMIN); // Revenir à la position repos
81 delay(DELAI_RETOUR);
82 delay(DELAI_SECURITE); // Pause pour sécurité
83 }
84
85 // Jouer une note avec sa durée
86 void jouerNote(int note, int duree) {
87 frapperTouche(note); // Frapper la touche
88 int tempsRestant = duree - (DELAI_FRAPPE + DELAI_RETOUR + DELAI_SECURITE);
89 if (tempsRestant > 0) {
90 delay(tempsRestant); // Attendre le reste de la durée de la note
91 }
92 }
93
94 // Silence / pause
95 void silence(int duree) {
96 delay(duree); // Simple pause pour un silence
97 }
98
99 // -------- MUSIQUE : "Ne pleure pas Jeannette" --------
100 void jouerNePleurePasJeannette() {
101 Serial.println("=== Ne pleure pas Jeannette - Version Etendue ===");
102
103 // Introduction - graves (servos 0 à 4)
104 jouerNote(DO, CROCHE);
105 jouerNote(MI, CROCHE);
106 jouerNote(SOL, CROCHE);
107 jouerNote(DO2, CROCHE);
108
109 // Partie principale - octave moyenne
110 jouerNote(SOL, CROCHE);
111 jouerNote(SOL, CROCHE);
112 jouerNote(LA, CROCHE);
113 jouerNote(SI, CROCHE);
114 jouerNote(DO2, NOIRE);
115 jouerNote(SI, NOIRE);
116
117 // "Tra la la" - monte vers aigu
118 jouerNote(LA, CROCHE);
119 jouerNote(SOL, CROCHE);
120 jouerNote(LA, CROCHE);
121 jouerNote(SI, CROCHE);
122 jouerNote(DO2, NOIRE);
123 jouerNote(RE2, NOIRE);
124
125 // Octave haute (servos 7-14)
126 jouerNote(DO2, CROCHE);
127 jouerNote(RE2, CROCHE);
128 jouerNote(MI2, CROCHE);
129 jouerNote(FA2, CROCHE);
130 jouerNote(SOL2, NOIRE);
131 jouerNote(FA2, NOIRE);
132
133 // Descente rapide
134 jouerNote(MI2, CROCHE);
135 jouerNote(RE2, CROCHE);
136 jouerNote(DO2, CROCHE);
137 jouerNote(SI, CROCHE);
138 jouerNote(LA, NOIRE);
139 jouerNote(SOL, NOIRE);
140
141 silence(300); // Petite pause
142
143 // Interlude - arpège complet
144 jouerNote(DO, CROCHE);
145 jouerNote(RE, CROCHE);
146 jouerNote(MI, CROCHE);
147 jouerNote(FA, CROCHE);
148 jouerNote(SOL, CROCHE);
149 jouerNote(LA, CROCHE);
150 jouerNote(SI, CROCHE);
151 jouerNote(DO2, CROCHE);
152 jouerNote(RE2, CROCHE);
153 jouerNote(MI2, CROCHE);
154 jouerNote(FA2, CROCHE);
155 jouerNote(SOL2, CROCHE);
156 jouerNote(LA2, CROCHE);
157 jouerNote(SI2, CROCHE);
158 jouerNote(DO3, NOIRE); // Note la plus haute
159
160 silence(300); // Petite pause
161
162 // Refrain
163 jouerNote(SI, CROCHE);
164 jouerNote(SI, CROCHE);
165 jouerNote(DO2, CROCHE);
166 jouerNote(RE2, CROCHE);
167 jouerNote(MI2, NOIRE);
168 jouerNote(RE2, NOIRE);
169
170 // Descente
171 jouerNote(DO2, CROCHE);
172 jouerNote(SI, CROCHE);
173 jouerNote(LA, CROCHE);
174 jouerNote(SOL, CROCHE);
175 jouerNote(FA, NOIRE);
176 jouerNote(MI, NOIRE);
177
178 // Finale sur toute l’étendue
179 jouerNote(SOL2, CROCHE);
180 jouerNote(FA2, CROCHE);
181 jouerNote(MI2, CROCHE);
182 jouerNote(RE2, CROCHE);
183 jouerNote(DO2, CROCHE);
184 jouerNote(SI, CROCHE);
185 jouerNote(LA, CROCHE);
186 jouerNote(SOL, CROCHE);
187 jouerNote(FA, CROCHE);
188 jouerNote(MI, CROCHE);
189 jouerNote(RE, CROCHE);
190 jouerNote(DO, NOIRE); // Retour grave
191
192 silence(NOIRE); // Petite pause
193
194 // Final - accord rapide (3 notes simultanées)
195 jouerNote(DO, CROCHE);
196 delay(30);
197 jouerNote(MI, CROCHE);
198 delay(30);
199 jouerNote(SOL, CROCHE);
200 delay(30);
201 jouerNote(DO2, NOIRE);
202
203 Serial.println("=== Fin ===");
204 }
fr none 0 Draft
Vous avez entré un nom de page invalide, avec un ou plusieurs caractères suivants :
< > @ ~ : * € £ ` + = / \ | [ ] { } ; ? #