2016年9月26日 星期一

Arduino 聲音測試 (二) : 模擬特雷門琴

兩周前去母校高應大圖館還書時, 無意間在書架上看到這本 "Make : 簡易的Arduino 專題製作 (莊啟晃等譯, 碁峰出版)" :

Source : 三民書局

翻閱之下發現雖然內容簡單, 沒甚麼較吸睛的實驗, 但其中有一個特雷門琴 (Theremin) 還蠻有趣的, 也是 tone() 函數的應用, 它只需要一個蜂鳴器, 一個光敏電阻, 以及一個 10K 電阻就可以進行測試了. 實際電路接線如下 :

光敏電阻與 10 K 電阻串聯, 光敏電阻一端接 5V, 與電阻串接處接 Arduino 的 A0 腳, 電阻另一端接地. 而無源蜂鳴器則 + 端接 Arduino 的 D9,  - 端接地.

我將其範例程式改編為下面的測試 1 :

測試 1 :

void setup() {
  Serial.begin(9600);
  }

void loop() {
  int value=analogRead(A0);  //return 0~1023
  Serial.println(value);
  int f=map(value, 400, 1000, 120, 1500);  //mapping 400~1000 to 120~1500
  tone(9, f, 10);  //make sounds
  delay(1); //delay for stable response
  }

此程式從 A0 讀取光敏電阻與 10K 電阻的分壓電壓值 (0~5V), AnalogRead() 會經 A/D 轉換後傳回 0~1023 的數值, 然後呼叫 map() 函數將其對應至 120 Hz~1500 Hz 頻率丟給 tone() 函數發音. 用燈光照射光敏電阻會讓頻率變高亢, 用手遮住光線就變低沉, 實際測試感覺聲音好難聽.

在葉難寫的 "Arduino 輕鬆入門" 這本書的 6.3 節也介紹了這個特雷門琴, 此琴為俄國發明家 Leon Theremin 所發明的電子合成樂器, 具有一個狀似天線的金屬桿以及一個環狀金屬圈, 前者控制發聲頻率, 後者控制音量強度. 透過演奏者的手與金屬桿與金屬圈之距離變化, 改變電容量之大小, 使內部震盪電路之頻率改變而發出不同頻率之聲音. 參考 :

https://zh.wikipedia.org/wiki/特雷門

在此實驗中我們是利用光敏電阻的阻值變化來模擬真正特雷門琴的電容變化以改變發聲頻率, 但沒辦法模擬音量變化.

我將 "Arduino 輕鬆入門" 6.3 節範例改編如下 :

測試 2 :

#define C5  523

int buzzerPin=9;

void setup() {
  Serial.begin(9600);
  pinMode(buzzerPin, OUTPUT);
  }

void loop() {
  int value=analogRead(A0);  //return 0~1023
  Serial.print("A0=");
  Serial.print(value);
  Serial.print(" ");
  int f=C5 + value/4;
  Serial.print("f=");
  tone(buzzerPin, f);  //make sounds
  Serial.println(f);
  }

此程式計算發聲頻率的方式與上面測試 1 不同, 它以中央 C (低音 Do) 為基準頻率, 將自 A0 獨到的 0~1024 數值除以 4 後加上此基準頻率為發音頻率. 此程式發出之頻率範圍為 523 Hz ~ 779 Hz 之間變動. 因 tone() 沒有指定持續時間, 因此會持續發聲.

真正的特雷門琴據說不好演奏, 需要極高的技巧, 如下影片所示 :


演奏者看起來就像在摸著空氣演奏一樣, 它沒有小提琴那樣實質的弦, 所以抓音階位置全憑演奏者的演練經驗.


沒有留言 :