踏切カンカン [Arduino]
LED 2個を交互に点灯して「踏切チカチカ」にするのはビギナー過ぎるのですが、音をならして「踏切カンカン」にしようとすると、とたんにレベルが上がるような気がします。
Arduino playground - PCMAudio
http://www.arduino.cc/playground/Code/PCMAudio
ここを参考にすると、音声を再生できそうですが、このソースを見てもさっぱり意味がわかりません。
ただ、原理としては、通常のPWMは490Hzくらい(普通に聞こえる音になってしまう、、)なのですが、これを超高速PWMにして、RC回路を使い、PWMの高周波成分をローパスフィルタで除去かつ波形をなめらかにすることで音声波形を出力できるようです。さらにはスピーカ自体が適当な時定数を持っているため、この回路すら必要ないらしい。
(エレキジャックBASIC No.1 Sept.2010 p.205- の記事を参考にしました。)
技術のない部分は、アイデアと力技で補完します。
まずは、踏切の音の解析をしてみました。
なんだか複雑そうな波形です。
しかし、よく見てみると、なんとなく鋸歯状の波形で、数100~1000Hzくらい、それが次第に減衰していく、これを繰り返すというように簡略化して考えればよさそう。
超高速PWMも自前で作成すればなんとかなりそうです。
こんな感じ。
波形の擬似サンプリングの作成の部分、
(t % 5) * 4 の部分で 0~16まで(0, 4, 8, 12, 16)の鋸歯状波をつくる
(1000 - t) / 1000 の部分で tが1~750まで変動することで99.9%→25%となり、この倍率をかけて減衰させることで、擬似サンプリングは 0~15までの値をとることになります。
PWMも0~15までの16段階で出力します。
このスケッチで使った値は、いろいろ試行錯誤し、手探りでなんとなく踏切っぽく聞こえる音になった値で、根拠のある値ではありません。
再生できない場合、ダウンロードは🎥こちら
圧電サウンダの代わりに、スピーカにしてみたらすこし音質もあがりました。
再生できない場合、ダウンロードは🎥こちら
Arduino playground - PCMAudio
http://www.arduino.cc/playground/Code/PCMAudio
ここを参考にすると、音声を再生できそうですが、このソースを見てもさっぱり意味がわかりません。
ただ、原理としては、通常のPWMは490Hzくらい(普通に聞こえる音になってしまう、、)なのですが、これを超高速PWMにして、RC回路を使い、PWMの高周波成分をローパスフィルタで除去かつ波形をなめらかにすることで音声波形を出力できるようです。さらにはスピーカ自体が適当な時定数を持っているため、この回路すら必要ないらしい。
(エレキジャックBASIC No.1 Sept.2010 p.205- の記事を参考にしました。)
技術のない部分は、アイデアと力技で補完します。
まずは、踏切の音の解析をしてみました。
なんだか複雑そうな波形です。
しかし、よく見てみると、なんとなく鋸歯状の波形で、数100~1000Hzくらい、それが次第に減衰していく、これを繰り返すというように簡略化して考えればよさそう。
超高速PWMも自前で作成すればなんとかなりそうです。
// 踏切くん byte sigLED = 0; // LEDの状態 void setup() { DDRD |= B00000100; // ピン2を出力に設定 pinMode(12, OUTPUT); // LED pinMode(13, OUTPUT); // LED } void loop() { unsigned int t; byte pwm, rep, smp; digitalWrite( 12, sigLED ); // LEDを交互に光らせる digitalWrite( 13, sigLED = 1 - sigLED ); for(t = 1; t < 750; t++) { // 音を鳴らす smp = (t % 5) * 4 * (1000 - t) / 1000; // 波形を作る for(rep = 0; rep < 100; rep++) { // 高速PWMで擬似アナログ出力 PORTD |= B00000100; // ピン2をHIGH for(pwm = 0; pwm < smp; pwm++) asm("nop"); PORTD ^= B00000100; // ピン2をLOW (反転) for(pwm = smp; pwm < 16; pwm++) asm("nop"); } } }
こんな感じ。
波形の擬似サンプリングの作成の部分、
(t % 5) * 4 の部分で 0~16まで(0, 4, 8, 12, 16)の鋸歯状波をつくる
(1000 - t) / 1000 の部分で tが1~750まで変動することで99.9%→25%となり、この倍率をかけて減衰させることで、擬似サンプリングは 0~15までの値をとることになります。
PWMも0~15までの16段階で出力します。
このスケッチで使った値は、いろいろ試行錯誤し、手探りでなんとなく踏切っぽく聞こえる音になった値で、根拠のある値ではありません。
再生できない場合、ダウンロードは🎥こちら
圧電サウンダの代わりに、スピーカにしてみたらすこし音質もあがりました。
再生できない場合、ダウンロードは🎥こちら
2011-10-30 02:26
nice!(0)
コメント(0)
トラックバック(0)
コメント 0