DesignSpark Electrical Logolinkedin
菜单 搜寻
提问问题

Arduino空氣吉他 (繁體)

這吉他只需要人們喜歡電子產品和一雙手。它不像傳統樂器,沒有任何弦或鍵盤。我們使用不同的高度來分別聲音。

Parts List

Qty Product Part number
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
See more products

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;}

未來大計

它是一項工程師樂器。我們喜歡音樂,我們喜歡電子,我們把這兩個元素組合起來發揮它們種種的可能。
它只是一個手勢儀器的概念,在聲音質量,音符和外觀藝術方面都有進步的空間。
希望所有人都喜歡這種簡單的工具,作為現代音樂愛好者創作音樂的新方式。

 

下载

Brian0925 还没写个人简介...