圧電スピーカ(圧電ブザー)を振動センサーにしてみます
〔Arduinoの動かせ方入門に戻る〕
前回はエレクトリックコンデンサーマイクロフォンを使って音を入力にし、
音の大きさでLED(RGBLED)を点灯させる実験を行いました。
今度は圧電スピーカを利用し振動センサー代わりにして実験を行います。
圧電スピーカは圧電ブザーや圧電サウンダとも言われており通常メロディを発生させる装置ですが、
圧電スピーカに振動を与えると電圧を発生します、この電圧をArduinoのアナログ入力に入れてやり
振動(電圧)の大きさにより音を出力してみます、また、RGBのLEDも表示させてみます。
尚、圧電スピーカは秋月電子のこちらから購入しています。
圧電スピーカで発振回路を内蔵(自励発振)タイプは利用出来ません注意しましょう。


この回路の増幅部は
「音センサー(マイク)でLEDを点灯させます」の回路と同じです、
マイク部入力回路を圧電スピーカ入力
回路に変えただけです。
圧電スピーカは端子が2本有りますが
どちらに配線してもOKです。
下の実験風景の様に音の出力を圧電スピーカでなく普通のスピーカで繋ぐ事も出来ます、
その方が音も大きくならせるしぃ、音質も良いです、普通のスピーカを繋ぐ方法はこちらを参考にして下さい。

こちらの頁に記述している「半固定抵抗の調整」を参考にしながら振動が
無い時の入力電圧を約2.0Vに調整して下さい。
左の図は圧電スピーカからの信号をアナログで読みArduinoIDEのシリアル
画面に表示させたものです。
約2.0V(410)前後の調整ですがノイズが有るのでふらふらしています。
最高値が約428で最低値が約413位で、テスター値は2.005〜1.905V位です。
で、428〜413の真ん中の420を閾値として使用します。
これはUSB接続での話でArduinoを外部電池で動かした場合は、電圧値も
若干変わるので半固定抵抗の調整が必要かなたぶん、
右に回せば420より大きくなって行きます、電圧が高くなっていきます、
気持ち左右に回す程度でしょう。
(スケッチ)
@上の配線図の様に配線しましょう。
Aarduinoボード(Arduino Duemilanove 328)はUSBケーブルで接続して、arduino IDEを起動させます。
BIDEに下記のスケッチプログラムをコピーペーストして貼り付けて下さい。
---------------------------------------------------------------------
#define THRESHOLD 420 // 振動センサー信号の入力閾値約2.0V
#define NOUSESIGNAL 55 // この値以下の信号は利用しない(ノイズ対策)
#define BEAT 200 // 音を鳴らす長さ
#define PINNO 13 // 音出力用スピーカを接続したピン番号
void setup() {
}
void loop() {
int val ;
val = analogRead(5) ; // アナログ5番ピンから振動値を読取る
val = abs(val- THRESHOLD) ; // ソフト整流
if (val <= NOUSESIGNAL) noTone(PINNO) ; // 小さい振動値は音を鳴らさない
else {
val = map(val,NOUSESIGNAL,1023,31,4978) ; // 振動値を音の周波数値に変換
tone(PINNO,val,BEAT) ; // 音の出力
delay(BEAT) ; // この分だけ音を鳴らす
}
}
---------------------------------------------------------------------
CIDEツールバーの赤枠部分「Upload」ボタンをクリックしてコンパイルとarduinoボードに書込みを行います。
D調整が終わっていれば、ブレッドボードや圧電スピーカに触れるだけで色々な音が鳴ると思います。
ソフト整流について
左の(1)がArduinoのアナログに入力される圧電スピーカからの信号です、
信号は+-方向の上下に出力されます、
また、振動信号が無い時でもノイズ等により信号が振れています、この振れを取り除く方法をソフトで行うやり方の説明です。
上記の「半固定抵抗の調整」で約2.0V(THRESHOLD)付近に調整をしました、
入力されたアナログ値(1)からTHRESHOLDを引いてabs()関数を通すと左の(2)の様になります。
abs()関数を通った値からNOUSESIGNAL(ノイズ
分)を除ければ振動した信号が得られます。
abs()関数とは絶対値を得る関数で、
abs(10)やabs(-10)なら10が得られます。
NOUSESIGNALの値(55)を下げるとノイズ成分を信号として見るので音が鳴りっぱなしになるでしょう、
なので、振動が無いのに音が鳴りっぱなしになる時はこの値を上げないとだめですね。
上手く調整できれば一寸した振動でも反応します、大きい振動で反応させたければNOUSESIGNALを上げましょう。
map()関数について
アナログに入力された信号(THRESHOLD〜1023)を音の周波数(31〜4978Hz)に変換する関数です、
音はtone()関数で鳴らしています、tone()関数と音の鳴らせ方はこちらを参考にして下さい。
それと、例えば、
デジタル入力5番ピンにスイッチA、6番ピンにスイッチB、7番ピンにスイッチCとする。
val = map(val,NOUSESIGNAL,1023,31,4978) ; // 振動値を音の周波数値に変換
if (digitalRead(5) == HIGH) val = map(val,NOUSESIGNAL,1023,31,131) ; // 低音
if (digitalRead(6) == HIGH) val = map(val,NOUSESIGNAL,1023,131,1047) ; // 中音
if (digitalRead(7) == HIGH) val = map(val,NOUSESIGNAL,1023,1047,4978) ; // 高音
みたいにスイッチAを押しながら振動有れば低音域の周波数利用で、Bなら中音域、Cなら高音域
とするやり方もありでしょう。
あ、フルートの様な物出来ないかしら?(息を吹きかけても反応します)
あ、それかぁ、スイッチでなく振動センサーを3個ぐらいにしてそれぞれ異なる音域でぇ
太鼓みたく叩けばそれぞれの音を出すとか、おぉ、面白いかもぉ。
BEATについて
BEAT値は音の鳴る長さなので、値を大きくしていけば音は長くなりますが振動に追従出来なくなるかもですね。
ボリューム(半固定抵抗)をアナログにいれて、この値でBEAT値を変化させても良いかもね。
スライドボリュームにすれば、なんちゃってトロンボーンの様なのが出来るかもね?。
《音から光へRGB 3色フルカラーLEDにする》
配線図やRGBLEDの事はこちら「実験2」を参照して貰うとして、ここではスケッチのみ掲載します。
---------------------------------------------------------------------
#define THRESHOLD 420 // 振動センサー信号の入力閾値約2.0V
#define NOUSESIGNAL 60 // この値以下の信号は利用しない(ノイズ対策)
void setup() {
}
void loop() {
int val , H ;
int R , G , B ;
val = analogRead(5) ; // アナログ5番ピンから振動値を読取る
val = abs(val- THRESHOLD) ; // ソフト整流
if (val > NOUSESIGNAL) { // 振動有りなら点灯させる
H = map(val,THRESHOLD,450,0,360) ; // HSVのH値(0-360)にスケール変換を行う
/* HSVのH値を各LEDのアナログ出力値(0-255)に変換する処理 */
if (H <= 120) {
/* H値(0-120) 赤-黄-緑 */
R = map(H,0,120,255,0) ; // 赤LED R←→G
G = map(H,0,120,0,255) ; // 緑LED G←→R
} else if (H <= 240) {
/* H値(120-240) 緑-水色-青 */
G = map(H,120,240,255,0) ; // 緑LED G←→B
B = map(H,120,240,0,255) ; // 青LED B←→G
} else {
/* H値(240-360) 青-紫-赤 */
B = map(H,240,360,255,0) ; // 青LED B←→R
R = map(H,240,360,0,255) ; // 青LED R←→B
}
/* RGBLEDを点灯させる */
analogWrite(9,R) ; // 9番ピンから赤LEDの出力
analogWrite(11,G) ; // 11番ピンから緑LEDの出力
analogWrite(10,B) ; // 10番ピンから青LEDの出力
delay(200) ; // 200msだけ点灯させる
} else {
/* RGBLEDを消灯させる */
analogWrite(9,0) ; // 9番ピンから赤LEDの出力
analogWrite(11,0) ; // 11番ピンから緑LEDの出力
analogWrite(10,0) ; // 10番ピンから青LEDの出力
}
}
---------------------------------------------------------------------
振動の大きさによりRGBLEDがいろいろな色で点灯します。
H = map(val,THRESHOLD,450,0,360) ;
の450は本当は1023ですがぁ振動の電圧があまり高くならない様なぁ、
でぇ、青系以上が表示しにくい様なぁ、でぇ450にして見たのですがぁ.....
まあ、いろいろ調整してみてみて下さい、レッツぅ、トライみたいなぁ。
《その他》

実験風景
実験では普通のダイナミックスピーカ(8Ω 8W)を10uFコンデンサと100Ω抵抗を直列に繋いで音を鳴らしています、
ブレッドボード上の右側の回路ですね。
この写真の様に圧電スピーカに輪ゴムをかけて弾けば色々音が出ますね〜、
ブレッドボードを爪でコツッとするだけで色々音が出ますね〜、
なんだかぁ、面白いじゃ〜ぁないですかぁ.....おぉぉ、楽しいぞぅ.....(^o^)
回路図の追加(*1) 2014/02/06
【きむ茶工房ガレージハウス】
Copyright (C) 2006-2014 Shigehiro Kimura All Rights Reserved.