音センサー(マイク)でLEDを点灯させます
〔Arduinoの動かせ方入門に戻る〕
エレクトリックコンデンサーマイクロフォンを使った、簡単・何処にでも有りそうな部品・安価なと三拍子そろった
回路でLEDを点灯させる実験を行います。
実験1は、設定より大きな音が入力(外部割込み)されればArduino付属13番LEDを1秒間点灯させます。
実験2は、音をアナログに接続して音の大きさによりRGB3色フルカラーLEDを色々変化点灯させます。
尚、マイクは秋月電子のこちらから購入しています。
マイクには極性が有ります、下図はデータシートからの抜粋です。
このマイクはピンが出ているのでブレッドボードに射す事が出来ます。
回路はマイク信号の波をバイアス
回路に通した後、トランジスタで
2段増幅しています、
これをダーリントン接続と言います
この回路はデジタル外部割込みを利用していますが、
Arduinoは2番か3番ピンのみ割込み入力が出来ます。
左は実態配線図ですが下に
回路図を載せておきます。 *1)
上の回路はデジタル入力(2番ピン)にマイクの信号を入れています、
Arduinoはデジタル入力に約2.0V以上の電圧が入力されればON(HIGH)と認識します。
なので、無音時は2.0V(1V-1.5V)以内にして、音を拾えば2.0V以上と調整しないとダメです、
当然大きい音の場合はそれに比例して入力電圧が大きくなります。
この波形は無音時の電圧を約1.0Vに調整した図です。
若干ノイズが乗っているようですね。
半固定抵抗を右に回せば1.0Vの電圧が上がっていきます。
1.0V-1.5V位にテスターで調整しましょう。
まぁ、結構微妙な調整ですがね。
当然左や右に回しすぎだと音の出力はダメダメです。
この図は音を入力した場合の波形です。
2.0V以上なら山が2か所有るのでそこでONとなります。
今回は割込み入力なので、割込みが発生します。
尚、この波形は秋月電子のLCDオシロキットで表示させました。
オシロスコープやテスターが無い人は下記スケッチを実行して下さい。
@上の配線はArduinoのデジタル2番ピンになっていますが、これをアナログの5番ピンに配線を変更します。
Aarduinoボード(Arduino Duemilanove 328)はUSBケーブルで接続して、arduino IDEを起動させます。
BIDEに下記のスケッチプログラムをコピーペーストして貼り付けて下さい。
半固定抵抗調整用スケッチです。
---------------------------------------------------------------------
void setup() {
Serial.begin(9600) ; // パソコン(ArduinoIDE)とシリアル通信の準備を行う
}
void loop() {
Serial.println(analogRead(5));// アナログ5番ピン読込み値を表示する
delay(500) ; // 500ms毎に表示を繰返す
}
---------------------------------------------------------------------
CIDEツールバーの赤枠部分「Upload」ボタンをクリックしてコンパイルとarduinoボードに書込みを行います。
D正常終了後、ツールバーの右側のアイコン「SerialMonitor」
ボタンをクリックしてシリアルモニター画面を起動させます。
E半固定抵抗を回して調整しましょう。
Arduinoのアナログ変換は0V〜5.0Vを0〜1023に変換して読み込みます。
で、1.0Vだと205位の値です、2.0Vなら410位。
左の図は大体1.0V位の内容です、ノイズが有るので少し値がふらついています。
あ、そうそう勿論静かな場所でね。
(実験1のスケッチ)
Arduinoの入力信号はアナログ5番ピンからデジタル2番ピンに配線を元に戻します。
このスケッチをコンパイルしてarduinoボードに書込みを行いましょう。
---------------------------------------------------------------------
int PinFlag ;
long TimeCount ;
void InterPin()
{
PinFlag = 1 ; // 割込み有ればON
}
void setup()
{
pinMode(13,OUTPUT) ; // 13番ピン付属LED出力
attachInterrupt(0,InterPin, RISING) ; // 2番ピンの割込みを指定(立上がりで割込み)
PinFlag = 0 ;
TimeCount = 0 ;
}
void loop()
{
// 割込み有ればその時点の時刻を保存してLEDを点灯する
while(PinFlag) {
PinFlag = 0 ;
TimeCount = millis() ; // 現在の時刻を保存
digitalWrite(13,HIGH) ; // LEDを点灯
}
// 1秒間カウントしたらLEDを消灯する
if (TimeCount != 0) {
if ((millis() - TimeCount) >= 1000) {
TimeCount = 0 ;
digitalWrite(13,LOW) ; // LEDを消灯
}
}
}
---------------------------------------------------------------------
マイクに音を入れて見て下さい、信号が2.0Vを超えたらLEDが1秒間点灯します、
1秒以内に更に割込みが入ればそこから更に1秒点灯期間が延びます。
尚、デジタル3番ピンに接続した場合は、
attachInterrupt(1,InterPin, RISING) ; // 3番ピンの割込みを指定(立上がりで割込み)
です。
この回路はマイクからの信号をアナログ端子に入力しています。
なので、音の大きさによりRGBのLEDを赤色→黄色→緑色→水色→青色→紫色と点灯させます。
RGBのLEDピン構成は下記を参照ください。
RGB 3色フルカラーLEDの制御方法はこちらの記事を参照ください。
RGB3色フルカラーLEDについて
LEDには極性が有ります、
一番長い足がGND(カソードコモン)です、arduinoのGND端子に接続します。
赤の足を330Ωの電流制限抵抗を介してarduinoの9番ピンに接続します。
青の足を470Ωの電流制限抵抗を介してarduinoの10番ピンに接続します。
緑の足を220Ωの電流制限抵抗を介してarduinoの11番ピンに接続します。
このLEDは秋月電子通商のこちらで購入しました。
電流制限抵抗
LEDの順方向電流(IF)と順方向電圧(VF)がデータシート等に書いてあると思います、
例えばIFが10mAで、VFが2.5Vで、arduinoのアナログ出力が5Vとすると、
(arduino出力−順方向電圧)÷ 順方向電流 = 電流制限抵抗値
よって、(5V - 2.5V) ÷ 0.010A = 250Ω(250Ωは無いので240Ωか270Ωを使います)
10mAは0.010AというふうにAに変換して計算します。
だいたい120Ω〜680Ωのあたりだと思います。
データシートによると、このLEDは、
赤LEDでVF=2.0V・緑と青LEDでVF=3.6V IFは最大50mAとなっています。
今回は、赤LEDでIF=9.0mA・緑LEDでIF=6.5mA・青LEDでIF=3mAぐらいの割合で制御しています。
抵抗値を変えると色合いが変化します、調整してみて下さい。
(20mA以上は流さないように、arduino壊れるしぃ、目がいたい)
(実験2のスケッチ)
下記スケッチをコンパイルしてarduinoボードに書込みを行いましょう。
音の大きさによりRGBLEDが変化すると思います。
---------------------------------------------------------------------
#define Threshold 410 // マイク信号の入力閾値約2.0V以上
void setup() {
}
void loop() {
int H , val ;
int R , G , B ;
R = G = B = 0 ;
/* マイク信号の値を読取りその値を0〜360に変換する処理 */
val = analogRead(5) ; // アナログ5番ピンから値を読み取る
if (val > Threshold) {
val = constrain(val,Threshold,1023) ; // 410-1023の範囲ないで値を切取る
H = map(val,Threshold,1023,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の出力
}
---------------------------------------------------------------------
マイク信号の入力閾値について
上記の方で記載した半固定抵抗の調整値が1.0V〜1.5Vなので、
このスケッチでは410(2.0V)としています、
これは410〜1023(2V-5V)をLEDの制御値(0-360)としていると言う事です。
なので、この閾値を調整すればLEDの光り方が変わりますのでお好きに変更してください。
#define Threshold 410 // マイク信号の入力閾値約2.0V以上
を変更です。
《その他》
左は《実験2》の実験風景です。
実験1の様に単純にスイッチ動作させ
る場合、このままでは実用的ではない
ですね。
それは、周りには色々な音が有り、
予期しない音でONするからです。
例えば手を3回続けて鳴らしたらON
とか考えないとダメでしょうね、
でもそれでも完ぺきではないと思う。
まぁ、あくまでも実験ですね。
それと、この頁ではコンデンサーマイク
を通常の音声マイクとしてでなく、音を
入力するセンサースイッチとした使い方
ですのでマイクアンプではない事に
注意して下さい。
また、マイクの替りに圧電スピーカを
振動センサーとして動作させ音を色々
発生させる記事はこちらを参考にして
下さい。
回路図の追加(*1) 2014/02/06
【きむ茶工房ガレージハウス】
Copyright (C) 2006-2014 Shigehiro Kimura All Rights Reserved.