Metrónomo de Arduino: 4 pasos

Metrónomo de Arduino: 4 pasos

Tabla de contenido:

Anonim

Sería bueno tener un dispositivo de metrónomo con las siguientes funciones para usarlo en casa o en la escuela de música de manera conveniente.

  • Factor de forma compacta para adaptarse a lugares pequeños en la parte superior o al lado de instrumentos musicales,
  • Funciona con pilas, robusta y portátil para llevar,
  • Fácil de configurar incluso para niños, el valor BPM siempre se muestra,
  • Beats ajustables por minuto con un botón giratorio, hasta 240 BPM
  • Tacto audible con control de volumen,
  • Modo silencioso para la práctica de auriculares durante la noche,
  • Retroalimentación visual de latidos (1/4, 2/4, 3/3, 4/4, 6/8, etc.) hasta 8 LEDs,
  • Con o sin acento principal, con retroalimentación visual y audible.

Al encenderse, el modo de metrónomo comenzará a 60 BPM en la pantalla pequeña y permitirá que el ritmo se sintonice con el botón giratorio entre 10 y 240. Neopixels muestra el tiempo en los LED azules mientras el zumbador marca. Al presionar la perilla, cambiará al modo de ajuste de tiempo y los LED verdes indicarán la estructura de tiempo establecida. El mando giratorio incrementará o disminuirá la estructura del tiempo (2/2, 3/3, 4/4, 6/8, etc.). Por encima de 8 LED, girando aún más en el sentido de las agujas del reloj, el acento principal se activará, y el primer LED lo indicará en rojo. El acento principal también tendrá una respuesta audible. Se puede apagar girando en sentido contrario a las agujas del reloj. Al presionar el botón, volverá del modo de ajuste de tiempo al modo de metrónomo.

Paso 2: Lista de piezas

Necesitarás un caso. Se puede comprar cualquier forma o tamaño, pero teníamos una bonita caja de metal negro de un viejo interruptor VGA manual desechado por un amigo. El resto de las partes se enumeran a continuación.

  • Batería de 9V, USD 1.50
  • Cable conector de batería, USD 0,16
  • Arduino Nano con cabeceras de pines, USD 2.05
  • Nano IO Extension Shield, USD 1,05
  • Mini interruptor deslizante para alimentación, USD 0.15
  • Zumbador piezo, USD 0,86
  • Adafruit Neopixel WS2812 8 bits, USD 1,01
  • Pantalla OLED 128x64, USD 1,53
  • Encoder rotativo, USD 0,50
  • Cables Dupont F / F, USD 0,49

El precio total de los componentes es inferior a USD 10, -

Paso 3: Diagrama de cableado

Use la tarjeta de extensión Nano IO para no molestarse en soldar múltiples conexiones GND y VCC. Se requerirá una soldadura mínima para los encabezados de pin Nano y para los conectores del módulo Neopixel. El uso de cables Dupont permite conexiones estables para el resto del cableado como se muestra en el diagrama. La batería de 9V está conectada a GND y VIN, esta última a través del interruptor deslizante de alimentación. El módulo del codificador rotatorio tiene un botón de interruptor integrado, que se muestra por separado en el diagrama para facilitar la comprensión de cómo conectarlos. La parte giratoria (CLK y DT) está conectada a PIN2 y PIN3 respectivamente, porque estos son los únicos pines NANO capaces de manejo de interrupciones. Rotary GND está conectado al PIN GND de Nano, por supuesto. El botón de interruptor integrado está conectado a PIN4. El zumbador piezo está conectado a PIN5 y GND. El módulo Adafruit Neopixel está conectado a PIN7 y su VIN y GND a 5V y GND de Nano, respectivamente. La pequeña pantalla OLED está conectada a la interfaz de bus I2C, que es PIN A4 y A5 para SDA y SDL. VCC y GND van a 5V y GND de Nano, por supuesto. Con esto concluye nuestro cableado Dupont.

Paso 4: Código Fuente Arduino

// Metronome, Leading Accent, Visual & Audible Tact - 2019 Peter Csurgay

#include "Wire.h" #include "Adafruit_GFX.h" #include "Adafruit_SSD1306.h" #include "Adafruit_NeoPixel.h" #include_HE n "E 'E' E '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''. Reinicie el pin # (o -1 si comparte el pin de reinicio de Arduino) Pantalla 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 encendido al principio, apagado en el resto … int tack = 4; bool leadingTack = false; int pos = 0; int curVal = 0; int prevVal = 0;

void setup () {pixels.begin (); pinMode (pin_buzzer, SALIDA); 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)) {// Dirección 0x3D para 128x64 para (;;); // No continuar, bucle para siempre} display.clearDisplay (); display.display (); }

void loop () {if (digitalRead (pin_switch) == LOW) {delay (100); while (digitalRead (pin_switch) == LOW); retraso (100); Timer1.detachInterrupt (); showGreenTacks (); while (digitalRead (pin_switch) == HIGH) {if (curVal> prevVal) {tack + = 1; if (tack> 8) {if (leadingTack) tack = 8; else {leadingTack = true; tack = 1; }}} else if (curVal prevVal) {bpm + = 2; if (lpm> 240) lpm = 240; } else if (curVal = 100) display.print (""); else display.print (""); display.print (bpm); display.display (); }

void buzztick () {if (bpmFirst == 0) {int volumen = 4; if (leadingTack && pos == 0) volumen = 8; para (int i = 0; i

void showGreenTacks () {for (int i = 0; i <8; i ++) {if (leadingTack && i == 0) pixels.setPixelColor (7-i, pixels.Color (BRILLO, 0,0)); si no

void rotaryCLK () {if (digitalRead (CLK) == LOW) {if (state == IDLE_11) state = SCLK_01; else if (estado == SCLK_10) estado = SCLK_00; else if (estado == SDT_10) estado = SDT_00; } else {if (state == SCLK_01) state = IDLE_11; si no (estado == SCLK_00) estado = SCLK_10; else if (estado == SDT_00) estado = SDT_10; else if (state == SDT_01) {state = IDLE_11; curVal--; }}} void rotaryDT () {if (digitalRead (DT) == LOW) {if (state == IDLE_11) state = SDT_10; else if (estado == SDT_01) estado = SDT_00; else if (estado == SCLK_01) estado = SCLK_00; } else {if (state == SDT_10) state = IDLE_11; else if (estado == SDT_00) estado = SDT_01; else if (estado == SCLK_00) estado = SCLK_01; si no (estado == SCLK_10) {estado = IDLE_11; curVal ++; }}}

Esta es una entrada en el

Concurso Arduino 2019