2026年3月7日土曜日

脳トレゲーム対応制御学習ボード4 ブザー制御

 ブザーで音を出力するときには、右図のようなPWM(Pulse Wide Modulation)というONとOFFを繰り返して出力することで音が鳴ります。

 繰り返す時間(ONとOFF1つ分の時間)を周期T[s]といいます。音の高さは周波数[Hz]で表され、周期と逆数の関係になります。

 音楽の「ドレミファソラシド」は右のような関係で周波数が決まっています。
 例えば「ド」を鳴らすには、261.63Hz、523.25Hz、1046.5Hzの周波数です。(1オクターブ上の周波数は2倍となります)

音を鳴らす関数 tone関数

 音を鳴らす関数として「tone」関数が用意されています。

  tone(  出力ポート  ,  周波数  ,  時間[ms]  );

 設定値として、音を出力するポート番号、周波数、音を鳴らす時間[ms]を指定します。

 スイッチSW1を押したときに、ド(523Hz)の音を1秒間鳴らす例を示します。

void loop() {
  if(digitalRead(SW1)==0){
    // ドの音を1秒(1000ms)鳴らす
    tone( BUZZER, 523, 1000);
    delay(1000);
  }
}

 tone関数は、命令処理後に、すぐ次の命令を実行します。このため、時間待ちdelayを入れます。

 上の鍵盤の図では小数点以下の数字がありますが、tone関数の周波数は整数です(小数があっても無視されます)。


演習

(1)上の例題に追加して、スイッチSW2を押したときに「レ」の音を鳴らすように変更する。

void loop() {
  if(digitalRead(SW1)==0){
    // ドの音を1秒(1000ms)鳴らす
    tone( BUZZER, 523, 1000);
    delay(1000);
  }
  if(       ){  // SW2を押したとき
    // レの音(587Hz)を1秒(1000ms)鳴らす

  }
}

(2)(1)にさらに追加して、SW1~SW6を使い、「ド」~「ラ」まで鳴らす電子オルガンを作成する。


(3)前回の投稿の「スイッチ制御」にtone関数を追加して、SW1を押したら「ド」を鳴らし数字「1」を表示するプログラムを作成する。

void loop() {
  if(digitalRead(SW1)==0){
    // ドの音を1秒(1000ms)鳴らす
    tone( BUZZER, 523, 1000);
    // 数字「1」を表示
    
    delay(1000);
  }
  if(       ){  // SW2を押したとき
    // レの音(587Hz)を1秒(1000ms)鳴らす

  }
}


(4)(3)に追加して、SW1~SW6まで対応させましょう。


0 件のコメント:

コメントを投稿

LEDマトリックス表示装置の設計・製作 9(画像表示)

  LEDマトリックスに画像を表示させるには、いろいろな画像形式を知る必要があります。現在、よく使われるJPG形式やPNG形式は圧縮処理されて保存されています。これに対して、BMP形式やTIFF形式は非圧縮形式で、画像データがそのまま保存されています。このため、ファイルは大きくな...