DesignSpark Electrical Logolinkedin
菜单 搜寻
提问问题

Arduino空氣吉他

让大家更容易踏上音乐这条路!

Parts List

产品
查看更多产品

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 还没写个人简介...