13浏览
查看: 13|回复: 2

[项目] 【Arduino 动手做】DIY 简单的 Arduino 节拍器

[复制链接]
这是一个简单的初学者 Arduino 项目,具有出色的视觉效果,也是学习演奏乐器时非常有用的工具。

节拍器是音乐中使用的一种设备,可帮助音乐家在演奏或练习时保持一致的速度或节拍。它产生有规律、稳定的声音,通常以咔嗒声或每分钟节拍数 (BPM) 的形式出现,以帮助音乐家保持所需的节奏。

节拍器有多种形式,包括机械节拍器、电子节拍器和数字节拍器应用程序。
本视频中展示的设备实际上是一个数字节拍器,其中包含一系列 LED,用于模拟加重钟摆的运动。

重物在垂直杆上的移动已被滑动电位器取代,当前每分钟的心跳次数显示在一个小的 OLED 屏幕上。LED 和电位计的放置方式使设备看起来非常像原始的机械节拍器。

否则,该设备的制作非常简单,由几个组件组成
• Arduino Nano 微控制器
• 8 个 LED
• 滑动电位计,值为 10 至 100 kilohms
• 两个有源蜂鸣器
• SSD1306 OLED 显示屏
• 和一个 470 欧姆电阻器

考虑到一次只有一个二极管始终处于活动状态,而不是每个阳极上有 8 个电阻器,我只在公共阴极上放置一个电阻器接地。通过这种方式,电路得到了显著简化。同样对于声音指示器,我使用两个有源蜂鸣器而不是一个,它们的成本可以忽略不计。另一方面,我们得到了清晰锐利的声音,这是这个设备的基本要求,也不需要让代码复杂化。我将蜂鸣器直接连接到 D2 和 D9 输出。此外,代码非常简单,可以很容易地针对不同数量的 LED 进行修改。当然,可以删除 void setup 部分中带有我的 logo 和 device name 的部分。即使为了简单起见,也可以省略 OLED 显示屏,然后在滑动电位计附近绘制一个 BPM 刻度。

现在让我们看看该设备在现实中是如何工作的。开机后,在最初的几秒钟内,会出现之前定义的 logo 以及有关设备类型的信息。然后,有条件地说,摆锤开始以取决于电位计位置的速度移动。当电位计较高时,振荡会减慢,反之亦然。当前 BPM 显示在 OLED 显示屏上。第一个和最后一个 LED 具有不同的颜色,表示蜂鸣器激活的时刻。二极管的运动实际上是 Knight Rider 主导的效果,其速度由电位计控制。
最后,这是一个简单的初学者 Arduino 项目,具有出色的视觉效果,也是学习演奏乐器时非常有用的工具。

【Arduino 动手做】DIY 简单的 Arduino 节拍器图3

【Arduino 动手做】DIY 简单的 Arduino 节拍器图2

【Arduino 动手做】DIY 简单的 Arduino 节拍器图4

【Arduino 动手做】DIY 简单的 Arduino 节拍器图5

【Arduino 动手做】DIY 简单的 Arduino 节拍器图6

【Arduino 动手做】DIY 简单的 Arduino 节拍器图1

驴友花雕  中级技神
 楼主|

发表于 6 小时前

【Arduino 动手做】DIY 简单的 Arduino 节拍器

项目代码

  1. /*
  2.   For Loop Iteration
  3.   Demonstrates the use of a for() loop.
  4.   Lights multiple LEDs in sequence, then in reverse.
  5.   The circuit:
  6.   - LEDs from pins 2 through 7 to ground
  7.   created 2006
  8.   by David A. Mellis
  9.   modified 30 Aug 2011
  10.   by Tom Igoe
  11.   This example code is in the public domain.
  12.   https://www.arduino.cc/built-in-examples/ForLoopIteration
  13. */
  14. #include <SPI.h>
  15. #include <Wire.h>
  16. #include <Adafruit_GFX.h>
  17. #include <Adafruit_SSD1306.h>
  18. #define SCREEN_WIDTH 128 // OLED display width, in pixels
  19. #define SCREEN_HEIGHT 64 // OLED display height, in pixels
  20. #define OLED_RESET  -1
  21. #define SCREEN_ADDRESS 0x3C
  22. Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
  23. int timer = 0;           // The higher the number, the slower the timing.
  24. int bpm = 0;
  25. const unsigned char zmaj [] PROGMEM = {
  26.   // 'zmaj7 60x60, 128x64px
  27.   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  28.   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  29.   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  30.   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  31.   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  32.   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  33.   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  34.   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  35.   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  36.   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff,
  37.   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff,
  38.   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff,
  39.   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x04, 0x00, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff,
  40.   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0c, 0x00, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff,
  41.   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff,
  42.   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff,
  43.   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff,
  44.   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x80, 0x00, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff,
  45.   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x40, 0x00, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff,
  46.   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x80, 0x60, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff,
  47.   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x80, 0x30, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff,
  48.   0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x3f, 0xfa, 0x80, 0x0f, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff,
  49.   0xff, 0xff, 0xff, 0xff, 0xff, 0xed, 0xbf, 0xf4, 0x80, 0x00, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff,
  50.   0xff, 0xff, 0xff, 0xff, 0xff, 0xd9, 0x3f, 0xe9, 0x80, 0x00, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff,
  51.   0xff, 0xff, 0xff, 0xff, 0xff, 0xa2, 0xff, 0xd3, 0x00, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff,
  52.   0xff, 0xff, 0xff, 0xff, 0xff, 0x85, 0xff, 0xa6, 0x01, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff,
  53.   0xff, 0xff, 0xff, 0xff, 0xff, 0x85, 0xff, 0x4c, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  54.   0xff, 0xff, 0xff, 0xff, 0xff, 0x85, 0xfe, 0x98, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  55.   0xff, 0xff, 0xff, 0xff, 0xff, 0x85, 0xfd, 0x30, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  56.   0xff, 0xff, 0xff, 0xff, 0xff, 0x82, 0x02, 0x60, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  57.   0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, 0xfc, 0x80, 0x01, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  58.   0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x41, 0x80, 0x00, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  59.   0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0xbe, 0x00, 0x04, 0x0b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  60.   0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x40, 0x00, 0x0b, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  61.   0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x05, 0x23, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  62.   0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x47, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  63.   0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x87, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  64.   0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x00, 0x00, 0x8b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  65.   0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x80, 0x00, 0x97, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  66.   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4c, 0x01, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  67.   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa6, 0x03, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  68.   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x04, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  69.   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x8c, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  70.   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x88, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  71.   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x90, 0x53, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  72.   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x90, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  73.   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x8a, 0x05, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  74.   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x87, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  75.   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x01, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  76.   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x00, 0x81, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  77.   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  78.   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  79.   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  80.   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  81.   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  82.   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  83.   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  84.   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  85.   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  86.   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  87.   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  88.   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  89.   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  90.   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
  91. };
  92. void setup() {
  93. Serial.begin(9600);
  94.   // use a for loop to initialize each pin as an output:
  95.   display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS);
  96.   display.clearDisplay();
  97.   display.drawBitmap(0, 0,zmaj, 128, 64, WHITE); // display.drawBitmap(x position, y position, bitmap data, bitmap width, bitmap height, color)
  98.   display.display();
  99.   delay(2000);
  100.   display.clearDisplay();
  101.   display.setTextSize(2);
  102.   display.setTextColor(WHITE);
  103.   display.setCursor(22,10);
  104.   display.println("mircemk");// Print text
  105.   display.setCursor(10,40);
  106.   display.println("METRONOME");
  107.   display.display();
  108.   delay(2000);
  109.   for (int thisPin = 2; thisPin < 10; thisPin++) {
  110.     pinMode(thisPin, OUTPUT);
  111.   }
  112. }
  113. void loop() {
  114. int sensorValue = analogRead(A0);
  115. byte timer = map(sensorValue, 0, 1023, 20,125);
  116. bpm=map(timer, 20 ,125 , 160   , 60);
  117. Serial.println(bpm);
  118.     display.clearDisplay();   
  119.     display.setTextSize(3);
  120.     display.setTextColor(WHITE);
  121.     display.setCursor(35,5);
  122.     display.println("BPM:");
  123.     display.setCursor(15,40);
  124.     display.println(bpm);
  125.     display.setTextSize(2);
  126.      display.setCursor(73,45);
  127.     display.println("/min");
  128.     display.display();
  129.    // loop from the lowest pin to the highest:
  130.   for (int thisPin = 2; thisPin < 10; thisPin++) {
  131.     // turn the pin on:
  132.     digitalWrite(thisPin, HIGH);
  133.     delay(timer);
  134.     // turn the pin off:
  135.     digitalWrite(thisPin, LOW);
  136.   }
  137.   // loop from the highest pin to the lowest:
  138.   for (int thisPin = 9; thisPin >= 2; thisPin--) {
  139.     // turn the pin on:
  140.     digitalWrite(thisPin, HIGH);
  141.     delay(timer);
  142.     // turn the pin off:
  143.     digitalWrite(thisPin, LOW);
  144.   }
  145. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 6 小时前

【Arduino 动手做】DIY 简单的 Arduino 节拍器

【Arduino 动手做】DIY 简单的 Arduino 节拍器
项目链接:https://www.hackster.io/mircemk/ ... no-metronome-2cc2bc
项目作者:北马其顿 米尔塞姆克(Mirko Pavleski)

项目视频 :https://www.youtube.com/watch?v=RgNBuB4j6PU
项目代码:https://www.hackster.io/code_files/647620/download

【Arduino 动手做】DIY 简单的 Arduino 节拍器图1

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail