研究テーマ->音楽とロボット->オリジナル制作のロボット->Arduinoで効果音を再生する

   
  ここでは、Arduinoを使用して効果音を再生する方法について紹介します。 toneの機能を使用する他、PWMのピンを使用して、サンプリング音で効果音を再生することもできます。  
 
toneで効果音を再生する
 

スピーカーをどれかのピンとGNDに接続し、ピンを出力に設定します。スケッチでtoneというファンクションを呼び出すと、指定した周波数の矩形波が再生されます。 ドの音「523Hz」、レの音「587Hz」など、音階中の各音の周波数を指定して音楽を演奏させることもできます。

 
 
サンプリング音を再生するには
 

パソコンのプログラムで効果音を使用する場合、WAVファイルやMP3ファイルを使用すると思います。ここでは、それと同じように、あらかじめ録音しておいた音をarduinoで効果音として再生するということを行いたいと思います。

スピーカーをピンとGNDに接続し、ピンに出力する値を連続して変化させることで、音が再生されるはずです。WAVファイルに収められているようなPCMデータを再生したい場合は、サンプリングレートに応じた周期で、データの値0-をピンに出力すればいいことになります。

arduinoでサンプリングレートに応じた周期で出力を行うために、タイマーを使用します。Arduino UnoにはTimer0、Timer1、Timer2という3つのタイマーがあります。ネットでみつけたサンプルではTimer2を使用していました。toneでもTimer2を使用しているようですのでTimer2を使用してプログラムを書くことにしました。出力するピンはサーボモータの制御などに使用されるPWMに対応しているピンでなければなりませんが、Timer2を使用する場合は、3番か11番になるようです。それぞれのTimerはレジスタに関連づけられています。 3番ピンは OCR2B、11番ピンはOCR2Aのレジスタに関連づけられています。

スケッチではsetupで、タイマー使用の設定を行ったあと、loopの中で、レジスタに値を書き込んでいきます。PCMデータのサンプリングレートに応して、loopの中にdelayMicrosecondsを入れて周期を調節します。

 
 
サンプリング音のデータを作成する
  パソコンのWAVデータは、だいたいサンプリングレートが44.1k Hzで、16ビット、2チャンネルというものが多いです。パソコンでデータを作成し、それをarduinoに持っていくわけですが、メモリが小さいため、もっと低いサンプリングレート (8000Hz程度)に変え、8ビット、モノラルにする必要があります。
つまり作業として必要なのは、
(1)WAVファイルの用意(素材集からもってきたり、自分で録音したりして用意する)
(2)サンプリングレート、ビット数、ステレオ/モノラルの変更
(3)テキストデータに変換する(16進数表記のデータ)
ということになります。
これらの作業は複数のソフトを組み合わせることで可能になりますが、今回、(2)と(3)を一括して行うWindows用のソフトを開発しました。
 
 



http://www.mu-tech.co.jp/Soft/Wav2Text.zip
 

 
 

[LOAD]ボタンでWAVファイルを読み込むと、Inputの欄に読み込んだファイルのサンプリングレートやチャネル数、ビット数が表示されます。Sizeはバイトサイズで、Lengthはファイルの長さが秒単位で表示されます。
Outputの欄に目的のサンプリングレートを設定します。チャネル数は1、ビット数は8に固定です。サンプリングレートを設定すると、出力されるファイルのバイト数が計算され、Sizeのところに表示されます。Sample durationには1サンプルあたりの時間がマイクロ秒単位で表示されます。サンプリングレートを大きくすると、Sample durationの値は小さくなるとともに、Sizeが大きくなります。
データはSRAMではなくフラッシュメモリに置く必要があります。SRAMは1キロバイトの容量しかありませんが、 フラッシュメモリは16キロバイトあり、そのうちの14キロバイトはユーザーが使用できるようになっています。音のデータだけでなく、プログラム全体をこの中に収められるサイズにする必要がありますから、それを考慮してサンプリングレートを選択する必要があります。もちろん、サンプリングレートを高くするほど、音質が良くなります。サンプリングレートが8000Hzだと、その半分の4000Hzまでの音しか出すことができませんが、サンプリングレートが16000Hzだと8000Hzの音まで出すことができます。ちなみに、人間の可聴域ではおおよそ15000Hzぐらいの高い音まで聞こえますから、サンプリングレートが8000Hzでは高い音が抜けている感じに聞こえます。
設定が固まったら保存します。このソフトでは、ノーマライズと呼ばれる音量最大化の処理が自動に行われて保存されるようになっています。

 
 
Arduinoのスケッチを作成する
  http://www.mu-tech.co.jp/Soft/drum.zip (arduino スケッチ)
作成したテキストデータをarduinoのスケッチに取り込みます。
具体的には次のように書きます。

const unsigned char sample_data[] PROGMEM = { テキストデータ };

PROGMEMと書くことで、データをフラッシュメモリに置くことができます。
 
  setupにピンとタイマーの初期設定を行うコードを書きます。

 pinMode(3, OUTPUT);
TCCR2A = _BV(COM2B1) | _BV(WGM21) | _BV(WGM20);// 8bit高速PWMを設定
TCCR2B = _BV(CS20); // クロック 分周比を設定

 
 
 

loopの中で音を再生しますが、次のように書きます。

OCR2B = pgm_read_byte_near(&sample_data[i]);

また、サンプル(1つ1つの再生データ)あたりの時間間隔を調整するために、次のように書きます。

delayMicroseconds(Sample durationの値);

Sample durationの値には、テキストへの変換ソフトでSample durationの欄に表示されているMicro Sec単位の値を書きます。サンプリングレートが大きいと、1サンプルごとの時間間隔が短くなるため、この値が小さくなります。

 
 
Arduino上の配線を行う
 

 
  スピーカーの赤い線をピン3に、黒い線をGNDに接続します。作品を展示などに出す場合は、音が小さいので、アンプなどを入れる必要があります。