PIC16F1619の PWM を使用し、短い言葉を喋るようなプログラムを作ります。ハードウエアや制御プログラム自体はそれほど難易度の高いものではありません。一方で実際に喋る言葉のデータを準備するのに時間がかかりました。
<回路図>
32MHzのシステムクロックでTimer2と連携したPWM3を使い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ファイルも同梱しています。
音声再生ソースファイル B01_Oha.zip |
<プログラム main.c>
/*********************************************************************
* File name: PWM3 TMR2 音声再生
* Notes: 32MHz内部クロック PLLはOn
* PWM RC5
* PushSW RC4
* PIC16F1619 MPLAB X IDE with XC8
* 2020-4-4
* Copyright (c) 2020 iwamoto All Rights Reserved
* *******************************************************************/
#include <xc.h>
#include "wOha.h" // include PCNデータ
#define _XTAL_FREQ 32000000
// CONFIG
#pragma config FOSC = INTOSC, PWRTE = OFF, MCLRE = ON, CP = OFF
#pragma config BOREN = ON, CLKOUTEN = OFF, IESO = ON, FCMEN = ON
#pragma config WRT = OFF, PPS1WAY = ON, ZCD = OFF, PLLEN = ON
#pragma config STVREN = ON, BORV = LO, LPBOR = OFF, LVP = ON
#pragma config WDTCPS = WDTCPS1F, WDTE = OFF, WDTCWS = WDTCWSSW, WDTCCS = SWC
/*********************************************************
Main application
*********************************************************/
void main(void)
{
int count = 0;
OSCCON = 0b11110000; // PLL ON; 8Hz_HF; FOSC;
TRISC5 = 0; // Outputs RC5 for PWM3
RC5PPS = 14; // PWM3をRC3に設定
// --------------------------------------------
// PWM3は、TMR"と連携し、
// 初期値デュティサイクルは、50%
// --------------------------------------------
PWM3CON = 0b10000000; // PWM ON
PWM3DCH = 0x00; // デュティサイクルを設定
CCPTMRS = 0x00; // TMR2と連携
// --------------------------------------------
// Timer2 は、Fosc/4(8MHz)をPreScalerで 1/1(2MHz)
// 8bitで255カウントする 8M / 255 = 31KHz
// PostScaler 1/4 でTMR2IFが「1」になる 7.8KHz周期
// TMR2IFを常時モニタし、LED(RC0)を反転
// --------------------------------------------
T2CON = 0b10000011; // Timer2 Pre1/1 Post1/4設定
PR2 = 255; // Timer2 Period Register設定
T2CLKCON = 0x00; // クロックはFosc/4
T2HLT = 0x00; // Free Runモード
T2RST = 0x00; // Free Runなので該当せず
while(1){ // 繰り返しループ
while(! TMR2IF); // Timer2 8KHzのカウントアップを待つ
TMR2IF = 0; // キャリーフラッグをクリア
PWM3DCH = wavedata[count]; // デュティサイクルを設定
if(wavedata[count++]==0){ // 音声データ終了なら
count = 0; // データポインタを戻す
__delay_ms(1000); // 1秒待つ
while(RC4); // 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 にバイト単位の配列定数として収録しました。
「おはようございます」という言葉の音声ファイルが必要です。ファイル作成にはいろいろな方法が考えられます。
例えば
下の画面は取得した音声ファイルを、「Audacity」で開いた時のものです。
音声ファイルには、余分な空白や雑音なども一緒に録音されているので、必要な長さ音の大きさに「Audacity」を使い調整します。
調整項目は
下の画面は各種調整を終えた音声データです。
調整を終えたら
の音声ファイルで「書き出し」ます。
wave形式ファイルでは、MPLAB X で取り扱えないので、バイナリーエディタとテキストエディタを使用して wOha.h を作成します。
下の画面は取得した音声ファイルを、バイナリーエディタ「BZ」で開いた時のものです。