你觉得这篇文章怎么样? 帮助我们为您提供更好的内容。
Thank you! Your feedback has been received.
There was a problem submitting your feedback, please try again later.
你觉得这篇文章怎么样?
零件清单
数量 | 产品 | 库存编号 | |
---|---|---|---|
1 | ARDUINO STARTER KIT WITH UNO BRD,K000007 | 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 Dual Nozzle 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;}
未來大計
它是一項工程師樂器。我們喜歡音樂,我們喜歡電子,我們把這兩個元素組合起來發揮它們種種的可能。
它只是一個手勢儀器的概念,在聲音質量,音符和外觀藝術方面都有進步的空間。
希望所有人都喜歡這種簡單的工具,作為現代音樂愛好者創作音樂的新方式。
评论