C'est l'été ! Fleur.gif

ENIB 2025 : Métronome JJJA : Différence entre versions

De Les Fabriques du Ponant
Aller à : navigation, rechercher
(Fichiers annexes)
(Code Arduino)
Ligne 114 : Ligne 114 :
 
}
 
}
 
}
 
}
 +
 +
#include <Servo.h> // Bibliothèque pour contrôler les servomoteurs
 +
#include <ESP8266WiFi.h> // Bibliothèque pour connecter l'ESP8266 au WiFi
 +
#include <TM1637Display.h> // Bibliothèque pour contrôler l'afficheur 7 segments TM1637
 +
 +
// Définition des broches
 +
#define PIN_SERVO_2  D4
 +
Servo myservo_2; // Création d'une instance de servomoteur
 +
 +
const int boutonIncrement = D1; // Bouton pour augmenter le BPM
 +
const int boutonDecrement = D2; // Bouton pour diminuer le BPM
 +
const int led1 = D5; // LED synchronisée avec le tempo
 +
const int servoPin = D4; // Broche du servomoteur
 +
const int buzzer = D6; // Haut-parleur pour signal sonore
 +
const int clk = D3; // Broche CLK de l'afficheur 7 segments
 +
const int dio = D0; // Broche DIO de l'afficheur 7 segments
 +
 +
Servo servo; // Instance principale du servomoteur
 +
TM1637Display display(clk, dio); // Instance pour contrôler l'afficheur 7 segments
 +
 +
// Variables globales
 +
int bpm = 60; // BPM initial
 +
int minBPM = 40; // BPM minimum
 +
int maxBPM = 200; // BPM maximum
 +
bool servo_pos = false; // État actuel du servomoteur (position)
 +
unsigned long previousMillis = 0; // Temps de référence pour le métronome
 +
 +
void setup() {
 +
// Initialisation du matériel
 +
initHardware();
 +
setupWiFi();
 +
server.begin();
 +
 +
// Configuration des broches
 +
pinMode(boutonIncrement, INPUT_PULLUP); // Bouton "+" configuré en entrée avec résistance pull-up
 +
pinMode(boutonDecrement, INPUT_PULLUP); // Bouton "-" configuré en entrée avec résistance pull-up
 +
pinMode(led1, OUTPUT); // Configuration de la LED comme sortie
 +
pinMode(buzzer, OUTPUT); // Configuration du buzzer comme sortie
 +
 +
// Configuration du servomoteur
 +
servo.attach(servoPin);
 +
 +
// Initialisation des sorties
 +
digitalWrite(led1, LOW); // Éteindre la LED au démarrage
 +
digitalWrite(buzzer, LOW); // Éteindre le buzzer au démarrage
 +
servo.write(0); // Position initiale du servomoteur
 +
 +
// Configuration de l'afficheur 7 segments
 +
display.setBrightness(0x0f); // Réglage de la luminosité de l'afficheur
 +
display.showNumberDec(bpm); // Affichage de la valeur initiale de BPM
 +
}
 +
 +
void loop() {
 +
handleButtons(); // Gestion des boutons pour régler le BPM
 +
metronomeTick(); // Gestion des ticks du métronome
 +
display.showNumberDec(bpm); // Mise à jour de l'affichage du BPM
 +
}
 +
 +
void handleButtons() {
 +
// Vérifie si le bouton "+" est pressé
 +
if (digitalRead(boutonIncrement) == LOW) {
 +
bpm = min(bpm + 1, maxBPM); // Augmente le BPM jusqu'à la limite maximale
 +
delay(200); // Délai pour éviter les rebonds du bouton
 +
}
 +
 +
// Vérifie si le bouton "-" est pressé
 +
if (digitalRead(boutonDecrement) == LOW) {
 +
bpm = max(bpm - 1, minBPM); // Diminue le BPM jusqu'à la limite minimale
 +
delay(200); // Délai pour éviter les rebonds du bouton
 +
}
 +
}
 +
 +
void metronomeTick() {
 +
unsigned long currentMillis = millis(); // Récupère le temps actuel
 +
unsigned long interval = 60000 / bpm; // Calcul de l'intervalle entre chaque tick (en ms)
 +
unsigned long interval_buzzer = 100; // Durée d'activation du buzzer
 +
 +
// Vérifie si le temps écoulé dépasse l'intervalle calculé
 +
if (currentMillis - previousMillis >= interval) {
 +
previousMillis = currentMillis; // Met à jour le temps de référence
 +
digitalWrite(buzzer, HIGH); // Active le buzzer
 +
 +
if (servo_pos == false) {
 +
  digitalWrite(led1, HIGH); // Allume la LED
 +
  servo.write(180); // Déplace le servomoteur à 180°
 +
  servo_pos = true; // Change l'état du servomoteur
 +
} else {
 +
  servo.write(0); // Ramène le servomoteur à 0°
 +
  digitalWrite(led1, HIGH); // Allume la LED
 +
  servo_pos = false; // Change l'état du servomoteur
 +
}
 +
 +
}
 +
 +
// Vérifie si le buzzer doit être éteint après son intervalle
 +
if (currentMillis - previousMillis >= interval_buzzer) {
 +
digitalWrite(led1, LOW); // Éteint la LED
 +
digitalWrite(buzzer, LOW); // Éteint le buzzer
 +
}
 +
}
 +
 +
 
</syntaxhighlight>
 
</syntaxhighlight>
  

Version du 21 janvier 2025 à 12:22

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.

Outils et matériel

Outils

  • Pistolet à colle
  • 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>
  2 #include <ESP8266WiFi.h>
  3 #include <TM1637Display.h>
  4 #define PIN_SERVO_2  D4
  5 Servo myservo_2;
  6 
  7 // Définition des broches
  8 const int boutonIncrement = D1;
  9 const int boutonDecrement = D2;
 10 const int led1 = D5;
 11 const int servoPin = D4;
 12 const int buzzer = D6;
 13 const int clk = D3;  // Broche CLK du 4-Digit Display
 14 const int dio = D0;  // Broche DIO du 4-Digit Display
 15 
 16 Servo servo;
 17 TM1637Display display(clk, dio);
 18 
 19 int bpm = 60;  // BPM initial
 20 int minBPM = 40;
 21 int maxBPM = 200;
 22 bool servo_pos = false;
 23 unsigned long previousMillis = 0;
 24 
 25 void setup() {
 26 initHardware();
 27 setupWiFi();
 28 server.begin();
 29 
 30 pinMode(boutonIncrement, INPUT_PULLUP);
 31 pinMode(boutonDecrement, INPUT_PULLUP);
 32 pinMode(led1, OUTPUT);
 33 pinMode(buzzer, OUTPUT);
 34 servo.attach(servoPin);
 35 
 36 digitalWrite(led1, LOW);
 37 digitalWrite(buzzer, LOW);
 38 servo.write(0);
 39 display.setBrightness(0x0f);  // Réglage de la luminosité du display
 40 display.showNumberDec(bpm);   // Affiche la valeur initiale de BPM
 41 }
 42 
 43 void loop() {
 44 handleButtons();
 45 metronomeTick();
 46 display.showNumberDec(bpm);  // Met à jour l'affichage du BPM
 47 }
 48 
 49 void handleButtons() {
 50 if (digitalRead(boutonIncrement) == LOW) {
 51 bpm = min(bpm + 1, maxBPM);
 52 delay(200);  // Antirebond
 53 }
 54 if (digitalRead(boutonDecrement) == LOW) {
 55 bpm = max(bpm - 1, minBPM);
 56 delay(200);  // Antirebond
 57 }
 58 }
 59 
 60 void metronomeTick() {
 61 unsigned long currentMillis = millis();
 62 unsigned long interval = 60000 / bpm;  // Calcul de l'intervalle en ms
 63 unsigned long interval_buzzer = 100;
 64 
 65 if (currentMillis - previousMillis >= interval) {
 66 previousMillis = currentMillis;
 67 digitalWrite(buzzer, HIGH);
 68 if (servo_pos == false){
 69 digitalWrite(led1, HIGH);
 70 servo.write(180);
 71 servo_pos = true;
 72 } else{
 73 servo.write(0);
 74 digitalWrite(led1, HIGH);
 75 servo_pos = false;
 76 }
 77 }
 78 if (currentMillis - previousMillis >= interval_buzzer){
 79 digitalWrite(led1, LOW);
 80 digitalWrite(buzzer, LOW);
 81 }
 82 }
 83 
 84 #include <Servo.h> // Bibliothèque pour contrôler les servomoteurs
 85 #include <ESP8266WiFi.h> // Bibliothèque pour connecter l'ESP8266 au WiFi
 86 #include <TM1637Display.h> // Bibliothèque pour contrôler l'afficheur 7 segments TM1637
 87 
 88 // Définition des broches
 89 #define PIN_SERVO_2  D4
 90 Servo myservo_2; // Création d'une instance de servomoteur
 91 
 92 const int boutonIncrement = D1; // Bouton pour augmenter le BPM
 93 const int boutonDecrement = D2; // Bouton pour diminuer le BPM
 94 const int led1 = D5; // LED synchronisée avec le tempo
 95 const int servoPin = D4; // Broche du servomoteur
 96 const int buzzer = D6; // Haut-parleur pour signal sonore
 97 const int clk = D3; // Broche CLK de l'afficheur 7 segments
 98 const int dio = D0; // Broche DIO de l'afficheur 7 segments
 99 
100 Servo servo; // Instance principale du servomoteur
101 TM1637Display display(clk, dio); // Instance pour contrôler l'afficheur 7 segments
102 
103 // Variables globales
104 int bpm = 60; // BPM initial
105 int minBPM = 40; // BPM minimum
106 int maxBPM = 200; // BPM maximum
107 bool servo_pos = false; // État actuel du servomoteur (position)
108 unsigned long previousMillis = 0; // Temps de référence pour le métronome
109 
110 void setup() {
111 // Initialisation du matériel
112 initHardware();
113 setupWiFi();
114 server.begin();
115 
116 // Configuration des broches
117 pinMode(boutonIncrement, INPUT_PULLUP); // Bouton "+" configuré en entrée avec résistance pull-up
118 pinMode(boutonDecrement, INPUT_PULLUP); // Bouton "-" configuré en entrée avec résistance pull-up
119 pinMode(led1, OUTPUT); // Configuration de la LED comme sortie
120 pinMode(buzzer, OUTPUT); // Configuration du buzzer comme sortie
121 
122 // Configuration du servomoteur
123 servo.attach(servoPin);
124 
125 // Initialisation des sorties
126 digitalWrite(led1, LOW); // Éteindre la LED au démarrage
127 digitalWrite(buzzer, LOW); // Éteindre le buzzer au démarrage
128 servo.write(0); // Position initiale du servomoteur
129 
130 // Configuration de l'afficheur 7 segments
131 display.setBrightness(0x0f); // Réglage de la luminosité de l'afficheur
132 display.showNumberDec(bpm); // Affichage de la valeur initiale de BPM
133 }
134 
135 void loop() {
136 handleButtons(); // Gestion des boutons pour régler le BPM
137 metronomeTick(); // Gestion des ticks du métronome
138 display.showNumberDec(bpm); // Mise à jour de l'affichage du BPM
139 }
140 
141 void handleButtons() {
142 // Vérifie si le bouton "+" est pressé
143 if (digitalRead(boutonIncrement) == LOW) {
144 bpm = min(bpm + 1, maxBPM); // Augmente le BPM jusqu'à la limite maximale
145 delay(200); // Délai pour éviter les rebonds du bouton
146 }
147 
148 // Vérifie si le bouton "-" est pressé
149 if (digitalRead(boutonDecrement) == LOW) {
150 bpm = max(bpm - 1, minBPM); // Diminue le BPM jusqu'à la limite minimale
151 delay(200); // Délai pour éviter les rebonds du bouton
152 }
153 }
154 
155 void metronomeTick() {
156 unsigned long currentMillis = millis(); // Récupère le temps actuel
157 unsigned long interval = 60000 / bpm; // Calcul de l'intervalle entre chaque tick (en ms)
158 unsigned long interval_buzzer = 100; // Durée d'activation du buzzer
159 
160 // Vérifie si le temps écoulé dépasse l'intervalle calculé
161 if (currentMillis - previousMillis >= interval) {
162 previousMillis = currentMillis; // Met à jour le temps de référence
163 digitalWrite(buzzer, HIGH); // Active le buzzer
164 
165 if (servo_pos == false) {
166   digitalWrite(led1, HIGH); // Allume la LED
167   servo.write(180); // Déplace le servomoteur à 180°
168   servo_pos = true; // Change l'état du servomoteur
169 } else {
170   servo.write(0); // Ramène le servomoteur à 0°
171   digitalWrite(led1, HIGH); // Allume la LED
172   servo_pos = false; // Change l'état du servomoteur
173 }
174 
175 }
176 
177 // Vérifie si le buzzer doit être éteint après son intervalle
178 if (currentMillis - previousMillis >= interval_buzzer) {
179 digitalWrite(led1, LOW); // Éteint la LED
180 digitalWrite(buzzer, LOW); // Éteint le buzzer
181 }
182 }

Étapes de fabrication

indiquer autant d'étape que nécessaire, chacune illustrée par des images (photo, dessins, ...)

1. 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.

2. Préparation de l’environnement Arduino

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.

3. Préparation des matériaux

Découper le carton selon le patron.

4. Montage des composants électroniques

Brancher tout les composants selon le plan

5. 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.

7. 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.

8. 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