見出し画像

圧電ブザーを使って音を鳴らそう(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割になります。

デューティ比50%

ハードウェア方式の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の「ライラック」を作成することに挑戦しました。

この記事が気に入ったらサポートをしてみませんか?