圧電ブザー・スピーカーを鳴らしてみよう【STM32 Nucleo】

圧電ブザー・圧電スピーカーをSTM32マイコン(Nucleoボード) につなげて鳴らしてみましょう。今回は安価な圧電ブザー(形式:LF-MB12B06)を使いました。ペリフェラル タイマの応用です。詳細はタイマ・カウンタ【STM32の高機能・汎用タイマ詳細】で解説しています。

圧電ブザーの仕様

めかのとろ

圧電ブザーは発振回路を内蔵しており仕様に応じた電圧をかけると共鳴して音が発生する部品です。これとよく似た部品に圧電スピーカー(サウンダー)がありますが、こちらは発振回路を内蔵しておらず任意の周波数パルスを与えて音を発生させます。

めかのとろ

今回のアプリでは圧電ブザー、圧電スピーカー両方で使用できるものに挑戦したいと思います。

圧電ブザー外観
ブザー LF-MB12B06 仕様書
めかのとろ

このタイプは極性があり、プラス側(ピン足の長い方)に直流電圧、マイナス側にGNDを接続すると規定の音(2,300Hz)が発生します。

めかのとろ

ブザーに与える電圧はマイコン電圧と同じ3.3VDCを与えることにします。固定電圧の場合は連続音、3.3VDCのパルスにすると断続音になります。

めかのとろ

圧電スピーカーの場合は発振回路がないので直流電圧を与えるだけでは音は発生せず、外部から音に応じた周波数のパルスを与える必要があります。断続音にしたい場合はこの発生パルスを断続的にブロック状態で発生させます。

めかのとろ

今回のアプリでは圧電ブザー/圧電スピーカ ーのどちらでも使用できるものとして、任意の周波数をブロック状態で発生させたものを圧電ブザーに与えて音を発生させることにします。

めかのとろ

部品によっては保護抵抗として1k程度のものを直列に接続する必要がありますが、今回のものは抵抗があると機能しませんでしたので使用していません。保護抵抗の有無は仕様書等で確認してください

圧電ブザーとマイコンとの接続回路

圧電ブザー/スピーカー接続回路
めかのとろ

タイマTIM3で一定幅のパルスを任意の間隔で発生させます。PWM出力機能を使用すると簡単です。任意の間隔(発生音の頻度)はTIM3タイマのサイクルを設定する 動リロードレジスタ(ARR) の設定値を調整します。出力パルスの幅(発生音の長さ)はPWM設定の一つで キャプチャコンペアレジスタ(CCR) の設定値を調整します。タイムチャートで検討しながら設定すればよいです。

めかのとろ

圧電ブザーの場合はこのTIM3の出力(PA6)を与えるだけでよいのですが、圧電スピーカーの場合は各パルスが更に細かい音源の周波数で構成されたものでなければいけません。そこで、もう1段タイマTIM4を追加します。

めかのとろ

タイマTIM4には音源周波数のパルスを出力するように設定して、タイマTIM3のパルス出力時にのみタイマTIM4の細かい音源パルスが出力されるようにすればよいのです。デジタル論理回路のAND回路のような感じです。

めかのとろ

この場合は、タイマTIM3の出力に同期した割り込みを使います。カウントサイクル毎に発生する更新イベント割り込みとPWM出力のキャプチャコンペア割り込みを利用してタイマTIM4のパルスを発生させたり、停止させたりします。

割り込みに関しては詳細を さまざまな割り込み【STM32の割り込み詳細】で解説しています。

プログラム構成

めかのとろ

プログラムのアウトラインです。今回は割り込みだけで処理しています。

ブザーアプリプログラムアウトライン
めかのとろ

使用するペリフェラルはTIM3とTIM4およびそれぞれGPIOのAポートとBポートです。

GPIO設定
めかのとろ

TIM3_CH1の設定です。TIM3_CH1へのカウンタクロックを10kHzに設定してサイクルを自動リロードレジスタARR_TIM3で設定しています。ARR_TIM3が10000の場合はPWMモード時の周期は1秒です。

めかのとろ

カウント中に自動リロードレジスタARR値を任意に変更したい場合はカウンタモードをダウンカウンタに設定しておきます。

めかのとろ

カウンタモードはPWMモード1か2に指定します。PWMモードのキャプチャコンペアレジスタCCRはメンバTIM_Pulseに設定します。この値でパルス幅を調整できます。

めかのとろ

タイマTIM3_CH1のサイクル更新毎に発生する更新イベント割り込みTIM_IT_UpdateとPWMのキャプチャコンペア時に発生するキャプチャコンペア割り込みTIM_CC1を有効にしてからカウンタを開始します。

TIM3設定
めかのとろ

次にTIM4_CH1の設定です。圧電スピーカーで発生する音源パルスを設定します。このタイマもPWMモードを指定します。メンバTIM_Periodeの自動リロードレジスタ(ARR)でパルス周期を、 圧電スピーカーの場合はARRに音源に対応した周波数になるように設定します。メンバTIM_Pulseのキャプチャコンペアレジスタ(CCR)で パルス幅を設定します。これは通常ON/OFF比率50%のduty比でよいのではないでしょうか。

めかのとろ

PWMモードで2.5kHzのパルス(duty比50%)が出力する設定になっています。

めかのとろ

発振回路を内蔵している圧電ブザーにはTIM4のパルス設定は必要はないので、PWMモードキャプチャコンペアレジスタでパルス幅(duty比)を大きめに設定しておく方が本来の音に近づきます。

TIM4設定
めかのとろ

最後に割り込みの設定です。TIM3_CH1のPWM出力キャプチャコンペア割り込み でTIM4_CH1をPWMモードでカウントを開始させます。 TIM3_CH1の カウントサイクル毎に発生する更新イベント割り込みでTIM4 _CH1を強制的に出力ゼロにしています。ここでは適当なファームウェア関数の代わりにレジスタを直接操作しています。

割り込み処理
めかのとろ

設定したTIM3とTIM4で発生するパルスは下記のようになります。TIM3のパルスに同期してTIM4が発生しています。今回のアプリ例ではTIM3のパルスは固定ですが、動作中に間隔(ARR)やパルス幅 (CCR) を変更するものに発展させてみてください。

タイマTIM3とタイマTIM4の発生パルス
めかのとろ

実際の圧電ブザー音です。TIM4のPWM出力によるduty比が50%ではすこしかすれた感じの音なので90%程度に設定したら本来の音に近づきました。

めかのとろ

発振回路の内蔵していない圧電スピーカーの場合は TIM4によるパルス周波数を変えると音色が変わりますので、TIM3のPWMによりパルス幅を調整して音長を変えたものと組み合わせるといろいろと面白いとおもいます。

コラム

オシロスコープの必然性について:
今回のアプリのようにパルスを扱う場合は特に、想定したとおりに動作をしているかどうかの確認のためにもオシロスコープで確認することが必要です。オシロスコープで実際の波形を確認して初めてプログラムの不具合や改善点などがわかります。今どきのオシロスコープはかつてのような高額なものでなく、扱う周波数帯などの性能にもよりますが一般の人でも取得可能な価格で販売されていますので、テスターとともに保有しておいてほしい計測機器です。

コラム

レジスタ操作について
SPL(Standard Periferal Library)
で使用できるファームウェア関数が存在すればそれを使えばよいのですが、ちょっとした操作をしたいのに適当な関数がない場合もあります。そんな時はレジスタを直接操作すればよいのですが、SPLの場合は比較的シンプルなファームウェア関数ですので、関数内のレジスタ操作が理解しやすく比較的簡単に応用しやすいです。そういった意味でもマイコンの勉強にはSPLは向いていると思います。