2018年10月5日金曜日

[Elegoo: 6-7] ブザーで電子音・音階・メロディを鳴らす




概要 (Overview)
  • ブザーの鳴らし方について学ぶ
  • ブザー音・音階(ドレミファソラシド)・メロディを鳴らす



参照 (Reference)

tone関数
(周波数指定型PWM 出力)

  • PWM出力はLEDの明るさを変更できる。PWMの周波数はLEDの明るさや光の波長には無関係だが、PWMの周波数が関係する素子もある。その一つが電圧の振動で音波を生じる電圧スピーカー
  • 電圧の周波数と発生する音波の高さ(音の高さ)が一致するので、PWMの周波数が固定されていると音の高さを変えることができないが、Arduinoには指定した周波数(31Hz~65KHz[最大81KHz])の矩形波(50%デューティ)を出力するtone関数が用意されている
  • PWM出力に利用するタイマと同じタイマ(タイマ/カウンタ2)を利用するためデジタルピンの3番と11番へのPWM出力を妨げるので注意する
書式引数説明
void tone( [byte]pin, [unsigned int]frequency )            
void tone( [byte]pin, [unsigned int]frequency,
                 [long]durations )
pin:デジタルピン番号
frequency:
音の高さの周波数(Hz)
durations:   ※オプション
出力時間(ms)
pinにfrequencyを
(durations時間)
出力し続ける
void noTone( [byte]pin ) pin:デジタルピン番号 pinの出力を止める




使用する電子部品 (Component Required)
電子種別電子部品個数
マイコン Elegoo UNO R3 マイコンボード1
USBケーブル1
能動アクティブブザー1
パッシブブザー1
機構プッシュボタン3
ブレッドボード1
ジャンプワイヤ(赤)[オス-メス]1
ジャンプワイヤ(黒)[オス-メス]1
ジャンプワイヤ(青)[オス-オス]1
ジャンプワイヤ(黄)[オス-オス]1
ジャンプワイヤ(緑)[オス-オス]1
ジャンプワイヤ(黒)[オス-オス]4




電子部品について (Component Introduction)

ブザー

  • 電子ブザーはDC電源で集積回路を備えている。
  • PCやプリンタ、アラームや電子玩具、車載電子機器、電話機、タイマ及び音声デバイス用の電子製品に広く使用されている
  • ピンを上に向けて、黒色のテープで囲まれているのがアクティブ(能動的)ブザー、緑色の回路基板を持つのがパッシブ(受動的)ブザー
  • アクティブブザーは発振器内臓で、決まった直流電圧を掛けると決まった音程のブザー音(BEEP音)が鳴る。また周波数(2k~5k)にて音程を変えたり、メロディーを流すことも可能
  • パッシブブザーは周波数にて音程を変えたり、メロディーを流すことができる





電子回路 (Electronic Circuit)

回路図 (Schematic)



実体配線図 (Wiring Diagram)





実践 (To Practice)

配線写真 (Example Picture)


プログラム (Code)

ライブラリ
  • 【pitches】音階の周波数を宣言

スケッチ
/*****************************************/
/* 【 Elegoo: 6-7 】 ブザー              */
/*    電子音・音階・メロディを鳴らす        */
/*****************************************/

// pitchesライブラリ:音階の周波数(Hz)を宣言
#include "pitches.h"

// ピンの定義
#define BUZZER    5   // D5 : BUZZER
#define SW_BEEP   7   // D7 : Switch 電子音(BEEP)
#define SW_TONE   8   // D8 : Switch 音階
#define SW_MELODY 9   // D9 : Switch メロディ

/*-------------------------*/
/* 音階                    */
/*    "pitches.h"より      */
/*-------------------------*/
int aryFrequency[] = {
    NOTE_C4, NOTE_D4, NOTE_E4, NOTE_F4,
    NOTE_G4, NOTE_A4, NOTE_B4, NOTE_C5
};

/*-------------------------*/
/* メロディ : きらきらぼし   */
/*    "pitches.h"より      */
/*-------------------------*/
int aryMelody[] = {
    NOTE_C4, NOTE_C4, NOTE_G4, NOTE_G4, NOTE_A4, NOTE_A4, NOTE_G4, 
    NOTE_F4, NOTE_F4, NOTE_E4, NOTE_E4, NOTE_D4, NOTE_D4, NOTE_C4, 
    NOTE_G4, NOTE_G4, NOTE_F4, NOTE_F4, NOTE_E4, NOTE_E4, NOTE_D4,
    NOTE_G4, NOTE_G4, NOTE_F4, NOTE_F4, NOTE_E4, NOTE_E4, NOTE_D4,
    NOTE_C4, NOTE_C4, NOTE_G4, NOTE_G4, NOTE_A4, NOTE_A4, NOTE_G4,
    NOTE_F4, NOTE_F4, NOTE_E4, NOTE_E4, NOTE_D4, NOTE_D4, NOTE_C4
};
// 音の長さ
int aryMelodyDurations[] = {
    4,4,4,4,4,4,2,
    4,4,4,4,4,4,2,
    4,4,4,4,4,4,2,
    4,4,4,4,4,4,2,
    4,4,4,4,4,4,2, 
    4,4,4,4,4,4,2
};

/*-------------------------*/
/* 音階総数                */
/*-------------------------*/
int noteNum; 


/*********/
/* setup */
/*********/
void setup(){
  // pinの設定
  pinMode( BUZZER,    OUTPUT );       // BUZZER : 出力用
  pinMode( SW_BEEP,   INPUT_PULLUP ); // Switch : プルアップ時に発動
  pinMode( SW_TONE,   INPUT_PULLUP ); // Switch : プルアップ時に発動
  pinMode( SW_MELODY, INPUT_PULLUP ); // Switch : プルアップ時に発動
}

/********/
/* loop */
/********/
void loop(){
  // --------------------------------------------------
  // Switch 電子音(BEEP) ==> BEEP音 出力
  // --------------------------------------------------
  if( digitalRead( SW_BEEP ) == LOW ) outputBeep();

  // --------------------------------------------------
  // Switch 音階 ==> 音階 出力
  // --------------------------------------------------
  if( digitalRead( SW_TONE ) == LOW ) outputTone();

  // --------------------------------------------------
  // Switch メロディ ==> メロディ 出力
  // --------------------------------------------------
  if( digitalRead( SW_MELODY ) == LOW ) outputMelody();
}


/********************************/
/* BEEP音 出力                  */
/********************************/
void outputBeep(){
  int i, j;

  // --------------------------------------------------
  // 音の長さ
  // --------------------------------------------------
  for( j = 0; j <= 600; j += 150 ){

    // --------------------------------------------------
    // 演奏回数
    // --------------------------------------------------
    for( i = 0; i < 5; i++ ){
      digitalWrite( BUZZER, HIGH );
      delay( j );
      digitalWrite( BUZZER, LOW );
      delay( j );
    }
  }
}


/********************************/
/* 音階 出力                    */
/********************************/
void outputTone(){
  // --------------------------------------------------
  // 音階総数の設定
  // --------------------------------------------------
  noteNum = sizeof aryFrequency / sizeof aryFrequency[0];

  // --------------------------------------------------
  // 音階数の周波数を出力する 
  // --------------------------------------------------
  for( int i = 0; i < noteNum; i++ ){
    tone( BUZZER, aryFrequency[i] );
    delay( 500 );   // 演奏速度
  }

  // --------------------------------------------------
  // 周波数の出力を停止する
  // --------------------------------------------------
  noTone( BUZZER );
  delay( 500 );
}


/********************************/
/* メロディ 出力                */
/********************************/
void outputMelody(){
  // --------------------------------------------------
  // 音階総数の設定
  // --------------------------------------------------
  noteNum = sizeof aryMelody / sizeof aryMelody[0];

  // --------------------------------------------------
  //  音階数の周波数を音の長さだけ出力する 
  // --------------------------------------------------
  for( int i = 0; i < noteNum; i++){
    tone( BUZZER, aryMelody[i],( 1000 / aryMelodyDurations[i] ) );
    delay( 500 );   //演奏速度
  }

  // --------------------------------------------------
  // 周波数の出力を停止する
  // --------------------------------------------------
  noTone( BUZZER );
  delay( 500 );
}


結果(動画)・モニタリング

アクティブブザー

BEEP音

音階

メロディ[ きらきらぼし ]


パッシブブザー

BEEP音
※ 発振器が内臓されていないため、
電圧を掛けてもブザー音(BEEP音)は鳴らない

音階

メロディ[ きらきらぼし ]

0 件のコメント:

コメントを投稿