トラギジュニアに掲載されていた「電子楽器テルミン」を作成してみた。
アンテナ代わりに、アルミホイルで直径15cmくらいの円盤を作ったら、セロハンテープで2.4MΩの抵抗を貼り付けます。(※絶縁抵抗として使用したいので、5.1Mが理想です)
アルミホイルから抵抗経由で、7ピンへ刺します。また圧電スピーカをGNDと13ピンヘ挿入します。
これだけで準備は整いました。
後はプログラムを書き込むだけです!
ソースプログラム↓
int antenna = 7;
int s_pin = 13;
void setup()
{
Serial.begin(9600);
}
int check(int pin)
{
pinMode(pin,OUTPUT);
digitalWrite(pin,LOW);
delay(1);
pinMode(pin,INPUT);
for(int i = 0;i < 1000; ++i)
{
if(digitalRead(pin) == HIGH)
{
pinMode(pin,OUTPUT);
digitalWrite(pin,LOW);
return i;
}
}
pinMode(pin,OUTPUT);
digitalWrite(pin,LOW);
return 1000;
}
void loop()
{
int cap = check(antenna);;
Serial.println(cap);
if(cap < 350)
{
tone(s_pin,map(cap,0,349,200,4000),20);
delay(20);
}else{
noTone(s_pin);
delay(20);
}
}
<プログラム解説>
void setup()
{
Serial.begin(9600);
}
上記の部分でパソコンに出力する際の通信速度を9600bpsに設定しています。
int check(int pin)
このチェック関数では、pinの静電容量をチェックしています。
主なアルゴリズムは、アンテナに手が近づくと電気がたまります。電機がたまってくるとアンテナをさしているピンがHigh状態になります。つまりHighになるのが早いほどアンテナに手が近づいているということになります。
下記へloop関数の中身を説明します。
int cap = check(antenna);
上記では、アンテナに手が近づいているかどうかをチェックしています。
Serial.println(cap);
チェックした値をパソコンへ出力しています。
チェックした値が350未満のときに以下を実行します。
if(cap < 350)
{
tone(s_pin,map(cap,0,349,200,4000),20);
delay(20);
}else{
noTone(s_pin);
delay(20);
}
}
0 件のコメント:
コメントを投稿