Sommario:

Metronomo Arduino: 4 passaggi
Metronomo Arduino: 4 passaggi

Video: Metronomo Arduino: 4 passaggi

Video: Metronomo Arduino: 4 passaggi
Video: DIY Stopwatch made in 30 seconds using #arduino 2024, Dicembre
Anonim
Image
Image

Quando si impara un nuovo strumento musicale da bambino, ci sono così tante cose nuove su cui concentrarsi. Tenere il passo con il ritmo giusto è uno di questi. Non trovare un metronomo funzionalmente completo e conveniente significava la scusa migliore per ricominciare a costruire con i miei figli. In questo post di Instructables troverai la descrizione funzionale, l'elenco delle parti con i collegamenti e i prezzi del negozio online, lo schema elettrico per l'assemblaggio e il codice sorgente completo di Arduino.

Passaggio 1: descrizione funzionale

Elenco delle parti
Elenco delle parti

Sarebbe bello avere un metronomo con le seguenti funzioni per usarlo comodamente a casa o alla scuola di musica.

  • Fattore di forma compatto per adattarsi a piccoli posti sopra o accanto a strumenti musicali,
  • Funziona a batteria, robusto e portatile da portare in giro,
  • Facilmente configurabile anche per i bambini, valore BPM sempre visualizzato,
  • Battiti al minuto regolabili con una manopola rotante, fino a 240 BPM
  • Tatto udibile con controllo del volume,
  • Modalità silenziosa per esercitarsi con le cuffie durante la notte,
  • Feedback visivo dei battiti (1/4, 2/4, 3/3, 4/4, 6/8, ecc.) fino a 8 LED,
  • Con o senza accento principale, con feedback visivo e sonoro.

All'accensione, la modalità metronomo partirà a 60 BPM mostrando sul piccolo display e lasciando che il ritmo sia sintonizzato dalla manopola rotante tra 10 e 240. I neopixel mostrano il battito in LED blu mentre il cicalino ticchetta. Premendo la manopola si passerà alla modalità di regolazione della battuta e i LED verdi indicheranno la struttura della battuta impostata. La manopola rotante aumenterà o diminuirà la struttura del battito (2/2, 3/3, 4/4, 6/8, ecc.). Sopra gli 8 LED, ruotando ulteriormente in senso orario, verrà attivato l'accento principale e il primo LED lo indicherà in rosso. Anche l'accento principale avrà un feedback udibile. Può essere spento ruotando in senso antiorario. Premendo la manopola si torna dalla modalità di regolazione della battuta alla modalità metronomo.

Passaggio 2: elenco delle parti

Avrai bisogno di una custodia. È possibile acquistare qualsiasi forma o dimensione, ma abbiamo avuto una bella custodia in metallo nero di un vecchio interruttore VGA manuale smaltito da un amico. Le altre parti sono elencate di seguito.

  • Batteria da 9 V, 1,50 USD
  • Cavo connettore batteria, USD 0, 16
  • Arduino Nano con intestazioni pin, 2,05 USD
  • Nano IO Extension Shield, USD 1, 05
  • Mini interruttore a scorrimento per l'alimentazione, 0,15 USD
  • Cicalino piezoelettrico, 0 USD, 86
  • Adafruit Neopixel WS2812 8 bit, 1 USD, 01
  • Display OLED 128x64, USD 1, 53
  • Encoder rotativo, 0 USD, 50
  • Cavi Dupont F/F, 0 USD, 49

Il prezzo totale dei componenti è inferiore a USD 10, -

Passaggio 3: schema elettrico

Schema elettrico
Schema elettrico

Usa la scheda di estensione Nano IO in modo da non preoccuparti di saldare più connessioni GND e VCC. Sarà necessaria una saldatura minima per le intestazioni dei pin Nano e per i connettori del modulo Neopixel. L'utilizzo di cavi Dupont consente connessioni stabili per il resto del cablaggio, come mostrato nello schema. La batteria da 9V è collegata a GND e VIN, quest'ultimo tramite l'interruttore a cursore di alimentazione. Il modulo encoder rotativo ha un pulsante di commutazione integrato, mostrato separatamente nello schema per una più facile comprensione di come collegarli. La parte rotante (CLK e DT) è collegata rispettivamente al PIN2 e al PIN3, poiché questi sono gli unici pin NANO in grado di gestire gli Interrupt. Ovviamente il Rotary GND è collegato al GND PIN di Nano. Il pulsante di commutazione integrato è collegato al PIN4. Il cicalino piezoelettrico è collegato a PIN5 e GND. Il modulo Adafruit Neopixel è collegato al PIN7 e il suo VIN e GND rispettivamente ai 5V e GND di Nano. Il piccolo display OLED è collegato all'interfaccia del bus I2C, che è il PIN A4 e A5 per SDA e SDL. VCC e GND vanno ovviamente a 5V e GND di Nano. Questo conclude il nostro cablaggio Dupont.

Passaggio 4: codice sorgente Arduino

Codice sorgente Arduino
Codice sorgente Arduino

// Metronomo, accento principale, tatto visivo e udibile - 2019 Peter Csurgay

#include #include #include #include #include "TimerOne.h" #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 #define OLED_RESET -1 // Ripristina pin # (o -1 se si condivide il pin di ripristino Arduino) Adafruit_SSD1306 display (SCREEN_WIDTH, SCREEN_HEIGHT, &Filo, OLED_RESET); #define pin_neopixel 7 #define NUMPIXELS 8 #define BRIGHTNESS 32 Adafruit_NeoPixel pixel = 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 acceso per primo, spento per il resto… int tack = 4; bool leadingTack = false; int posizione = 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)) { // Indirizzo 0x3D per 128x64 for(;;); // Non procedere, loop per sempre } display.clearDisplay(); display.display(); } void loop() { if (digitalRead(pin_switch)==LOW) { delay(100); while(digitalRead(pin_switch)==LOW); ritardo(100); Timer1.detachInterrupt(); showGreenTacks(); while(digitalRead(pin_switch)==HIGH) { if (curVal>prevVal) { virata+=1; if (virata>8) { if (virata iniziale) virata = 8; else { leadingTack = true; virata = 1; } } } else if (curValprevVal) { bpm+=2; se (bpm>240) bpm = 240; } else if (curVal=100) display.print(" "); altrimenti display.print(" "); display.print(bpm); display.display(); } void buzztick() { if (bpmFirst==0) { int volume = 4; if (leadingTack && pos==0) volume = 8; per (int i=0; i

Consigliato: