音センサー(マイク)でLEDを点灯させます

〔Arduinoの動かせ方入門に戻る〕



エレクトリックコンデンサーマイクロフォンを使った、簡単・何処にでも有りそうな部品・安価なと三拍子そろった 回路でLEDを点灯させる実験を行います。
実験1は、設定より大きな音が入力(外部割込み)されればArduino付属13番LEDを1秒間点灯させます。
実験2は、音をアナログに接続して音の大きさによりRGB3色フルカラーLEDを色々変化点灯させます。
尚、マイクは秋月電子のこちらから購入しています。

《実験1》

実験1回路
マイクには極性が有ります、下図はデータシートからの抜粋です。
マイクピン構成

このマイクはピンが出ているのでブレッドボードに射す事が出来ます。

回路はマイク信号の波をバイアス
回路に通した後、トランジスタで
2段増幅しています、
これをダーリントン接続と言います

この回路はデジタル外部割込みを利用していますが、 Arduinoは2番か3番ピンのみ割込み入力が出来ます。





左は実態配線図ですが下に
回路図を載せておきます。 *1)

     回路図

(半固定抵抗の調整)

上の回路はデジタル入力(2番ピン)にマイクの信号を入れています、 Arduinoはデジタル入力に約2.0V以上の電圧が入力されればON(HIGH)と認識します。
なので、無音時は2.0V(1V-1.5V)以内にして、音を拾えば2.0V以上と調整しないとダメです、
当然大きい音の場合はそれに比例して入力電圧が大きくなります。

出力波形1
 この波形は無音時の電圧を約1.0Vに調整した図です。
 若干ノイズが乗っているようですね。
 半固定抵抗を右に回せば1.0Vの電圧が上がっていきます。
 1.0V-1.5V位にテスターで調整しましょう。
 まぁ、結構微妙な調整ですがね。
 当然左や右に回しすぎだと音の出力はダメダメです。


出力波形2
 この図は音を入力した場合の波形です。
 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ボードに書込みを行います。

upload

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番ピンの割込みを指定(立上がりで割込み)
です。

《実験2》

実験2回路
この回路はマイクからの信号をアナログ端子に入力しています。
なので、音の大きさによりRGBのLEDを赤色→黄色→緑色→水色→青色→紫色と点灯させます。

RGBのLEDピン構成は下記を参照ください。

RGB 3色フルカラーLEDの制御方法はこちらの記事を参照ください。


RGB3色フルカラーLEDについて

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.