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

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

PIC16F1459の PWM を使用し、短い言葉を喋るようなプログラムを作ります。ハードウエアや制御プログラム自体はそれほど難易度の高いものではありません。一方で実際に喋る言葉のデータを準備するのに時間がかかりました。

おしゃべりプログラム(1秒)

<回路図>

48MHzのシステムクロックでTimer2と連携したPWM1を使いPCM音声データを再生させます。Fosc/4をプリスケラー 1/1, PR2=255 ポストスケーラー 1/6 とすると、PWM周期は47KHz. Timer2カウントオーバーは、7.8KHzになります。
音声データは、8KHzサンプリングのunsigned 8bit PCMで準備し、Timer2カウントオーバーごとにPWMデュティサイクルレジスタに書き込めば音声が再生できます。

PushSWを押すと、「おはようございます」を発声します。音声データは、別ファイル "wOha.h" に、配列として記録してあります。
このデータで再生時間は、1秒もないですがPICメモリーの70%を使用します。長時間の再生を行うには、外部メモリを追加する必要があります。

このプログラムは、main.c, wOha.h の2本のファイルから構成されています。スペースの関係で、サイズの大きい wOha.h は、PCMデータ部のほどんどを省略し、ファイルの最初と最後だけを掲載しました。完全なファイルは、下のアイコンからダウンロードしてください。また、プログラマーですぐに書き込める hexファイルも同梱していますが、サイズが大きいためBootloaderでは書き込めません。PICkitを使用してPICに書き込んでください。

音声再生ソースファイル B09_Oha.zip

<プログラム main.c>

/* *****************************************
 *  File name: PWM TMR2 音声再生
 *  8kHz 8bit でサンプルした音声 PCMデータを再生
 *  Notes: 48MHz内部クロック PLLはOn
 *        PWM出力 RC5
 *        PushSW  RA5
 *
 * Created on May 5, 2020, 6:31 PM
 ***************************************** */

 #include <xc.h>
#include "wOha.h"   // 音声PCMデータ 8kHz 8bit

#define _XTAL_FREQ 48000000
#define SW2  RA5

#pragma config FOSC  = INTOSC, WDTE = OFF, PWRTE = OFF, MCLRE = OFF, CP  = OFF
#pragma config BOREN = ON, CLKOUTEN = OFF, IESO  = OFF, FCMEN = OFF
#pragma config WRT = OFF, CPUDIV = NOCLKDIV, USBLSCLK = 48MHz, PLLMULT = 3x
#pragma config PLLEN = ENABLED, STVREN = ON, BORV = LO, LPBOR = OFF, LVP = OFF

void main(void) {
    unsigned int count = 0;
    OSCCON = 0b11111100;     // SPLLEN = ON, 16MHz(x3=48MHz)
    LATC = 0;
    TRISC = 0b11010000;   // PWM, LEDs output pins

    // -------------------------------------------------------
    // Timer2 は、Fosc/4(12MHz)をPreScalerで 1/1
    // 8bitで256カウントする     12M / 255 = 47KHz
    // PostScaler 1/6 でTMR2IFが「1」になる 7.8KHz周期
    // TMR2IFを常時モニタし、TMR2IFセットで音声データ更新
    // -------------------------------------------------------
   T2CON  = 0b00101100;     // Timer 2 Post 1/6 PS 1/1 設定
   PR2    = 0xFF;           // Timer2 Period Register設定
   PWM1CON= 0b11000000;     // 正論理出力

    while(1){
        count = 0;
        while(wavedata[count]){         // データ終端は「0x00」
            while(! TMR2IF);                // Timer2のカウントアップを待つ
            TMR2IF = 0;                     // フラッグをクリア
            PWM1DCH = wavedata[count++];    // デュティサイクルを設定
        }
        while (SW2);                    // 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」で開いた時のものです。