こんにちは、タクト工房へようこそ!今回は、圧電サウンダを使って音を鳴らします。圧電ブザーの基本原理と圧電ブザーを鳴らす際に使う、PWM(パルス幅変調)についても説明します。
※この記事は、アフリエイト広告を利用しています
必要な材料と道具
Raspberry Pi
圧電ブザー
ジャンパーワイヤー
ブレッドボード
抵抗



圧電ブザーの原理
圧電ブザーは、圧電効果を利用して音を発生させるデバイスです。圧電効果とは、特定の材料に機械的な力(圧力)を加えると、電圧が発生する現象を指します。逆に、電圧を加えると機械的な振動が発生します。この振動によって、圧電ブザーは音を鳴らします。

PWM(パルス幅変調)とは?
PWM(パルス幅変調)は、デジタル信号のONとOFFの割合を変えることで、アナログ信号を模倣する技術です。PWMはモータや照明の明るさなど様々な場所で活用されています。そして、PWM信号の周波数を変えることで、圧電ブザーから異なる音を鳴らすことができます。Raspberry PiのGPIOピンを使ってPWM信号を生成し、圧電ブザーを制御します。
デューティ比について
デューティ比(デューティサイクル)は、PWM信号が1周期のうちでオンになっている時間の割合を示します。デューティ比は百分率で表されます。例えば、デューティ比が50%の場合、PWM信号は1周期のうち半分の時間がオン、残り半分の時間がオフになります。オンの時間をTon、オフの時間を
$$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の場所は以下の記事を参考にしてください。
PWMチャンネル | 対応するGPIO |
PWM0 | GPIO12,18 |
PWM1 | GPIO13,19 |
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}{T_{pwm}}

・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の「ライラック」を作成することに挑戦しました。
コメント