你觉得这篇文章怎么样? 帮助我们为您提供更好的内容。
Thank you! Your feedback has been received.
There was a problem submitting your feedback, please try again later.
你觉得这篇文章怎么样?
零件清单
数量 | 产品 | 库存编号 | |
---|---|---|---|
1 | Arduino Starter Kit with UNO board | 761-7355 | |
1 | Arduino Starter Kit with UNO board | 761-7355 | |
1 | Parallax Inc 28015, PING))) Ultrasonic Distance Sensor Module | 781-3020 | |
1 | RS Pro 8Ω 0.08W Miniature Speaker 22.5mm Dia. , 6mm Lead Length 22.5 (Dia.) x 8.5mm (LxWxD) | 724-3100 | |
1 | Ultimaker 3 3D Printer | 124-9474 | |
Arduino 空气吉他
现在音乐是一些人的生命。许多人喜欢音乐,但他们在弹奏弦乐,木风,青铜风等乐器前却步,可能是因为掌握这技能太难了。那么,不如我们降低入门的技巧?让大家更容易踏上音乐这条路。
这吉他只需要人们喜欢电子产品和一双手。它不像传统乐器,没有任何弦或键盘。我们使用不同的高度来分别声音。
硬件部分
ping传感器 - 超声波传感器使用声波来确定物体与传感器之间的距离在30mm到3m之间。
我放置一条柱来让PING传感器更易跟随手势的高度。
软件部分
此分享使用Arduino IDE作为主要平台。
我使用了designspark的Mechanical software -
3d概念帮手來做我所的3D搞。
它真的很容易使用!更多信息请参考此 連結。
我使用了ultimaker的CURA-3.4.1來印刷我的STL檔案。
代码
首先,我们INCLUDE LiquidCrystal.H 控制LCD显示。而pitches.h是缩放声音音符的文件。
melody阵列是音调频率,noteDurations数组是音调4是四分音符的时间,而8是八分音符的时间。
音符的周期由Tone()函数后面的基于PWM的程序控制。
我们必须通过跟随DIGITAL引脚将LCD显示器,扬声器,LED,按钮和Ping传感器连接到arduino。
LCD显示器rs链接到引脚12,en链接到引脚11,d4链接到引脚5,d5链接到引脚4,d6链接到引脚3,d7链接到引脚2。
一个10k可更换电阻连接到+ 5V和GND,并且vo链接到10k输出。 220伏电阻从5v VCC连接到d15,d2也连接到VCC,并且d1,d5和d16连接到地。
Ping传感器连接到pin7,以及5v VCC和Ground。
按钮连接到引脚9,110ohm电阻连接到VCC,按钮的引脚连接到地。
#include <LiquidCrystal.h>
#include "pitches.h"
int melody[] = {
NOTE_C4, NOTE_G3, NOTE_G3, NOTE_A3, NOTE_G3, 0, NOTE_B3, NOTE_C4
};
int noteDurations[] = {
4, 8, 8, 4, 4, 4, 4, 4
};
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
const int pingPin = 7;
const int buttonPin = 9;
const int ledPin = 13;
int ledState = HIGH;
int buttonState;
int lastButtonState = LOW;
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;
这是LCD显示器的设置以及LED和按钮引脚的pinMode。
pinMode将Arduino数字引脚设置为输出或输入。
void setup() {
lcd.begin(16, 2);
pinMode(buttonPin, INPUT);
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, ledState);
}
这是主程式,我们正在设置一个去抖动(debouncing)按钮。
如果我们没有按下按钮,则不会发出旋律,不会改变LED状态。
按下按钮时,播放旋律并将LED状态改变。
void loop() {
int reading = digitalRead(buttonPin);
if (reading != lastButtonState) {
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if (reading != buttonState) {
buttonState = reading;
if (buttonState == HIGH) {
ledState = !ledState;
for (int thisNote = 0; thisNote < 8; thisNote++) {
// 要計算音符持續時間,需要一秒鐘除以音符類型。
//例如 四分音符= 1000/4,八分音符= 1000/8等
int noteDuration = 1000 / noteDurations[thisNote];
tone(8, melody[thisNote], noteDuration);
// 區分音符,設置它們之間的最短時間。
//音符的持續時間+ 30%似乎運作最好:
int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);
// 停止播放音樂
noTone(8);
}
}
}
}
我们现在正在调整ping传感器的功能。
ping传感器是这分享的关键。
我们从第一列第一行设置LCD指标。
long duration, inches, cm;
pinMode(pingPin, OUTPUT);
digitalWrite(pingPin, LOW);
delayMicroseconds(2);
digitalWrite(pingPin, HIGH);
delayMicroseconds(5);
digitalWrite(pingPin, LOW);
pinMode(pingPin, INPUT);
duration = pulseIn(pingPin, HIGH);
inches = microsecondsToInches(duration);
cm = microsecondsToCentimeters(duration);
lcd.setCursor(1, 1);
lcd.print(inches);
lcd.print("in, ");
lcd.print(cm);
lcd.print("cm ");
delay(100);
digitalWrite(ledPin, ledState);
lastButtonState = reading;
lcd.setCursor(0, 0);
在这里我们画分展台高度并将其分成2个完整的旋律。
int note_Duration =2000/4;
if (cm>34) {noTone(8);lcd.print("Welcome"); }
if (34>cm&&cm>=32) {lcd.print("NOTE_C6");tone(8, NOTE_C6, note_Duration);}
if (32>cm&&cm>=30) {lcd.print("NOTE_B5");tone(8, NOTE_B5, note_Duration);}
if (30>cm&&cm>=28) {lcd.print("NOTE_A5");tone(8, NOTE_A5, note_Duration);}
if (28>cm&&cm>=26) {lcd.print("NOTE_G5");tone(8, NOTE_G5, note_Duration);}
if (26>cm&&cm>=24) {lcd.print("NOTE_F5");tone(8, NOTE_F5, note_Duration);}
if (24>cm&&cm>=22) {lcd.print("NOTE_E5");tone(8, NOTE_E5, note_Duration);}
if (22>cm&&cm>=20) {lcd.print("NOTE_D5");tone(8, NOTE_D5, note_Duration);}
if (20>cm&&cm>=18) {lcd.print("NOTE_C5");tone(8, NOTE_C5, note_Duration);}
if (18>cm&&cm>=16) {lcd.print("NOTE_B4");tone(8, NOTE_B4, note_Duration);}
if (16>cm&&cm>=14) {lcd.print("NOTE_A4");tone(8, NOTE_A4, note_Duration);}
if (14>cm&&cm>=12) {lcd.print("NOTE_G4");tone(8, NOTE_G4, note_Duration);}
if (12>cm&&cm>=10) {lcd.print("NOTE_F4");tone(8, NOTE_F4, note_Duration);}
if (10>cm&&cm>=8) {lcd.print("NOTE_E4");tone(8, NOTE_E4, note_Duration);}
if (8>cm&&cm>=6) {lcd.print("NOTE_D4");tone(8, NOTE_D4, note_Duration);}
if (6>cm&&cm>=4) {lcd.print("NOTE_C4");tone(8, NOTE_C4, note_Duration);}
int pauseBetweenNotes1 = note_Duration * 1.30;
delay(pauseBetweenNotes1);
noTone(8);
}
这是ping传感器的功能。我们可以在arduino示例中找到以下程序代码。
long microsecondsToInches(long microseconds) {return microseconds / 74 / 2;}
long microsecondsToCentimeters(long microseconds) {return microseconds / 29 / 2;}
未來大計
它是一项工程师乐器。我们喜欢音乐,我们喜欢电子,我们把这两个元素组合起来发挥它们种种的可能。
它只是一个手势仪器的概念,在声音质量,音符和外观艺术方面都有进步的空间。
希望所有人都喜欢这种简单的工具,作为现代音乐爱好者创作音乐的新方式。