Métronome Arduino: 4 étapes

Métronome Arduino: 4 étapes

Table des matières:

Anonim

Il serait bien d’avoir un métronome doté des fonctions suivantes pour pouvoir l’utiliser facilement à la maison ou à l’école de musique.

  • Facteur de forme compact pour s'adapter à de petits endroits sur ou à côté d'instruments de musique,
  • Fonctionnant sur batterie, robuste et portable pour transporter,
  • Facilement configuré, même pour les enfants, la valeur de BPM est toujours affichée,
  • Battements par minute réglables avec un bouton rotatif, jusqu'à 240 BPM
  • Audible tact avec contrôle du volume,
  • Mode silencieux pour la pratique nocturne du casque,
  • Retour visuel des temps (1/4, 2/4, 3/3, 4/4, 6/8, etc.) jusqu'à 8 LED,
  • Avec ou sans accent principal, avec retour visuel et audible.

Lorsque vous activez cette fonction, le mode métronome démarre à 60 BPM. Vous pouvez régler le rythme à l’aide du bouton rotatif entre 10 et 240. Neopixels affiche le temps dans des voyants bleus pendant que la sonnerie retentit. Appuyez sur le bouton pour passer en mode de réglage du temps et les DEL vertes indiquent la structure de temps définie. Le bouton rotatif incrémente ou décrémente la structure du temps (2/2, 3/3, 4/4, 6/8, etc.). Au-dessus de 8 voyants, la rotation continue dans le sens des aiguilles d'une montre, l'accent principal est activé et le premier voyant l'indique en rouge. L'accent principal aura également un retour audible. Vous pouvez l'éteindre en tournant dans le sens contraire des aiguilles d'une montre. Appuyez sur le bouton pour revenir du mode de réglage du temps au mode métronome.

Étape 2: Liste de pièces

Vous aurez besoin d'un cas. Toutes les formes et toutes les tailles peuvent être achetées, mais nous avions un beau boîtier en métal noir contenant un ancien commutateur VGA manuel et un ami. Les autres parties sont énumérées ci-dessous.

  • Pile 9 V, 1,50 USD
  • Câble de connecteur de batterie, USD 0,16
  • Arduino Nano avec en-têtes de broches, 2,05 USD
  • Bouclier d'extension Nano IO, USD 1,05
  • Mini interrupteur à glissière pour l'alimentation, 0,15 USD
  • Sonnerie piézo-électrique, USD 0,86
  • Adafruit Neopixel WS2812 8 bits, 1,01 USD
  • Écran OLED 128 x 64, USD 1,53
  • Encodeur rotatif, USD 0,50
  • Câbles Dupont F / F, USD 0,49

Le prix total des composants est inférieur à 10 USD, -

Étape 3: Schéma de câblage

Utilisez la carte d'extension Nano IO afin de ne pas vous soucier de souder plusieurs connexions GND et VCC. Une soudure minimale sera nécessaire pour les en-têtes à broches nano et pour les connecteurs de module Neopixel. L'utilisation de câbles Dupont permet des connexions stables pour le reste du câblage, comme indiqué sur le schéma. La batterie 9V est connectée à GND et VIN, ce dernier via le commutateur d'alimentation. Le module codeur rotatif comporte un bouton-poussoir intégré, qui est indiqué séparément dans le schéma pour faciliter la compréhension de la façon de les connecter. La partie rotative (CLK et DT) est connectée à PIN2 et à PIN3 respectivement, car ce sont les seules broches NANO capables de gérer les interruptions. Rotary GND est bien entendu connecté au code PIN GND du Nano. Le bouton de commutation intégré est connecté à PIN4. La sonnerie piézo est connectée à PIN5 et GND. Le module Adafruit Neopixel est connecté à PIN7 et ses VIN et GND aux 5V et GND de Nano, respectivement. Le petit écran OLED est connecté à l’interface de bus I2C, PIN A4 et A5 pour SDA et SDL. VCC et GND vont bien sûr au 5V de Nano et à GND. Ceci conclut notre câblage Dupont.

Étape 4: Code source Arduino

// Métronome, accent accentué, visuel et audible - 2019 Peter Csurgay

#include "Wire.h" #include "Adafruit_GFX.h" #include "Adafruit_SSD1306.h" #include "Adafruit_NeoPixel.h" #include "TimerOne.h" #define SCREEN_WIDTHIN Broche de réinitialisation n ° (ou -1 si partage de la broche de réinitialisation Arduino), écran Adafruit_SSD1306 (SCREEN_WIDTH, SCREEN_HEIGHT, & Wire, OLED_RESET); #define pin_neopixel 7 #define NUMPIXELS 8 #define BRIGHTNESS 32 Adafruit_NeoPixel pixels = Adafruit_NeoPixel (NUMPIXELS, pin_neopixel, NEO_GRB + NEO_KHZ800); #define IDLE_11 0 #define SCLK_01 1 #define SCLK_00 2 #define SCLK_10 3 #define SDT_10 4 #define SDT_00 5 #define SDT_01 6 int state = IDLE_11; #define CLK 2 #define DT 3 #define pin_switch 4 #define pin_buzzer 5 int bpm = 60; int bpmFirst = 0; // LED allumée en premier, éteinte au repos … int tack = 4; bool LeadingTack = false; int pos = 0; int curVal = 0; int prevVal = 0;

void setup () {pixels.begin (); pinMode (pin_buzzer, OUTPUT); Timer1.initialize (1000000 * 60 / bpm / 2); Timer1.attachInterrupt (buzztick); pinMode (CLK, INPUT_PULLUP); pinMode (DT, INPUT_PULLUP); pinMode (pin_switch, INPUT_PULLUP); attachInterrupt (digitalPinToInterrupt (CLK), rotaryCLK, CHANGE); attachInterrupt (digitalPinToInterrupt (DT), rotaryDT, CHANGE); if (! display.begin (SSD1306_SWITCHCAPVCC, 0x3C)) {// Adresse 0x3D pour 128x64 pour (;;); // Ne continue pas, boucle en boucle} display.clearDisplay (); display.display (); }

boucle vide () {if (digitalRead (pin_switch) == BAS) {delay (100); while (digitalRead (pin_switch) == BAS); délai (100); Timer1.detachInterrupt (); showGreenTacks (); tandis que (digitalRead (pin_switch) == HIGH) {if (curVal> prevVal) {tack + = 1; si (tack> 8) {si (leadTack) tack = 8; else {LeadingTack = true; tack = 1; }}} else if (curVal prevVal) {bpm + = 2; si (bpm> 240) bpm = 240; } else if (curVal = 100) display.print (""); sinon display.print (""); display.print (bpm); display.display (); }

void buzztick () {if (bpmFirst == 0) {int volume = 4; if (LeadingTack && pos == 0) volume = 8; pour (int i = 0; i

void showGreenTacks () {for (int i = 0; i <8; i ++) {if (LeadingTack && i == 0) pixels.setPixelColor (7-i, pixels.Color (LUMINOSITÉ, 0,0)); sinon si (i

void rotaryCLK () {if (digitalRead (CLK) == BAS) {if (state == IDLE_11) state = SCLK_01; sinon si (état == SCLK_10) état = SCLK_00; sinon if (state == SDT_10) state = SDT_00; } else {if (state == SCLK_01) state = IDLE_11; sinon si (état == SCLK_00) état = SCLK_10; sinon si (état == SDT_00) état = SDT_10; sinon if (state == SDT_01) {state = IDLE_11; curVal--; }}} void rotaryDT () {if (digitalRead (DT) == BAS) {if (state == IDLE_11) state = SDT_10; sinon if (state == SDT_01) state = SDT_00; sinon si (état == SCLK_01) état = SCLK_00; } else {if (state == SDT_10) state = IDLE_11; sinon si (état == SDT_00) état = SDT_01; sinon si (état == SCLK_00) état = SCLK_01; sinon si (état == SCLK_10) {état = IDLE_11; curVal ++; }}}

Ceci est une entrée dans le

Concours Arduino 2019