PIC16F18346の PWM を使用し、短い言葉を喋るようなプログラムを作ります。ハードウエアや制御プログラム自体はそれほど難易度の高いものではありません。一方で実際に喋る言葉のデータを準備するのに時間がかかりました。
<回路図>
32MHzのシステムクロックでTimer2と連携したPWM5を使いPCM音声データを再生させます。Fosc/4をプリスケラー 1/1, PR2=255 ポストスケーラー 1/4 とすると、PWM周期は31KHz. Timer2カウントオーバーは、7.8KHzになります。
音声データは、8KHzサンプリングのunsigned 8bit PCMで準備し、Timer2カウントオーバーごとにPWMデュティサイクルレジスタに書き込めば音声が再生できます。
PushSWを押すと、「おはようございます」を発声します。音声データは、別ファイル "wOha.h" に、配列として記録してあります。
このデータで再生時間は、1秒にもないですがPICメモリーの70%を使用します。長時間の再生を行うには、外部メモリを追加する必要があります。
このプログラムは、main.c, wOha.h の2本のファイルから構成されています。スペースの関係で、サイズの大きい wOha.h は、PCMデータ部のほどんどを省略し、ファイルの最初と最後だけを掲載しました。完全なファイルは、下のアイコンからダウンロードしてください。また、プログラマーですぐに書き込める hexファイルも同梱しています。
音声再生ソースファイル B05_Oha.zip |
<プログラム main.c>
/*********************************************************************
* File: PWM voicw sample
* System ClockはConfigで内部32MHzに設定
* 電源OMまたはPushSWを押すと、「おはようございます」
* LEDも連動した点灯
* PWM(LED) RC5
* PushSW RC4
*
* Language: MPLABX XC8 v2.10
* PIC16F18346 on Curiosity
* Created on May 22, 2020, 2:37 PM
**************************************/
#include <xc.h>
#include "wOha.h" // PCMデータ
#define _XTAL_FREQ 32000000 // delay_ms(x) のための定義
#define PushSW RC4
#pragma config FEXTOSC = OFF,RSTOSC = HFINT32 // HFINTOSC (32MHz)
#pragma config CLKOUTEN = OFF,CSWEN = OFF,FCMEN = OFF
#pragma config MCLRE = ON,PWRTE = OFF,WDTE = OFF,LPBOREN = OFF
#pragma config BOREN = OFF,BORV = LOW,PPS1WAY = OFF,STVREN = ON
#pragma config DEBUG = OFF
#pragma config WRT = OFF,LVP = ON,CP = OFF,CPD = OFF
// ******************* main *************************************
void main() {
int count = 0;
char data = 0;
TRISC4 = 1; // RC4 入力
ANSELC = 0; // すべてデジタル
TRISC5 = 0; // Outputs RC5 for PWM5
RC5PPS = 2; // PWM5をRC5に出力
//------------ Initialize PWM -----------------------
// Timer2 は、Fosc/4(8MHz)をPreScalerで 1/1(8MHz)
// 8bitで255カウントする 8M / 255 = 31KHz
// PostScaler 1/4 でTMR2IFは7.8KHz周期で「1」になる
// ---------------------------------------------------
T2CON = 0b00011100; // Timer 2 Post 1/4 Pre 1/1設定
PR2 = 0xFF; // Timer2 Period Register設定
// --------------------------------------------
// PWM5は、TMR2と連携し、
// 初期値デュティサイクルは、50%
// --------------------------------------------
PWM5CON= 0b11000000; // 正論理出力
PWM5DCH= 0x80; // デュティサイクルを設定
PWMTMRS= 0b00000101; // TMR2と連携(初期値)
while(1){ // 繰り返しループ
while(! TMR2IF); // Timer2 8KHzのカウントアップを待つ
TMR2IF = 0; // キャリーフラッグをクリア
data=wavedata[count++]; // 音声データ取得
PWM5DCH = data; // デュティサイクルを設定
if(data==0){ // 音声データ終了なら
count = 0; // データポインタを戻す
__delay_ms(1000); // 1秒待つ
while(PushSW); // PushSWが押されるのを待つ
}
}
}
<音声データ wOha.h>
/*
* File:「おはようございます」
* Comments:"PIC Program" wave data
* Revision history:2020-4-6
*/
#include <xc.h> // include processor files - each processor file is guarded.
const unsigned char wavedata[] = {
0x08,0x10,0x18,0x20,0x28,0x30,0x38,0x40,0x48,0x50,0x58,0x60,0x68,0x70,0x78,0x7F,
0x81,0x81,0x81,0x80,0x80,0x80,0x80,0x80,0x7F,0x7F,0x7F,0x7F,0x7F,0x7E,0x7E,0x7E,
0x7E,0x7E,0x7E,0x7E,0x7E,0x7E,0x7F,0x7F,0x7F,0x80,0x80,0x80,0x81,0x81,0x81,0x82,
0x82,0x82,0x83,0x83,0x83,0x82,0x82,0x82,0x81,0x81,0x80,0x7F,0x7E,0x7D,0x7C,0x7C,
↑↑↑↑↑↑↑
(中略)
↓↓↓↓↓↓↓
x7E,0x7D,0x82,0x80,0x7E,0x7F,0x80,0x7F,0x7E,0x82,0x80,0x7F,0x81,0x7F,0x7F,0x80,
0x80,0x7F,0x7F,0x80,0x7F,0x80,0x7E,0x80,0x81,0x7E,0x7F,0x7E,0x7F,0x80,0x7E,0x7F,
0x80,0x78,0x70,0x68,0x60,0x58,0x50,0x48,0x40,0x38,0x30,0x28,0x20,0x18,0x10,0x08,
0x00};
このプログラムで使用する「おはようございます」という言葉の音声データは、無料の音声編集ソフト「Audacity」、バイナリーエディタ「BZ」、テキストエディタ『Atom』を使用して作成し最終的に wOha.h にバイト単位の配列定数として収録しました。
wave形式ファイルでは、MPLAB X で取り扱えないので、バイナリーエディタとテキストエディタを使用して wOha.h を作成します。
下の画面は取得した音声ファイルを、バイナリーエディタ「BZ」で開いた時のものです。