PIC16F1619の基本動作から応用プログラムまでを学びます。

ホーム
12F1822
16F1455
16F1459
18F14K50
18F26J50
dsPIC
その他
    
16F18313
16F18325
16F18346
16F1619
Curiosity
---
---
音声再生 [ PICに言葉を喋らすには ]
2020-04-10

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」を使い調整します。
調整項目は

下の画面は各種調整を終えた音声データです。
調整を終えたら

の音声ファイルで「書き出し」ます。

PIC用のファイルに変換する

wave形式ファイルでは、MPLAB X で取り扱えないので、バイナリーエディタとテキストエディタを使用して wOha.h を作成します。

下の画面は取得した音声ファイルを、バイナリーエディタ「BZ」で開いた時のものです。