この記事でわかること
・圧電ブザー回路の動作原理
・音を鳴らすプログラムの設計方法
・各プログラムでのメロディが試聴できる
PICマイコンで、ブザー音やメロディを流すための回路と、
その制御を行うプログラムの設計方法について解説します。
本記事で使用する新居浜高専PICマイコン学習キットについては下記記事で解説しています。
キットの回路図やプログラムはキットを販売している秋月電子のHPからダウンロードできます。
秋月電子 新居浜高専PICマイコン学習キットVer.3 ACアダプタ付
また、参考書も販売されています。
※本記事はPICマイコン学習方法の一例を紹介するものであり、
ここで紹介するキットやソフトの動作を保証するものではありません。
キット等の購入については自己責任でお願いします。
(不明点等の質問にはお答えできません)
<本ソフトの利用環境と設定について>
本記事におけるMPLAB(プログラム開発ソフト)の開発環境は以下の通りです。
・MPLAB X IDE v.15
・XC8 v2.46
・Device Family Pack PIC16F1xxxx_DFP(1.24.387)
※ダウンロードしたプロジェクトファイル(NNCTkit_v3.X)は、
そのままビルドするとエラーになるため、以下の変更を実施しました。
・helpstr.h 9行目
変更前:const __section(“title”) unsigned char title[224]={
変更後:const __section(“help_title“) unsigned char help_title[224]={
セクション名が「title」だとエラーになるので、別の名前にします。
ここでは「help_title」にしましたが、何でも良いです。
この時、配列名は「title」のままでも問題ありませんが、
他のデータ同様、配列名をセクション名と同じにする場合は、
この配列を使用しているソースファイルの方も直します。
・monitor.c 2093行目
変更前:TX1REG = title[i];
変更後:TX1REG = help_title[i];
MPLABの使い方については下記で解説しています。
圧電ブザー回路
動作原理
キットの回路は下図のような構成となっています。
ここで使用されている圧電ブザー(BZ)は、他励型が使用されています。
他励型は音を出すのにパルス信号を加える必要があるタイプで、
自励型はDC電圧を供給するだけで音が鳴ります。
ブザー音の様な一定周波数の音を鳴らすだけなら、自励型が簡単ですが、
他励型にすれば、パルス信号の周波数と振幅を調整することで音色を変えられるので、
メロディを流すことができます。
音を鳴らすための制御信号は以下の3つで、
L出力時に有効(ローアクティブ)となります。
RB2:ブザーへの電源供給コンデンサC7を充電(TR5オン)
RB3:電源供給コンデンサC7を急速放電(TR2オン)
RB4:ブザーへのパルス信号を出力(TR3オフ)
SW3とSW4は別のプログラムでRB2とRB3を入力にした時に使われるもので、
圧電ブザー回路としては不要です。
R8とR9はブザー回路動作中にスイッチを押した場合、
RB2とRB3がH出力してもショートしないための保護用なので、
SW3、SW4が無いなら不要です。
音を鳴らす基本的な動作を説明します。
まず、RB2=LでPNPトランジスタTR5がONすると、
C7が充電され、TR3のコレクタ電圧が上昇します。
この時、RB4=HでNPNトランジスタTR3がONすると、
コレクタ電圧はほぼゼロになるため、RB4をH/L切替することで、
コレクタ電圧はパルス信号になります。
また、TR3とブザーBZ間にあるC2は高周波だけを通すハイパスフィルタとして働き、
コンデンサ容量が小さい程、通過できる周波数は高くなります。
以上の動作により、RB4のH/L周期を変化させると、
ブザーに入力されるパルス信号の周波数も変わるので、音色を制御できます。
一定の音量でなく、減衰音にしたい場合は、RB4を一定期間だけL(充電)にします。
ブザーへの電源供給は充電されたC7から行われ、
放電と共に電圧は徐々に低下することで、パルス信号の振幅も小さくなり、
音が減衰されていきます。
この時、RB3=Lにすることで、C7の放電が早くなるため、
ピアノの様な余韻の短い減衰音となります。
回路定数
・音が減衰する速さの設定
RB2=H(C7充電なし)にした時の音が減衰する速さについて
ゆっくり減衰させる場合(RB3=H(C7放電なし))、
C7とR14の時定数で決まるので
47uF×30kΩ=1.41s
時定数:RC放電回路において、充電電圧の約37%に減少するまでの時間
早く減衰させる場合(RB3=L(C7放電あり))は、
R14に比べ、R13の抵抗値が一桁程小さいので、
C7とR13の時定数で決まります。
47uF×3.9kΩ≒183ms
・トランジスタのベース抵抗の設定
まず、トランジスタに流れるコレクタ電流を求めます。
これはトランジスタON時のコレクタ・エミッタ間電圧を考慮していませんが、
データシートのコレクタ・エミッタ飽和電圧VCE(sat)特性グラフを見ると、
コレクタ電流Icが1.4mA程度では約0.04Vと非常に低い値であり、
VCE(sat)を考慮に入れてコレクタ電流を再計算してみても、
(5Vー0.04ー0.04)/3.5kΩ≒1.4mA
と同じ値になります。
但し、VCE(sat)特性グラフの条件がIC/IB=10なので、
ベース電流IBを0.14mA以上流してあげる必要があります。
※トランジスタをON/OFFさせるスイッチとして使用するには、
ベース電流を大きくして、飽和領域で動作させます。
トランジスタのベース抵抗の決め方については、下記記事で解説しています。
TR5のベース電流は以下の式で求まります。
IB=(5VーVBE(sat)ーVOL)/(10k+5.1kΩ)
データシートのベース・エミッタ飽和電圧VBE(sat)特性グラフを見ると、
コレクタ電流ICが1.4mA程度の場合、約0.7Vです。
PICマイコンのLレベル出力電圧VOLはPIC16F18857のデータシートより、
VOL(max)=0.6V
※この値は出力電流IOLが10mAと大きな場合であることから、
実際のVOLは殆どゼロになります。
また、Hレベル出力電圧VOH(min)は、規定よりVDD-0.7V=4.3Vとなりますが、
これについても、IOH=6mA時の値なので、実際は殆ど5Vになります。
IB=(5Vー0.7ー0.6V)/(10k+5.1kΩ)
≒0.25mA
となり、0.14mAより大きいのでOKです。
他のトランジスタのベース抵抗も同様な値にしていますが、
図に示す様に、スイッチング動作に十分なベース電流を流すことができます。
音を鳴らすプログラム
ここでは、アラーム音、虫の音、電子ピアノの3つのプログラムについて解説します。
プログラムコードの詳細は、ソースファイル(nnct_kit_v3.c)を参照下さい。
各プログラム共通となるコンフィグレーション設定(※1)は以下の通りです。
※1:クロックなどの動作環境設定
#pragma config FEXTOSC = HS
外部発振器モード選択:HS(水晶振動子 4MHz以上)
#pragma config RSTOSC = EXT4X
発振器の動作モード:PLL(※2)の4逓倍回路を使用
※2:Phase Locked Loop(位相同期ループ):クロック周波数を増加させる回路
PIC16F18857ではPLLにより、外部からのクロック信号の周波数を4倍に増やすことができ、
本キットでは、8MHzの水晶振動子から32MHzのシステムクロック周波数を生成してます。
コンフィグレーション設定については、下記記事で解説しています。
アラーム音
ararm関数はアラーム音(ピピピ、ピピピと一定リズム)を鳴らすプログラムで、
本キットで動作するソフト「タッチアラーム」や「タイマー」で使用されています。
アラーム音
このプログラムは、100パルス毎に周波数をわずかに変化
(約3.6kHz/4.7kHz)させることでビブラートをかけ、
それを10セット実施したら50㎳休止しています。
また、RB2=L(C7充電)、RB3=H(C7放電無)で固定しているので、
減衰しない一定音量で鳴り続けます。
※このプログラムは8bitLEDの点滅処理も行っていますが、
以下の記載では、点滅処理部分のコードは省略しています。
※3:ソースファイル内で定義された待機処理を行う関数で、
wait関数は約2us×(引数の値) だけ待機時間を作り、
L_wait関数はwait(255)×(引数の値) だけ待機時間を作ります。
wait関数の詳細は下記記事で解説してます。
虫の音
このプログラム(BellInsect)では、次の2種類の虫の音を出します。
鈴虫音(リーン、リーン):ゆっくりとした減衰音
コオロギ音(コロコロコロ):一定間隔で休止する減衰しない音
鈴虫音は最初の5msだけRB2をLにしてC7を充電し、
RB3=H(C7放電無)にすることで、ゆっくり減衰させます。
パルスは7.5kHz/5kHzを100パルスずつ70セット行うことでビブラートをかけており、
アラーム音と同様、待機時間を設ける為、wait関数を使用しています。
コオロギ音は、RB2=L(C7充電)のままにして、減衰しないようにしており、
音の区切りをつけるために50msのRB4=L(音停止)期間を設けています。
パルスは7.1kHz/4.7kHzを100パルスずつ10セット行うことでビブラートをかけています。
電子ピアノ
このプログラムでは「ドレミファ」の音階を制御するため、
タイマ1割込みを使用してRB4をトグル出力(※4)させることで、
RB4の周波数を正確に設定します。
※4:それまでの出力がHならL、LならHにすることで、前回とは逆の出力にすること
電子ピアノ
タイマー1割込みは、タイマ1レジスタがロールオーバー(※5)した時に発生します。
※5:カウント値が最大値に達して、ゼロに戻ること
タイマ1レジスタは上位8bit用のTMR1H、
下位8bit用のTMR1Lレジスタから構成される16bitの値が入ります。
このレジスタ値は、タイマ1クロック信号(T1CLK)によってカウントアップされ、
16bitの最大値である0xFFFFの次(65535+1=65536)になったら割込みが発生します。
(具体的には、TMR1IF(タイマ 1 割込フラグ)が1になる)
従って、割込みをxカウント毎に発生させるには
タイマ1レジスタに(65536ーx)をセットします。
タイマ1の設定は、初期設定関数SetConfigで行っており、
タイマ1のクロック周波数T1CLK=Fosc/4、
T1CLKの分周器の設定を1:1にしているので、
T1CLK=8MHzのクロック信号でタイマ1レジスタはカウントアップします。
タイマ1割込みが発生したら、RB4をトグル出力するように割込み処理関数 isrで定義しています。
これによって、RB4のH/L信号の1周期が割込み周期2回分となるので、
xカウント毎に割込みを発生させた時、RB4信号の周波数をfとすると、
1/f=2 × x × (1/8MHz)
となります。
式を変形すると、
x=8MHz/2f
従って、タイマ1レジスタの値を(65536ーx)にセットします。
例えば、低い「ド」(261.6Hz)の音を鳴らす場合のカウント数は、
x=8MHz/(2×261.6Hz)
≒15291
タイマ1レジスタにセットする値は、
65536ー15291=50245(0xC445)
となるので、TMR1H=0xC4、TMR1L=0x45にセットします。
以上から、電子ピアノのプログラム(ElectricPiano)は以下になります。