4.BEEP音の鳴らし方

2020年5月18日

BEEP音(ブザー音)を鳴らす方法

Arduinoには、toneという関数があり、これを使うことで、CPUから単音(ブザー音)を鳴らすことができます。
Arduinoのデジタルピンから、指定した音の高さの信号が出力されますが、それをそのままスピーカーにつないだだけではパワーが足りないので、簡単な方法では圧電ブザーを使う方法があります。

圧電ブザーとArduino Unoの接続

クムクムロボット(ArduinoLeonardo)でBeepを鳴らす

弊社のクムクムロボットにはあらかじめLM386というLSIを使ったオーディオアンプ回路が搭載されていて、音の大きさを変えられるボリュームまでついているので、配線などは一切必要なく、プログラムを作るだけでBEEP音を鳴らすことができます。

クムクムロボットのCPUとアンプ接続

ポート情報

クムクムロボットは、Arduinoとしての(D12)ピンからオーディオアンプに接続されスピーカーへ到達しますので、プログラムからは(D12)をコントロールします。
使用する関数はtone関数です。

Arduinoとしてのポート
D12
関数
tone(D12,440,100) 指定した周波数の音を指定した長さで鳴らす
noTone(D12) 音を止める

void tone(出力PIN,周波数,出力時間)

Arduino標準関数で、出力PINから、周波数(50%のデューティ・サイクル)の高さの音を、出力時間(msec)鳴らします。出力時間(msec)を省略した場合は、出力を止める noTone()関数をコールするまでBEEP音はなり続けます。
※tone関数によって指定できるPINは1つだけに限られます。

出力PIN 出力PIN番号を指定します
周波数 出力する周波数を設定します
出力時間 何ミリ秒鳴らしたいかを設定します
型:unsigned long  0~4,294,967,295
戻り値 なし

周波数は使用するボード、アンプ・スピーカーの性能によって異なりますが、プログラム的には下記の値を指定することが可能です

ボード 出力周波数
Uno,Mega,Leonardo,その他AVR系 31Hz~65535Hz
Zero 41Hz~275000Hz
Gemma,Due 実装なし

tone()関数は内部でマイコンのタイ―マーを利用します。
そのため、同じタイマーを利用したPWMポートの一部が使えなくなったり、他のPWMポートで阻害され音が鳴らない場合が発生します。
その場合は、Arduinoのライブラリー内のソースコードでタイマー割り込みの番号等を変更する必要があります。

Qumcumではモータを7個使いPWMとToneが競合しているので競合しないようにTone側のタイマーを変更したプログラムを使っています。

noTone(PIN番号)

tone関数で出力した音を停止します。

PIN番号 toneを鳴らした出力PIN番号
戻り値 なし

音階を配列にして鳴らしてみる

ドレミファ音階の一例を配列で用意し鳴らしてみましょう。
発音した長さだけ、発音直後に delay で待っています。
delayの長さや発音時間を変えることで、音楽的なタイやスタッカート的な発音ができます。

※奇数周波数は処理上うまく発音できなかったり、プツというノイズが出ます。
※偶数になるように+-1をした周波数にしてみるといいでしょう。

//---------------------------------------------------------------------------
// 音階表現用周波数テーブル
//---------------------------------------------------------------------------
static int _NoteFreq[84] = {
33, 35, 37, 39, 41, 44, 46, 49, 52, 55, 58, 62,
65, 69, 73, 78, 82, 87, 93, 98, 104, 110, 117, 123,
131, 139, 147, 156, 165, 175, 185, 196, 208, 220, 233, 247,
262, 277, 294, 311, 330, 349, 370, 392, 415, 440, 466, 494,
523, 554, 587, 622, 659, 698, 740, 784, 831, 880, 932, 988,
1047, 1109, 1175, 1245, 1319, 1397, 1480, 1568, 1661, 1760, 1865, 1976,
2093, 2217, 2349, 2489, 2637, 2794, 2960, 3136, 3322, 3520, 3729, 3951,
} ;

int pin = 12;      
void setup() {
}
void loop() {
  for(int i=0;i<84;i++){
    tone(pin,_NoteFreq[i],200) ;  // 
    delay(200) ;                  // 音がなっている間待機
  }
}