เครื่องเมตรอนอม Arduino: 4 ขั้นตอน

เครื่องเมตรอนอม Arduino: 4 ขั้นตอน

สารบัญ:

Anonim

มันจะดีถ้ามีเครื่องเมตรอนอมด้วยฟังก์ชั่นต่อไปนี้เพื่อใช้ที่บ้านหรือที่โรงเรียนดนตรีอย่างสะดวก

  • ฟอร์มแฟคเตอร์ขนาดกะทัดรัดเพื่อให้พอดีกับสถานที่เล็ก ๆ ด้านบนหรือติดกับเครื่องดนตรี
  • ใช้แบตเตอรี่แข็งแรงและพกพาสะดวก
  • ตั้งค่าได้อย่างง่ายดายแม้สำหรับเด็ก ๆ ค่า BPM จะปรากฏขึ้นเสมอ
  • ปรับจังหวะต่อนาทีด้วยปุ่มหมุนได้สูงสุด 240 BPM
  • เสียงแหลมด้วยการควบคุมระดับเสียง
  • โหมดเงียบสำหรับฝึกหูฟังข้ามคืน
  • ข้อเสนอแนะภาพของการเต้น (1/4, 2/4, 3/3, 4/4, 6/8, ฯลฯ) ถึง 8 LEDs,
  • มีหรือไม่มีการเน้นเสียงชั้นนำที่มีข้อเสนอแนะภาพและเสียง

การเปิดโหมดเครื่องเมตรอนอมจะเริ่มต้นที่ 60 BPM แสดงบนจอแสดงผลขนาดเล็กและปล่อยให้จังหวะการปรับตามลูกบิดหมุนระหว่าง 10 และ 240 Neopixels แสดงจังหวะในไฟ LED สีฟ้าในขณะที่เสียงสัญญาณติ๊ก การกดปุ่มจะเปลี่ยนไปที่โหมดการปรับค่าแสงและไฟ LED สีเขียวจะแสดงถึงโครงสร้างการตีที่ตั้งค่าไว้ ปุ่มหมุนจะเพิ่มหรือลดโครงสร้างจังหวะ (2/2, 3/3, 4/4, 6/8 ฯลฯ) ไฟ LED ด้านบน 8 ดวง, หมุนตามเข็มนาฬิกา, เน้นนำจะเปิดขึ้นและไฟ LED ดวงแรกจะแสดงเป็นสีแดง สำเนียงชั้นนำจะมีข้อเสนอแนะเสียงเช่นกัน สามารถปิดได้โดยหมุนทวนเข็มนาฬิกา การกดปุ่มจะเปลี่ยนกลับจากโหมดการปรับการตีเป็นโหมดเครื่องเมตรอนอม

ขั้นตอนที่ 2: รายการอะไหล่

คุณจะต้องมีกรณี สามารถซื้อรูปทรงหรือขนาดใดก็ได้ แต่เรามีกล่องโลหะสีดำที่สวยงามของสวิตช์ VGA แบบเก่าที่ใช้แล้วทิ้งของเพื่อน ชิ้นส่วนที่เหลือมีการระบุไว้ด้านล่าง

  • แบตเตอรี่ 9V, USD 1.50
  • สายเคเบิลขั้วต่อแบตเตอรี่, USD 0,16
  • Arduino Nano พร้อมพินส่วนหัว, USD 2.05
  • แผงกั้นเสริม Nano IO, USD 1,05
  • สวิตช์สไลด์ขนาดเล็กใช้พลังงาน USD 0.15
  • สัญญาณเตือน Piezo, USD 0,86
  • Adafruit Neopixel WS2812 8 บิต, USD 1,01
  • จอแสดงผล OLED 128x64, USD 1,53
  • เครื่องเข้ารหัสแบบหมุน USD 0,50
  • สายดูปองท์ F / F, USD 0,49

ราคารวมของส่วนประกอบน้อยกว่า USD 10, -

ขั้นตอนที่ 3: Wiring Diagram

ใช้ Nano IO Extension Board เพื่อไม่ให้รำคาญกับการบัดกรีหลายการเชื่อมต่อ GND และ VCC การบัดกรีที่น้อยที่สุดจะต้องใช้สำหรับหัวเข็มนาโนและสำหรับตัวเชื่อมต่อโมดูล Neopixel การใช้สาย Dupont ช่วยให้การเชื่อมต่อที่มั่นคงสำหรับการเดินสายส่วนที่เหลือดังแสดงในแผนภาพ แบตเตอรี่ขนาด 9 โวลต์เชื่อมต่อกับ GND และ VIN ซึ่งเป็นรุ่นหลังผ่านสวิตช์เลื่อนไฟ โมดูลตัวเข้ารหัสแบบหมุนมีปุ่มสวิทช์ในตัวซึ่งจะแสดงแยกต่างหากในแผนภาพเพื่อความเข้าใจที่ง่ายขึ้นเกี่ยวกับวิธีการเชื่อมต่อ ส่วนโรตารี่ (CLK และ DT) เชื่อมต่อกับ PIN2 และ PIN3 ตามลำดับเนื่องจากเป็นพิน NANO เท่านั้นที่สามารถจัดการการขัดจังหวะได้ Rotary GND เชื่อมต่อกับ PIN GND ของนาโนแน่นอน ปุ่มสวิตช์ในตัวเชื่อมต่อกับ PIN4 Piezo buzzer เชื่อมต่อกับ PIN5 และ GND โมดูล Adafruit Neopixel เชื่อมต่อกับ PIN7 และ VIN และ GND กับ 5V และ GND ของนาโนตามลำดับ จอแสดงผล OLED ขนาดเล็กเชื่อมต่อกับบัส I2C ซึ่งเป็น PIN A4 และ A5 สำหรับ SDA และ SDL VCC และ GND ไปที่ 5V และ GND ของ Nano แน่นอน สรุปการเดินสายดูปองต์ของเรา

ขั้นตอนที่ 4: ซอร์สโค้ด Arduino

// เครื่องเมตรอนอม, เน้นชั้นนำ, ภาพและเสียงชั้นเชิง - 2019 Peter Csurgay

#include "Wire.h" #include "Adafruit_GFX.h" #include "Adafruit_SSD1306.h" #include "Adafruit_NeoPixel.h" #include "TimerOne.h" #define SCREEN_HEIGHT 64 #detES -1 รีเซ็ตพิน # (หรือ -1 ถ้าแชร์พินการรีเซ็ต Arduino) Adafruit_SSD1306 จอแสดงผล (SCREEN_WIDTH, SCREEN_HEIGHT, & Wire, OLED_RESET); #define pin_neopixel 7 #define NUMPIXELS 8 #define BRIGHTNESS 32 Adafruit_NeoPixel พิกเซล = 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 # กำหนด SDT_10 4 # กำหนด SDT_00 6 int สถานะ = IDLE_11 #define CLK 2 #define DT 3 #define pin_switch 4 #define pin_buzzer 5 int bpm = 60; int bpmFirst = 0; // LED เปิดเป็นครั้งแรกปิดที่เหลือ … int tack = 4; bool LeadingTack = false; int pos = 0; int curVal = 0; int prevVal = 0;

การตั้งค่าเป็นโมฆะ () {pixels.begin (); pinMode (pin_buzzer, OUTPUT); Timer1.initialize (1000000 * 60 / ครั้งต่อนาที / 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)) {// ที่อยู่ 0x3D สำหรับ 128x64 สำหรับ (;;); // อย่าดำเนินการต่อไปเรื่อย ๆ วนซ้ำ} display.clearDisplay (); display.display (); }

void loop () {if (digitalRead (pin_switch) == LOW) {delay (100); ในขณะที่ (digitalRead (pin_switch) == LOW); ล่าช้า (100); Timer1.detachInterrupt (); showGreenTacks (); ในขณะที่ (digitalRead (pin_switch) == สูง) {ถ้า (curVal> prevVal) {tack + = 1; if (tack> 8) {if (LeadingTack) tack = 8; อื่น {LeadingTack = จริง; ตะปู = 1; }}} อื่น ๆ หาก (curVal prevVal) {bpm + = 2; ถ้า (bpm> 240) bpm = 240; } ถ้า if (curVal = 100) display.print (""); อื่น display.print (""); display.print (BPM); display.display (); }

ถือเป็นโมฆะ buzztick () {ถ้า (bpmFirst == 0) {int volume = 4; if (LeadingTack && pos == 0) ปริมาณ = 8; สำหรับ (int i = 0; i

ถือเป็นโมฆะ showGreenTacks () {สำหรับ (int i = 0; i <8; i ++) {ถ้า (นำแท็ก && ฉัน == 0) pixels.setPixelColor (7-i, pixels.Color (BRIGHTNESS, 0,0)); อื่นถ้า (i

void rotaryCLK () {ถ้า (digitalRead (CLK) == LOW) {ถ้า (state == IDLE_11) state = SCLK_01; อื่นถ้า (state == SCLK_10) state = SCLK_00; อื่นถ้า (state == SDT_10) state = SDT_00; } else {if (state == SCLK_01) state = IDLE_11; อื่นถ้า (state == SCLK_00) state = SCLK_10; อื่นถ้า (state == SDT_00) state = SDT_10; อื่นถ้า (state == SDT_01) {state = IDLE_11; curVal--; }}} void rotaryDT () {ถ้า (digitalRead (DT) == LOW) {ถ้า (state == IDLE_11) state = SDT_10; อื่นถ้า (state == SDT_01) state = SDT_00; อื่นถ้า (state == SCLK_01) state = SCLK_00; } else {if (state == SDT_10) state = IDLE_11; อื่นถ้า (state == SDT_00) state = SDT_01; อื่นถ้า (state == SCLK_00) state = SCLK_01; อื่นถ้า (state == SCLK_10) {state = IDLE_11; curVal ++; }}}

นี่คือรายการใน

การประกวด Arduino 2019