【Arduino】スピーカーを接続して音を出してみた
Arduinoを始めました。
んで。私の目標はシンセを作ることなので、まずは音を出してみたい。
LEDに電圧をかければ光る。
じゃ、スピーカーから音を出すには?
電圧を高速でON, OFFさせればいいのですよ!
電圧がかかる
→スピーカー内のコイルで電磁誘導が起きる
→永久磁石との間に力が働いて振動する
→音波になる
いける!
スピーカーから音を出そう ~原理に則して編~
スピーカーに周期的に電圧をかけてやった結果がこちら。
音が出てる。やったね!
単純なON, OFFなので矩形波になります。
ON, OFFを一定周期で繰り返し、ノブを回すと周期が変わるようにしてあり、結果として音程が変わります。
スケッチ(プログラム)は一番下に置いておきます。
配線図は……配線図を描くソフトFritzingに慣れたら載せますww
arduinoでシンセを作ろう。
— きくよ@M3_二展2Fク-18y (@kikuyo_q29) August 17, 2016
スピーカー悪いせいか、音が汚い…… pic.twitter.com/iGUwnwvcmH
220Hz~880Hzの範囲で変化するように組んであります。
が、処理にかかる時間を考えていないので、発音される音の波長は処理時間分、長くなってるはずです。だから音程はずれているでしょう。
あと、とても音が汚いですね……高音が耳に刺さります。
スピーカーと出力波形のどちらかが原因だと考えられますが、どっちかというと波形かなぁ。完全な矩形波になるほど、高音成分が増えていくはずなので。
この方法で音を出しても問題が多いことが分かりました。
音を出す用に調整された"Mozziライブラリ"とかを使えば、解決するかもしれません。
以下スケッチ。動画と違い、スイッチを押したときだけ音が出るように変わってます。
実はArduinoにはtone関数って便利なやつがあって、それを使えば周波数を入力するだけで同じようなことやってくれるんですが……まあプログラミングの練習ですよ、練習。
他スケッチからの流用があるのでき、変なの残ってるかも……
int SW = 2; // スイッチをデジタルインプット2に
int speaker = 5; // スピーカーをデジタルアウトプット5に
int val;
int Hz;
int timer;
void setup()
{
pinMode(speaker, OUTPUT);
pinMode(SW,INPUT);
}
void loop()
{
val = analogRead(valpin); // reads the value of the potentiometer (value between 0 and 1023)
Hz=220+ map(val,0,1023,0,660);
if(digitalRead(SW)){
digitalWrite(speaker,HIGH);
delayMicroseconds(1000000/2/Hz);
digitalWrite(speaker,LOW);
delayMicroseconds(1000000/2/Hz);
}
}