You are here

音楽の前に。。。まずはピー

圧電サウンダを利用して、音を出す実験をしてみましょう。

音を鳴らすには、ある周波数で空気を振動させます。ここでは、圧電サウンダにHIGH,LOWの電圧を相互にかけ、圧電サウンダの振動板を振動させて音を出させることにします。たとえば、ドの音を出そうとすると、その周波数262Hzで圧電サウンダに電圧をかけてを振動させればよいことになります。

具体的には、262Hzの一周期は、1,000,000μs(1秒)÷262で約3,816μsになりますので、3,816μsを一周期として、圧電サウンダを振動させます。3,816μsを一周期として振動させるためには、圧電サウンダに3,816μsの半分の時間1,908μsをHIGH、残りの半分の時間をLOWの電圧をかける、という処理を繰り返してやればよいことになります。

それでは、このような処理をスケッチしてみましょう。

REDUINO-NANO

REDUINO-NANOの2ピンヘッダCN6に圧電サウンダを接続して実験してみましょう。CN6はArduinoではディジタルの4番ピンになります。また、SW2,SW3でそれぞれ異なる音が鳴るようにしてみましょう。SW2, SW2はそれぞれ、Arduinoではディジタルの8番、9番ピンとなります。

以下に、スケッチの初期化部分を示します。最初に入出力のピン番号の定義を行っています。次に、鳴らす音の周波数を配列で定義しています。初期化処理を行うsetup()関数では、ピンの入出力の設定と、スイッチに関しては、チップ内部でプルアップを行っています。また、最初の部分で説明した、圧電サウンダに相互にかけるHIGH,LOWの時間を、あらかじめ計算して記録しておく処理を行っておきます。

このスケッチの中核の処理がsoundOut()関数で行われます。引数で指定された周波数の音を圧電サウンダに出力します。

まず、引数で指定した音の半周期の時間tを求め、forループの中で、圧電サウンダのピンをHIGHにしてt時間まち、LOWにしてt時間まつ、という処理を繰り返して、圧電サウンダを振動させて音を作り出しています。

forループの繰り返し回数10は適当です。この回数を少なくすると、soundOut()の処理がすぐに終わり、音を鳴らすforループの処理に比べ、soundOut()関数の呼び出しのオーバーヘッドの時間などが相対的に増大するため、音がにごる可能性があります。一方、この回数をかなり大きくすると、forループが終了するまで時間を要することになるため、ボタン操作への音の反応が遅れることになります。何が起きるかは、実際に変更して確かめてみると良いでしょう。

2つのボタンをそれぞれ押すと、プログラムで指定した音が鳴ることを確認できると思います。loop()関数の中で呼ばれているsoundOut()の引数は、soundhz配列の添え字をあらわしており、0は最初のドの音、7は最後で1オクターブ上のドの音を指定しています。0-7の値(配列で、データが用意されている範囲)を入れ替えると、soundhz配列の対応する周波数の音が鳴るようになります。

このスケッチでは、周波数から周期を求める処理を、音を作るsoundOut()関数ではなく、初期化のsetup()関数で行っています。最初は、soundOut()関数で計算を行ってみたのですが、音がにごって許容レベルにはなかったので、周期を求める計算をsetup()関数に移しました。計算そのものは1行の簡単なものなのですが、割り算が含まれており、割り算を行うハードウェアが実装されていないATMEGA168(をはじめとするほとんどのMCU)では、音を作成するそれなりに処理速度が要求される処理に対して、十分な処理速度を実現できなかったのです。皆さんも、コメントアウトされている部分とその下の行を入れ替えて、soundOut()関数で、計算を行うと音がどのように鳴るか確認してみると面白いでしょう。このような試行錯誤も手軽に行えるのがArduinoの魅力のひとつでしょう。

このプログラムでは、音の生成に特殊なハードウェアを利用していないので、CN6端子に限らず、どの拡張端子でも音を鳴らすことが出来ます。拡張端子と対応するArduinoのピン番号は、CN3:D10, CN5:D2の様になります。soundPinの番号を入れ替えると、簡単に実験を行えます。残念ながら、CN4はアナログ入力専用になっているので、この用途(デジタル出力が必要なもの)には利用できません。

REDUINO-GL128

REDUINO-GL128には、標準で圧電サウンダが装備されているので、簡単に音で遊ぶことが出来ます。

REDUINO-GL128では、圧電サウンダはディジタルの9番ピンに接続されています。音の出力に関しては、上記のREDUINO-NANOのスケッチのsoundPinの設定を9に変えてやれば終わりなのですが、スイッチの構成が異なるため、その部分の変更を行う必要があります。

開発ソフト: 
MCUチップ: