注釈

こんにちは、SunFounderのRaspberry Pi & Arduino & ESP32愛好家コミュニティへようこそ!Facebook上でRaspberry Pi、Arduino、ESP32についてもっと深く掘り下げ、他の愛好家と交流しましょう。

参加する理由は?

  • エキスパートサポート:コミュニティやチームの助けを借りて、販売後の問題や技術的な課題を解決します。

  • 学び&共有:ヒントやチュートリアルを交換してスキルを向上させましょう。

  • 独占的なプレビュー:新製品の発表や先行プレビューに早期アクセスしましょう。

  • 特別割引:最新製品の独占割引をお楽しみください。

  • 祭りのプロモーションとギフト:ギフトや祝日のプロモーションに参加しましょう。

👉 私たちと一緒に探索し、創造する準備はできていますか?[ここ]をクリックして今すぐ参加しましょう!

1.2.2 パッシブブザー

前書き

このレッスンでは、パッシブブザーで音楽を再生する方法を学習する。

部品

../_images/list_1.2.21.png

回路図

この実験では、トランジスタを保護するために、トランジスタのベースとGPIOの間にパッシブブザー、PNPトランジスタ、および1k抵抗器を使用する。

GPIO17に異なる周波数が与えられると、パッシブブザーは異なる音を出す。このようにして、ブザーは音楽を再生する。

../_images/image3331.png

実験手順

ステップ1: 回路を作る。

../_images/image1061.png

ステップ2: ディレクトリを変更する。

cd ~/davinci-kit-for-raspberry-pi/c/1.2.2/

ステップ3: コードをコンパイルする。

gcc 1.2.2_PassiveBuzzer.c -lwiringPi

ステップ4: 実行。

sudo ./a.out

コードが実行されると、ブザーが音楽を再生する。

コード

#include <wiringPi.h>
#include <softTone.h>
#include <stdio.h>

#define BuzPin    0

#define  CL1  131
#define  CL2  147
#define  CL3  165
#define  CL4  175
#define  CL5  196
#define  CL6  221
#define  CL7  248

#define  CM1  262
#define  CM2  294
#define  CM3  330
#define  CM4  350
#define  CM5  393
#define  CM6  441
#define  CM7  495

#define  CH1  525
#define  CH2  589
#define  CH3  661
#define  CH4  700
#define  CH5  786
#define  CH6  882
#define  CH7  990

int song_1[] = {CM3,CM5,CM6,CM3,CM2,CM3,CM5,CM6,CH1,CM6,CM5,CM1,CM3,CM2,
                CM2,CM3,CM5,CM2,CM3,CM3,CL6,CL6,CL6,CM1,CM2,CM3,CM2,CL7,
                CL6,CM1,CL5};

int beat_1[] = {1,1,3,1,1,3,1,1,1,1,1,1,1,1,3,1,1,3,1,1,1,1,1,1,1,2,1,1,
                1,1,1,1,1,1,3};


int song_2[] = {CM1,CM1,CM1,CL5,CM3,CM3,CM3,CM1,CM1,CM3,CM5,CM5,CM4,CM3,CM2,
                CM2,CM3,CM4,CM4,CM3,CM2,CM3,CM1,CM1,CM3,CM2,CL5,CL7,CM2,CM1
                };

int beat_2[] = {1,1,1,3,1,1,1,3,1,1,1,1,1,1,3,1,1,1,2,1,1,1,3,1,1,1,3,3,2,3};

int main(void)
{
    int i, j;
    if(wiringPiSetup() == -1){ //when initialize wiring failed,print message to screen
        printf("setup wiringPi failed !");
        return 1;
    }

    if(softToneCreate(BuzPin) == -1){
        printf("setup softTone failed !");
        return 1;
    }

    while(1){
        printf("music is being played...\n");
        delay(100);
        for(i=0;i<sizeof(song_1)/4;i++){
            softToneWrite(BuzPin, song_1[i]);
            delay(beat_1[i] * 500);
        }

        for(i=0;i<sizeof(song_2)/4;i++){
            softToneWrite(BuzPin, song_2[i]);
            delay(beat_2[i] * 500);
        }
    }

    return 0;
}

コードの説明

#define  CL1  131
#define  CL2  147
#define  CL3  165
#define  CL4  175
#define  CL5  196
#define  CL6  221
#define  CL7  248

#define  CM1  262
#define  CM2  294

各音の周波数は以下のように示している。CL-低音、CM-中音、CH-高音、1~7は音C、D、E、F、G、A、Bに対応する。

int song_1[] = {CM3,CM5,CM6,CM3,CM2,CM3,CM5,CM6,CH1,CM6,CM5,CM1,CM3,CM2,
                CM2,CM3,CM5,CM2,CM3,CM3,CL6,CL6,CL6,CM1,CM2,CM3,CM2,CL7,
                CL6,CM1,CL5};
int beat_1[] = {1,1,3,1,1,3,1,1,1,1,1,1,1,1,3,1,1,3,1,1,1,1,1,1,1,2,1,1,
                1,1,1,1,1,1,3};

配列 song_1[] は曲の楽譜を保存する。 beat_1[] は曲の各音符の拍を表す(1拍ごとに0.5秒)。

if(softToneCreate(BuzPin) == -1){
        printf("setup softTone failed !");
        return 1;

これにより、ソフトウェア制御のトーンピンが作成される。 任意のGPIOピンを使用でき、ピンの番号は使用した wiringPiSetup() 関数の番号になる。成功した場合の戻り値は0である。 それ以外の場合は、グローバル変数errnoをチェックして、何が問題なのかを確認する必要がある。

for(i=0;i<sizeof(song_1)/4;i++){
    softToneWrite(BuzPin, song_1[i]);
    delay(beat_1[i] * 500);
}

song_1 を再生するために for statement を使用する。

判断条件 i<sizeof(song_1)/4 では、 配列 song_1[] は整数のデータ型の配列であり、各要素は 4 ビートを取るため、4 で除算します。

song_1の要素の数(音符の数)は、 sizeof(song_4) を4で割ることによって得られる。

各音符を拍* 500msで再生できるようにするには、関数 delay(beat_1[i]*500) が呼び出される。

softToneWrite(BuzPin、song_1[i]) のプロトタイプ:

void softToneWrite (int pin, int freq);

これにより、指定されたピンのトーン周波数値が更新される。周波数を0に設定するまで、トーンの再生は停止しない。