圧電ブザーを使って音を鳴らそう(RaspberryPi)
こんにちは、タクト工房へようこそ!今回は、圧電サウンダを使って音を鳴らします。圧電ブザーの基本原理と圧電ブザーを鳴らす際に使う、PWM(パルス幅変調)についても説明します。
この記事は、アフリエイト広告を利用しています
必要な材料と道具
Raspberry Pi
圧電ブザー
ジャンパーワイヤー
ブレッドボード
抵抗
RaspberryPiと電子工作キットですべて部品は揃います。
圧電ブザーの原理
圧電ブザーは、圧電効果を利用して音を発生させるデバイスです。圧電効果とは、特定の材料に機械的な力(圧力)を加えると、電圧が発生する現象を指します。逆に、電圧を加えると機械的な振動が発生します。この振動によって、圧電ブザーは音を鳴らします。
PWM(パルス幅変調)とは?
PWM(パルス幅変調)は、デジタル信号のONとOFFの割合を変えることで、アナログ信号を模倣する技術です。PWMはモータや照明の明るさなど様々な場所で活用されています。そして、PWM信号の周波数を変えることで、圧電ブザーから異なる音を鳴らすことができます。Raspberry PiのGPIOピンを使ってPWM信号を生成し、圧電ブザーを制御します。
デューティ比について
デューティ比(デューティサイクル)は、PWM信号が1周期のうちでオンになっている時間の割合を示します。デューティ比は百分率で表されます。例えば、デューティ比が50%の場合、PWM信号は1周期のうち半分の時間がオン、残り半分の時間がオフになります。オンの時間を$${T_{on}}$$、オフの時間を$${T_{off}}$$とすると、周期$${T_{pwm}}$$、周波数$${f_{pwm}}$$は次のようになります:
$$
T_{pwm}=T_{on}+T_{off}\\
f_{pwm}=\frac{1}{T_{pwm}}
$$
デューティ比は1周期のうちでオンになっている時間の割合なので、デューティ比$${D}$$は次のように求めることができます:
$$
D=\frac{T_{on}}{T_{pwm}}
$$
例えば、デューティ比が0.5の50%の場合、平均電圧は5割になります。
ハードウェア方式のPWM
WiringPiを使用したPWM信号を発生させる方法として、ソフトウェア方式と、ハードウェア方式があります。今回、ハードウェア方式によってPWM信号を発生させます。ハードウェア方式はソフトウェア方式と比較してPWM信号の周波数を高く設定することができます。そして、ハードウェア方式のPWMには、2チャンネルがあります。PWMの場所は以下の記事を参考にしてください。
$$
\begin{array}{|c|c|} \hline
PWMチャンネル & 対応するGPIO\\ \hline\hline
PWM0 & GPIO 12, 18 \\
PWM1& GPIO 13, 19 \\ \hline
\end{array}
$$
PWMの設定
PWM信号は次のコードを書くことで設定することができます。
pinMode(18,PWM_OUTPUT);
int pwmRang=1024
int clockDivisor = 54000000 / (frequency * pwmRange);
pwmSetClock(clockDivisor);
pwmSetRange(pwmRange);
pwmSetMode(PWM_MODE_MS);
pwmWrite(18,50);
・pwmSetRange関数
pwm信号の1周期の諧調の値を設定する。また、PWM信号の周期と周波数は次のようにして求まります:
$$
T_{pwm}=最小変化幅×pwmRange\\
f_{pwm}=\frac{1}{最小変化幅×pwmRange}
$$
・pwmSetClock関数
内部クロックの分周の設定を行います。clockDivisorの値は次の通りです:
$$
clockDivisor=内部クロックの周波数×最小変化幅
$$
内部クロックの周波数はRaspberryPi4Bは54.0MHzのため、54000000と設定します。
また、今回、目的の周波数を設定したいため、次の式でclockDivisorの値を設定します。
$$
clockDivisor=\frac{内部クロックの周波数}{目的の周波数×pwmRange}
$$
・pwmSetMode関数
ハードウェア方式の出力波形には、マークスペースモード(PWM_MODE_MS)とバランスモード(PWM_MODE_BAL)の2種類がありますが、今回マークスペースモードを使用します。
・pwmWrite関数
この関数ではデューティ比を設定しPWM信号を出力させます。今回の例では50%の場合を示しています。
回路設計
以下に示す回路図に従って配線を行ってください。また、ピン配列が分からない方は以下の記事を参考にしてください。
プログラム
次に、Raspberry Piに以下のPythonコードを入力して、圧電ブザーを鳴らします。今回は簡単なメロディーがなるように作成します。
#include <wiringPi.h>
#include <stdio.h>
#define BUZZER_PIN 18 // GPIO 18
// 音階の周波数
#define C4 523
#define D4 587
#define E4 659
#define F4 698
#define G4 783
#define A4 880
#define B4 987
#define C5 1046
// 音階の長さ
#define W 1000
#define T 750
#define H 500
#define Q 250
void playTone(int frequency, int duration) {
int clockDivisor = 54000000 / (frequency * 1024);
pwmSetClock(clockDivisor);
if (frequency==0){
pwmWrite(BUZZER_PIN, 0); // 音を止める
}
else{
pwmWrite(BUZZER_PIN, 512); // デューティサイクル50%
}
delay(duration);
pwmWrite(BUZZER_PIN, 0); // 音を止める
}
void playMelody() {
int melody[] = {C4,D4,E4,F4,G4,A4,B4,C5};
int noteDurations[] = {H,H,H,H,H,H,H,H};
int numNotes = sizeof(melody) / sizeof(melody[0]);
for (int i = 0; i < numNotes; i++) {
playTone(melody[i], noteDurations[i]);
}
}
int main(void) {
if (wiringPiSetupGpio() == -1) {
printf("wiringPiのセットアップに失敗しました\n");
return 1;
}
pinMode(BUZZER_PIN, PWM_OUTPUT);
pwmSetMode(PWM_MODE_MS);
pwmSetRange(1024);
while (1) {
playMelody(); // メロディを再生
}
return 0;
}
コンパイルと実行
入力が完了したら、メニューの「ビルド>Build」をクリックします。コンパイルが完了したら「ビルド>Execute」をクリックし、プログラムを実行します。実行すると「ドレミファソラシド」と音が流れると思います。
まとめ
今回、圧電ブザーを使って音を鳴らしました。音階の周波数は調べればすぐに見つかるので、自分の好きな曲を鳴らして楽しんでみてください。ちなみに、私はMrs. GREEN APPLEの「ライラック」を作成することに挑戦しました。