Arduino Metronome: 4 kroki

Arduino Metronome: 4 kroki

Spisu treści:

Anonim

Byłoby miło mieć urządzenie metronomu z następującymi funkcjami do wygodnego korzystania z niego w domu lub w szkole muzycznej.

  • Kompaktowa obudowa pasująca do małych miejsc na górze lub obok instrumentów muzycznych,
  • Zasilany bateryjnie, wytrzymały i przenośny do przenoszenia,
  • Łatwa konfiguracja nawet dla dzieci, zawsze wyświetlana wartość BPM,
  • Regulowane uderzenia na minutę za pomocą pokrętła, do 240 BPM
  • Dźwiękowy takt z regulacją głośności,
  • Tryb cichy dla nocnej praktyki słuchawkowej,
  • Wizualna informacja zwrotna uderzeń (1/4, 2/4, 3/3, 4/4, 6/8 itd.) Do 8 diod LED,
  • Z lub bez akcentu wiodącego, z wizualnym i dźwiękowym sprzężeniem zwrotnym.

Włączenie trybu metronomu rozpocznie się od 60 BPM wyświetlanego na małym wyświetlaczu i pozwoli na dostrojenie tempa za pomocą pokrętła od 10 do 240. Neopixele pokazują rytm na niebieskich diodach LED, gdy brzęczyk zaznacza. Naciśnięcie pokrętła spowoduje przełączenie na tryb regulacji, a zielone diody LED wskażą ustawioną strukturę rytmu. Pokrętło zwiększy lub zmniejszy strukturę rytmu (2/2, 3/3, 4/4, 6/8 itp.). Powyżej 8 diod LED, dalej obracając zgodnie z ruchem wskazówek zegara, akcent wiodący zostanie włączony, a pierwsza dioda LED wskaże to na czerwono. Główny akcent będzie również słyszalny. Można go wyłączyć, obracając w lewo. Naciśnięcie pokrętła spowoduje powrót z trybu regulacji rytmu do trybu metronomu.

Krok 2: Lista części

Będziesz potrzebować walizki. Każdy kształt lub rozmiar można kupić, ale mieliśmy znajomego czarnego, metalowego pudełka starego ręcznego przełącznika VGA. Pozostałe części są wymienione poniżej.

  • Bateria 9 V, 1,50 USD
  • Kabel złącza akumulatora, 0,16 USD
  • Arduino Nano z nagłówkami pinów, 2,05 USD
  • Nano IO Extension Shield, 1,05 USD
  • Mini suwak do zasilania, 0,15 USD
  • Piezo buzzer, 0,86 USD
  • Adafruit Neopixel WS2812 8-bitowy, 1,01 USD
  • Wyświetlacz OLED 128x64, 1,53 USD
  • Koder obrotowy, 0,50 USD
  • Kable Dupont F / F, 0,49 USD

Całkowita cena komponentów wynosi mniej niż 10 USD, -

Krok 3: Schemat okablowania

Użyj Nano IO Extension Board, aby nie przejmować się lutowaniem wielu połączeń GND i VCC. Minimalne lutowanie będzie potrzebne dla nagłówków pinów Nano i dla złączy modułu Neopixel. Użycie przewodów Dupont umożliwia stabilne połączenia dla pozostałej części okablowania, jak pokazano na schemacie. Bateria 9V jest podłączona do GND i VIN, druga przez przełącznik suwakowy zasilania. Moduł enkodera obrotowego ma zintegrowany przycisk przełącznika, który jest pokazany oddzielnie na schemacie, aby ułatwić zrozumienie sposobu ich łączenia. Część obrotowa (CLK i DT) jest połączona odpowiednio z PIN2 i PIN3, ponieważ są to jedyne szpilki NANO zdolne do obsługi przerwania. Obrotowy GND jest oczywiście podłączony do PIN GND Nano. Zintegrowany przycisk przełącznika jest podłączony do PIN4. Piezoelektryczny brzęczyk jest podłączony do PIN5 i GND. Moduł Adafruit Neopixel jest połączony z PIN7 i jego VIN i GND odpowiednio do 5V i GND Nano. Mały wyświetlacz OLED jest podłączony do interfejsu magistrali I2C, który jest PIN A4 i A5 dla SDA i SDL. VCC i GND przechodzą oczywiście do 5V i GND Nano. To kończy nasze okablowanie Dupont.

Krok 4: Kod źródłowy Arduino

// Metronom, główny akcent, wizualny i dźwiękowy takt - 2019 Peter Csurgay

#include "Wire.h" #include "Adafruit_GFX.h" #include "Adafruit_SSD1306.h" #include "Adafruit_NeoPixel.h" #include "TimerOne.h" #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 #define OLED_RESET -1 // Zresetuj pin # (lub -1 jeśli współdzielisz pin reset Arduino) Adafruit_SSD1306 wyświetlacz (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 On at First, Off at reszta … 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)) {// Adres 0x3D dla 128x64 dla (;;); // Nie kontynuuj, zapętl na zawsze} display.clearDisplay (); display.display (); }

void loop () {if (digitalRead (pin_switch) == LOW) {delay (100); while (digitalRead (pin_switch) == LOW); opóźnienie (100); Timer1.detachInterrupt (); showGreenTacks (); while (digitalRead (pin_switch) == HIGH) {if (curVal> prevVal) {tack + = 1; jeśli (hals> 8) {jeśli (leadingTack) hals = 8; else {leadingTack = true; hals = 1; }}} else if (curVal prevVal) {bpm + = 2; jeśli (bpm> 240) bpm = 240; } else if (curVal = 100) display.print (""); else display.print (""); display.print (bpm); display.display (); }

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

void showGreenTacks () {for (int i = 0; i <8; i ++) {if (leadingTack && i == 0) pixels.setPixelColor (7-i, pixels.Color (BRIGHTNESS, 0,0)); inaczej jeśli (i

void rotaryCLK () {if (digitalRead (CLK) == LOW) {if (state == IDLE_11) state = SCLK_01; else if (state == SCLK_10) state = SCLK_00; else if (state == SDT_10) state = SDT_00; } else {if (state == SCLK_01) state = IDLE_11; else if (state == SCLK_00) state = SCLK_10; else if (state == SDT_00) state = 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 (state == SDT_01) state = SDT_00; else if (state == SCLK_01) state = SCLK_00; } else {if (state == SDT_10) state = IDLE_11; else if (state == SDT_00) state = SDT_01; else if (state == SCLK_00) state = SCLK_01; else if (state == SCLK_10) {state = IDLE_11; curVal ++; }}}

To jest wpis w

Arduino Contest 2019