ENIB 2025 : Métronome JJJA : Différence entre versions
(→Montage des composants électroniques) |
(→Montage des composants électroniques) |
||
Ligne 162 : | Ligne 162 : | ||
====Montage des composants électroniques==== | ====Montage des composants électroniques==== | ||
Brancher tout les composants selon le plan | Brancher tout les composants selon le plan | ||
− | [Fichier: Shema_cablage.png] | + | [[Fichier: Shema_cablage.png]] |
====Intégration dans la structure==== | ====Intégration dans la structure==== |
Version du 21 janvier 2025 à 12:55
Sommaire
Description
Le projet consiste en la conception et la réalisation d'un métronome à tempo variable, réglable entre 40 et 200 BPM à l’aide de boutons "+" et "-". Il dispose d’un écran numérique pour afficher avec précision le tempo sélectionné, d’une LED verte clignotant en synchronisation avec le rythme, ainsi que d'une deuxième LED avec intensité ajustable via un potentiomètre. Cette dernière assure un éclairage efficace de l’aiguille, permettant une utilisation optimale dans différentes conditions de luminosité.
Introduction
Dans le cadre de ce projet, l'équipe JJJA (Joachim, Joseph, Jean, Antoine) a entrepris de transformer un papertoy existant en un métronome fonctionnel. En conservant les éléments essentiels du modèle de départ, à l’exception de la boîte initiale, l’équipe a entièrement repensé et adapté le dispositif.
Qu'est qu'un métronome ?
Un métronome est un instrument donnant un signal audible permettant d'indiquer un tempo que l'on règle avec ce que l'on appelle le BPM (Battements Par Minute), vitesse à laquelle doit être jouée une musique. Il est surtout utilisé dans l'étude d'une partition, la mise en place d'une interprétation ou la recherche du minutage d'une œuvre musicale.(suite)
Outils et matériel
Outils
- Pistolet à colle
- Imprimante 3D
- Cutter
- Ciseaux
- Crayon
- Cerveau affûté d'Antoine l’ingénieur
- Doigts minutieux et précis de Jean l’ingénieur
Matériel
- 2 LEDs vertes
- Un potentiomètre 10 kΩ
- Un haut-parleur WSC 8 Ω 2 V
- Un écran 7 segments (4-digit display version 1.2)
- Une carte weemos D1 mini
- Un micro servo 9g NG90
- Un bouton poussoir
- Une breadboard
- Une batterie 2600 mAh avec câble
- Des câbles classiques
- Du carton
Fichiers annexes
Code Arduino
1 #include <Servo.h> // Bibliothèque pour contrôler les servomoteurs
2 #include <ESP8266WiFi.h> // Bibliothèque pour connecter l'ESP8266 au WiFi
3 #include <TM1637Display.h> // Bibliothèque pour contrôler l'afficheur 7 segments TM1637
4
5 // Définition des broches
6 #define PIN_SERVO_2 D4
7 Servo myservo_2; // Création d'une instance de servomoteur
8
9 const int boutonIncrement = D1; // Bouton pour augmenter le BPM
10 const int boutonDecrement = D2; // Bouton pour diminuer le BPM
11 const int led1 = D5; // LED synchronisée avec le tempo
12 const int servoPin = D4; // Broche du servomoteur
13 const int buzzer = D6; // Haut-parleur pour signal sonore
14 const int clk = D3; // Broche CLK de l'afficheur 7 segments
15 const int dio = D0; // Broche DIO de l'afficheur 7 segments
16
17 Servo servo; // Instance principale du servomoteur
18 TM1637Display display(clk, dio); // Instance pour contrôler l'afficheur 7 segments
19
20 // Variables globales
21 int bpm = 60; // BPM initial
22 int minBPM = 40; // BPM minimum
23 int maxBPM = 200; // BPM maximum
24 bool servo_pos = false; // État actuel du servomoteur (position)
25 unsigned long previousMillis = 0; // Temps de référence pour le métronome
26
27 void setup() {
28 // Initialisation du matériel
29 initHardware();
30 setupWiFi();
31 server.begin();
32
33 // Configuration des broches
34 pinMode(boutonIncrement, INPUT_PULLUP); // Bouton "+" configuré en entrée avec résistance pull-up
35 pinMode(boutonDecrement, INPUT_PULLUP); // Bouton "-" configuré en entrée avec résistance pull-up
36 pinMode(led1, OUTPUT); // Configuration de la LED comme sortie
37 pinMode(buzzer, OUTPUT); // Configuration du buzzer comme sortie
38
39 // Configuration du servomoteur
40 servo.attach(servoPin);
41
42 // Initialisation des sorties
43 digitalWrite(led1, LOW); // Éteindre la LED au démarrage
44 digitalWrite(buzzer, LOW); // Éteindre le buzzer au démarrage
45 servo.write(0); // Position initiale du servomoteur
46
47 // Configuration de l'afficheur 7 segments
48 display.setBrightness(0x0f); // Réglage de la luminosité de l'afficheur
49 display.showNumberDec(bpm); // Affichage de la valeur initiale de BPM
50 }
51
52 void loop() {
53 handleButtons(); // Gestion des boutons pour régler le BPM
54 metronomeTick(); // Gestion des ticks du métronome
55 display.showNumberDec(bpm); // Mise à jour de l'affichage du BPM
56 }
57
58 void handleButtons() {
59 // Vérifie si le bouton "+" est pressé
60 if (digitalRead(boutonIncrement) == LOW) {
61 bpm = min(bpm + 1, maxBPM); // Augmente le BPM jusqu'à la limite maximale
62 delay(200); // Délai pour éviter les rebonds du bouton
63 }
64
65 // Vérifie si le bouton "-" est pressé
66 if (digitalRead(boutonDecrement) == LOW) {
67 bpm = max(bpm - 1, minBPM); // Diminue le BPM jusqu'à la limite minimale
68 delay(200); // Délai pour éviter les rebonds du bouton
69 }
70 }
71
72 void metronomeTick() {
73 unsigned long currentMillis = millis(); // Récupère le temps actuel
74 unsigned long interval = 60000 / bpm; // Calcul de l'intervalle entre chaque tick (en ms)
75 unsigned long interval_buzzer = 100; // Durée d'activation du buzzer
76
77 // Vérifie si le temps écoulé dépasse l'intervalle calculé
78 if (currentMillis - previousMillis >= interval) {
79 previousMillis = currentMillis; // Met à jour le temps de référence
80 digitalWrite(buzzer, HIGH); // Active le buzzer
81
82 if (servo_pos == false) {
83 digitalWrite(led1, HIGH); // Allume la LED
84 servo.write(180); // Déplace le servomoteur à 180°
85 servo_pos = true; // Change l'état du servomoteur
86 } else {
87 servo.write(0); // Ramène le servomoteur à 0°
88 digitalWrite(led1, HIGH); // Allume la LED
89 servo_pos = false; // Change l'état du servomoteur
90 }
91
92 }
93
94 // Vérifie si le buzzer doit être éteint après son intervalle
95 if (currentMillis - previousMillis >= interval_buzzer) {
96 digitalWrite(led1, LOW); // Éteint la LED
97 digitalWrite(buzzer, LOW); // Éteint le buzzer
98 }
99 }
Étapes de fabrication
indiquer autant d'étape que nécessaire, chacune illustrée par des images (photo, dessins, ...)
Définition des objectifs du projet
- Utiliser le servo pour faire l'aiguille.
- Rendre le tempo réglable (40 à 200 BPM) avec des boutons "+" et "-".
- Inclure un affichage numérique pour le tempo.
- Inclure un haut parleur pour faire le rythme.
- Utiliser une LED pour un repère visuel et la synchronisée et l'autre LED d'éclairage pour l’aiguille.
Préparation de l’environnement Arduino
- Télécharger et installer l'IDE Arduino et utiliser la procédure pour le wemos D1 mini
- Ajouter les bibliothèques Servo.h, ESP8266WiFi.h et TM1637Display.h.
Servo.h : Cette bibliothèque permet de contrôler des servomoteurs à l'aide des cartes Arduino.
ESP8266WiFi.h : Cette bibliothèque fait partie du core ESP8266 pour Arduino et fournit des fonctionnalités pour connecter votre ESP8266 à un réseau Wi-Fi, configurer des serveurs ou des clients.
TM1637Display.h : Cette bibliothèque est conçue pour contrôler des modules d'affichage 7 segments à 4 chiffres basés sur le circuit TM1637, tels que le module Grove 4-Digit Display de Seeed Studio.
Préparation des matériaux
Découper le carton selon le patron.
Montage des composants électroniques
Brancher tout les composants selon le plan
Intégration dans la structure
Coller les composants dans le carton à l'aide du pistolet à colle. Veiller à ce que tous les câbles soient bien positionnés pour éviter les déconnexions. Fixer la batterie rechargeable avec un câble d’alimentation accessible.
Validation fonctionnelle
Vérifier que le système fonctionne correctement en mode autonome. Tester le métronome à différents tempos pour s'assurer de la fiabilité du système. Vérifier la synchronisation des LEDs, le bon affichage du tempo, et l’intensité variable de l’éclairage.
Rédaction du wiki
Compléter les problèmes et solutions rencontrés pour aider la communauté.
Troubleshooting
Problème : Latence élevée
- Solution :Les instructions `delay()` ont été supprimées du code pour réduire la latence.
Problème : Pas de son provenant du haut-parleur
- Solution : Une caisse de résonance a été ajoutée pour améliorer la qualité du son.
Sources et documentation complémentaire
Élément de présentation
je met ici le document de présentation de mon projet