BEEP音(tone)を制御してロボットから音を鳴らそう

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をした周波数にしてみるといいでしょう。

コメント

タイトルとURLをコピーしました