Arduino Metronome: 4 trin

Arduino Metronome: 4 trin

Indholdsfortegnelse:

Anonim

Det ville være rart at have en metronom enhed med følgende funktioner til at bruge det hjemme eller på musikskolen bekvemt.

  • Kompakt formfaktor til at passe til små steder på toppen eller ved siden af ​​musikinstrumenter,
  • Batteridrevne, robuste og bærbare til at bære rundt,
  • Nemt oprettet selv for børn, vises BPM-værdi altid,
  • Justerbare slag i minuttet med en drejeknap, op til 240 BPM
  • Hørbar takt med volumenkontrol,
  • Silent mode til over natten hovedtelefon praksis,
  • Visuel feedback af beats (1/4, 2/4, 3/3, 4/4, 6/8 osv.) Op til 8 LED'er,
  • Med eller uden ledende accent, med visuel og hørbar feedback.

Aktivering af metronommodus starter ved 60 BPM, der vises på den lille skærm og lader tempoet indstilles af drejeknappen mellem 10 og 240. Neopixels viser takt i blå lysdioder, mens summeren tipper. Hvis du trykker på knappen, skifter den til taktjusteringsfunktionen, og grønne LED'er angiver den indstillede beatstruktur. Drejeknap vil øge eller formindske beatstrukturen (2/2, 3/3, 4/4, 6/8 osv.). Over 8 LED'er, der roterer yderligere med uret, vil ledende accent blive tændt, og den første LED vil indikere dette i rødt. Ledende accent vil også have hørbar feedback. Den kan slukkes ved at dreje mod uret. Hvis du trykker på knappen, skifter du tilbage fra taktjusteringstilstand til metronommodus.

Trin 2: Dele liste

Du skal have en sag. Enhver form eller størrelse kan købes, men vi havde en flot sort metal sag af en gammel manuel VGA-switch bortskaffet en ven. Resten af ​​delene er angivet nedenfor.

  • 9V batteri, USD 1,50
  • Batterikabel, USD 0,16
  • Arduino Nano med pin headers, USD 2,05
  • Nano IO Extension Shield, USD 1,05
  • Mini slide switch for strøm, USD 0,15
  • Piezo summer, USD 0,86
  • Adafruit Neopixel WS2812 8-bit, USD 1,01
  • OLED Display 128x64, USD 1,53
  • Rotationscoder, USD 0,50
  • Dupont kabler F / F, USD 0,49

Den samlede pris på komponenterne er mindre end USD 10, -

Trin 3: Ledningsdiagram

Brug Nano IO Extension Board for ikke at forstyrre ved lodning flere GND og VCC forbindelser. Minimal lodning vil være nødvendig for Nano-pinhovederne og til Neopixel-modulets stik. Brug af Dupont-ledninger tillader stabile forbindelser for resten af ​​ledningerne som vist på diagrammet. 9V-batteriet er forbundet til GND og VIN, sidstnævnte gennem strømskifteren. Rotations-kodermodulet har en integreret omskifterknap, der vises separat i diagrammet for at få en bedre forståelse for, hvordan man forbinder dem. Rotationsdelen (CLK og DT) er forbundet til henholdsvis PIN2 og PIN3, da disse er de eneste NANO-ben, der kan afbryde håndtering. Rotary GND er naturligvis forbundet til Nano's GND PIN. Den integrerede afbryderknap er tilsluttet til PIN4. Piezo summer er forbundet til PIN5 og GND. Adafruit Neopixel-modulet er forbundet til PIN7 og dets VIN og GND til Nano's 5V og GND henholdsvis. Lille OLED-skærm er forbundet til I2C-busgrænsefladen, som er PIN A4 og A5 til SDA og SDL. VCC og GND går naturligvis til Nano's 5V og GND. Det konkluderer vores Dupont ledninger.

Trin 4: Arduino Kildekode

// Metronom, førende accent, visuel og lydbar 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 // Reset pin # (eller -1 hvis du deler Arduino reset pin) Adafruit_SSD1306 display (SCREEN_WIDTH, SCREEN_HEIGHT, og 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 til først, slukket i resten … 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); hvis (! display.begin (SSD1306_SWITCHCAPVCC, 0x3C)) {// Adresse 0x3D til 128x64 for (;;); // Fortsæt ikke, loop forever} display.clearDisplay (); display.display (); }

void loop () {hvis (digitalRead (pin_switch) == LOW) {forsinkelse (100); mens (digitalRead (pin_switch) == LOW); forsinkelse (100); Timer1.detachInterrupt (); showGreenTacks (); mens (digitalRead (pin_switch) == HIGH) {hvis (curVal> prevVal) {tack + = 1; hvis (tack> 8) {hvis (leadingTack) tack = 8; ellers {leadingTack = true; tack = 1; }}} ellers hvis (curVal prevVal) {bpm + = 2; hvis (bpm> 240) bpm = 240; } ellers hvis (curVal = 100) display.print (""); ellers display.print (""); display.print (bpm); display.display (); }

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

void showGreenTacks () {for (int i = 0; i <8; i ++) {hvis (leadingTack && i == 0) pixels.setPixelColor (7-i, pixels.Color (BRIGHTNESS, 0,0)); ellers hvis (jeg

void rotaryCLK () {hvis (digitalRead (CLK) == LOW) {hvis (state == IDLE_11) state = SCLK_01; ellers hvis (tilstand == SCLK_10) state = SCLK_00; ellers hvis (tilstand == SDT_10) state = SDT_00; } ellers {hvis (tilstand == SCLK_01) state = IDLE_11; ellers hvis (tilstand == SCLK_00) state = SCLK_10; ellers hvis (tilstand == SDT_00) state = SDT_10; ellers hvis (tilstand == SDT_01) {state = IDLE_11; curVal--; }}} void rotaryDT () {hvis (digitalRead (DT) == LOW) {hvis (state == IDLE_11) state = SDT_10; ellers hvis (tilstand == SDT_01) state = SDT_00; ellers hvis (tilstand == SCLK_01) state = SCLK_00; } ellers {hvis (tilstand == SDT_10) state = IDLE_11; ellers hvis (tilstand == SDT_00) state = SDT_01; ellers hvis (tilstand == SCLK_00) state = SCLK_01; ellers hvis (tilstand == SCLK_10) {state = IDLE_11; curVal ++; }}}

Dette er en post i

Arduino Contest 2019