特雷門(Theremin) 電波琴是甚麼玩意兒? 如果您還不知道,可以參考一下維基百科 。
所需材料
1. Arduino Nano(Uno也可以) 開發板 *1
2. 麵包板 *1
3. PAM8403 功放模組 *1
4. 光敏電阻(LDR) *1
5. 10K 電阻 *1
6. 小喇叭(蜂鳴器也可以) *1
7. 公母頭杜邦線 *若干
8. 公排針 *若干
如果您沒有以上材料,也可以到露天賣場購買。
1. 將 Arduino Nano 開發板插上麵包板。
2. 依照上面電路圖用杜邦線連接各單元。
3. 喇叭接功放模組單邊輸出即可。
程式
1. 下載函式庫 https://sensorium.github.io/Mozzi/
2. 將下列程式上傳到 Arduino。
//#include <ADC.h>
#include <MozziGuts.h>
#include <Oscil.h> // oscillator template
#include <tables/sin2048_int8.h> // sine table for oscillator
#include <RollingAverage.h>
#include <ControlDelay.h>
#define INPUT_PIN 0 // analog control input
unsigned int echo_cells_1 = 32;
unsigned int echo_cells_2 = 60;
unsigned int echo_cells_3 = 127;
#define CONTROL_RATE 64
ControlDelay <128, int> kDelay; // 2seconds
// oscils to compare bumpy to averaged control input
Oscil <SIN2048_NUM_CELLS, AUDIO_RATE> aSin0(SIN2048_DATA);
Oscil <SIN2048_NUM_CELLS, AUDIO_RATE> aSin1(SIN2048_DATA);
Oscil <SIN2048_NUM_CELLS, AUDIO_RATE> aSin2(SIN2048_DATA);
Oscil <SIN2048_NUM_CELLS, AUDIO_RATE> aSin3(SIN2048_DATA);
// use: RollingAverage <number_type, how_many_to_average> myThing
RollingAverage <int, 32> kAverage; // how_many_to_average has to be power of 2
int averaged;
void setup(){
kDelay.set(echo_cells_1);
startMozzi();
}
void updateControl(){
int bumpy_input = mozziAnalogRead(INPUT_PIN);
averaged = kAverage.next(bumpy_input);
aSin0.setFreq(averaged);
aSin1.setFreq(kDelay.next(averaged));
aSin2.setFreq(kDelay.read(echo_cells_2));
aSin3.setFreq(kDelay.read(echo_cells_3));
}
int updateAudio(){
return 3*((int)aSin0.next()+aSin1.next()+(aSin2.next()>>1)
+(aSin3.next()>>2)) >>3;
}
void loop(){
audioHook();
}
上傳程式後,試著用手由遠到近遮住光敏電阻,光敏電阻受光程度會影響聲音的頻率。
觀賞影片
參考資料
https://www.hackster.io/Oniichan_is_ded/arduino-theremin-96fc6d?fbclid=IwAR0IxHx7tyu2cwGUJTBs6tmBP234j-XV-2stRpmPg76N2sv9NQQpdhUsFKk
採購資訊
特雷門(Theremin) 電波琴套件 https://www.ruten.com.tw/item/show?22040528261934