趣味的なIT・ネットの話題

Raspberry PiでIoTなシステム開発:圧電振動子(ピエゾスピーカー)の昇圧ドライブ

バイクジムカーナのタイム計測機を作ろうとすると、スタートシグナルを鳴らす方法を考えないといけません。

簡単な方法としては、音声出力にアンプとスピーカーをつなぐことなのですが、発想は簡単でも実装は大変です。バイクの爆音の中でヘルメットをしているライダーに音を伝えようとすると、相当なワット数のアンプが必要です。電源電圧が5Vに制限されていると、4Ωのスピーカーを使って出せる出力は理論上の最大でも5Wぐらい、実際に入手可能なD級アンプモジュールだと2wぐらいです。これではライダーにスタートシグナルを伝えることができません。

そこで思いついたのが、防犯ブザーでよく使われている圧電振動子を昇圧して鳴らせる方法。ネットで検索するとそれほど多くは無いですがいくつか回路が出てきます。ただ受動素子の定数が合いませんので、トライアンドエラーで試してみます。

S__7036933

電源電圧が5Vだとこんな感じですね。

コードは最初はWiringPiのソフトウェアPWMライブラリを使いました。

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

int main(void){

    wiringPiSetup();

    pinMode(7,PWM_OUTPUT);

    softPwmCreate(7,5,11);

    int i = 0;
    while(1){



        softPwmWrite(7,10);
        sleep(2);


        /*
        for (i=0;i<=11;i++)
        {
            printf("rate is %d\n",i);
            softPwmWrite(7,i);
            sleep(1);
        }*/


    }

}

が、このライブラリは、途中でデューティ比を変えられるものの、PWM周期を変えられないことが判明。この昇圧回路の場合、デューティー比を変えるとインダクタへのチャージ量が変わりそれで音量調整ができるので、便利です。が、音程が変えられないとシグナルにならないので断念。出力を2本使う方法も有りだと思いますが、それは今度試して見ます。

で、やむを得ずソフトウェアトーンライブラリで書いたのがこちら。

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

int main(void){

    wiringPiSetup();

    pinMode(7,OUTPUT);

    softToneCreate(7);

    int i = 0;
    while(1){/*

        softToneWrite(7,446);//446で実際の出力が439.98Hz
        usleep(500000);
        softToneWrite(7,0);
        usleep(500000);
        softToneWrite(7,446);//446で実際の出力が439.98Hz
        usleep(500000);
        softToneWrite(7,0);
        usleep(500000);
        softToneWrite(7,446);//446で実際の出力が439.98Hz
        usleep(500000);
        softToneWrite(7,0);
        usleep(500000);
        softToneWrite(7,904);//904で実際の出力が879.56Hz
        usleep(1000000);
        softToneWrite(7,0);
        usleep(500000);*/



        softToneWrite(7,446);//446で実際の出力が439.98Hz
        usleep(3000000);
        softToneWrite(7,904);//904で実際の出力が879.56Hz
        usleep(3000000);


        /*
        for (i=0;i<=11;i++)
        {
            printf("rate is %d\n",i);
            softPwmWrite(7,i);
            sleep(1);
        }*/


    }

}

以前rpi1で試したときもそうだったのですが、そのライブラリは音程がずれます。ソース内のコメントの通りですが、出力波形を実測して設定値を微調整する必要があります。

で、5Vで慣らしてみたところ、かなりの音量で鳴らすことができました。計測してみるとピークトゥピークで25Vぐらいありそうです。しかしバイク用としては若干物足りません。そこで電源電圧を12Vにしてみたところ、ある程度満足のいく音量に達しました。ピークトゥピークで50Vぐらい出ています。ちなみにこれはピエゾスピーカーの仕様を超えた使い方ですので、いつ壊れても誰にも文句は言えません。ただし消費電流は440Hzで27mA、880Hzで60mAだけです。アンプをつないでスピーカーを鳴らすことを考えると大分とエコですね。

出力のオンオフを繰り返していると、唐突にpiの電源が落ちることが何度かありました。恐らくですが、インダクタの起電力が電源側に回り込んでいます。繰り返しているとpiとかモバイルバッテリーを壊しそうなので、予防用にダイオードを入れました。使ったのは1N4148。最大で200mA流せます。電圧降下のロスがありますが、電源が12Vであればその1割程度なので許容範囲とします。

S__7036937

イメージ動画がこちら。

背景に聞こえている音楽は、「僕が普通にBGMを鳴らしている時の音量」です。なんとなく音量レベルが分かりますでしょうか。

 

 

 

 


Facebooktwitterpinterestlinkedinmail
納得したらすぐにシェア!